Re: [TUTO débutants] les modules
Publié : dim. 19/août/2018 16:58
@Micoute : En principe c'est un tutoriel sur les modules et ..... je ne vois pas de module.
Code : Tout sélectionner
InsertJSONList(JSONValue(#FichierJSON), produits())
Code : Tout sélectionner
SaveJSON(#FichierJSON, FichierJson, #PB_JSON_PrettyPrint)
Code : Tout sélectionner
;Gestion Liste d'achats
; 13 avril 2018
; PB 5.70
; par Micoute
DeclareModule Remplissage
Enumeration Fichiers
#FichierJSON
EndEnumeration
Enumeration Fenetres
#Fenetre_edition
EndEnumeration
Enumeration Gadgets
#Liste_produits
#Txt_Magasin
#Txt_Rayon
#Txt_Nom_Produit
#Txt_CP
#Txt_Ville
#Str_Magasin
#Str_Rayon
#Str_Nom_Produit
#Btn_Nouveau
#Btn_Maj
#Btn_Supprimer
#Btn_Sauvegarder
#Btn_Quitter
#Txt_Nb_Enreg
EndEnumeration
Enumeration Polices
#Police
#Police2
#Police_Txt
EndEnumeration
;Structure d'un produit
Structure Produit
Magasin.s
Rayon.s
Produit.s
EndStructure
Global.l Evenement
;Création d'une liste vierge pour les produits
Global NewList produits.produit()
Global$ FichierJson = "D:\Programmation\Donnees\produits_achats.json"
Declare Quitter()
Declare Charger_produits()
Declare GestionEvenements()
Declare Nouveauproduit()
Declare Selectionproduit()
Declare Supprimerproduit()
Declare Majproduit()
Declare Sauvegardeproduits()
LoadFont(#Police, "Cambria", 16, #PB_Font_Bold)
LoadFont(#Police_Txt, "A_Nefel_Botan", 10, #PB_Font_Bold)
LoadFont(#Police2, "FontAwesome", 18, #PB_Font_Bold)
EndDeclareModule
Module Remplissage
Macro TrierListeStruc(_NomListe_, _Options_, _Champ_Structure_)
; Cette macro simplifie l'utilisation de la fonction intégrée SortStructuredList().
SortStructuredList(_NomListe_, _Options_, OffsetOf(_Champ_Structure_), TypeOf(_Champ_Structure_))
EndMacro
Procedure Quitter()
CloseWindow(#Fenetre_edition)
End
EndProcedure
;Chargement des produits existants
Procedure Charger_produits()
If ReadFile(#FichierJSON, FichierJson)
CloseFile(#FichierJSON)
;Lecture du fichier JSON
LoadJSON(#FichierJSON, FichierJson, #PB_JSON_NoCase)
;Extraction de la chaine JSON vers la liste chainée produits
ExtractJSONList(JSONValue(#FichierJSON), produits())
TrierListeStruc(produits(), #PB_Sort_Ascending, produit\Produit)
TrierListeStruc(produits(), #PB_Sort_Ascending, produit\Rayon)
TrierListeStruc(produits(), #PB_Sort_Ascending, produit\Magasin)
;Affichage de la liste des produits
ForEach(produits())
With produits()
AddGadgetItem(#Liste_produits, -1, \Magasin + #LF$ + \Rayon + #LF$ + \Produit)
SetGadgetItemData(#Liste_produits, CountGadgetItems(#Liste_produits)-1, ListIndex(produits()))
EndWith
Next
EndIf
EndProcedure
;Gestionnaire de contrôle de la saisie
Procedure GestionEvenements()
Protected Evenement = EventType()
Select Evenement
Case #PB_EventType_Change
If Trim(GetGadgetText(#Str_Magasin)) <> ""
DisableGadget(#Btn_Nouveau, #True)
DisableGadget(#Btn_Maj, #False)
DisableGadget(#Btn_Sauvegarder, #False)
Else
DisableGadget(#Btn_Nouveau, #False)
DisableGadget(#Btn_Maj, #True)
DisableGadget(#Btn_Sauvegarder, #True)
EndIf
EndSelect
EndProcedure
;Nouveau produit (Remise à zéro des champs de saisie)
Procedure Nouveauproduit()
SetWindowData(#Fenetre_edition, 0) ;C'est une création
SetGadgetText(#Str_Magasin, "")
SetGadgetText(#Str_Rayon, "")
SetGadgetText(#Str_Nom_Produit, "")
DisableGadget(#Btn_Nouveau, #False)
DisableGadget(#Btn_Maj, #True)
DisableGadget(#Btn_Supprimer, #True)
SetGadgetText(#Btn_Maj, Chr($F067))
SetActiveGadget(#Str_Magasin)
EndProcedure
;Un produit est sélectionné dans la liste
Procedure Selectionproduit()
Protected Item = GetGadgetState(#Liste_produits)
If Item <> -1
SelectElement(produits(), GetGadgetItemData(#Liste_produits, Item))
With produits()
SetGadgetText(#Str_Magasin, \Magasin)
SetGadgetText(#Str_Rayon, \Rayon)
SetGadgetText(#Str_Nom_Produit, \Produit)
EndWith
EndIf
;C'est une modification de produit
SetWindowData(#Fenetre_edition, 1)
DisableGadget(#Btn_Nouveau, #False)
DisableGadget(#Btn_Maj, #False)
DisableGadget(#Btn_Supprimer, #False)
SetGadgetText(#Btn_Maj, Chr($F040))
SetActiveGadget(#Str_Magasin)
EndProcedure
;Suppression d'un produit
Procedure Supprimerproduit()
If MessageRequester("Information", "Etes vous sûr de supprimer un produit ?" + #CRLF$ + "cette action est irrémédiable !", #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
SetWindowData(#Fenetre_edition, 3) ;C'est une suppression
Majproduit()
EndIf
EndProcedure
;Gestionnaire de mise à jour des produits
Procedure Majproduit()
Protected.s Magasin = GetGadgetText(#Str_Magasin)
Protected.s Rayon = GetGadgetText(#Str_Rayon)
Protected.s Nom_Produit = GetGadgetText(#Str_Nom_Produit)
DisableGadget(#Btn_Sauvegarder, 0)
Select GetWindowData(#Fenetre_edition)
Case 0 ;Création d'un produit
AddElement(produits())
With produits()
\Magasin = Magasin
\Rayon = Rayon
\Produit = Nom_Produit
AddGadgetItem(#Liste_produits, -1, \Magasin + #LF$ + \Rayon + #LF$ + \Produit)
SetGadgetItemData(#Liste_produits, CountGadgetItems(#Liste_produits)-1, ListIndex(produits()))
EndWith
Case 1 ;Modification d'un produit
With produits()
\Magasin = Magasin
\Rayon = Rayon
\Produit = Nom_Produit
SetGadgetItemText(#Liste_produits, ListIndex(produits()), \Magasin, 0)
SetGadgetItemText(#Liste_produits, ListIndex(produits()), \Rayon, 1)
SetGadgetItemText(#Liste_produits, ListIndex(produits()), \Produit, 2)
EndWith
Nouveauproduit()
Case 3 ;Suppression d'un produit
RemoveGadgetItem(#Liste_produits, ListIndex(produits()))
DeleteElement(produits())
;Mise à jour des index de liaison ListIconGadget <-> produits()
ForEach(produits())
SetGadgetItemData(#Liste_produits, ListIndex(produits()), ListIndex(produits()))
Next
EndSelect
EndProcedure
;Sauvegarde automatique des produits à la fermeture de l'application
Procedure Sauvegardeproduits()
;Création d'un objet JSON
CreateJSON(#FichierJSON)
;Insertion de la liste chainée "produits" dans l'objet JSON
InsertJSONList(JSONValue(#FichierJSON), produits())
;Sauvegarde du fichier
SaveJSON(#FichierJSON, FichierJson, #PB_JSON_PrettyPrint)
MessageRequester("Information", "Le fichier " + #DQUOTE$ + GetFilePart(FichierJson) + #DQUOTE$ + " a été sauvegardé" + #LF$ + #LF$ + "et va se fermer", #PB_MessageRequester_Info)
Quitter()
EndProcedure
EndModule
Procedure Programme_principal()
UseModule Remplissage
If OpenWindow(#Fenetre_edition, 767, 175, 520, 500, "Base de données", #PB_Window_TitleBar|#PB_Window_ScreenCentered)
SetWindowColor(#Fenetre_edition, $F8BFB8)
SetGadgetFont(#PB_Default, FontID(#Police))
ListIconGadget(#Liste_produits, 10, 10, WindowWidth(#Fenetre_edition)-20, 260, "Rayon", 130, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection|#PB_ListIcon_HeaderDragDrop)
AddGadgetColumn(#Liste_produits, 1, "Produit", 130)
AddGadgetColumn(#Liste_produits, 2, "Nom", 220)
TextGadget(#Txt_Magasin, 10, 280, 140, 25, "Magasin", #PB_Text_Right)
TextGadget(#Txt_Rayon, 10, 310, 140, 25, "Rayon", #PB_Text_Right)
TextGadget(#Txt_Nom_Produit, 10, 340, 140, 25, "Nom produit", #PB_Text_Right)
StringGadget(#Str_Magasin, 160, 280, 350, 25, "")
StringGadget(#Str_Rayon, 160, 310, 350, 25, "")
StringGadget(#Str_Nom_Produit, 160, 340, 350, 25, "")
ButtonGadget(#Btn_Nouveau, 10, 400, 130, 40, "Nouveau")
ButtonGadget(#Btn_Maj, 200, 400, 130, 40, "Mise à jour")
ButtonGadget(#Btn_Supprimer, 380, 400, 130, 40, "Supprimer")
ButtonGadget(#Btn_Sauvegarder, 10, 450, 130, 40, "Sauvegarder")
ButtonGadget(#Btn_Quitter, 380, 450, 130, 40, "Quitter")
TextGadget(#Txt_Nb_Enreg, 180, 460, 200, 25, "")
;Lectures des produits
Charger_produits()
For i = #Btn_Nouveau To #Btn_Quitter
SetGadgetFont(i, FontID(#Police2))
Next i
SetGadgetText(#Txt_Nb_Enreg, Str(ListSize(produits())) + " enregistrements")
SetGadgetColor(#Txt_Nb_Enreg, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_edition))
For i = #Txt_Magasin To #Txt_Nom_Produit
SetGadgetFont(i, FontID(#Police_Txt))
SetGadgetFont(#Txt_Nb_Enreg, FontID(#Police_Txt))
SetGadgetColor(i, #PB_Gadget_BackColor, GetWindowColor(#Fenetre_edition))
Next i
For i = #Str_Magasin To #Str_Nom_Produit
SetGadgetFont(i, FontID(#Police_Txt))
SetGadgetColor(i, #PB_Gadget_BackColor, $B8F7F8)
Next i
For i = 0 To CountGadgetItems(#Liste_produits) ;ListIconGadget
If i%2 = 1 ; si notre compteur est pair
SetGadgetItemColor(#Liste_produits, i, #PB_Gadget_FrontColor, $0000FF)
SetGadgetItemColor(#Liste_produits, i, #PB_Gadget_BackColor, $FFE8FF)
Else ; sinon, s'il est impair
SetGadgetItemColor(#Liste_produits, i, #PB_Gadget_FrontColor, $FF0000)
SetGadgetItemColor(#Liste_produits, i, #PB_Gadget_BackColor, $FFE9E8)
EndIf
Next i
;Contrôle de la saisie (Le Magasin ou la raison sociale est obligatoire)
BindGadgetEvent(#Str_Magasin, @GestionEvenements())
;Mise en place d'un nouveau produit
BindGadgetEvent(#Btn_Nouveau, @Nouveauproduit())
;Un produit est selectionné dans la liste
BindGadgetEvent(#Liste_produits, @Selectionproduit())
;Ajout ou modification d'un produit
BindGadgetEvent(#Btn_Maj, @Majproduit())
;Supression d'un produit
BindGadgetEvent(#Btn_Supprimer, @Supprimerproduit())
;Fermeture de l'application et sauvegarde des produits
BindGadgetEvent(#Btn_Sauvegarder, @Sauvegardeproduits())
;Quitter le programme sans sauvegarder
BindEvent(#PB_Event_CloseWindow, @Quitter())
BindGadgetEvent(#Btn_Quitter, @Quitter())
DisableGadget(#Btn_Sauvegarder, #True)
;DisableGadget(#Btn_Nouveau, #False)
Nouveauproduit()
SetActiveGadget(#Str_Magasin)
EndIf
EndProcedure
Programme_principal()
;- Boucle
Repeat
Evenement = WaitWindowEvent()
Select Evenement
Case #PB_Event_Gadget
Select EventGadget()
Case #Btn_Quitter
Quitter()
EndSelect
Case #PB_Event_CloseWindow
Select EventWindow()
Case #Fenetre_edition
Quitter()
Break
EndSelect
EndSelect
ForEver
Code : Tout sélectionner
IncludeFile "3Dultimate.pbi"
UseModule 3D
3D::CreateCube()
Omega a écrit :Quelle est le type de bases de données préféré pour un logiciel de gestion commerciale?
Fichier.Data? Fichier.Json? .Sqlite?Merci
Code : Tout sélectionner
Enumeration Fenetres
#Fenetre_edition
EndEnumeration
Savoir que comme pour les fichiers XML, les fichiers JSON au niveau disque, on lit ou écrit tout le fichier à chaque fois.Je viens de jeter un coup d'oeil sur les fichiers Json. Je voudrais juste savoir pourquoi choisir Json (avantage par rapport à sqlite par exemple)
J'ai besoin au moins de 3000 enregistrements (c'est le contenu de mon fichier livraison (base sqlite).Les fichier JSON c'est bien pour sauver un paquet de données disparates ou pour de petites bases type carnet d'adresse, mais pour quelques centaines d’enregistrements ou plus ce n'est pas adapté.
Non pas du tout.microdevweb a écrit :Par contre chaque recherche va demander de parcourir toute la liste jusqu’à trouvé le bon record