Créer et mettre à jour une base de données Sqlite

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Mdr ta l'âge de boire au moins ?
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

MetalOS a écrit :Mdr ta l'âge de boire au moins ?
Etant plus vieux que toi, je suis apte pour cet exercice :)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Lol
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

Allez soyons fou. On va reprendre le code précédent qui nous permettait de de compter le nombre de fois ou apparaît un poste budgétaire et nous allons, pour chacun des postes, calculer le montant total.

On rabâche encore une fois la séquence de traitement :)
Sélectionner "SELECT" l'ensemble des enregistrement de ta table.
Regrouper les postes budgétaires "GROUP BY poste".
Pour chaque poste budgétaire, compter le nombre de fois ou il apparaît "COUNT(poste)"
Pour chaque poste budgétaire, faire la somme des montants "SUM(Montant)"
Et enfin pour la présentation, trier les postes dans l'ordre ascendant "ORDER BY poste ASC"

Le code

Code : Tout sélectionner

Enumeration
  #Database
EndEnumeration

Global ReqSql.s, Buffer.s

;Base de données 
Procedure QueryBudget()
  ;La base de données est créee en mémoire 
  If OpenDatabase(#Database, ":memory:", "", "")
    Debug "Connected"
    
    ;Création de la table budget
    ReqSql = "CREATE TABLE budget("
    ReqSql + "poste INTEGER,"   ;Poste budgétaire
    ReqSql + "montant INTEGER"  ;Montant
    ReqSql + ");"
    DatabaseUpdate(#DataBase, ReqSql) ;Exécution de la requéte
    Debug DatabaseError()
    
    ;Ajout d'un jeu de test de 10 enregistrements
    ;. Poste 1 = Dépense, Poste 2 = Recette
    ;. Pour chacun de ces postes, on affecte un montant compris entre 10 et 100
    For n = 1 To 10 
      ReqSql = "INSERT INTO budget (poste, montant) values ("
      ReqSql + Chr(34) + Random(2,1) + Chr(34)+Chr(44)  ;Numéro de poste budgétaire aléatoire 1 ou 2 
      ReqSql + Chr(34) + Random(100, 10) + Chr(34)+")"  ;Montant aléatoire compris entre 10 et 100
      DatabaseUpdate(#Database, ReqSql) ;Exécution de la requête
    Next
    
    ;Visualisation des enregistrements de la table budget
    Debug "Visualisation du jeu de test"
    ReqSql = "SELECT * FROM budget ORDER BY poste ASC" ;
    DatabaseQuery(#Database, ReqSql) 
    While NextDatabaseRow(#Database)
      Debug "Poste " + Str(GetDatabaseLong(#Database, 0)) + " => " + Str(GetDatabaseLong(#Database, 1)) + " Euros"
    Wend   
    Debug ""
    
    ;Répartition budgétaire
    Debug "Répartition budgétaire"
    ReqSql = "SELECT Poste, COUNT(poste), SUM(Montant) FROM budget GROUP BY Poste ORDER BY poste ASC"
    DatabaseQuery(#Database, ReqSql) 
    While NextDatabaseRow(#Database)
      Buffer = "le poste " + Str(GetDatabaseLong(#Database, 0)) 
      Buffer + " apparait " + Str(GetDatabaseLong(#Database, 1)) + " Fois " 
      
      Buffer + "pour un montant de " + Str(GetDatabaseLong(#Database, 2)) + " Euros"
      Debug Buffer
    Wend
    
  Else
    Debug DatabaseError()   
  EndIf
EndProcedure

UseSQLiteDatabase()
QueryBudget()
Pour vous montrer la puissance de Pure Basic et de SQL, remplacer

Code : Tout sélectionner

For n = 1 To 10 
par

Code : Tout sélectionner

For n = 1 To 10000
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Cool, perso je ne doute pas de la puissance de PB.
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

J'ai du mal à comprendre avec ton exemple falsam pour l'exploiter dans mon code.

Dans mon Window j'ai un combobox avec plusieurs valeurs.

Code : Tout sélectionner

ComboBoxGadget(#ComboCategorieMC,235,30,200,20,#PB_ComboBox_UpperCase);{
    AddGadgetItem(#ComboCategorieMC, -1, "FEU")
    AddGadgetItem(#ComboCategorieMC, -1, "SECOUR A VICTIME(S)")
    AddGadgetItem(#ComboCategorieMC, -1, "FUITE D'EAU")
    AddGadgetItem(#ComboCategorieMC, -1, "VERIFICATIONS")
    AddGadgetItem(#ComboCategorieMC, -1, "ASC OU MC")
    AddGadgetItem(#ComboCategorieMC, -1, "DEGRADATION")
    AddGadgetItem(#ComboCategorieMC, -1, "INCIDENT TECHNIQUE")
    AddGadgetItem(#ComboCategorieMC, -1, "AGRESSION VERBALE")
    AddGadgetItem(#ComboCategorieMC, -1, "LITIGE")
    AddGadgetItem(#ComboCategorieMC, -1, "EVACUATION")
    AddGadgetItem(#ComboCategorieMC, -1, "VOL AVEC PLAINTE")
    AddGadgetItem(#ComboCategorieMC, -1, "VOL SANS PLAINTE")
    AddGadgetItem(#ComboCategorieMC, -1, "BAGARRE")
    AddGadgetItem(#ComboCategorieMC, -1, "PRISE DE SERVICE")
    AddGadgetItem(#ComboCategorieMC, -1, "FIN DE SERVICE")
    AddGadgetItem(#ComboCategorieMC, -1, "RONDE DE SECURITE")
    AddGadgetItem(#ComboCategorieMC, -1, "PERCEPTION DE CLES")
    AddGadgetItem(#ComboCategorieMC, -1, "REINTEGRATION DE CLES")
    AddGadgetItem(#ComboCategorieMC, -1, "DIVERS")
J'aimerais savoir combien de fois je retrouve 'FEU' dans ma base de données sqlite et ceci pour chaque valeurs.

exemple de résultats:

FEU = 1 fois
SECOUR A VICTIME(S) = 5 fois
FUITE D'EAU = 10 fois
VERIFICATIONS = 0 fois
...

J'ai un peut de mal la dessus.
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Personne n'a d'idée ?
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Je devient fou avec ses base de données. Je ne comprend pas comment compter le nombre de fois ou chaque catégorie apparaît dans ma base. Voici mon code ou la procédure DB_Count() devrait me retourner le résultat, mais rien ne fonctionne.

Code : Tout sélectionner

Global glDBSQLite.l
Global glListviewItemSelected.l = -1
Global glImageMemory.l

;- Window Constants
Enumeration 1
  #Window_Form3
EndEnumeration
#WindowIndex=#PB_Compiler_EnumerationValue


;- Gadget Constants
Enumeration 1
  
  ;Window_Form3
  #TextHeaderMC
  #TextNumMC
  #StringNumMC
  #TextCategorieMC
  #ComboCategorieMC
  #TextDateMC
  #String_DateMC
  #TextHeureMC
  #StringHeureMC
  #TextRequerantMC
  #StringRequerantMC
  #TextLieuMC
  #StringLieuMC
  #TextSujetMC
  #StringSujetMC
  #EditeurMC
  #ListMC
  #BtnMC_Enregistrer
  #BtnMC_Ouvrir
  #BtnMC_Supprimer
  #BtnMC_Fermer
  #ListingMC
  
EndEnumeration
#GadgetIndex=#PB_Compiler_EnumerationValue

Procedure.i Window_Form3()
  If OpenWindow(#Window_Form3,302,164,790,560,"Main-courante évènementielle expresse :",#PB_Window_ScreenCentered|#PB_Window_Invisible)
    
    TextGadget(#TextHeaderMC,0,0,790,20," Gestion main-courante évènementielle expresse")
    SetGadgetFont(#TextHeaderMC, Font0)
    SetGadgetColor(#TextHeaderMC, #PB_Gadget_BackColor, RGB(42, 85, 134))   
    SetGadgetColor(#TextHeaderMC, #PB_Gadget_FrontColor, RGB(223, 233, 245))

    TextGadget(#TextNumMC,10,32,60,15,"Numéro")
    StringGadget(#StringNumMC,70,30,100,20,"", #PB_String_ReadOnly)
    GadgetToolTip(#StringNumMC,"Numérotation automatique")

    TextGadget(#TextCategorieMC,180,32,55,15,"Catégorie :")
    ComboBoxGadget(#ComboCategorieMC,235,30,200,20,#PB_ComboBox_UpperCase);{
    AddGadgetItem(#ComboCategorieMC, -1, "FEU")
    AddGadgetItem(#ComboCategorieMC, -1, "SECOUR A VICTIME(S)")
    AddGadgetItem(#ComboCategorieMC, -1, "FUITE D'EAU")
    AddGadgetItem(#ComboCategorieMC, -1, "VERIFICATIONS")
    AddGadgetItem(#ComboCategorieMC, -1, "ASC OU MC")
    AddGadgetItem(#ComboCategorieMC, -1, "DEGRADATION")
    AddGadgetItem(#ComboCategorieMC, -1, "INCIDENT TECHNIQUE")
    AddGadgetItem(#ComboCategorieMC, -1, "AGRESSION VERBALE")
    AddGadgetItem(#ComboCategorieMC, -1, "LITIGE")
    AddGadgetItem(#ComboCategorieMC, -1, "EVACUATION")
    AddGadgetItem(#ComboCategorieMC, -1, "VOL AVEC PLAINTE")
    AddGadgetItem(#ComboCategorieMC, -1, "VOL SANS PLAINTE")
    AddGadgetItem(#ComboCategorieMC, -1, "BAGARRE")
    AddGadgetItem(#ComboCategorieMC, -1, "PRISE DE SERVICE")
    AddGadgetItem(#ComboCategorieMC, -1, "FIN DE SERVICE")
    AddGadgetItem(#ComboCategorieMC, -1, "RONDE DE SECURITE")
    AddGadgetItem(#ComboCategorieMC, -1, "PERCEPTION DE CLES")
    AddGadgetItem(#ComboCategorieMC, -1, "REINTEGRATION DE CLES")
    AddGadgetItem(#ComboCategorieMC, -1, "DIVERS")
    GadgetToolTip(#ComboCategorieMC,"Sélectionnez la catégorie")
;}

    TextGadget(#TextDateMC,450,32,30,15,"Date")
    Date$ = FormatDate("%dd / %mm / %yyyy", Date())
    StringGadget(#String_DateMC, 480, 30, 120, 20, Date$, #PB_String_ReadOnly)
    GadgetToolTip(#String_DateMC,"Sélectionnez la date de la MC")

    TextGadget(#TextHeureMC,620,32,35,15,"Heure")
    StringGadget(#StringHeureMC,655,30,50,20,FormatDate("%hh h %ii",Date()), #PB_String_ReadOnly)
    GadgetToolTip(#StringHeureMC,"Heure de réquisition")

    TextGadget(#TextRequerantMC,10,57,60,15,"Requérant")
    StringGadget(#StringRequerantMC,70,55,210,20,"")
    GadgetToolTip(#StringRequerantMC,"Nom et prénom si disponible")

    TextGadget(#TextLieuMC,290,57,50,15,"Lieu")
    StringGadget(#StringLieuMC,350,55,400,20,"")
    GadgetToolTip(#StringLieuMC,"Adresse de l'intervention / des faits")

    TextGadget(#TextSujetMC,10,82,50,15,"Sujet")
    StringGadget(#StringSujetMC,70,80,400,20,"")
    GadgetToolTip(#StringSujetMC,"Indiquez succintement le sujet de cette main-courante")

    EditorGadget(#EditeurMC, 10, 105, 770, 200, #PB_Editor_WordWrap)
    SetGadgetFont(#EditeurMC, Font1)
    SetGadgetColor(#EditeurMC, #PB_Gadget_BackColor, RGB(253, 251, 212))   
    SetGadgetColor(#EditeurMC, #PB_Gadget_FrontColor, RGB(29, 29, 118))
    GadgetToolTip(#EditeurMC,"Saisi du Compte-rendu des évènements")

    ;Dans ce listing on y met que les infos de fichier, pas la MC elle même.
    ListIconGadget(#ListMC,10,310,770,200,"Numéro",120, #PB_ListIcon_FullRowSelect)
     AddGadgetColumn(#ListMC, 1, "Date", 100)
     AddGadgetColumn(#ListMC, 2, "Heure", 70)
     AddGadgetColumn(#ListMC, 3, "Catégorie", 150)
     AddGadgetColumn(#ListMC, 4, "Sujet", 300)
     AddGadgetColumn(#ListMC, 5, "Requérant", 200)
     AddGadgetColumn(#ListMC, 6, "Lieu", 250)
     AddGadgetColumn(#ListMC, 7, "Compte rendu", 500)
   

    ButtonGadget(#BtnMC_Enregistrer, 10, 520, 80, 25, "Enregistrer")
     GadgetToolTip(#BtnMC_Enregistrer,"Enregistrer la main courante")
   
    ButtonGadget(#BtnMC_Ouvrir, 100, 520, 80, 25, "Statistiques")
     GadgetToolTip(#BtnMC_Ouvrir,"Statistique de la main courante sélectionnée")
   
    ButtonGadget(#BtnMC_Fermer, 700, 520, 80, 25, "Fermer")
     GadgetToolTip(#BtnMC_Fermer,"Quitter Main-Courante Express")
    
    HideWindow(#Window_Form3,0)
    ProcedureReturn WindowID(#Window_Form3)
  EndIf
EndProcedure

;****Fin procédures impression****
Procedure DB_Init()
  Protected plFile.l
  Protected psSQLRequest.s
  UseSQLiteDatabase()
  If FileSize(#PB_Compiler_FilePath+"MainCourante.sqlite") < 0
    plFile = CreateFile(#PB_Any, #PB_Compiler_FilePath+"MainCourante.sqlite")
    If plFile
      CloseFile(plFile)
    EndIf
  EndIf
  
  glDBSQLite = OpenDatabase(#PB_Any, "MainCourante.sqlite", "", "", #PB_Database_SQLite)
  If glDBSQLite = 0
    MessageRequester("Main-Courante évènementielle", DatabaseError())
    End
  ElseIf plFile
    psSQLRequest = "CREATE TABLE IF NOT EXISTS mc ("
    psSQLRequest + "id_mc INTEGER PRIMARY KEY AUTOINCREMENT Not NULL, "
    psSQLRequest + "mcnum TEXT Not NULL," ;Numéro de main-courante
    psSQLRequest + "date TEXT Not NULL,"  ;Date
    psSQLRequest + "heure TEXT Not NULL," ;heure
    psSQLRequest + "categorie TEXT Not NULL,";Catégories
    psSQLRequest + "sujet TEXT Not NULL,";Sujet
    psSQLRequest + "requerant TEXT Not NULL,";Requérant
    psSQLRequest + "lieu TEXT Not NULL,";lieu
    psSQLRequest + "compterendu TEXT Not NULL";Compte rendue de la main-courante
    psSQLRequest + ")"
    ; Debug psSQLRequest
    If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
      MessageRequester("Main-Courante évènementielle - DB_Init()", DatabaseError())
    EndIf
  EndIf
  
  If DatabaseQuery(glDBSQLite, "SELECT * FROM mc") <> 0
    While NextDatabaseRow(glDBSQLite)
      AddGadgetItem(#ListMC, CountGadgetItems(#ListMC), GetDatabaseString(glDBSQLite, 1) +Chr(10)+ GetDatabaseString(glDBSQLite, 2) +Chr(10)+ GetDatabaseString(glDBSQLite, 3) +Chr(10)+ GetDatabaseString(glDBSQLite, 4) +Chr(10)+ GetDatabaseString(glDBSQLite, 5) +Chr(10)+ GetDatabaseString(glDBSQLite, 6) +Chr(10)+ GetDatabaseString(glDBSQLite, 7) +Chr(10)+ GetDatabaseString(glDBSQLite, 8))
      SetGadgetItemData(#ListMC, CountGadgetItems(#ListMC)-1, GetDatabaseLong(glDBSQLite, 0))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  EndIf
EndProcedure

Procedure.s SqliteString(Buffer.s)
  Buffer=Chr(34)+ReplaceString(Buffer, Chr(34), Chr(34)+Chr(34)) + Chr(34)
  ProcedureReturn Buffer
EndProcedure

Procedure DB_InsertMC()
  Protected psSQLRequest.s
  
  psSQLRequest = "INSERT INTO mc (mcnum, date, heure, categorie, sujet, requerant, lieu, compterendu)"
  psSQLRequest + "VALUES ("
  psSQLRequest + SqliteString(GetGadgetText(#StringNumMC))+ ","
  psSQLRequest + SqliteString(GetGadgetText(#String_DateMC))+ ","
  psSQLRequest + SqliteString(GetGadgetText(#StringHeureMC))+ ","
  psSQLRequest + SqliteString(GetGadgetText(#ComboCategorieMC))+ ","
  psSQLRequest + SqliteString(GetGadgetText(#StringSujetMC))+ ","
  psSQLRequest + SqliteString(GetGadgetText(#StringRequerantMC))+ ","
  psSQLRequest + SqliteString(GetGadgetText(#StringLieuMC)) + ","
  psSQLRequest + SqliteString(GetGadgetText(#EditeurMC)) +")"
  
  If DatabaseUpdate(glDBSQLite, psSQLRequest) = 0
    Debug psSQLRequest
    MessageRequester("Main-Courante évènementielle - DB_InsertMC()", DatabaseError())
  EndIf
  
  ClearGadgetItems(#ListMC)
  
  If DatabaseQuery(glDBSQLite, "SELECT * FROM mc") <> 0
    While NextDatabaseRow(glDBSQLite)
      AddGadgetItem(#ListMC, CountGadgetItems(#ListMC), GetDatabaseString(glDBSQLite, 1) +Chr(10)+ GetDatabaseString(glDBSQLite, 2) +Chr(10)+ GetDatabaseString(glDBSQLite, 3) +Chr(10)+ GetDatabaseString(glDBSQLite, 4) +Chr(10)+ GetDatabaseString(glDBSQLite, 5) +Chr(10)+ GetDatabaseString(glDBSQLite, 6) +Chr(10)+ GetDatabaseString(glDBSQLite, 7) +Chr(10)+ GetDatabaseString(glDBSQLite, 8))
      SetGadgetItemData(#ListMC, CountGadgetItems(#ListMC)-1, GetDatabaseLong(glDBSQLite, 0))
    Wend
    FinishDatabaseQuery(glDBSQLite)
  EndIf
  
  ;actualisation automatique du numéro
  SetGadgetText(#StringNumMC,"MC"+FormatDate("%yyyy", Date())+"_"+Str(CountGadgetItems(#ListMC) + 1))
EndProcedure

Procedure DB_Count()
  Protected psSQLRequest.s
  psSQLRequest = "SELECT categorie, COUNT(categorie), FROM mc GROUP BY categorie ORDER BY categorie ASC"
  If DatabaseQuery(glDBSQLite, psSQLRequest)
    While NextDatabaseRow(glDBSQLite)
      Buffer$ = "la catégorie" + GetDatabaseString(glDBSQLite, 4)
      Buffer$ + " apparait " + GetDatabaseString(glDBSQLite, 4) + " Fois " 
    Wend
    FinishDatabaseQuery(glDBSQLite)
  Else
    MessageRequester("Main-Courante évènementielle - DB_Count", DatabaseError())
  EndIf 
EndProcedure

;- Main Loop
If Window_Form3()
   DB_Init()
    ;actualisation automatique du numéro
     SetGadgetText(#StringNumMC,"MC"+FormatDate("%yyyy", Date())+"_"+Str(CountGadgetItems(#ListMC) + 1))

  Define quitForm1=0
  Repeat
    EventID  =WaitWindowEvent()
    MenuID   =EventMenu()
    GadgetID =EventGadget()
    WindowID =EventWindow()

    Select EventID
      Case #PB_Event_CloseWindow
        If WindowID=#Window_Form3
          quitForm1=1
        EndIf 
        
      Case #PB_Event_Gadget
        Select GadgetID
          Case #BtnMC_Fermer
           End
          Case #BtnMC_Enregistrer
            A$ = GetGadgetText(#StringNumMC)
            B$ = GetGadgetText(#String_DateMC)
            C$ = GetGadgetText(#StringHeureMC)
            D$ = GetGadgetText(#ComboCategorieMC)
            E$ = GetGadgetText(#StringSujetMC)
            F$ = GetGadgetText(#StringRequerantMC)
            G$ = GetGadgetText(#StringLieuMC)
            H$ = GetGadgetText(#EditeurMC)
            I$ = ""
            
            If A$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf B$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf C$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf D$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf E$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf F$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf G$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            ElseIf H$ = I$
              MessageRequester("Attention", "Certains champ du formulaire de main-courante sont vide. Compléter le formulaire pour pouvoir enregistrer une nouvelle main-courante.", #PB_MessageRequester_Ok)
            Else  
              Resultat = MessageRequester("MAIN-COURANTE n° "+GetGadgetText(#StringNumMC),"Vous allez enregistrer cette main-courante que vous ne pourrez modifier."+Chr(13)+"S'il vous reste des informations à vérifier ou des éléments à corriger, faites le avant."+Chr(13)+"Enregistrer maintenant ?", #PB_MessageRequester_YesNo)
              If Resultat = 6
               DB_InsertMC()
                ; on remet les champs à zéro et on actualise le compteur après enregistrement
                ClearGadgetItems(#EditeurMC)
                SetGadgetText(#StringNumMC,"MC"+FormatDate("%yyyy", Date())+"_"+Str(CountGadgetItems(#ListMC) + 1))
                SetGadgetText(#ComboCategorieMC,"")
                SetGadgetText(#StringHeureMC,FormatDate("%hh h %ii",Date()))
                SetGadgetText(#StringRequerantMC,"")
                SetGadgetText(#StringLieuMC,"")
                SetGadgetText(#StringSujetMC,"")
              ElseIf Resultat = 7
              ;annulé
              EndIf
            EndIf
            
          Case #BtnMC_Ouvrir
            DB_Count()
        EndSelect

    EndSelect
  Until quitForm1
  CloseWindow(#Window_Form3)
EndIf
End
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

Bonjour Métal OS. Aurais tu une base de données test que je pourrais telecharger?
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

A télécharger ici:

Télécharger la base Sqlite
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par falsam »

Code : Tout sélectionner

Procedure DB_Count()
  Protected psSQLRequest.s
  psSQLRequest = "SELECT categorie, COUNT(categorie), FROM mc GROUP BY categorie ORDER BY categorie ASC"
  If DatabaseQuery(glDBSQLite, psSQLRequest)
    While NextDatabaseRow(glDBSQLite)
      Buffer$ = "la catégorie" + GetDatabaseString(glDBSQLite, 4)
      Buffer$ + " apparait " + GetDatabaseString(glDBSQLite, 4) + " Fois " 
    Wend
    FinishDatabaseQuery(glDBSQLite)
  Else
    MessageRequester("Main-Courante évènementielle - DB_Count", DatabaseError())
  EndIf 
EndProcedure
:!: Normalement tu as du avoir le message d'erreur near "FROM" : Syntax error car tu as mis une virgule devant le FROM.

■ Malgré cette correction tu n'auras toujours pas d'affichage car tu n'utilises pas de debug pour afficher ta variable Buffers$ (haha). Je rigole mais ça m'arrive aussi parfois d'oublier d'utiliser debug devant une variable que je souhaite afficher.

■ Deux corrections et le code devient

Code : Tout sélectionner

Procedure DB_Count()
  Protected psSQLRequest.s
  psSQLRequest = "SELECT categorie, COUNT(categorie) FROM mc GROUP BY categorie ORDER BY categorie ASC"
  If DatabaseQuery(glDBSQLite, psSQLRequest)
    While NextDatabaseRow(glDBSQLite)
      Buffer$ = "la catégorie" + GetDatabaseString(glDBSQLite, 4)
      Buffer$ + " apparait " + GetDatabaseString(glDBSQLite, 4) + " Fois " 
      
      Debug Buffer$
    Wend
    FinishDatabaseQuery(glDBSQLite)
  Else
    MessageRequester("Main-Courante évènementielle - DB_Count", DatabaseError())
  EndIf 
EndProcedure
:?: Mais ..... toujours pas le résultat que l'on souhaite. Mais pourquoi donc ?

:idea: Ta requête retourne un tableau de x lignes (ou rangée : Row en anglais) et x Colonnes
La numérotation de chacune des rangée et colonnes commencera par 0

:idea: Dans ta requête tu sélectionnes categorie et COUNT(categorie) (je sens que tu vois déjà ton erreur)
categorie sera la première colonne (Colonne 0)
COUNT(categorie) sera la seconde colonne (Colonne 1)

Hors tu demandes d'afficher la colonne 4

Code : Tout sélectionner

Buffer$ = "la catégorie" + GetDatabaseString(glDBSQLite, 4)
:arrow: Correction finales du code

Code : Tout sélectionner

Procedure DB_Count()
  Protected psSQLRequest.s
  psSQLRequest = "SELECT categorie, COUNT(categorie) FROM mc GROUP BY categorie ORDER BY categorie ASC"
  If DatabaseQuery(glDBSQLite, psSQLRequest)
    While NextDatabaseRow(glDBSQLite)
      Buffer$ = "la catégorie " + GetDatabaseString(glDBSQLite, 0)
      Buffer$ + " apparait " + GetDatabaseString(glDBSQLite, 1) + " Fois " 
      
      Debug Buffer$
    Wend
    FinishDatabaseQuery(glDBSQLite)
  Else
    MessageRequester("Main-Courante évènementielle - DB_Count", DatabaseError())
  EndIf 
EndProcedure
Résultat
la catégorie DIVERS apparait 1 Fois
la catégorie FEU apparait 4 Fois
la catégorie FUITE D'EAU apparait 1 Fois
la catégorie VERIFICATIONS apparait 2 Fois
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
MetalOS
Messages : 1492
Inscription : mar. 20/juin/2006 22:17
Localisation : Lorraine
Contact :

Re: Créer et mettre à jour une base de données Sqlite

Message par MetalOS »

Putain comment c'est simple quand tu à la solution :lol: Si tu savais le nombre de nuit que j'ai passer dessus à m'arracher les cheveux (même si j'en ai pas beaucoup lol). Merci falsam de ton aide une fois de plus.
Shade
Messages : 52
Inscription : sam. 05/juin/2010 15:40

Re: Créer et mettre à jour une base de données Sqlite

Message par Shade »

salut tous le monde

merci falsam pour se fabuleux tuto sa m'aide super bien,
j'ai une question bête, ou j n'est pas vu de réponse, je voulais savoir si c'était possible de modifier le nombre de colonne une fois la table créer ?
par exemple comme dans l'exemple que tu a donner tu a la colonne nom, prénom, âge est il possible d'ajouté par exemple une colonne tel, une fois la table créer ?
Avatar de l’utilisateur
Mindphazer
Messages : 635
Inscription : mer. 24/août/2005 10:42

Re: Créer et mettre à jour une base de données Sqlite

Message par Mindphazer »

Shade a écrit : ven. 08/mars/2024 6:25 salut tous le monde

merci falsam pour se fabuleux tuto sa m'aide super bien,
j'ai une question bête, ou j n'est pas vu de réponse, je voulais savoir si c'était possible de modifier le nombre de colonne une fois la table créer ?
par exemple comme dans l'exemple que tu a donner tu a la colonne nom, prénom, âge est il possible d'ajouté par exemple une colonne tel, une fois la table créer ?
Oui, il suffit d'utiliser la commande SQL

Code : Tout sélectionner

ALTER TABLE nom_table ADD nom_colonne type_donnees
au sein d'une commande PureBasic DatabaseUpdate()
Bureau : Win10 64bits
Maison : Macbook Pro M1 14" SSD 512 Go / Ram 16 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Shade
Messages : 52
Inscription : sam. 05/juin/2010 15:40

Re: Créer et mettre à jour une base de données Sqlite

Message par Shade »

merci beaucoup
Répondre