[TUTO] Programmation structurée
- microdevweb
- Messages : 1800
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
[TUTO] Programmation structurée
Bonjour à tous,
En voyant un code sur le forum un code qui est vraiment codé d'une façon déstructurée, je mes suis dis que je ferais bien un petit tuto la dessus.
On va développé un petit soft de contact de façon modulaire. Le soft aura deux couche, une couche model pour la gestion des données et une couche View pour les interactions avec l'utilisateur. Le gros avantage de ce type de développement réside dans la facilité de maintenance et le fait de pouvoir réutiliser facilement les modules pour d'autres projet (gain de temps et ainsi d'argent). En plus si imaginons l'on devais changé de type de Db (sqlite vers exemple postgresql) on ne devra modifié q'un seul module.
La première partie va implémenté le système pour toute utilisation futur et évidement j'ai choisi la plus petite table (Pays)
Module Db qui sera utilisé par tous les autre modules (model)
Module Countries_DB.pbi
Module Cities_DB.pbi
Module Contacts_DB
Module main pour le teste du model
Une fois le premier module réalisé il suffis de faire un copié coller et de modié les données nécessaire.
Evidemment c'est un model simple dans une application plus complexe il faudra ajouté des fonctions.
Voila le model est terminé, prochaine étape la couche view.
La couche view
Le module
MainForm.pbi
Le module Countries_TAB
Le module Country_FIC.pbi
Le main pour le teste (model et view)
En voyant un code sur le forum un code qui est vraiment codé d'une façon déstructurée, je mes suis dis que je ferais bien un petit tuto la dessus.
On va développé un petit soft de contact de façon modulaire. Le soft aura deux couche, une couche model pour la gestion des données et une couche View pour les interactions avec l'utilisateur. Le gros avantage de ce type de développement réside dans la facilité de maintenance et le fait de pouvoir réutiliser facilement les modules pour d'autres projet (gain de temps et ainsi d'argent). En plus si imaginons l'on devais changé de type de Db (sqlite vers exemple postgresql) on ne devra modifié q'un seul module.
La première partie va implémenté le système pour toute utilisation futur et évidement j'ai choisi la plus petite table (Pays)
Module Db qui sera utilisé par tous les autre modules (model)
Module Countries_DB.pbi
Module Cities_DB.pbi
Module Contacts_DB
Module main pour le teste du model
Une fois le premier module réalisé il suffis de faire un copié coller et de modié les données nécessaire.
Evidemment c'est un model simple dans une application plus complexe il faudra ajouté des fonctions.
Voila le model est terminé, prochaine étape la couche view.
La couche view
Le module
MainForm.pbi
Le module Countries_TAB
Le module Country_FIC.pbi
Le main pour le teste (model et view)
Dernière modification par microdevweb le sam. 18/août/2018 14:37, modifié 9 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- microdevweb
- Messages : 1800
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: [TUTO] Programmation structurée
Code module DB.bpi
Code : Tout sélectionner
;********************************************************
; TUTO FAC
;********************************************************
; Author : MicrodevWeb
; MODULE : DB
; VERSION : 1
; DESIGNED WITH : PB 5.62
; DOT IT : Accède à la base de données
;********************************************************
DeclareModule DB
Declare.b baseExists()
Declare openBase()
Declare closeBase(id)
Declare.b update(request.s)
Declare query(request.s)
Declare getLastId(table.s)
EndDeclareModule
Module DB
;-* INTITIALISATION
EnableExplicit ; les variables doivent être déclarées
UseSQLiteDatabase() ; on va utilisé sqlite
;}
;-* GLOBAL VARIABLES OF MODULE
; on déclare ici les variables qui ne seront accesible que dans le code du module
Global.s baseDirectory = "Data",baseName = "DbFac.db"
;}
;-* PROTOTYPES OF FUNCTIONS
Declare _createBase()
;}
;-* PRIVATE FUNCTIONS
; on déclare ici les fonctions qui ne seront accessible que dans le code du module
Procedure _createBase()
Protected idFile
; on teste si le répertoire existe
If FileSize(baseDirectory) <> -2
If Not CreateDirectory(baseDirectory)
MessageRequester("Create directory ERROR","cannot create the directory "+baseDirectory,#PB_MessageRequester_Error)
End
EndIf
EndIf
If Not baseExists() ; la base n'existe pas
; on la crée
idFile = CreateFile(#PB_Any,baseDirectory+"\"+baseName)
If Not idFile
MessageRequester("Create database file ERROR","cannot create the file "+baseName,#PB_MessageRequester_Error)
End
EndIf
CloseFile(idFile) ; on ferme le fichier pour les utilisations futures
EndIf
EndProcedure
;}
;-* PUBLIC FUNCTIONS
; on déclare ici les fonctions qui ne seront accessible depuis tout le programme
Procedure.b baseExists()
; teste si la base donnée existe
If FileSize(baseDirectory+"\"+baseName) = -1
ProcedureReturn #False
EndIf
ProcedureReturn #True
EndProcedure
Procedure openBase()
Protected currentId
; ouvre la base de donnée
If Not baseExists()
; la base de donnée n'existe pas on la crée
_createBase()
EndIf
; ouverture de la base de donnée
currentId = OpenDatabase(#PB_Any,baseDirectory+"\"+baseName,"","")
ProcedureReturn currentId
EndProcedure
Procedure closeBase(id)
; fermetude de la base de données
With myId
If IsDatabase(id)
CloseDatabase(id)
EndIf
EndWith
EndProcedure
Procedure.b update(request.s)
With myId
Protected currentID = openBase()
If Not currentID
ProcedureReturn #False
EndIf
If Not DatabaseUpdate(currentID,request)
MessageRequester("SQL Update ERROR",request + Chr(10) + DatabaseError(),#PB_MessageRequester_Error)
ProcedureReturn #False
EndIf
closeBase(currentID) ; on ferme la base de données (uniquement pour update)
ProcedureReturn #True
EndWith
EndProcedure
Procedure query(request.s)
With myId
Protected currentID = openBase()
If Not DatabaseQuery(currentId,request)
MessageRequester("SQL query ERROR",request + Chr(10) + DatabaseError(),#PB_MessageRequester_Error)
ProcedureReturn #False
EndIf
ProcedureReturn currentID
EndWith
EndProcedure
Procedure getLastId(table.s)
Protected req.s = "SELECT id FROM "+table+" ORDER by id DESC"
Protected id = query(req)
Protected returnedValue
If id
FirstDatabaseRow(id)
returnedValue = GetDatabaseLong(id,0)
closeBase(id)
ProcedureReturn returnedValue
EndIf
ProcedureReturn #False
EndProcedure
;}
EndModule
Dernière modification par microdevweb le ven. 17/août/2018 15:41, modifié 1 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- microdevweb
- Messages : 1800
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: [TUTO] Programmation structurée
Code Countries_DB.pbi
Code : Tout sélectionner
;********************************************************
; TUTO FAC
;********************************************************
; Author : MicrodevWeb
; MODULE : Countries_DB
; VERSION : 1
; DESIGNED WITH : PB 5.62
; DOT IT : gestion des pays
;********************************************************
DeclareModule Countries_DB
Declare create()
Declare load(whereClause.s = "")
Declare resetRecord()
Declare nextRecord()
Declare find(id)
Declare getId()
Declare.s getName()
Declare setName(name.s)
Declare save()
Declare add(name.s)
Declare delete()
EndDeclareModule
Module Countries_DB
Structure country
id.l
name.s
EndStructure
Global NewList myItems.country()
Global NewMap _myItems.l()
Global currentID
Macro doubleCote
Chr(34)
EndMacro
;-* PRIVATE FUNCTIONS
Procedure _add()
With myItems()
Protected req.s = "INSERT INTO countries (name) VALUES ("+doubleCote+\name+doubleCote+")"
ProcedureReturn DB::update(req)
EndWith
EndProcedure
;}
;-* PUBLIC FUNCTIONS
Procedure create()
; on crée la table uniquement si la base de donnée n'existe pas encore
Protected req.s = "CREATE TABLE IF NOT EXISTS countries ("+
" id INTEGER PRIMARY KEY AUTOINCREMENT,"+
" name TEXT)"
If Not DB::update(req)
End
EndIf
EndProcedure
Procedure load(whereClause.s = "")
; charge les pays depuis la base de données
ClearList(myItems())
Protected request.s = "SELECT * FROM countries "+
whereClause
currentID = DB::query(request)
; charge les records en mémoire
If currentID
With myItems()
While NextDatabaseRow(currentID)
; ajout des élément à la liste
AddElement(myItems())
\id = GetDatabaseLong(currentID,0)
\name = GetDatabaseString(currentID,1)
; on sauve dans une map pour une utilisation future
AddMapElement(_myItems(),Str(\id))
_myItems() = ListIndex(myItems())
Wend
EndWith
EndIf
EndProcedure
Procedure resetRecord()
; ne pointe sur aucun élément de la liste
ResetList(myItems())
EndProcedure
Procedure nextRecord()
ProcedureReturn NextElement(myItems())
EndProcedure
Procedure find(id)
If FindMapElement(_myItems(),Str(id))
ProcedureReturn SelectElement(myItems(),_myItems())
EndIf
ProcedureReturn #False
EndProcedure
Procedure getId()
With myItems()
ProcedureReturn \id
EndWith
EndProcedure
Procedure.s getName()
With myItems()
ProcedureReturn \name
EndWith
EndProcedure
Procedure setName(name.s)
With myItems()
\name = name
EndWith
EndProcedure
Procedure save()
; sauvegarde de l'enregistrement courrant
With myItems()
If Not Len(\name)
MessageRequester("Champs obligatoire","Le nom doit être renseigné",#PB_MessageRequester_Warning)
ProcedureReturn #False
EndIf
Protected req.s = "UPDATE countries SET "+
"name = "+doubleCote+\name+doubleCote+
" WHERE id = "+\id
ProcedureReturn DB::update(req)
EndWith
EndProcedure
Procedure add(name.s)
With myItems()
; ajout de l'élement
AddElement(myItems())
\name = name
; ajoute le record à la db
If _add()
\id = DB::getLastId("countries")
AddMapElement(_myItems(),Str(\id))
_myItems() = ListIndex(myItems())
ProcedureReturn #True
EndIf
DeleteElement(myItems())
ProcedureReturn #False
EndWith
EndProcedure
Procedure delete()
With myItems()
Protected req.s = "DELETE FROM countries "+
" WHERE id = "+\id
If DB::update(req)
DeleteElement(myItems())
FindMapElement(_myItems(),Str(\id))
DeleteMapElement(_myItems())
EndIf
EndWith
EndProcedure
;}
EndModule
Dernière modification par microdevweb le ven. 17/août/2018 15:41, modifié 1 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- microdevweb
- Messages : 1800
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: [TUTO] Programmation structurée
Code main de bébugage
Code : Tout sélectionner
;********************************************************
; TUTO FAC
;********************************************************
; Author : MicrodevWeb
; MODULE : Main
; VERSION : 1
; DESIGNED WITH : PB 5.62
; DOT IT : Fichier principal
;********************************************************
IncludePath "Model/"
XIncludeFile "DB.pbi"
XIncludeFile "Countries_DB.pbi"
XIncludeFile "Cities_DB.pbi"
; création de la base de données
If Not DB::baseExists()
Countries_DB::create()
Cities_DB::create()
EndIf
;-* TEST COUNTRIE
; ajout de donnée pour le teste
Countries_DB::add("Belgique")
Countries_DB::add("France")
Countries_DB::add("Italie")
; lecture des données pour le test
Countries_DB::resetRecord()
While Countries_DB::nextRecord()
Debug Countries_DB::getName()
Wend
; teste de modification
Countries_DB::find(2) ; recherche france
Countries_DB::setName("France debug")
Countries_DB::save()
; lecture des données pour le test
Countries_DB::resetRecord()
While Countries_DB::nextRecord()
Debug Countries_DB::getName()
Wend
; teste suppression
Countries_DB::find(3) ; italie
Countries_DB::delete()
; lecture des données pour le test
Countries_DB::resetRecord()
While Countries_DB::nextRecord()
Debug Countries_DB::getName()
Wend
;}
; ;-* TEST CITIES
; ajout de donnée pour le teste
Cities_DB::add("Waremme","4300",1)
Cities_DB::add("Trooz","4870",1)
Cities_DB::add("Paris","75000",2)
; lecture des données pour le test
Cities_DB::resetRecord()
While Cities_DB::nextRecord()
Debug Cities_DB::getName()
Wend
; teste de modification
Cities_DB::find(2) ; recherche Trooz
Cities_DB::setName("Trooz debug")
Cities_DB::save()
; lecture des données pour le test
Cities_DB::resetRecord()
While Cities_DB::nextRecord()
Debug Cities_DB::getName()
Wend
; teste suppression
Cities_DB::find(3) ; Paris
Cities_DB::delete()
; lecture des données pour le test
Cities_DB::resetRecord()
While Cities_DB::nextRecord()
Debug Cities_DB::getName()
Wend
; ;}
Dernière modification par microdevweb le ven. 17/août/2018 15:44, modifié 1 fois.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- Kwai chang caine
- Messages : 6962
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Re: [TUTO] Programmation structurée
Ca marche ici, merci
- microdevweb
- Messages : 1800
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: [TUTO] Programmation structurée
Module Cities_DB.pbi
Code : Tout sélectionner
;********************************************************
; TUTO FAC
;********************************************************
; Author : MicrodevWeb
; MODULE : Cities_DB
; VERSION : 1
; DESIGNED WITH : PB 5.62
; DOT IT : gestion des pays
;********************************************************
DeclareModule Cities_DB
Declare create()
Declare load(whereClause.s = "")
Declare resetRecord()
Declare nextRecord()
Declare find(id)
Declare getId()
Declare.s getName()
Declare.s getPostalCode()
Declare getIdCountry()
Declare setName(name.s)
Declare setPostalCode(postalCode.s)
Declare setIdCountry(idCountry)
Declare save()
Declare add(name.s,postal_code.s,id_country)
Declare delete()
EndDeclareModule
Module Cities_DB
Structure _struct
id.l
name.s
postal_code.s
id_country.l
EndStructure
Global NewList myItems._struct()
Global NewMap _myItems.l()
Global currentID
Macro doubleCote
Chr(34)
EndMacro
;-* PRIVATE FUNCTIONS
Procedure _add()
With myItems()
Protected req.s = "INSERT INTO cities ("+
"name,"+
"postal_code,"+
"id_country"+
")"+
" VALUES ("+
doubleCote+\name+doubleCote+","+
doubleCote+\postal_code+doubleCote+","+
\id_country+
")"
ProcedureReturn DB::update(req)
EndWith
EndProcedure
;}
;-* PUBLIC FUNCTIONS
Procedure create()
; on crée la table uniquement si la base de donnée n'existe pas encore
Protected req.s = "CREATE TABLE IF NOT EXISTS cities ("+
" id INTEGER PRIMARY KEY AUTOINCREMENT,"+
" name TEXT,"+
" postal_code TEXT,"+
" id_country INTEGER"+
")"
If Not DB::update(req)
End
EndIf
EndProcedure
Procedure load(whereClause.s = "")
; charge les pays depuis la base de données
ClearList(myItems())
Protected request.s = "SELECT * FROM cities "+
whereClause
currentID = DB::query(request)
; charge les records en mémoire
If currentID
With myItems()
While NextDatabaseRow(currentID)
; ajout des élément à la liste
AddElement(myItems())
\id = GetDatabaseLong(currentID,0)
\name = GetDatabaseString(currentID,1)
\postal_code = GetDatabaseString(currentID,2)
\id_country = GetDatabaseLong(currentID,3)
; on sauve dans une map pour une utilisation future
AddMapElement(_myItems(),Str(\id))
_myItems() = ListIndex(myItems())
Wend
EndWith
EndIf
EndProcedure
Procedure resetRecord()
; ne pointe sur aucun élément de la liste
ResetList(myItems())
EndProcedure
Procedure nextRecord()
ProcedureReturn NextElement(myItems())
EndProcedure
Procedure find(id)
If FindMapElement(_myItems(),Str(id))
ProcedureReturn SelectElement(myItems(),_myItems())
EndIf
ProcedureReturn #False
EndProcedure
Procedure getId()
With myItems()
ProcedureReturn \id
EndWith
EndProcedure
Procedure.s getName()
With myItems()
ProcedureReturn \name
EndWith
EndProcedure
Procedure.s getPostalCode()
With myItems()
ProcedureReturn \postal_code
EndWith
EndProcedure
Procedure getIdCountry()
With myItems()
ProcedureReturn \id_country
EndWith
EndProcedure
Procedure setName(name.s)
With myItems()
\name = name
EndWith
EndProcedure
Procedure setPostalCode(postalCode.s)
With myItems()
\postal_code = postalCode
EndWith
EndProcedure
Procedure setIdCountry(idCountry)
With myItems()
\id_country = idCountry
EndWith
EndProcedure
Procedure save()
; sauvegarde de l'enregistrement courrant
With myItems()
If Not Len(\name)
MessageRequester("Champs obligatoire","Le nom doit être renseigné",#PB_MessageRequester_Warning)
ProcedureReturn #False
EndIf
If Not \id_country
MessageRequester("Champs obligatoire","Le pays doit être renseigné",#PB_MessageRequester_Warning)
ProcedureReturn #False
EndIf
Protected req.s = "UPDATE cities SET "+
"name = "+doubleCote+\name+doubleCote+","+
"postal_code = "+doubleCote+\postal_code+doubleCote+","+
"id_country = "+\id_country+
" WHERE id = "+\id
ProcedureReturn DB::update(req)
EndWith
EndProcedure
Procedure add(name.s,postal_code.s,id_country)
With myItems()
; ajout de l'élement
AddElement(myItems())
\name = name
\postal_code = postal_code
\id_country = id_country
; ajoute le record à la db
If _add()
\id = DB::getLastId("cities")
AddMapElement(_myItems(),Str(\id))
_myItems() = ListIndex(myItems())
ProcedureReturn #True
EndIf
DeleteElement(myItems())
ProcedureReturn #False
EndWith
EndProcedure
Procedure delete()
With myItems()
Protected req.s = "DELETE FROM cities "+
" WHERE id = "+\id
If DB::update(req)
DeleteElement(myItems())
FindMapElement(_myItems(),Str(\id))
DeleteMapElement(_myItems())
EndIf
EndWith
EndProcedure
;}
EndModule
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- microdevweb
- Messages : 1800
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: [TUTO] Programmation structurée
module Contacts_DB.pbi
Code : Tout sélectionner
;********************************************************
; TUTO FAC
;********************************************************
; Author : MicrodevWeb
; MODULE : Cities_DB
; VERSION : 1
; DESIGNED WITH : PB 5.62
; DOT IT : gestion des pays
;********************************************************
DeclareModule Contacts_DB
Declare create()
Declare load(whereClause.s = "")
Declare resetRecord()
Declare nextRecord()
Declare find(id)
Declare getId()
Declare.s getName()
Declare.s getAddress()
Declare.s getPhone()
Declare.s getCel()
Declare.s getEmail()
Declare getIdCity()
Declare setName(name.s)
Declare setAddress(address.s)
Declare setPhone(phone.s)
Declare setCel(cel.s)
Declare setEmail(email.s)
Declare setIdCity(idCity)
Declare save()
Declare add(name.s,address.s,phone.s,cel.s,email.s,id_city)
Declare delete()
EndDeclareModule
Module Contacts_DB
Structure _struct
id.l
name.s
address.s
phone.s
cel.s
email.s
id_city.l
EndStructure
Global NewList myItems._struct()
Global NewMap _myItems.l()
Global currentID
Macro doubleCote
Chr(34)
EndMacro
;-* PRIVATE FUNCTIONS
Procedure _add()
With myItems()
Protected req.s = "INSERT INTO contacts ("+
"name,"+
"address,"+
"phone,"+
"cel,"+
"email,"+
"id_city"+
")"+
" VALUES ("+
doubleCote+\name+doubleCote+","+
doubleCote+\address+doubleCote+","+
doubleCote+\phone+doubleCote+","+
doubleCote+\cel+doubleCote+","+
doubleCote+\email+doubleCote+","+
\id_city+
")"
ProcedureReturn DB::update(req)
EndWith
EndProcedure
;}
;-* PUBLIC FUNCTIONS
Procedure create()
; on crée la table uniquement si la base de donnée n'existe pas encore
Protected req.s = "CREATE TABLE IF NOT EXISTS contacts ("+
" id INTEGER PRIMARY KEY AUTOINCREMENT,"+
" name TEXT,"+
" address TEXT,"+
" phone TEXT,"+
" cel TEXT,"+
" email TEXT,"+
" id_city INTEGER"+
")"
If Not DB::update(req)
End
EndIf
EndProcedure
Procedure load(whereClause.s = "")
; charge les pays depuis la base de données
ClearList(myItems())
Protected request.s = "SELECT * FROM contact "+
whereClause
currentID = DB::query(request)
; charge les records en mémoire
If currentID
With myItems()
While NextDatabaseRow(currentID)
; ajout des élément à la liste
AddElement(myItems())
\id = GetDatabaseLong(currentID,0)
\name = GetDatabaseString(currentID,1)
\address = GetDatabaseString(currentID,2)
\phone = GetDatabaseString(currentID,3)
\cel = GetDatabaseString(currentID,4)
\email = GetDatabaseString(currentID,5)
\id_city = GetDatabaseLong(currentID,6)
; on sauve dans une map pour une utilisation future
AddMapElement(_myItems(),Str(\id))
_myItems() = ListIndex(myItems())
Wend
EndWith
EndIf
EndProcedure
Procedure resetRecord()
; ne pointe sur aucun élément de la liste
ResetList(myItems())
EndProcedure
Procedure nextRecord()
ProcedureReturn NextElement(myItems())
EndProcedure
Procedure find(id)
If FindMapElement(_myItems(),Str(id))
ProcedureReturn SelectElement(myItems(),_myItems())
EndIf
ProcedureReturn #False
EndProcedure
Procedure getId()
With myItems()
ProcedureReturn \id
EndWith
EndProcedure
Procedure.s getName()
With myItems()
ProcedureReturn \name
EndWith
EndProcedure
Procedure.s getAddress()
With myItems()
ProcedureReturn \address
EndWith
EndProcedure
Procedure getIdCity()
With myItems()
ProcedureReturn \id_city
EndWith
EndProcedure
Procedure.s getPhone()
With myItems()
ProcedureReturn \phone
EndWith
EndProcedure
Procedure.s getCel()
With myItems()
ProcedureReturn \cel
EndWith
EndProcedure
Procedure.s getEmail()
With myItems()
ProcedureReturn \email
EndWith
EndProcedure
Procedure setName(name.s)
With myItems()
\name = name
EndWith
EndProcedure
Procedure setAddress(address.s)
With myItems()
\address = address
EndWith
EndProcedure
Procedure setPhone(phone.s)
With myItems()
\phone = phone
EndWith
EndProcedure
Procedure setCel(cel.s)
With myItems()
\cel = cel
EndWith
EndProcedure
Procedure setEmail(email.s)
With myItems()
\email = email
EndWith
EndProcedure
Procedure setIdCity(idCity)
With myItems()
\id_city = idCity
EndWith
EndProcedure
Procedure save()
; sauvegarde de l'enregistrement courrant
With myItems()
If Not Len(\name)
MessageRequester("Champs obligatoire","Le nom doit être renseigné",#PB_MessageRequester_Warning)
ProcedureReturn #False
EndIf
If Not \id_city
MessageRequester("Champs obligatoire","La localité doit être renseigné",#PB_MessageRequester_Warning)
ProcedureReturn #False
EndIf
Protected req.s = "UPDATE contacts SET "+
"name = "+doubleCote+\name+doubleCote+","+
"address = "+doubleCote+\address+doubleCote+","+
"phone = "+doubleCote+\phone+doubleCote+","+
"cel = "+doubleCote+\cel+doubleCote+","+
"email = "+doubleCote+\email+doubleCote+","+
"id_city = "+\id_city+
" WHERE id = "+\id
ProcedureReturn DB::update(req)
EndWith
EndProcedure
Procedure add(name.s,address.s,phone.s,cel.s,email.s,id_city)
With myItems()
; ajout de l'élement
AddElement(myItems())
\name = name
\address = address
\phone = phone
\cel = cel
\email = email
\id_city = id_city
; ajoute le record à la db
If _add()
\id = DB::getLastId("contacts")
AddMapElement(_myItems(),Str(\id))
_myItems() = ListIndex(myItems())
ProcedureReturn #True
EndIf
DeleteElement(myItems())
ProcedureReturn #False
EndWith
EndProcedure
Procedure delete()
With myItems()
Protected req.s = "DELETE FROM contacts "+
" WHERE id = "+\id
If DB::update(req)
DeleteElement(myItems())
FindMapElement(_myItems(),Str(\id))
DeleteMapElement(_myItems())
EndIf
EndWith
EndProcedure
;}
EndModule
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: [TUTO] Programmation structurée
Des valeurs de bases de données encadrées par des doubles quotes c'est la garantie d'une base de données corrompu à 100% un exemple avec \adress = lieu dit "la poudrière"
Code : Tout sélectionner
... doubleCote + \address + doubleCote ...
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- microdevweb
- Messages : 1800
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: [TUTO] Programmation structurée
Et avec des simple cote les apostrophe ne passe pas
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: [TUTO] Programmation structurée
Oui c'est vrai aussi.microdevweb a écrit :Et avec des simple cote les apostrophe ne passe pas
je te conseille les requêtes préparées.
https://www.purebasic.fr/french/viewtop ... =6&t=16597
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: [TUTO] Programmation structurée
@Microdevweb
Si tu appelles ça un petit tuto, alors qu'est ce que sera un vrai tuto? C'est plus tôt un code avancé. Rien à voir avec un tuto. J'aurais aimer suivre ton tuto pour comprendre le but et la façon d'utiliser les structures et les modules, hélàs, je n'ai rien appris en consultant ton code ligne par ligne... Dommage moi qui cherche depuis hier un bon exemple de code sur les structures et les modules ainsi que le rapport avec les bases de données...
Si vraiment tu veux faire un tuto, un vrai, alors il faut te mettre à la place des débutants (comme moi), ceux qui n'ont jamais entendu parler ni d'une structure ni d'un module...Exemple:
Et là l'explication de tout ça (définition d'une structure, explication de chaque contenu (en exemple) puis on passe à COMMENT UTILISER UNE STRUCTURE (puis plus loin ET POURQUOI?)
etc...
etc...
Et enfin un exemple complet (utilisant une structure, une base de données et un bouton VALIDER par exemple)
Bon ce n'est qu'une suggestion
Sinon, bon courage
Si tu appelles ça un petit tuto, alors qu'est ce que sera un vrai tuto? C'est plus tôt un code avancé. Rien à voir avec un tuto. J'aurais aimer suivre ton tuto pour comprendre le but et la façon d'utiliser les structures et les modules, hélàs, je n'ai rien appris en consultant ton code ligne par ligne... Dommage moi qui cherche depuis hier un bon exemple de code sur les structures et les modules ainsi que le rapport avec les bases de données...
Si vraiment tu veux faire un tuto, un vrai, alors il faut te mettre à la place des débutants (comme moi), ceux qui n'ont jamais entendu parler ni d'une structure ni d'un module...Exemple:
Code : Tout sélectionner
Structure NomStructure
Codeclient.s
NomClient.s
NumTel.s
EndStrucrure
etc...
etc...
Et enfin un exemple complet (utilisant une structure, une base de données et un bouton VALIDER par exemple)
Bon ce n'est qu'une suggestion
Sinon, bon courage
Win7 (x64) 64 bits Pb 5.72
- microdevweb
- Messages : 1800
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: [TUTO] Programmation structurée
omega,
Je termine ce tuto et ferais un tuto plus basique sur les structure et un autre sur les modules
Edit : Bon comme je voie que tu est dans la panade j'essayerais de faire cela aux plus vite.
Je termine ce tuto et ferais un tuto plus basique sur les structure et un autre sur les modules
Edit : Bon comme je voie que tu est dans la panade j'essayerais de faire cela aux plus vite.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège
Re: [TUTO] Programmation structurée
Déjà le vocalbulaire, car j'ai l'impressionque tu confonds programmation modulaire et modules.omega a écrit : Si tu appelles ça un petit tuto, alors qu'est ce que sera un vrai tuto? C'est plus tôt un code avancé. Rien à voir avec un tuto. J'aurais aimer suivre ton tuto pour comprendre le but et la façon d'utiliser les structures et les modules, hélàs, je n'ai rien appris en consultant ton code ligne par ligne... Dommage moi qui cherche depuis hier un bon exemple de code sur les structures et les modules ainsi que le rapport avec les bases de données...
Structure = Type de donnée qui en contient d'autres (comme un enregistrement de base de données, mais en RAM)
https://www.purebasic.com/french/docume ... tures.html
À noter qu'on peut très bien utiliser les structures sans pointeurs
Programmation "modulaire" = Programme découpé en plusieurs fichiers (en PB *.pbi) et assemblés à la compilation. On fait ça juste pour la lisibilité et/ou pour réutiliser des parties de codes génériques.
Include
https://www.purebasic.com/french/docume ... ludes.html
À ne pas confondre avec la programmation par modules
Modules
https://www.purebasic.com/french/docume ... odule.html
Reste simple, ne te prends pas la tête avec les pointeurs, les structures de structures etc
"Think simple"
- falsam
- Messages : 7244
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: [TUTO] Programmation structurée
je ne peux que approuverMarc56 a écrit :Reste simple, ne te prends pas la tête avec les pointeurs, les structures de structures etc
"Think simple"
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%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- microdevweb
- Messages : 1800
- Inscription : mer. 29/juin/2011 14:11
- Localisation : Belgique
Re: [TUTO] Programmation structurée
Module MainForm.pbi Temporaire
Code : Tout sélectionner
;********************************************************
; TUTO FAC
;********************************************************
; Author : MicrodevWeb
; MODULE : MainForm
; VERSION : 1
; DESIGNED WITH : PB 5.62
; DOT IT : Fenêtre principal
;********************************************************
DeclareModule MainForm
Declare open()
Declare getId()
EndDeclareModule
Module MainForm
Global idForm
Procedure Exit()
End
EndProcedure
Procedure open()
idForm = OpenWindow(#PB_Any,0,0,800,600,"Tuto fac",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
If idForm
BindEvent(#PB_Event_CloseWindow,@Exit(),idForm)
Countries_TAB::open(idForm)
Repeat
WaitWindowEvent()
ForEver
EndIf
EndProcedure
Procedure getId()
ProcedureReturn idForm
EndProcedure
EndModule
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Work at Centre Spatial de Liège