PureBasic

Forums PureBasic
Nous sommes le Mar 25/Juin/2019 12:47

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 19 messages ]  Aller à la page 1, 2  Suivante
Auteur Message
 Sujet du message: [TUTO] Programmation structurée
MessagePosté: Ven 17/Aoû/2018 14:14 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
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)

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Dernière édition par microdevweb le Sam 18/Aoû/2018 14:37, édité 9 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Ven 17/Aoû/2018 14:25 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
Code module DB.bpi

Code:
;********************************************************
; 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

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Dernière édition par microdevweb le Ven 17/Aoû/2018 15:41, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Ven 17/Aoû/2018 14:25 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
Code Countries_DB.pbi

Code:
;********************************************************
; 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

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Dernière édition par microdevweb le Ven 17/Aoû/2018 15:41, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Ven 17/Aoû/2018 14:26 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
Code main de bébugage

Code:
;********************************************************
; 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
; ;}

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Dernière édition par microdevweb le Ven 17/Aoû/2018 15:44, édité 1 fois.

Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Ven 17/Aoû/2018 15:17 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 23/Sep/2006 18:32
Messages: 6623
Localisation: Isere
Ca marche ici, merci 8)

_________________
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Ven 17/Aoû/2018 15:43 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
Module Cities_DB.pbi

Code:
;********************************************************
; 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

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Ven 17/Aoû/2018 17:32 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
module Contacts_DB.pbi

Code:
;********************************************************
; 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

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Ven 17/Aoû/2018 23:06 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6821
Localisation: IDF (Yvelines)
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:
... doubleCote + \address + doubleCote ...
un exemple avec \adress = lieu dit "la poudrière"

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Ven 17/Aoû/2018 23:55 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
Et avec des simple cote les apostrophe ne passe pas

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Sam 18/Aoû/2018 0:13 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6821
Localisation: IDF (Yvelines)
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: viewtopic.php?f=6&t=16597

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Sam 18/Aoû/2018 0:52 
Hors ligne
Avatar de l’utilisateur

Inscription: Sam 26/Nov/2011 13:04
Messages: 463
@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:
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 (x86) 32 bits Pb 5.70


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Sam 18/Aoû/2018 1:24 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
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.

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Sam 18/Aoû/2018 10:51 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1572
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:

_________________
HP de 2012 - Intel i3-3220 @3.30 GHz, 2 coeurs, 4 threads - RAM 16 Go - Nvidia GT 620 1920x1080 DPI 100%
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Sam 18/Aoû/2018 12:11 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 22/Aoû/2010 15:24
Messages: 6821
Localisation: IDF (Yvelines)
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:

_________________

➽ Config PureBasic : i3, RAM 4Go, NVidia (1024 Mo), Windows 10 - PB 5.70 LTS
➽ Je papote aussi sur http://purebasic.chat

➽ Sites personnels http://falsam.com & EasySprite.js

➽ Je ne réponds pas aux MP techniques


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: [TUTO] Programmation structurée
MessagePosté: Sam 18/Aoû/2018 14:32 
Hors ligne
Avatar de l’utilisateur

Inscription: Mer 29/Juin/2011 14:11
Messages: 1589
Localisation: Belgique
Module MainForm.pbi Temporaire

Code:
;********************************************************
; 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

_________________
Linux Mint / Windows 10 64 bits PB: 5.61 ; 5.62 beta


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 19 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye