Page 2 sur 3

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

Publié : mar. 12/août/2014 22:28
par MetalOS
Je vient de mettre un code sur le poste d'avant.

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

Publié : mar. 12/août/2014 23:05
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 :)

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

Publié : mar. 12/août/2014 23:12
par MetalOS
Désolé mais j'ai toujours une erreur :oops:

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

Publié : mar. 12/août/2014 23:15
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

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

Publié : mar. 12/août/2014 23:19
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:

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

Publié : mer. 13/août/2014 9:13
par Micoute
Quand ça veut pas, ça veut pas !

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

Publié : jeu. 11/sept./2014 17:14
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 ?

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

Publié : ven. 12/sept./2014 7:54
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

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

Publié : ven. 12/sept./2014 10:44
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()

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

Publié : ven. 12/sept./2014 10:46
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

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

Publié : ven. 12/sept./2014 10:48
par MetalOS
Super falsam je vais regarder ça merci

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

Publié : sam. 13/sept./2014 6:51
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).

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

Publié : sam. 13/sept./2014 10:00
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()

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

Publié : sam. 13/sept./2014 10:20
par MetalOS
Super merci falsam je te sauterais bien dessus pour te remercier mais je suis marié lol merci.

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

Publié : sam. 13/sept./2014 10:24
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 :)