Dans cette exemple nous gérer un fichier clients
Code : Tout sélectionner
;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : TUTO développement modulaire
; Deccription : Allez plus loin, gestion de client
; File Name : AllezPlusLoin.pb
;************************************************************************************************************************
DeclareModule myMacro
Macro EntreCote(TXT)
Chr(34)+TXT+Chr(34)
EndMacro
EndDeclareModule
Module myMacro
EndModule
DeclareModule db
;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
Global DbName.s,user.s,psw.s
;}
;-* PUBLIC DECLARATION
Declare Create()
Declare Query(query.s)
Declare Update(query.s)
;}
EndDeclareModule
Module db
EnableExplicit
UseSQLiteDatabase()
;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
Global myDb
;}
;-* LOCAL DECLARATION
Declare FileCreate()
Declare OpenDb()
;}
;-* PRIVATE PROCEDURE
Procedure FileCreate()
; Le fichier existe pas besoin de le créer
If FileSize(DbName)<>-1:ProcedureReturn :EndIf
; Création du fichier
If CreateFile(0,DbName)=0
MessageRequester("Erreur création fichier","Le fichier "+DbName+" n'a pas peu être créé")
End
EndIf
CloseFile(0)
EndProcedure
Procedure OpenDb()
FileCreate()
myDb=OpenDatabase(#PB_Any,DbName,user,psw)
If myDb=0
MessageRequester("Erreur base de données","impossible d'ouvrir la base de donnée")
End
EndIf
EndProcedure
;}
;-* PUBLIC PROCEDURE
Procedure Create()
Protected query.s
query="CREATE TABLE IF NOT EXISTS client ("
query+"id INTEGER PRIMARY KEY,"
query+"name TEXT,"
query+"localite TEXT,"
query+"adresse TEXT)"
If Not Update(query)
End
EndIf
EndProcedure
Procedure Query(query.s)
OpenDb()
If DatabaseQuery(myDb,query)=0
MessageRequester("Erreur base de donnée",DatabaseError())
CloseDatabase(myDb)
ProcedureReturn 0
EndIf
ProcedureReturn myDb
EndProcedure
Procedure Update(query.s)
OpenDb()
If DatabaseUpdate(myDb,query)=0
MessageRequester("Erreur base de donnée",DatabaseError())
CloseDatabase(myDb)
ProcedureReturn #False
EndIf
CloseDatabase(myDb)
ProcedureReturn #True
EndProcedure
;}
EndModule
DeclareModule ClientFIC
;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
Enumeration
#NEW
#EDIT
EndEnumeration
;}
;-* PUBLIC DECLARATION
Declare SetMode(mode=ClientFIC::#NEW)
Declare Open(MotherWindow)
Declare SetRefreshCallback(*callback)
Declare SetCurrentID(Id)
;}
EndDeclareModule
Module ClientFIC
EnableExplicit
;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
Global Form,myMotherWindow,myMode=#NEW
Global TxtNom,StrNom,TxtLocalite,StrLocalite,TxtAdresse,StrAdresse
Global btSubmit,btChancel,*refreshCallback=-1,CurrentID
;}
;-* LOCAL DECLARATION
;}
;-* PRIVATE PROCEDURE
Procedure Exit()
DisableWindow(myMotherWindow,#False)
CloseWindow(Form)
SetActiveWindow(myMotherWindow)
EndProcedure
Procedure AddClient()
Protected query.s
query="INSERT INTO client ("
query+"name,"
query+"localite,"
query+"adresse) VALUES ("
query+myMacro::EntreCote(GetGadgetText(StrNom))+","
query+myMacro::EntreCote(GetGadgetText(StrLocalite))+","
query+myMacro::EntreCote(GetGadgetText(StrAdresse))
query+")"
If db::Update(query)
If *refreshCallback<>-1
CallFunctionFast(*refreshCallback)
EndIf
Exit()
EndIf
EndProcedure
Procedure SaveClient()
Protected query.s
query="UPDATE client SET "
query+"name="+myMacro::EntreCote(GetGadgetText(StrNom))+","
query+"localite="+myMacro::EntreCote(GetGadgetText(StrLocalite))+","
query+"adresse="+myMacro::EntreCote(GetGadgetText(StrAdresse))
query+" WHERE id="+Str(CurrentID)
If db::Update(query)
CallFunctionFast(*refreshCallback)
Exit()
EndIf
EndProcedure
Procedure EventMyGadget()
Select EventGadget()
Case btSubmit
Select myMode
Case #NEW
AddClient()
Case #EDIT
SaveClient()
EndSelect
Case btChancel
Exit()
EndSelect
EndProcedure
Procedure FillGadget()
Protected query.s,db
query="SELECT name,localite,adresse FROM client WHERE id="+Str(CurrentID)
db=db::Query(query)
If db>0
If FirstDatabaseRow(db)
SetGadgetText(StrNom,GetDatabaseString(db,0))
SetGadgetText(StrLocalite,GetDatabaseString(db,1))
SetGadgetText(StrAdresse,GetDatabaseString(db,2))
EndIf
EndIf
CloseDatabase(db)
EndProcedure
;}
;-* PUBLIC PROCEDURE
Procedure SetRefreshCallback(*callback)
*refreshCallback=*callback
EndProcedure
Procedure SetMode(mode=ClientFIC::#NEW)
myMode=mode
EndProcedure
Procedure SetCurrentID(Id)
CurrentID=Id
EndProcedure
Procedure Open(MotherWindow)
myMotherWindow=MotherWindow
DisableWindow(myMotherWindow,#True)
Protected Flag=#PB_Window_SystemMenu|#PB_Window_ScreenCentered
Protected WF=400,HF=260
Protected Marg=10,X=Marg,Y=Marg
Protected WG=WF-(Marg*2),HG=30
Protected WBT=(WF/2)-(Marg*2)
Protected title.s
Select myMode
Case #NEW
title="Nouveau client"
Case #EDIT
title="Edition d'un client"
EndSelect
Form=OpenWindow(#PB_Any,0,0,WF,HF,title,Flag,WindowID(myMotherWindow))
TxtNom=TextGadget(#PB_Any,X,Y,WG,HG,"Nom")
Y+HG
StrNom=StringGadget(#PB_Any,X,Y,WG,HG,"")
Y+HG+Marg
TxtLocalite=TextGadget(#PB_Any,X,Y,WG,HG,"Localité")
Y+HG
StrLocalite=StringGadget(#PB_Any,X,Y,WG,HG,"")
Y+HG+Marg
TxtAdresse=TextGadget(#PB_Any,X,Y,WG,HG,"Adresse")
Y+HG
StrAdresse=StringGadget(#PB_Any,X,Y,WG,HG,"")
Y+HG+Marg
btSubmit=ButtonGadget(#PB_Any,X,Y,WBT,HG,"Valider")
X+WBT+Marg
btChancel=ButtonGadget(#PB_Any,X,Y,WBT,HG,"Annuler")
; Mise en place des callback
BindEvent(#PB_Event_CloseWindow,@Exit(),Form)
BindEvent(#PB_Event_Gadget,@EventMyGadget(),Form)
SetActiveGadget(StrNom)
If myMode=#EDIT
FillGadget()
EndIf
EndProcedure
;}
EndModule
DeclareModule ClientTAB
;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
;}
;-* PUBLIC DECLARATION
Declare RefreshList()
Declare Open()
;}
EndDeclareModule
Module ClientTAB
EnableExplicit
;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
Global Form,LstCLient,BtNew,BtEdit,BtDelete,BtExit
;}
;-* LOCAL DECLARATION
;}
;-* PRIVATE PROCEDURE
Procedure Exit()
End
EndProcedure
Procedure DeleteClient()
Protected query.s
If MessageRequester("Liste des clients","Etes-vous sure de vouloir supprimer cet enregistrment?",#PB_MessageRequester_YesNo)=#PB_MessageRequester_No
ProcedureReturn
EndIf
query="DELETE FROM client WHERE id="+Str(GetGadgetItemData(LstCLient,GetGadgetState(LstCLient)))
If db::Update(query)
RefreshList()
EndIf
EndProcedure
Procedure EventButton()
ClientFIC::SetRefreshCallback(@RefreshList())
Select EventGadget()
Case BtNew
ClientFIC::SetMode(ClientFIC::#NEW)
ClientFIC::Open(Form)
Case BtEdit
If GetGadgetState(LstCLient)=-1
MessageRequester("Liste des clients","Aucun client n'est sélectionné")
ProcedureReturn
EndIf
ClientFIC::SetMode(ClientFIC::#EDIT)
ClientFIC::SetCurrentID(GetGadgetItemData(LstCLient,GetGadgetState(LstCLient)))
ClientFIC::Open(Form)
Case BtExit
Exit()
Case BtDelete
If GetGadgetState(LstCLient)=-1
MessageRequester("Liste des clients","Aucun client n'est sélectionné")
ProcedureReturn
EndIf
DeleteClient()
EndSelect
EndProcedure
;}
;-* PUBLIC PROCEDURE
Procedure RefreshList()
Protected query.s,db,N
query="SELECT id,name,localite FROM client ORDER BY name"
db=db::Query(query)
If db>0
ClearGadgetItems(LstCLient)
While NextDatabaseRow(db)
AddGadgetItem(LstCLient,-1,GetDatabaseString(db,1)+Chr(10)+GetDatabaseString(db,2))
SetGadgetItemData(LstCLient,N,GetDatabaseLong(db,0))
N+1
Wend
CloseDatabase(db)
EndIf
EndProcedure
Procedure Open()
Protected Flag=#PB_Window_SystemMenu|#PB_Window_ScreenCentered
; Taille de la fenêtre
Protected WF=400,HF=600
; Marge/taille boutons / taille liste
Protected WBT=100,HBT=30,Marg=10,HL=HF-(Marg*2),WL=WF-(Marg*3)-WBT
; Position X /Y
Protected X=Marg,Y=Marg
Form=OpenWindow(#PB_Any,0,0,WF,HF,"Liste des clients",Flag)
LstCLient=ListIconGadget(#PB_Any,X,Y,WL,HL,"Nom",WL*0.5,#PB_ListIcon_FullRowSelect)
AddGadgetColumn(LstCLient,1,"Localité",(WL*0.5)-5)
; Position des boutons
X+WL+Marg
BtNew=ButtonGadget(#PB_Any,X,Y,WBT,HBT,"Nouveau")
Y+HBT+Marg
BtEdit=ButtonGadget(#PB_Any,X,Y,WBT,HBT,"Editer")
Y+HBT+Marg
BtDelete=ButtonGadget(#PB_Any,X,Y,WBT,HBT,"Supprimer")
Y+HBT+Marg
BtExit=ButtonGadget(#PB_Any,X,Y,WBT,HBT,"Quitter")
; Mise en place des callback
BindEvent(#PB_Event_CloseWindow,@Exit(),Form)
BindEvent(#PB_Event_Gadget,@EventButton(),Form)
; Affiche les éléments
RefreshList()
EndProcedure
;}
EndModule
; Lancement du logiciel
; initialisation de la base de données
db::DbName="client.sqlite"
db::user=""
db::psw=""
db::Create()
ClientTAB::Open()
Repeat:WaitWindowEvent():ForEver