[TUTO] Programmation modulaire

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 modulaire

Message par microdevweb »

La programmation modulaire

Ce type de programmation ne peut plaire à tout le monde. Donc libre à vous de l'adopter ou non.

Les avantages:
  • La portée des variables, constante et procédures est limitée au module. Cependant certaine procédures; constantes ou variables peuvent être déclarées public et sont donc appelable depuis l'extérieur du module. On peu donc assimilé le développement modulaire à un type de programmation orienté objet simplifié.
  • Il possible d'utilisé le même nom de variable ou procédure dans les différent modules.
  • L’auto-complétion de l'ide de PureBasic dans le module ne proposera que les variables ou procédures du dis module.
  • Un module est plus facilement réutilisable.
Les contraintes:
  • Le code extérieur au module n'est pas directement accessible, il doit soit passé par un autre module ou par des pointeurs.
  • L'inclusion des fichiers est importante, car contrairement aux simples procédures ou ne peu pas les déclarés
Ce tutoriel se déroulera en plusieurs parties

1ère Partie les bases
:arrow: ICI

2eme Partie aller plus loin
Dans cette exemple nous allons gérer un fichier client
:arrow: ICI

Suite à une discussion avec Falsam qui ma fait remarquer que cette partie était asse complexe (remarque justifiée d’ailleurs), la troisième partie est mise en pause. Les deux premières parties étant asse explicite sur le principe. Cependant si j'ai des demandes pour la suite je reprendrais cette dernière.


EN PAUSE
3éme Partie un petit logiciel de facturation

Organisation de la base de données
  • fichier pays
    • id -->PRIMARY KEY
    • nom --TEXT
  • fichier localite
    • id -->PRIMARY KEY
    • id_pays -->INTEGER
    • nom -->TEXT
    • code_postal
  • fichier type_moyen_contact
    • id -->PRIMARY KEY
    • nom -->TEXT
  • fichier client
    • id -->PRIMARY KEY
    • id_localite --> INTEGER
    • nom -->TEXT
    • adresse -->TEXT
    • remarque -->TEXT
  • fichier moyen_contact
    • id -->PRIMARY KEY
    • id_type_moyen_contact --> INTEGER
    • id_client -->INTEGER
    • valeur -->TEXT
    • remarque -->TEXT
  • fichier categorie
    • id -->PRIMARY KEY
    • nom -->TEXT
  • fichier taux_tva
    • id -->PRIMARY KEY
    • taux -->FLOAT
  • fichier produit
    • id -->PRIMARY KEY
    • id_categaorie --> INTEGER
    • id_taux_tva --> INTEGER
    • nom -->TEXT
    • prix -->FLOAT
    • remarque -->TEXT
  • fichier commande
    • id -->PRIMARY KEY
    • date -->TEXT (aaaammdd)
    • numero_commande -->TEXT
    • numero_livaison -->TEXT
    • numero_facture -->TEXT
    • id_localite-->INTEGER (l'adresse de livraison peut être différente de l'adresse du client)
    • adresse-->TEXT
    • id_client-->INTEGER
    • remarque -->TEXT
  • fichier lgn_commande
    • id -->PRIMARY KEY
    • id_commande -->INTEGER
    • id_produit -->INTEGER
    • qte -->INTEGER
    • prix -->FLOAT (le prix est mémorisé car il peut être changé dans le fichier produit)
    • tva -->FLOAT (le taux de tva est mémorisé car il peut être changé dans le fichier produit)
    • livreON -->INTEGER
    • factureON -->INTEGER
L'organisation des fichiers et modules
  • main.pb fichier principal :arrow: ICI
  • tbl.pbi module tbl :arrow: ICI
  • prj.pbi module prj :arrow: ICI
  • macro.pbi module myMacro :arrow: ICI
  • db.pbi module db :arrow: ICI
  • mainForm.pbi module mainForm :arrow: ICI
  • paysFIC.pbi module paysFIC :arrow: ICI
  • paysTAB.pbi module paysTAB :arrow: ICI
  • localiteFIC.pbi module localiteFIC :arrow: ICI
  • localiteTAB.pbi module localiteTAB :arrow: ICI
  • clientFIC.pbi module clientFIC :arrow: ICI
  • clientTAB.pbi module clientTAB :arrow: ICI
  • TypeMoyenFIC.pbi module TypeMoyenFIC :arrow: ICI
  • TypeMoyenTAB.pbi module TypeMoyenTAB :arrow: ICI
  • MoyenContactFIC.pbi module MoyenContactFIC :arrow: ICI
  • MoyenContactTAB.pbi module MoyenContactTAB :arrow: ICI
  • TvaFIC.pbi module TvaFIC :arrow: ICI
  • TvaTAB.pbi module TvaTAB :arrow: ICI
  • CategorieFIC.pbi module ]CategorieFIC :arrow: ICI
  • CategorieTAB.pbi module ]CategorieTAB :arrow: ICI
  • ProduitFIC.pbi module ]ProduitFIC :arrow: ICI
  • ]ProduitTAB.pbi module ]ProduitTAB :arrow: ICI
  • CommandeFIC.pbi module CommandeFIC :arrow: ICI
  • CommandeTAB.pbi module CommandeTAB :arrow: ICI
  • ImpCommande.pbi module ImpCommande :arrow: ICI
  • ImpLivaison.pbi module ImpLivaison :arrow: ICI
  • ImpFacture.pbi module ImpFacture :arrow: ICI
Télécharger le zip complet

Note: Ceci est un gros tutoriel et prendra plusieurs jours, il est en cours rédaction
Dernière modification par microdevweb le ven. 15/avr./2016 10:31, modifié 11 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 modulaire

Message par microdevweb »

Pourra être encore modifié
main.pb fichier principal

Code : Tout sélectionner

;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : TUTO développement modulaire
; Deccription : fichier principal
; File Name : main.pb
;************************************************************************************************************************
XIncludeFile "macro.pbi"
XIncludeFile "db.pbi"
XIncludeFile "tbl.pbi"
XIncludeFile "prj.pbi"
XIncludeFile "macro.pbi"
XIncludeFile "paysFIC.pbi"
XIncludeFile "paysTAB.pbi"
XIncludeFile "localiteFIC.pbi"
XIncludeFile "localiteTAB.pbi"
XIncludeFile "MoyenContactFIC.pbi"
XIncludeFile "MoyenContactTAB.pbi"
XIncludeFile "clientFIC.pbi"
XIncludeFile "clientTAB.pbi"
XIncludeFile "TvaFIC.pbi"
XIncludeFile "TvaTAB.pbi"
XIncludeFile "CategorieFIC.pbi"
XIncludeFile "CategorieTAB.pbi"
XIncludeFile "ProduitFIC.pbi"
XIncludeFile "ProduitTAB.pbi"
XIncludeFile "CommandeFIC.pbi"
XIncludeFile "CommandeTAB.pbi"
XIncludeFile "ImpCommande.pbi"
XIncludeFile "ImpLivaison.pbi"
XIncludeFile "ImpFacture.pbi"
XIncludeFile "mainForm.pbi"
; Création de la base de données
db::Create()
; Ouverture de la fenêtre principale
mainForm::Open()
; Boucle principale
Repeat:WaitWindowEvent():ForEver
Dernière modification par microdevweb le jeu. 14/avr./2016 14:44, modifié 2 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 modulaire

Message par microdevweb »

tbl.pbi module tbl

Ce fichier étant trop volumineux vous pouvez le télécharger

:arrow: ICI
Dernière modification par microdevweb le jeu. 14/avr./2016 15:09, 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 modulaire

Message par microdevweb »

Sujet à des modifications
prj.pbi module prj

Code : Tout sélectionner

;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : TUTO développement modulaire
; Deccription : module prj
; File Name : prj.pbi
;************************************************************************************************************************
DeclareModule prj
    ;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
    Global FontForm=LoadFont(#PB_Any,"Arial",12,#PB_Font_HighQuality)
    ;}
    ;-* PUBLIC DECLARATION
    Declare MaskingString(Gadget,mask,NbDecimal=0,Ext$="")
    Declare.f GetFloatValues(gadget,Ext.s="")
    ;}
EndDeclareModule
Module prj
    EnableExplicit
    ;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
    
    ;}
    ;-* LOCAL DECLARATION
    
    ;}
    ;-* PRIVATE PROCEDURE
    
    ;}
    ;-* PUBLIC PROCEDURE
    Procedure MaskingString(Gadget,mask,NbDecimal=0,Ext$="")
        Protected txt$,PosStart.i,PosEnd.i,N,Car$
        Protected number$="0123456789"
        Protected phone$="0123456789-/\:. "
        Protected Dec=-1
        If EventType()=#PB_EventType_Change
            SendMessage_(GadgetID(Gadget),#EM_GETSEL,@PosStart,@PosEnd)
            Select mask
                Case 1 ;Première lettre en majuscule
                    txt$=UCase(Left(GetGadgetText(Gadget),1))+Right(GetGadgetText(Gadget),Len(GetGadgetText(Gadget))-1)
                Case 2 ;Tout en majuscule
                    txt$=UCase(GetGadgetText(Gadget))
                Case 3 ;Tout en miniscule
                    txt$=LCase(GetGadgetText(Gadget))
                Case 4 ;Numérique
                    For N=1 To Len(GetGadgetText(Gadget))
                        Car$=Mid(GetGadgetText(Gadget),N,1)
                        If N=1 And Car$="-"
                            txt$+Car$
                        Else
                            If FindString(number$,Car$)<>0
                                If Dec=-1
                                    txt$+Car$
                                Else
                                    If Dec<NbDecimal
                                        txt$+Car$
                                        Dec+1
                                    EndIf
                                EndIf
                                
                            EndIf
                            If NbDecimal>0
                                If Car$="." And Dec=-1
                                    txt$+"."
                                    Dec=0
                                EndIf
                            EndIf
                        EndIf
                    Next
                Case 5 ;Phone
                    For N=1 To Len(GetGadgetText(Gadget))
                        Car$=Mid(GetGadgetText(Gadget),N,1)
                        If FindString(phone$,Car$)<>0
                            txt$+Car$
                        EndIf
                    Next
            EndSelect
            If Ext$<>""
                txt$+Ext$
            EndIf
            SetGadgetText(Gadget,txt$)
            SendMessage_(GadgetID(Gadget),#EM_SETSEL,PosStart,PosEnd)
        EndIf
    EndProcedure
    Procedure.f GetFloatValues(gadget,Ext.s="")
        ; Convertis le texte du gadget en float en retirant éventuelemnt l'extention
        Protected txt.s=GetGadgetText(gadget)
        txt=RemoveString(txt,Ext)
        ProcedureReturn ValF(txt)
    EndProcedure
    ;}
EndModule
Dernière modification par microdevweb le jeu. 14/avr./2016 15:12, 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 modulaire

Message par microdevweb »

Sujet à des modifications
macro.pbi module myMacro

Code : Tout sélectionner

;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : TUTO développement modulaire
; Deccription : module myMacro
; File Name : macro.pbi
;************************************************************************************************************************
DeclareModule myMacro
    ;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
    
    ;}
    ;-* PUBLIC DECLARATION
    Macro OpenFormFic(pWF,pHF)
        Protected flag=#PB_Window_SystemMenu|#PB_Window_ScreenCentered
        Protected M=10 ; La marge à gauche et droite au-desus et en dessous des champs
        Protected Y=M ; La position Y des champs (sera incrémentée par la macro)
        Protected X=M ; La posiiton X des champs
        Protected WF=pWF ; La largeur de la fenêtre
        Protected HF=pHF ; La hauteur de la fenêtre
        Protected Wbt=90 ; La largeur du bouton valider et annuler
        Protected WG=WF-(M*2) ; La largeur des gadgets
        Protected HG=30    ; la hauteur des gadgets
        ; Désactive la fenêtre mère
        DisableWindow(myMotherWindow,#True)
        ; Ouvre la fenêtre
        Form=OpenWindow(#PB_Any,X,Y,WF,HF,title,flag,WindowID(myMotherWindow))
        ; Mise en place des boutons valider et annuler
        btSubmit=ButtonGadget(#PB_Any,X,HF-(HG+M),Wbt,HG,"Valider")
        btChancel=ButtonGadget(#PB_Any,X+(M+Wbt),HF-(HG+M),Wbt,HG,"Annuler")
        ; Ajout de raccourcis clavier pour la validation par Enter et l'annulation par Esc
        AddKeyboardShortcut(Form,#PB_Shortcut_Return,$FF)
        AddKeyboardShortcut(Form,#PB_Shortcut_Escape,$FF1)
        ; Mise en place des callback
        BindEvent(#PB_Event_CloseWindow,@Exit(),Form)
        BindEvent(#PB_Event_Menu,@EventShortcut(),Form)
        BindGadgetEvent(btSubmit,@EventSubmit())
        BindGadgetEvent(btChancel,@Exit())
        ; Affecte la police aux bouttons
        SetGadgetFont(btSubmit,FontID(prj::FontForm))
        SetGadgetFont(btChancel,FontID(prj::FontForm))
    EndMacro
    Macro OpenFormTAB(pWF,pHF)
        Protected flag=#PB_Window_SystemMenu|#PB_Window_ScreenCentered
        Protected M=10 ; La marge à gauche et droite au-desus et en dessous des champs
        Protected Y=M  ; La position Y des champs (sera incrémentée par la macro)
        Protected X=M  ; La posiiton X des champs
        Protected WF=pWF ; La largeur de la fenêtre
        Protected HF=pHF ; La hauteur de la fenêtre
        Protected Wbt=90 ; La largeur du bouton valider et annuler
        Protected WT=WF-(Wbt+(M*3)) ; La largeur de la table
        Protected HT=HF-(M*2) ; La hauteur de la table
        Protected HG=30       ; la hauteur des gadgets
       ; Désactive la fenêtre mère
        DisableWindow(myMotherWindow,#True)
        ; Ouvre la fenêtre
        Form=OpenWindow(#PB_Any,X,Y,WF,HF,title,flag,WindowID(myMotherWindow))
        ; Création de la table
        Table=Tbl::Create(WindowID(Form),#PB_Any,X,Y,WT,HT,db::DbName,dbTable,db::user,db::psw,"")
        Define N,Nb,tmp.s
        Nb=CountString(tableContent,Chr(10))
        For N=1 To NB
            tmp=StringField(tableContent,N,Chr(10))
            Tbl::AddColumn(N,StringField(tmp,1,"|"),StringField(tmp,2,"|"),Val(StringField(tmp,3,"|")))
            ; Si colonne de recherche
            If Val(StringField(tmp,4,"|"))=1
                Tbl::EnableColumnShearch()
            EndIf
            ; Si nombre de décimale
             If Val(StringField(tmp,5,"|"))<>0
                Tbl::FixNumberDecimal(Val(StringField(tmp,5,"|")))
            EndIf
            ; Si extention
            If StringField(tmp,6,"|")<>""
                Tbl::FixExtent(StringField(tmp,6,"|"))
            EndIf
        Next
        ; Ajoute les boutons
        X=(M*2)+WT
        btNew=ButtonGadget(#PB_Any,X,Y,Wbt,HG,"Nouveau")
        Y+HG+M
        btEdit=ButtonGadget(#PB_Any,X,Y,Wbt,HG,"Editer")
        Y+HG+M
        btDelete=ButtonGadget(#PB_Any,X,Y,Wbt,HG,"Supprimer")
        Y+(HG*2)
        btChancel=ButtonGadget(#PB_Any,X,Y,Wbt,HG,"Quitter")
        ; Change la police des boutons
        SetGadgetFont(btNew,FontID(prj::FontForm))
        SetGadgetFont(btEdit,FontID(prj::FontForm))
        SetGadgetFont(btDelete,FontID(prj::FontForm))
        SetGadgetFont(btChancel,FontID(prj::FontForm))
        ; Ajout des bulles d'aide
        GadgetToolTip(btNew,"Nouveau [INSERT]")
        GadgetToolTip(btEdit,"Editer [F5]")
        GadgetToolTip(btDelete,"Supprimer [DELETE]")
        GadgetToolTip(btChancel,"Quitter [ESC]")
        ; Mise en place des callback
        BindEvent(#PB_Event_CloseWindow,@Exit(),Form)
        BindGadgetEvent(btNew,@EventNew())
        BindGadgetEvent(btEdit,@EventEdit())
        BindGadgetEvent(btDelete,@EventDelete())
        BindGadgetEvent(btChancel,@Exit())
        ; Ajout de raccorcis clavier pour ajouter un enregistrment avec Insert
        ; editer avec F5, supprimer avec Delete annuler avec Esc
        AddKeyboardShortcut(Form,#PB_Shortcut_Insert,$FF)
        AddKeyboardShortcut(Form,#PB_Shortcut_F5,$FF1)
        AddKeyboardShortcut(Form,#PB_Shortcut_Delete,$FF2)
        AddKeyboardShortcut(Form,#PB_Shortcut_Escape,$FF3)
        BindEvent(#PB_Event_Menu,@EventShortCut(),Form)
    EndMacro
    Macro Strind(name,label)
        ; Mise en place du libellé
        txt#name=TextGadget(#PB_Any,X,Y,WG,HG,label)
        ; Mise en place du string gadget
        Y+HG
        str#name=StringGadget(#PB_Any,X,Y,WG,HG,"")
        ; Change la position Y pour les gadget suivant
        Y+HG+M
        ; Change la police des gadgets
        SetGadgetFont(txt#name,FontID(prj::FontForm))
        SetGadgetFont(str#name,FontID(prj::FontForm))
    EndMacro
    Macro DobleCote(txt)
        Chr(34)+txt+Chr(34)
    EndMacro
    ;}
EndDeclareModule
Module myMacro
    EnableExplicit
    ;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
    
    ;}
    ;-* LOCAL DECLARATION
    
    ;}
    ;-* PRIVATE PROCEDURE
    
    ;}
    ;-* PUBLIC PROCEDURE
    
    ;}
EndModule
Dernière modification par microdevweb le jeu. 14/avr./2016 19:15, modifié 4 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 modulaire

Message par microdevweb »

Sujet à des modifications
db.pbi module db

Code : Tout sélectionner

;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : TUTO développement modulaire
; Deccription : module db
; File Name : db.pbi
;************************************************************************************************************************
DeclareModule db
    ;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
    Global DbName.s="DbFacture.sqlite",user.s="",psw.s=""
    Enumeration 
        #TEXT
        #NUMERIQUE
    EndEnumeration
    ;}
    ;-* PUBLIC DECLARATION
    Declare Create()
    Declare AllReadyExit(Table.s,column.s,value.s,Type=db::#TEXT,IdIgnore=-1)
    Declare AddTauxTva(Taux.f)
    Declare FillGadget(DbTable.s,LstItem.s,Id)
    Declare SaveTauxTva(Taux.f,Id)
    Declare DeleteTauxTva(Id)
    Declare IntegrityErrorTauxTva(Id)
    Declare IntegrityErrorPays(Id)
    Declare SavePays(Nom.s,Id)
    Declare AddPays(Nom.s)
    Declare DeletePays(Id)
    ;}
EndDeclareModule
Module db
    EnableExplicit
    UseSQLiteDatabase()
    ;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
    Global myDb
    ;}
    ;-* LOCAL DECLARATION
    Declare CreateDbFile()
    Declare OpenDb()
    ;}
    ;-* PRIVATE PROCEDURE
    Procedure CreateDbFile()
        ; Si le fichier existe déjà on sort
        If FileSize(DbName)<>-1:ProcedureReturn :EndIf
        If CreateFile(0,DbName)=0
            MessageRequester("Erreur base de données","Impossible de créer le fichier "+DbName)
            End
        EndIf
        CloseFile(0)
    EndProcedure
    Procedure OpenDb()
        ; Création du fichier de la base de données
        CreateDbFile()
        myDb=OpenDatabase(#PB_Any,DbName,user,psw)
        If myDb=0
             MessageRequester("Erreur base de données","Impossible d'ouvrir la base de données")
            End
        EndIf
    EndProcedure
    ;}
    ;-* PUBLIC PROCEDURE
    Procedure Create()
        Protected query.s,tableName.s
        OpenDb()
        ;{ Création de la table pays
        tableName="pays"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+" ("
        query+"id INTEGER PRIMARY KEY,"
        query+"nom TEXT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
         ;{ Création de la table localité
        tableName="localite"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+" ("
        query+"id INTEGER PRIMARY KEY,"
        query+"id_pays INTEGER,"
        query+"nom TEXT,"
        query+"code_postal TEXT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
         ;{ Création de la table type_moyen_contact
        tableName="type_moyen_contact"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+"("
        query+"id INTEGER PRIMARY KEY,"
        query+"nom TEXT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
         ;{ Création de la table client
        tableName="client"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+"("
        query+"id INTEGER PRIMARY KEY,"
        query+"id_localite INTEGER,"
        query+"nom TEXT,"
        query+"adresse TEXT,"
        query+"reparque TEXT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
        ;{ Création de la table moyen_contact
        tableName="moyen_contact"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+"("
        query+"id INTEGER PRIMARY KEY,"
        query+"id_type_moyen_contact INTEGER,"
        query+"id_client INTEGER,"
        query+"valeur TEXT,"
        query+"reparque TEXT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
         ;{ Création de la table categorie
        tableName="categorie"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+"("
        query+"id INTEGER PRIMARY KEY,"
        query+"nom TEXT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
         ;{ Création de la table taux_tva
        tableName="taux_tva"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+"("
        query+"id INTEGER PRIMARY KEY,"
        query+"taux FLOAT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
        ;{ Création de la table taux_tva
        tableName="taux_tva"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+"("
        query+"id INTEGER PRIMARY KEY,"
        query+"taux FLOAT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
        ;{ Création de la table taux_tva
        tableName="taux_tva"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+"("
        query+"id INTEGER PRIMARY KEY,"
        query+"taux FLOAT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
        ;{ Création de la table produit
        tableName="produit"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+"("
        query+"id INTEGER PRIMARY KEY,"
        query+"id_categorie INTEGER,"
        query+"id_taux_tva INTEGER,"
        query+"nom TEXT,"
        query+"remarque TEXT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
        ;{ Création de la table commande
        tableName="commande"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+"("
        query+"id INTEGER PRIMARY KEY,"
        query+"date TXT,"
        query+"numero_commande TEXT,"
        query+"numero_livraison TEXT,"
        query+"numero_facture TEXT,"
        query+"id_localite INTEGER,"
        query+"adresse TEXT,"
        query+"id_client TEXT,"
        query+"remarque TEXT)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        ;}
         ;{ Création de la table lgn_commande
        tableName="lgn_commande"
        query="CREATE TABLE  IF NOT EXISTS "+tableName+"("
        query+"id INTEGER PRIMARY KEY,"
        query+"id_commande INTEGER,"
        query+"id_produit INTEGER,"
        query+"qte INTEGER,"
        query+"prix FLOAT"
        query+"tva FLOAT,"
        query+"livreON INTEGER,"
        query+"factureON INTEGER)"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur à la création de la table "+tableName,DatabaseError())
            End
        EndIf
        CloseDatabase(myDb)
        ;}
    EndProcedure
    Procedure AllReadyExit(Table.s,column.s,value.s,Type=db::#TEXT,IdIgnore=-1)
        ; Teste si une colonne de la table existe déjà
        ; Si IdIgnore=-1 alors recherche dans la table avec un id différent de IdIgnore
        Protected query.s
        query="SELECT * FROM "+Table+" WHERE "+column+"="
        Select Type
            Case #TEXT
                query+myMacro::DobleCote(value)
            Case #NUMERIQUE
                query+value
        EndSelect
        If IdIgnore<>-1
            query+" AND id!="+Str(IdIgnore)
        EndIf
        OpenDb()
        If DatabaseQuery(myDb,query)=0
            MessageRequester("Error AllReadyExit",DatabaseError())
            End
        EndIf
        If FirstDatabaseRow(myDb)
            CloseDatabase(myDb)
            ProcedureReturn #True
        EndIf
        CloseDatabase(myDb)
        ProcedureReturn #False
    EndProcedure
    Procedure AddTauxTva(Taux.f)
        Protected query.s
        OpenDb()
        query="INSERT INTO taux_tva (taux) VALUES ("+StrF(Taux)+")"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur l'ord de l'ajout d'un taux de TVA",DatabaseError())
            CloseDatabase(myDb)
            ProcedureReturn #False
        EndIf
        CloseDatabase(myDb)
        ProcedureReturn #True
    EndProcedure
    Procedure AddPays(Nom.s)
        Protected query.s
        OpenDb()
        query="INSERT INTO pays (nom) VALUES ("+myMacro::DobleCote(Nom)+")"
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur l'ord de l'ajout d'un Pays",DatabaseError())
            CloseDatabase(myDb)
            ProcedureReturn #False
        EndIf
        CloseDatabase(myDb)
        ProcedureReturn #True
    EndProcedure
    Procedure FillGadget(DbTable.s,LstItem.s,Id)
        ; Remplis les gadget en fonction d'une liste
        ; LstItem doit être renseigné comme suit
        ; id du gadget|db_colonne|nb_decimal ou 0|extention"
        ; les item sont séparé par chr(10)
        Protected N,Nb,query.s,txt.s,Value.s,gadget,ext.s,NbDec
        Nb=CountString(LstItem,Chr(10))
        query="SELECT "
        For N=1 To Nb+1
            txt=StringField(LstItem,N,Chr(10))
            query+StringField(txt,2,"|")+","
        Next
        ; Retire la dernière virgule
        query=Left(query,Len(query)-1)
        query+" FROM "+DbTable
        query+" WHERE id="+Str(Id)
        OpenDb()
        If DatabaseQuery(myDb,query)=0
            MessageRequester("Error FillGadget",DatabaseError())
            ProcedureReturn 
        EndIf
        ; Remplis les gadgets
        N=0
        If FirstDatabaseRow(myDb)=0
            MessageRequester("Error FillGadget","L'id "+Str(id)+" de la table "+DbTable+" n'a pas été trouvé...")
            ProcedureReturn 
        EndIf
        For N=1 To Nb+1
            txt=StringField(LstItem,N,Chr(10))
            gadget=Val(StringField(txt,1,"|"))
            ext=StringField(txt,4,"|")
            Nb=Val(StringField(txt,3,"|"))
            If gadget>0
                Select  DatabaseColumnType(myDb,N-1)
                    Case #PB_Database_Long
                        Value=Str(GetDatabaseLong(myDb,N-1))
                    Case #PB_Database_Float
                        Value=StrF(GetDatabaseFloat(myDb,N-1),NbDec)
                    Case #PB_Database_Double
                        Value=StrD(GetDatabaseDouble(myDb,N-1))
                    Case #PB_Database_Quad
                        Value=StrD(GetDatabaseQuad(myDb,N-1))
                    Case #PB_Database_String
                        Value=GetDatabaseString(myDb,N-1)
                EndSelect
                If ext<>""
                    Value+ext
                EndIf
                SetGadgetText(gadget,Value)
            EndIf
        Next
        CloseDatabase(myDb)
    EndProcedure
    Procedure SaveTauxTva(Taux.f,Id)
         Protected query.s
        OpenDb()
        query="UPDATE  taux_tva SET taux="+Str(Taux)+" WHERE id="+Str(Id)
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur l'ord de la sauvegarde d'un taux de TVA",DatabaseError())
            CloseDatabase(myDb)
            ProcedureReturn #False
        EndIf
        CloseDatabase(myDb)
        ProcedureReturn #True
    EndProcedure
    Procedure SavePays(Nom.s,Id)
         Protected query.s
        OpenDb()
        query="UPDATE  pays SET nom="+myMacro::DobleCote(Nom)+" WHERE id="+Str(Id)
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur l'ord de la sauvegarde d'un Pays",DatabaseError())
            CloseDatabase(myDb)
            ProcedureReturn #False
        EndIf
        CloseDatabase(myDb)
        ProcedureReturn #True
    EndProcedure
    Procedure DeleteTauxTva(Id)
         Protected query.s
        OpenDb()
        query="DELETE  FROM taux_tva WHERE id="+Str(Id)
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur l'ord de la suppression d'un taux de TVA",DatabaseError())
            CloseDatabase(myDb)
            ProcedureReturn #False
        EndIf
        CloseDatabase(myDb)
        ProcedureReturn #True
    EndProcedure
    Procedure DeletePays(Id)
         Protected query.s
        OpenDb()
        query="DELETE  FROM pays WHERE id="+Str(Id)
        If DatabaseUpdate(myDb,query)=0
            MessageRequester("Erreur l'ord de la suppression d'un Pays",DatabaseError())
            CloseDatabase(myDb)
            ProcedureReturn #False
        EndIf
        CloseDatabase(myDb)
        ProcedureReturn #True
    EndProcedure
    Procedure IntegrityErrorTauxTva(Id)
        Protected query.s
        OpenDb()
        query="SELECT *  FROM produit WHERE id_taux_tva="+Str(Id)
        If DatabaseQuery(myDb,query)=0
            MessageRequester("Error IntegrityErrorTauxTva",DatabaseError())
            CloseDatabase(myDb)
            ProcedureReturn #True
        EndIf
        If FirstDatabaseRow(myDb)
            ProcedureReturn #True
        EndIf
        CloseDatabase(myDb)
        ProcedureReturn #False
    EndProcedure
    Procedure IntegrityErrorPays(Id)
        Protected query.s
        OpenDb()
        query="SELECT *  FROM localite WHERE id_pays="+Str(Id)
        If DatabaseQuery(myDb,query)=0
            MessageRequester("Error IntegrityErrorPays",DatabaseError())
            CloseDatabase(myDb)
            ProcedureReturn #True
        EndIf
        If FirstDatabaseRow(myDb)
            ProcedureReturn #True
        EndIf
        CloseDatabase(myDb)
        ProcedureReturn #False
    EndProcedure
    ;}
EndModule
Dernière modification par microdevweb le jeu. 14/avr./2016 19:19, modifié 3 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 modulaire

Message par microdevweb »

Sujet à des modifications
mainForm.pbi module mainForm

Code : Tout sélectionner

;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : TUTO développement modulaire
; Deccription : module mainForm
; File Name : mainForm.pbi
;************************************************************************************************************************
DeclareModule mainForm
    ;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
    ; Ici la variable form sera global car elle pourra être renseignée au autres fenêtres
    Global Form
    ;}
    ;-* PUBLIC DECLARATION
    Declare Open()
    ;}
EndDeclareModule
Module mainForm
    EnableExplicit
    ;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
    Global menu
    Enumeration ItemMenu
        #itPays
        #itLocalite
        #itCategorie
        #itTauxTva
        #itLstClient
        #itNewClient
        #itLstProduit
        #itNewProduit
        #itLstCommande
        #itNewCommande
    EndEnumeration
    ;}
    ;-* LOCAL DECLARATION
    Declare Exit()
    Declare MakeMenu()
    Declare EventMyMenu()
    ;}
    ;-* PRIVATE PROCEDURE
    Procedure Exit()
        End
    EndProcedure
    Procedure MakeMenu()
        menu=CreateMenu(#PB_Any,WindowID(Form))
        MenuTitle("Fichiers annexes")
        MenuItem(#itPays,"Pays")
        MenuItem(#itLocalite,"Localité")
        MenuItem(#itCategorie,"Catégorie")
        MenuItem(#itTauxTva,"Taux de TVA")
        MenuTitle("Client")
        MenuItem(#itLstClient,"Liste des clients")
        MenuItem(#itNewClient,"Nouveau client")
        MenuTitle("Produit")
        MenuItem(#itLstProduit,"Liste des produits")
        MenuItem(#itNewProduit,"Nouveau produits")
        MenuTitle("Commande")
        MenuItem(#itLstCommande,"Liste des commandes")
        MenuItem(#itNewCommande,"Nouvelle commande")
    EndProcedure
    Procedure EventMyMenu()
        ; Actuelemnt on ne vas gèrer que les fichiers annexes la suite viendra :)
        Select EventMenu()   
            Case #itPays
                paysTAB::Open(Form)
            Case #itLocalite
                
            Case #itCategorie
                
            Case #itTauxTva
                TvaTAB::Open(Form)
        EndSelect
    EndProcedure
    ;}
    ;-* PUBLIC PROCEDURE
    Procedure Open()
        Protected flag=#PB_Window_SystemMenu|#PB_Window_Maximize|#PB_Window_ScreenCentered
        flag|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget
        Protected title.s="Tutoriel programmation modulaire"
        ; Ouverture de la fenêtre
        Form=OpenWindow(#PB_Any,0,0,800,600,title,flag)
        ; Mise en place du menu
        MakeMenu()
        ; Mise en place des callback
        BindEvent(#PB_Event_CloseWindow,@Exit(),Form)
        BindEvent(#PB_Event_Menu,@EventMyMenu(),Form)
    EndProcedure
    ;}
EndModule
Dernière modification par microdevweb le jeu. 14/avr./2016 19:22, modifié 2 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 modulaire

Message par microdevweb »

Sujet à des modifications
paysFIC.pbi module paysFIC

Code : Tout sélectionner

;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : TUTO développement modulaire
; Deccription : module paysFIC
; File Name : paysFIC.pbi
;************************************************************************************************************************
DeclareModule paysFIC
    ;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
    Enumeration 
        #New
        #Edit
    EndEnumeration
    ;}
    ;-* PUBLIC DECLARATION
    Declare Open(MotherWindow)
    Declare SetMode(mode)
    Declare SetCurrentId(DbId)
    Declare SetRefrechCallback(*callBack)
    ;}
EndDeclareModule
Module paysFIC
    EnableExplicit
    ;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
    Global Form,myMotherWindow,btSubmit,btChancel,myMode=#New,title.s
    Global txtNom,strNom,currentId,*Refresh=-1
    ;}
    ;-* LOCAL DECLARATION
    Declare Exit()
    Declare EventSubmit()
    Declare EventShortcut()
    Declare EventMask()
    Declare AddRecord()
    Declare SaveRecord()
    ;}
    ;-* PRIVATE PROCEDURE
    Procedure Exit()
        ; Réactive la fenêtre mère
        DisableWindow(myMotherWindow,#False)
        ; Ferme la fenêtre
        CloseWindow(Form)
        ; Rend le focus à la fenêtre mère
        SetActiveWindow(myMotherWindow)
    EndProcedure
    Procedure AddRecord()
        Protected nom.s=GetGadgetText(strNom)
        If db::AllReadyExit("pays","nom",nom,db::#TEXT)
            SetGadgetColor(txtNom,#PB_Gadget_FrontColor,RGB(255, 0, 0))
            SetActiveGadget(strNom)
            MessageRequester(title,"Ce Pays existe déjà")
            ProcedureReturn 
        EndIf
        If db::AddPays(nom)
            ; Rafraichi la fenêtre Tab
            If *Refresh<>-1
                CallFunctionFast(*Refresh)
            EndIf
            Exit()
        EndIf
    EndProcedure
    Procedure SaveRecord()
         Protected nom.s=GetGadgetText(strNom)
        If db::AllReadyExit("pays","nom",nom,db::#TEXT,currentId)
            SetGadgetColor(txtNom,#PB_Gadget_FrontColor,RGB(255, 0, 0))
            SetActiveGadget(strNom)
            MessageRequester(title,"Ce Pays existe déjà")
            ProcedureReturn 
        EndIf
        If db::SavePays(nom,currentId)
            ; Rafraichi la fenêtre Tab
            If *Refresh<>-1
                CallFunctionFast(*Refresh)
            EndIf
            Exit()
        EndIf
    EndProcedure
    Procedure EventSubmit()
        ; Place les couleurs des gadgets par défaut
        SetGadgetColor(txtNom,#PB_Gadget_FrontColor,#PB_Default)
        ; Teste si la valeur n'est pas NULL
        If GetGadgetText(strNom)=""
            SetGadgetColor(txtNom,#PB_Gadget_FrontColor,RGB(255, 0, 0))
            SetActiveGadget(strNom)
            ProcedureReturn 
        EndIf
        Select myMode
            Case #New
                AddRecord()
            Case #Edit
                SaveRecord()
        EndSelect
    EndProcedure
    ; Procédure qui va servir à la validation par Enter et la sortie par Esc
    Procedure EventShortcut()
        Select EventMenu()
            Case $FF ;bt return
                EventSubmit()
            Case $FF1 ;bt Esc
                Exit()
        EndSelect
    EndProcedure
    Procedure EventMask()
        ; Le masque est de type FLOAT avec 2 décimale et l'extention %
        prj::MaskingString(strNom,1)
    EndProcedure
    ;}
    ;-* PUBLIC PROCEDURE
    Procedure Open(MotherWindow)
        Protected item.s
        myMotherWindow=MotherWindow
        ; Modifie le titre suivant le mode
        Select myMode
            Case #New
                title="Nouveau Pays"
            Case #Edit
                title="Edition d'un Pays"
        EndSelect
        ; Ouvre la fenêtre
        myMacro::OpenFormFic(300,120)
        ; Ajout des gadgets
        myMacro::Strind(Nom,"Nom du pays")
        SetActiveGadget(strNom)
        ; Gestion du masque de saisie
        BindGadgetEvent(strNom,@EventMask())
        ; En mode édition on remplis les champs de la fenêtre
        If myMode=#Edit
            ; On renseigne item comme suit
            ;id du gadget|db_colonne|nb_decimal ou 0|extention"
            ; les item sont séparé par chr(10)
            item=Str(strNom)+"|nom|0|"
            db::FillGadget("pays",item,currentId)
        EndIf
    EndProcedure
    Procedure SetMode(mode)
        myMode=mode
    EndProcedure
    Procedure SetCurrentId(DbId)
        currentId=DbId
    EndProcedure
    Procedure SetRefrechCallback(*callBack)
        *Refresh=*callBack
    EndProcedure
    ;}
EndModule
Dernière modification par microdevweb le jeu. 14/avr./2016 19:20, 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 modulaire

Message par microdevweb »

Sujet à des modifications
paysTAB.pbi module paysTAB

Code : Tout sélectionner

;************************************************************************************************************************
; Author : MicrodevWeb
; Project Name : TUTO développement modulaire
; Deccription : module paysTAB
; File Name : paysTAB.pbi
;************************************************************************************************************************
DeclareModule paysTAB
    ;-* PUBLIC VARIABLE/LIST/MAP/CONSTANTE
    
    ;}
    ;-* PUBLIC DECLARATION
    Declare Open(motherWindow)
    Declare Refresh()
    ;}
EndDeclareModule
Module paysTAB
    EnableExplicit
    ;-* LOCAL VARIABLE/LIST/MAP/CONSTANTE
    Global Form,Table,btNew,btEdit,btDelete,btChancel,title.s,myMotherWindow
    Global dbTable.s="pays"
    ; ICI on va renseigner les colonnes de la table qui vont être affichée
    ; db_colonne|libellé|largeur|1 si icone de recherche 0 si pas d'icone|nb_decimale si float ou -1|extention ex %"
    ; Chaque colonne est séprée par un chr(10)
    Global tableContent.s
    tableContent="nom|Pays|180|1|-1|"+Chr(10)
    ;}
    ;-* LOCAL DECLARATION
    Declare Exit()
    Declare EventNew()
    Declare EventEdit()
    Declare EventDelete()
    Declare EventShortcut()
    ;}
    ;-* PRIVATE PROCEDURE
    Procedure Exit()
        ; Réactive la fenêtre mère
        DisableWindow(myMotherWindow,#False)
        ; Ferme la fenêtre
        CloseWindow(Form)
        ; Efface la table
        Tbl::Free(Table)
        ; Donne le focus à la fenêtre mère
        SetActiveWindow(myMotherWindow)
    EndProcedure
    Procedure EventNew()
        ; La fenêtre TAB arrive arpès la FIC donc on fixe la procédure de rafraichismeent par pointeur
        paysFIC::SetRefrechCallback(@Refresh())
        paysFIC::SetMode(paysFIC::#New)
        paysFIC::Open(Form)
    EndProcedure
    Procedure EventEdit()
        Protected Id
        ; Récupère l'id de la table de la base de donnée
        Id=Tbl::GetLigneSelected(Table)
         ; La fenêtre TAB arrive arpès la FIC donc on fixe la procédure de rafraichismeent par pointeur
        paysFIC::SetRefrechCallback(@Refresh())
        paysFIC::SetMode(paysFIC::#Edit)
        paysFIC::SetCurrentId(Id)
        paysFIC::Open(Form)
    EndProcedure
    Procedure EventDelete()
        Protected Id
        ; Récupère l'id de la table de la base de donnée
        Id=Tbl::GetLigneSelected(Table)
        If MessageRequester(title,"Etes-vous sure de vouloir supprimer ce Pays",#PB_MessageRequester_YesNo)=#PB_MessageRequester_No
           ProcedureReturn 
       EndIf
       If db::IntegrityErrorPays(Id)
           MessageRequester("Erreur d'intégrité","Vous ne pouvez pas supprimer ce Pays")
           ProcedureReturn 
       EndIf
       If Not db::DeletePays(Id)
           ProcedureReturn 
       EndIf
       Refresh()
    EndProcedure
    Procedure EventShortcut()
        Select EventMenu()
            Case $FF ; INSERT
                EventNew()
            Case $FF1 ; F5
                EventEdit()
            Case $FF2 ;DELETE
                EventDelete()
            Case $FF3 ;ESC
                Exit()
        EndSelect
    EndProcedure
    ;}
    ;-* PUBLIC PROCEDURE
    Procedure Open(motherWindow)
        myMotherWindow=motherWindow
        title="Liste des Pays"
        myMacro::OpenFormTAB(300,600)
        ; Change l'odre de la table
        Tbl::SetOrder(Table,"nom")
        ; Affiche la table
        Tbl::Draw(Table)
    EndProcedure
    Procedure Refresh()
        Tbl::Draw(Table)
    EndProcedure
    ;}
EndModule
Dernière modification par microdevweb le jeu. 14/avr./2016 19:21, 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 modulaire

Message par microdevweb »

En cours de rédaction
localiteFIC.pbi module localiteFIC
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 modulaire

Message par microdevweb »

En cours de rédaction
localiteTAB.pbi module localiteTAB
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 modulaire

Message par microdevweb »

En cours de rédaction
clientFIC.pbi module clientFIC
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 modulaire

Message par microdevweb »

En cours de rédaction
clientTAB.pbi module clientTAB
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 modulaire

Message par microdevweb »

En cours de rédaction
TypeMoyenFIC.pbi module TypeMoyenFIC
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 modulaire

Message par microdevweb »

En cours de rédaction
TypeMoyenTAB.pbi module TypeMoyenTAB
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre