[TUTO] Programmation structurée

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

[TUTO] Programmation structurée

Message par microdevweb »

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)
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
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [TUTO] Programmation structurée

Message par microdevweb »

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
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [TUTO] Programmation structurée

Message par microdevweb »

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
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [TUTO] Programmation structurée

Message par microdevweb »

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
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: [TUTO] Programmation structurée

Message par Kwai chang caine »

Ca marche ici, merci 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [TUTO] Programmation structurée

Message par microdevweb »

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
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [TUTO] Programmation structurée

Message par microdevweb »

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
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [TUTO] Programmation structurée

Message par falsam »

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%

Code : Tout sélectionner

... doubleCote + \address + doubleCote ... 
un exemple avec \adress = lieu dit "la poudrière"
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
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [TUTO] Programmation structurée

Message par microdevweb »

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
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [TUTO] Programmation structurée

Message par falsam »

microdevweb a écrit :Et avec des simple cote les apostrophe ne passe pas
Oui c'est vrai aussi.

je te conseille les requêtes préparées.
:arrow: 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%
Avatar de l’utilisateur
omega
Messages : 617
Inscription : sam. 26/nov./2011 13:04
Localisation : Alger

Re: [TUTO] Programmation structurée

Message par omega »

@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:

Code : Tout sélectionner

Structure  NomStructure
Codeclient.s
NomClient.s
NumTel.s
EndStrucrure
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
Win7 (x64) 64 bits Pb 5.72
Avatar de l’utilisateur
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [TUTO] Programmation structurée

Message par microdevweb »

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.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Marc56
Messages : 2146
Inscription : sam. 08/févr./2014 15:19

Re: [TUTO] Programmation structurée

Message par Marc56 »

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...
Déjà le vocalbulaire, car j'ai l'impressionque tu confonds programmation modulaire et modules.

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"

:wink:
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: [TUTO] Programmation structurée

Message par falsam »

Marc56 a écrit :Reste simple, ne te prends pas la tête avec les pointeurs, les structures de structures etc

"Think simple"
je ne peux que approuver :wink:
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
microdevweb
Messages : 1798
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: [TUTO] Programmation structurée

Message par microdevweb »

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
Répondre