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 »

Je vient de mettre un code sur le poste d'avant.
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 :Je vient de mettre un code sur le poste d'avant.
Remplace

Code : Tout sélectionner

psSQLRequest + SqliteString+GetGadgetText(#EditeurMC))+"'"
  psSQLRequest + ")"
par

Code : Tout sélectionner

psSQLRequest + SqliteString(GetGadgetText(#EditeurMC))+")"
Jolie petite application de main courante :)
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 »

Désolé mais j'ai toujours une erreur :oops:
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 :Désolé mais j'ai toujours une erreur :oops:
Mais non!!! Je viens de saisir deux evements avec apostrophe et guillemet et je n'ai pas d'erreur.

Ton code corrigé

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, "Ouvrir")
     GadgetToolTip(#BtnMC_Ouvrir,"Ouvrir 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

;- 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
        EndSelect

    EndSelect
  Until quitForm1
  CloseWindow(#Window_Form3)
EndIf
End
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 »

Je ne comprend pas j'ai pourtant fais la même modif que toi et ca ne fonctionne pas mais quand je fais un copier/coller de la procédure ca fonctionne. Bref merci falsam :wink:
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

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

Message par Micoute »

Quand ça veut pas, ça veut pas !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
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 »

falsam, si je me base sur mon exemple et t'il possible de générer un graphique (camembert ou courbe) pour comparer le nombre des différentes catégories enregistrer dans ma base et si oui comment ? Les graphiques peuvent ils être fait avec le canevas gadget ou il faut une lib pour ça ?
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

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

Message par kernadec »

Bonjour Metalos
en cherchant à "Chart" tu va trouver des libs dédiées aux graphiques sur les forums
Regarde cette lib, l'exemple image est en 2D, mais depuis son code à été amélioré en ajoutant le relief :D
http://www.purebasic.fr/english/viewtop ... 14&t=59038

Cordialement
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 :générer un graphique (camembert ou courbe) pour comparer le nombre des différentes catégories enregistrer dans ma base et si oui comment ? Les graphiques peuvent ils être fait avec le canevas gadget ou il faut une lib pour ça ?
Un exemple basé sur une base de données stockant des données budgétaires.

Pour cette première partie de cet exercice, nous allons
- Créer une base de données qui stockera une table budget
- Chaque enregistrement de cette table sera composé d'un poste budgétaire et d'un montant
- On va faire simple : Le poste budgétaire est 1 ou 2 (Recette ou Dépense)

Les commentaires sont dans le code.

Code : Tout sélectionner

Enumeration
  #Database
EndEnumeration

Global ReqSql.s

;Base de données 
Procedure CalcBudget()
  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)
    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
    
    ;Calcul du montant total
    ReqSql = "SELECT SUM(montant) FROM budget"
    DatabaseQuery(#Database, ReqSql) 
    NextDatabaseRow(#Database)
    MontantTotal = GetDatabaseLong(#Database, 0)
    Debug "Montant total "+ MontantTotal + #CRLF$
    
    ;Calcul de la répartition budgétaire
    Debug "Répartition budgétaire"
    ReqSql = "SELECT poste, SUM(montant) FROM budget GROUP BY poste"
    DatabaseQuery(#Database, ReqSql) 
     
    While NextDatabaseRow(#Database)            
      Debug "Total poste " + Str(GetDatabaseLong(#Database, 0)) + " => " + Str(GetDatabaseLong(#Database, 1)) + " Euros "
    Wend
  Else
    Debug DatabaseError()   
  EndIf
EndProcedure

UseSQLiteDatabase()
CalcBudget()
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
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 »

Ajoutons maintenant un graphique sous la forme d'un camembert.

Code : Tout sélectionner

Enumeration
  #Database
EndEnumeration

Enumeration Windows
  #MainForm
EndEnumeration

Enumeration Gadgets
  #Canvas
  #Control
EndEnumeration

Global ReqSql.s

Structure PosteBudgetaire
  Poste.i
  Montant.i
  Repartition.f ;C'est un pourcentage
EndStructure

Global NewList Budget.PosteBudgetaire(),  MontantTotal

;Graphique
Procedure Pie(x, y, start.f, finish.f, radius.f, color = 0)   
   Protected x0, y0, x1, y1, xf, yf
   
   If start > finish : start - 360 : EndIf
   If finish - start > 360 : finish = start + 360 : EndIf
   
   DrawingMode(#PB_2DDrawing_Outlined)
   Circle(x, y, radius, color)
   
   x0 = x + Cos(Radian(start)) * radius
   y0 = y + Sin(Radian(start)) * radius
   x1 = x + Cos(Radian(finish)) * radius
   y1 = y + Sin(Radian(finish)) * radius
   
   LineXY(x0, y0, x, y, color)
   LineXY(x, y, x1, y1, color)
   
   xf = radius/2 * (Cos(Radian((start+finish)/2))) + x
   yf = radius/2 * (Sin(Radian((start+finish)/2))) + y
   FillArea(xf, yf, color, color ! 1)
EndProcedure

;Base de données 
Procedure CalcBudget()
  If OpenDatabase(#Database, ":memory:", "", "")
    
    ;Création de la table budget
    ReqSql = "CREATE TABLE budget("
    ReqSql + "poste INTEGER,"   ;Poste budgétaire
    ReqSql + "montant INTEGER"  ;Montant
    ReqSql + ");"
    DatabaseUpdate(#DataBase, ReqSql)       
        
    ;Ajout d'un jeu de test 
    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 100 et 1000
      DatabaseUpdate(#Database, ReqSql)
    Next
    
    ;Visualisation des enregistrements de la table budget
    AddGadgetItem(#Control, -1, "■ Visualisation du jeu de test")
    ReqSql = "SELECT * FROM budget ORDER BY poste ASC" ;
    DatabaseQuery(#Database, ReqSql) 
    While NextDatabaseRow(#Database)
      AddGadgetItem(#Control, -1, "Poste " + Str(GetDatabaseLong(#Database, 0)) + " => " + Str(GetDatabaseLong(#Database, 1)) + " Euros")
    Wend
    
    ;Calcul du montant total
    ReqSql = "SELECT SUM(montant) FROM budget"
    DatabaseQuery(#Database, ReqSql) 
    NextDatabaseRow(#Database)
    MontantTotal = GetDatabaseLong(#Database, 0)
    AddGadgetItem(#Control, -1,  LSet("", 50 ,"="))
    AddGadgetItem(#Control, -1, "Montant total "+ MontantTotal + " Euros")
    AddGadgetItem(#Control, -1,  "")
    
    ;Calcul de la répartition budgétaire
    AddGadgetItem(#Control, -1, "■ Répartition budgétaire")
    ReqSql = "SELECT poste, SUM(montant) FROM budget GROUP BY poste"
    DatabaseQuery(#Database, ReqSql) 
     
    While NextDatabaseRow(#Database)
      AddElement(Budget())
      Budget()\Poste = GetDatabaseLong(#Database, 0)
      Budget()\Montant = GetDatabaseLong(#Database, 1)
      Budget()\Repartition = Round((Budget()\Montant / MontantTotal)*100, #PB_Round_Nearest)
            
      AddGadgetItem(#Control, -1, "Total poste " + Str(GetDatabaseLong(#Database, 0)) + " => " + Str(GetDatabaseLong(#Database, 1)) + " Euros (" +  Budget()\Repartition + "%)")
    Wend
  Else
    MessageRequester("Ooops", "Une erreur à l'ouverture de la base de données " + DatabaseError())   
  EndIf
EndProcedure

;Représentation graphique du résultat
Procedure DrawResult()
  Protected DrawStart.f, DrawFinish.f, Radius.f = 150
  
  StartDrawing(CanvasOutput(#Canvas))
  Box(0, 0, 400, 400, RGB(233, 231, 225))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawText(150, 20, "Recette/Dépense", RGB(0, 0, 0))
  
  ForEach Budget()
    DrawingMode(#PB_2DDrawing_Default)
    DrawFinish = DrawStart + (360 *Budget()\Repartition) / 100
    
    Select Budget()\Poste
      Case 1 ;Recete
        Pie(200, 200, DrawStart, DrawFinish, Radius, RGB(110, 185, 64))
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(10, 370, "Recette " + Str(budget()\Repartition) + " %", RGB(110, 185, 64))
        
      Case 2 ;Dépense
        Pie(200, 200, DrawStart, DrawFinish, Radius, RGB(226, 43, 23))
        DrawingMode(#PB_2DDrawing_Transparent)
        DrawText(250, 370, "Dépense " + Str(budget()\Repartition) + " %", RGB(226, 43, 23))
        
    EndSelect
    DrawStart + (360 * Budget()\Repartition) / 100
  Next
  StopDrawing()
EndProcedure

Procedure MainForm_Show()
  If OpenWindow(#MainForm, 0, 0, 800, 450, "Mon budget")
    CanvasGadget(#Canvas, 10, 10, 400, 400)
    ListViewGadget(#Control, 420, 10, 370, 400)
    ProcedureReturn #True
  EndIf
EndProcedure  

If MainForm_Show()
  UseSQLiteDatabase()
  CalcBudget()
  DrawResult()
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
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 »

Super falsam je vais regarder ça merci
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 »

Désolé kernadec j'ai oublié de te remercier pour le lien. merci ;-)

Falsam pour dessiner le graphique ça fonctionne bien mais je n'arrive toujours pas à savoir comment comptabiliser le nombre de fois ou je retrouve les même catégorie dans ma base de donnés (toujours en me basant sur mon code d'exemple).
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 :comment comptabiliser le nombre de fois ou je retrouve les même catégorie dans ma base de donnés (toujours en me basant sur mon code d'exemple).
Ce que tu veux faire, c'est compter le nombre de fois ou apparaît une catégorie dans ta base de données.

En préambule : Je reprend le code simplifié que j'ai posté car que ce soit une catégorie ou un poste budgétaire, cela revient au même et le code est réduit à l'essentiel.
Pour la compréhension du code, les ordre SQL sont en majuscule.


A faire:
Sélectionner "SELECT" l'ensemble des enregistrement de ta table en ne tenant compte que du poste budgétaire.
Regrouper les postes budgétaires "GROUP BY poste".
Pour chaque poste budgétaire, compter le nombre de fois ou il apparaît "COUNT(poste)"
Et enfin pour la présentation, trier les postes dans l'ordre ascendant "ORDER BY poste ASC"

C'est parti pour le code

Code : Tout sélectionner

Enumeration
  #Database
EndEnumeration

Global ReqSql.s

;Base de données 
Procedure CalcBudget()
  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)
    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 ""
    
    ;Combien de fois apparait un poste budgétaire (Ou une quatégorie)
    Debug "Dénombrement"
    ReqSql = "SELECT Poste, COUNT(poste) FROM budget GROUP BY Poste ORDER BY poste ASC"
    DatabaseQuery(#Database, ReqSql) 
    While NextDatabaseRow(#Database)            
      Debug "le poste " + Str(GetDatabaseLong(#Database, 0)) + " apparait " + Str(GetDatabaseLong(#Database, 1)) + " Fois "
    Wend
    
  Else
    Debug DatabaseError()   
  EndIf
EndProcedure

UseSQLiteDatabase()
CalcBudget()
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 »

Super merci falsam je te sauterais bien dessus pour te remercier mais je suis marié lol merci.
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 :Super merci falsam je te sauterais bien dessus pour te remercier mais je suis marié lol merci.
Un jour je viendrais peut être dans ta région. Tu dois surement connaitre un bon troquet :)
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%
Répondre