Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Description des fichiers dans une application.
    Bonsoir,

    Ce soir, je vais aborder la description des données d'une application. Cette méthode est valable quelque soit la version du RPG que vous utilisez (du RPG3 au …). Cette méthode de description est même valable pour le RPG2 qui ne supporte pas les descriptions externes des fichiers. Mais au travers de la clause /COPY , il était possible de la simuler.

    La contrainte de base (j'en ai déjà parlé) concerne le nom de la zone résultat limité à 6 caractères en RPG3.
    Le RPG3 est à la base de ILE et Free format. Donc, si le compilateur a évolué, il n'en reste pas moins que ses contraintes restent proches. D'ailleurs, la phase de compilation depuis ILE se passe en deux étapes (CRTRPGMOD puis CRTPGM) au lieu d'une seule en RPG3 (CRTPGM).
    Pour comprendre le problème (et la solution que je propose) regardez une carte C en RPG3.
    Pour faire un MOVE d'une zone écran dans une zone fichier (facteur résultat), le nom de la zone résultat (donc celle du fichier, si c'est le cas) est limité à 6 caractères.
    Pour faire un Z-ADD, un TIME et tout autre code opération ou le facteur résultat est obligatoire, c'est pareil.

    Alors comment faire ?
    Voici la solution que je propose et qui est valable en ILE ou autre :

    Chaque fichier physique (PF) aura un nom de 6 caractères au maximum. Le nom des fichiers logiques auront 8 caractères (Nom du physique suivi d'un n° de séquence de 00 à 99). Condate (seul à me suivre il me semble)
    Les 2 premiers caractères de chaque fichier physique (PF) seront différents.
    Exemple : Si vous avez un fichier "commandes" et un fichier "colis", le nom du fichier des commandes sera COMMAN et celui des colis sera KOLIS. Ce qui compte, c'est que les 2 premiers caractères de chaque fichier soient différents.

    Créer un fichier physique "répertoire" (nom REP dans cet exemple) qui ne contiendra aucune données, mais juste la description des données de l'application. Dans ce fichier, chaque donnée sera décrite par son nom (maximum 4 caractères), son type, sa longueur et nombre de décimales au besoin.
    Exemple du répertoire des données (Fichier physique REP) :

    0001.00 A*****************************************************************
    0002.00 A* REPERTOIRE GENERAL DES DONNEES *
    0003.00 A*****************************************************************
    0004.00 A*REPERTOIRE GENERAL DES DONNEES
    0005.00 A*****************************************************************
    0006.00 A R REPF1 TEXT('REPERTOIRE GENERAL')
    0007.00 A*
    0008.00 A OPT1 1 TEXT('ZONE OPTION 1 DE LONG')
    0009.00 A COLHDG('ZONE OPTION')
    0010.00 A OPT2 2 TEXT('ZONE OPTION 2 DE LONG')
    0011.00 A COLHDG('ZONE OPTION')
    0012.00 A CCLI 5 TEXT('CODE CLIENT')
    0013.00 A COLHDG('CODE CLIENT')
    0014.00 A NCLI 25 TEXT('NOM CLIENT')
    0015.00 A COLHDG('NOM CLIENT')
    0016.00 A NTEL 10 TEXT('NUMERO DE TELEPHONE')
    0017.00 A COLHDG('NUMERO DE TELEPHONE')
    0018.00 A AD35 35 TEXT('ADRESSE 35 DE LONG')
    0019.00 A COLHDG('ADRESSE 35 DE LONG')
    0020.00 A CP 5 TEXT('CODE POSTAL')
    0021.00 A COLHDG('CODE POSTAL')
    0022.00 A VILL 35 TEXT('NOM VILLE')
    0023.00 A COLHDG('NOM VILLE')
    0024.00 A NPAY 25 TEXT('NOM PAYS')
    0025.00 A COLHDG('NOM PAYS')
    0026.00 A CPAY 3 TEXT('CODE PAYS')
    0027.00 A COLHDG('CODE PAYS')
    0028.00 A REM 40 TEXT('REMARQUE')
    0029.00 A COLHDG('REMARQUE')
    0030.00 A CCDE 12 TEXT('CODE CDE')
    0031.00 A COLHDG('CODE CDE')
    0032.00 A USER 10 TEXT('UTILISATEUR')
    0033.00 A COLHDG('UTILISATEUR')
    0034.00 A TIME 14 0 TEXT('DATE ET HEURE')
    0035.00 A COLHDG('DATE ET HEURE
    0036.00 A DATE 8 TEXT('AAAAMMJJ')
    0037.00 A COLHDG('AAAAMMJJ')
    0038.00 A HMS 6 0 TEXT('HHMMSS')
    0039.00 A COLHDG('HH:MM:SS')
    0040.00 A ANNE 4 TEXT('ANNEE')
    0041.00 A COLHDG('ANNEE')
    0042.00 A MOIS 2 TEXT('MOIS')
    0043.00 A COLHDG('MOIS')
    0044.00 A JOUR 2 TEXT('JOUR')
    0045.00 A COLHDG('JOUR')
    0046.00 A HEUR 2 0 TEXT('HEURE')
    0047.00 A COLHDG('HEURE')
    0048.00 A MINU 2 0 TEXT('MINUTE')
    0049.00 A COLHDG('MINUTE')
    0050.00 A SECO 2 0 TEXT('SECONDE')
    0051.00 A COLHDG('SECONDE')

    Remarque : le nom de chaque données fait au max 4 caractères

    Maintenant nous avons : Des fichiers physiques avec des noms qui différent sur les 2 premiers caractères et un "répertoire des données" avec des noms de 4 caractères au max.

    Passons à la description de chaque fichier … Chaque zone de fichier sera composée comme suit :
    2 premiers caractères du nom du fichier + nom de la zone du répertoire (avec un REFFLD pointant sur le répertoire).

    Création de la DDS du fichier "des commandes". Nom : CDE
    0001.00 REF(REP)
    0002.00 R CDEF1
    0003.00 CDCCDE R REFFLD(CCDE) CDCCDE = CD (2 premiers caractères du fichier CDE) + CCDE (venant du répertoire REP)
    0004.00 TEXT('CODE COMMANDE'
    0005.00 CDCCLI R REFFLD(CCLI) CDCCLI = CD (2 premiers caractères du fichier CDE) + CCLI (venant du répertoire REP)
    0006.00 TEXT('CODE CLIENT')
    0007.00 CDDCDE R REFFLD(DATE)
    0008.00 TEXT('DATE CDE')
    0009.00 CDHCDE R REFFLD(HMS)
    0010.00 TEXT('HEURE CDE')
    0011.00 CDREM1 R REFFLD(REM)
    0012.00 TEXT('REMARQUE')
    0013.00 CDREM2 R REFFLD(REM)
    0014.00 TEXT('REMARQUE')
    0015.00 CDTIME R REFFLD(TIME)
    0016.00 TEXT('DATE MAJ')
    0017.00 CDUSER R REFFLD(USER)
    0018.00 TEXT('USER MAJ')
    0019.00 K CDCCDE

    Création de la DDS du fichier "des clients". Nom : CLIENT

    0001.00 REF(REP)
    0002.00 R CLIENTF1
    0003.00 CLCCLI R REFFLD(CCLI) CLCCLI = CD (2 premiers caractères du fichier CLIENT) + CCLI (venant du répertoire REP)
    0004.00 TEXT('CODE CLIENT')
    0005.00 CLNCLI R REFFLD(NCLI)
    0006.00 TEXT('NOM CLIENT')
    0007.00 CLNTEL R REFFLD(NTEL)
    0008.00 TEXT('TELEPHONE')
    0009.00 CLADR1 R REFFLD(AD35)
    0010.00 TEXT('LIG 1 ADRESSE')
    0011.00 CLADR2 R REFFLD(AD35)
    0012.00 TEXT('LIG 2 ADRESSE')
    0013.00 CLCP R REFFLD(CP)
    0014.00 TEXT('CODE POSTAL')
    0015.00 CLVILL R REFFLD(VILL)
    0016.00 TEXT('VILLE')
    0017.00 CLCPAY R REFFLD(CPAY)
    0018.00 TEXT('PAYS')
    0019.00 CLREM1 R REFFLD(REM)
    0020.00 TEXT('REMARQUE')
    0021.00 CLREM2 R REFFLD(REM)
    0022.00 TEXT('REMARQUE')
    0023.00 CLTIME R REFFLD(TIME)
    0024.00 TEXT('DATE MAJ')
    0025.00 CLUSER R REFFLD(USER)
    0026.00 TEXT('USER MAJ')
    0027.00 K CLCCLI

    RESULTAT :
    Le nom de chaque zone de fichier fait 6 caractères au maximum (résolution de la longueur du nom en facteur résultat).
    Chaque nom de zone est unique.
    Toutes les zones font référence au répertoire des données : Donc il suffit de modifier la description d'une zone dans le répertoire et de "tout recompiler" pour que ça fonctionne.
    La description est unique et elle est faite au niveau du répertoire.
    Pour les zones des fichiers écrans (DSPF), les 2 premières lettres seront WS (pour WorkStation): Exemple WSCCLI pour code client d'un écran … Donc pas de nom de fichier physique commençant par WS.

    Les MOVE sont EXPLICITES !!! "Je n'aime pas l'implicite" car c'est illisible, donc les noms des zones écrans sont différentes des noms des zones de fichier.
    On fait MOVE zone-de-fichier dans zone-écran et MOVE zone-écran dans zone-de-fichier (les noms sont différents)
    Exemple MOVE WSCCLI CLCCLI
    ou MOVE CLCCLI WSCCLI

    Toujours pareil : Si vous avez des remarques, suggestions/propositions/autres solutions , critiques, avis, questions ou autre, n'hésitez pas à répondre et à vous exprimer.

    Demain je vous parlerai d'une façon de lancer et faire tourner une application. Mais je ne suis pas satisfait de ce que je vais vous exposer car il y a un problème. Alors, si vous pouvez m'aider, ça sera très sympa.
    En attendant, je vous souhaite une bonne soirée.

  2. #2
    Membre à l'essai
    Citation Envoyé par le_thon Voir le message
    Bonsoir,

    Ce soir, je vais aborder la description des données d'une application. Cette méthode est valable quelque soit la version du RPG que vous utilisez (du RPG3 au …). Cette méthode de description est même valable pour le RPG2 qui ne supporte pas les descriptions externes des fichiers. Mais au travers de la clause /COPY , il était possible de la simuler.

    La contrainte de base (j'en ai déjà parlé) concerne le nom de la zone résultat limité à 6 caractères en RPG3.
    Le RPG3 est à la base de ILE et Free format. Donc, si le compilateur a évolué, il n'en reste pas moins que ses contraintes restent proches. D'ailleurs, la phase de compilation depuis ILE se passe en deux étapes (CRTRPGMOD puis CRTPGM) au lieu d'une seule en RPG3 (CRTPGM).
    Pour comprendre le problème (et la solution que je propose) regardez une carte C en RPG3.
    Pour faire un MOVE d'une zone écran dans une zone fichier (facteur résultat), le nom de la zone résultat (donc celle du fichier, si c'est le cas) est limité à 6 caractères.
    Pour faire un Z-ADD, un TIME et tout autre code opération ou le facteur résultat est obligatoire, c'est pareil.

    Alors comment faire ?
    Voici la solution que je propose et qui est valable en ILE ou autre :

    Chaque fichier physique (PF) aura un nom de 6 caractères au maximum. Le nom des fichiers logiques auront 8 caractères (Nom du physique suivi d'un n° de séquence de 00 à 99). Condate (seul à me suivre il me semble)
    Les 2 premiers caractères de chaque fichier physique (PF) seront différents.
    Exemple : Si vous avez un fichier "commandes" et un fichier "colis", le nom du fichier des commandes sera COMMAN et celui des colis sera KOLIS. Ce qui compte, c'est que les 2 premiers caractères de chaque fichier soient différents.

    Créer un fichier physique "répertoire" (nom REP dans cet exemple) qui ne contiendra aucune données, mais juste la description des données de l'application. Dans ce fichier, chaque donnée sera décrite par son nom (maximum 4 caractères), son type, sa longueur et nombre de décimales au besoin.
    Exemple du répertoire des données (Fichier physique REP) :

    0001.00 A*****************************************************************
    0002.00 A* REPERTOIRE GENERAL DES DONNEES *
    0003.00 A*****************************************************************
    0004.00 A*REPERTOIRE GENERAL DES DONNEES
    0005.00 A*****************************************************************
    0006.00 A R REPF1 TEXT('REPERTOIRE GENERAL')
    0007.00 A*
    0008.00 A OPT1 1 TEXT('ZONE OPTION 1 DE LONG')
    0009.00 A COLHDG('ZONE OPTION')
    0010.00 A OPT2 2 TEXT('ZONE OPTION 2 DE LONG')
    0011.00 A COLHDG('ZONE OPTION')
    0012.00 A CCLI 5 TEXT('CODE CLIENT')
    0013.00 A COLHDG('CODE CLIENT')
    0014.00 A NCLI 25 TEXT('NOM CLIENT')
    0015.00 A COLHDG('NOM CLIENT')
    0016.00 A NTEL 10 TEXT('NUMERO DE TELEPHONE')
    0017.00 A COLHDG('NUMERO DE TELEPHONE')
    0018.00 A AD35 35 TEXT('ADRESSE 35 DE LONG')
    0019.00 A COLHDG('ADRESSE 35 DE LONG')
    0020.00 A CP 5 TEXT('CODE POSTAL')
    0021.00 A COLHDG('CODE POSTAL')
    0022.00 A VILL 35 TEXT('NOM VILLE')
    0023.00 A COLHDG('NOM VILLE')
    0024.00 A NPAY 25 TEXT('NOM PAYS')
    0025.00 A COLHDG('NOM PAYS')
    0026.00 A CPAY 3 TEXT('CODE PAYS')
    0027.00 A COLHDG('CODE PAYS')
    0028.00 A REM 40 TEXT('REMARQUE')
    0029.00 A COLHDG('REMARQUE')
    0030.00 A CCDE 12 TEXT('CODE CDE')
    0031.00 A COLHDG('CODE CDE')
    0032.00 A USER 10 TEXT('UTILISATEUR')
    0033.00 A COLHDG('UTILISATEUR')
    0034.00 A TIME 14 0 TEXT('DATE ET HEURE')
    0035.00 A COLHDG('DATE ET HEURE
    0036.00 A DATE 8 TEXT('AAAAMMJJ')
    0037.00 A COLHDG('AAAAMMJJ')
    0038.00 A HMS 6 0 TEXT('HHMMSS')
    0039.00 A COLHDG('HH:MM:SS')
    0040.00 A ANNE 4 TEXT('ANNEE')
    0041.00 A COLHDG('ANNEE')
    0042.00 A MOIS 2 TEXT('MOIS')
    0043.00 A COLHDG('MOIS')
    0044.00 A JOUR 2 TEXT('JOUR')
    0045.00 A COLHDG('JOUR')
    0046.00 A HEUR 2 0 TEXT('HEURE')
    0047.00 A COLHDG('HEURE')
    0048.00 A MINU 2 0 TEXT('MINUTE')
    0049.00 A COLHDG('MINUTE')
    0050.00 A SECO 2 0 TEXT('SECONDE')
    0051.00 A COLHDG('SECONDE')

    Remarque : le nom de chaque données fait au max 4 caractères

    Maintenant nous avons : Des fichiers physiques avec des noms qui différent sur les 2 premiers caractères et un "répertoire des données" avec des noms de 4 caractères au max.

    Passons à la description de chaque fichier … Chaque zone de fichier sera composée comme suit :
    2 premiers caractères du nom du fichier + nom de la zone du répertoire (avec un REFFLD pointant sur le répertoire).

    Création de la DDS du fichier "des commandes". Nom : CDE
    0001.00 REF(REP)
    0002.00 R CDEF1
    0003.00 CDCCDE R REFFLD(CCDE) CDCCDE = CD (2 premiers caractères du fichier CDE) + CCDE (venant du répertoire REP)
    0004.00 TEXT('CODE COMMANDE'
    0005.00 CDCCLI R REFFLD(CCLI) CDCCLI = CD (2 premiers caractères du fichier CDE) + CCLI (venant du répertoire REP)
    0006.00 TEXT('CODE CLIENT')
    0007.00 CDDCDE R REFFLD(DATE)
    0008.00 TEXT('DATE CDE')
    0009.00 CDHCDE R REFFLD(HMS)
    0010.00 TEXT('HEURE CDE')
    0011.00 CDREM1 R REFFLD(REM)
    0012.00 TEXT('REMARQUE')
    0013.00 CDREM2 R REFFLD(REM)
    0014.00 TEXT('REMARQUE')
    0015.00 CDTIME R REFFLD(TIME)
    0016.00 TEXT('DATE MAJ')
    0017.00 CDUSER R REFFLD(USER)
    0018.00 TEXT('USER MAJ')
    0019.00 K CDCCDE

    Création de la DDS du fichier "des clients". Nom : CLIENT

    0001.00 REF(REP)
    0002.00 R CLIENTF1
    0003.00 CLCCLI R REFFLD(CCLI) CLCCLI = CD (2 premiers caractères du fichier CLIENT) + CCLI (venant du répertoire REP)
    0004.00 TEXT('CODE CLIENT')
    0005.00 CLNCLI R REFFLD(NCLI)
    0006.00 TEXT('NOM CLIENT')
    0007.00 CLNTEL R REFFLD(NTEL)
    0008.00 TEXT('TELEPHONE')
    0009.00 CLADR1 R REFFLD(AD35)
    0010.00 TEXT('LIG 1 ADRESSE')
    0011.00 CLADR2 R REFFLD(AD35)
    0012.00 TEXT('LIG 2 ADRESSE')
    0013.00 CLCP R REFFLD(CP)
    0014.00 TEXT('CODE POSTAL')
    0015.00 CLVILL R REFFLD(VILL)
    0016.00 TEXT('VILLE')
    0017.00 CLCPAY R REFFLD(CPAY)
    0018.00 TEXT('PAYS')
    0019.00 CLREM1 R REFFLD(REM)
    0020.00 TEXT('REMARQUE')
    0021.00 CLREM2 R REFFLD(REM)
    0022.00 TEXT('REMARQUE')
    0023.00 CLTIME R REFFLD(TIME)
    0024.00 TEXT('DATE MAJ')
    0025.00 CLUSER R REFFLD(USER)
    0026.00 TEXT('USER MAJ')
    0027.00 K CLCCLI

    RESULTAT :
    Le nom de chaque zone de fichier fait 6 caractères au maximum (résolution de la longueur du nom en facteur résultat).
    Chaque nom de zone est unique.
    Toutes les zones font référence au répertoire des données : Donc il suffit de modifier la description d'une zone dans le répertoire et de "tout recompiler" pour que ça fonctionne.
    La description est unique et elle est faite au niveau du répertoire.
    Pour les zones des fichiers écrans (DSPF), les 2 premières lettres seront WS (pour WorkStation): Exemple WSCCLI pour code client d'un écran … Donc pas de nom de fichier physique commençant par WS.

    Les MOVE sont EXPLICITES !!! "Je n'aime pas l'implicite" car c'est illisible, donc les noms des zones écrans sont différentes des noms des zones de fichier.
    On fait MOVE zone-de-fichier dans zone-écran et MOVE zone-écran dans zone-de-fichier (les noms sont différents)
    Exemple MOVE WSCCLI CLCCLI
    ou MOVE CLCCLI WSCCLI

    Toujours pareil : Si vous avez des remarques, suggestions/propositions/autres solutions , critiques, avis, questions ou autre, n'hésitez pas à répondre et à vous exprimer.

    Demain je vous parlerai d'une façon de lancer et faire tourner une application. Mais je ne suis pas satisfait de ce que je vais vous exposer car il y a un problème. Alors, si vous pouvez m'aider, ça sera très sympa.
    En attendant, je vous souhaite une bonne soirée.
    Bonsoir,

    presque identique pour nous.

    Chaque entité possède son préfixe attribué : 2 caractères arbitraires, soit plus de 900 possibilités, ce qui est suffisant.
    Par contre, après il y a toujours le caractère "_", cela sert à améliorer la lisibilité à l'intérieur des programmes.
    Ensuite le suffixe : jusqu'à 5 caractères. Ces 5 caractères auraient dû correspondre à un nom dans un répertoire mais nous ne l'avons pas fait. (C'est pas bien hein ?)

    Nous avons donc des noms de zone BD jusqu'à 8 caractères. Nous n'utilisons plus ni RPGII, ni RPGIII depuis bien longtemps rien que pour cela !!! RPG-IV est effectivement le minimum vital.

    Dans les programmes, les "move" implicites sont à proscrire comme la peste parce que difficilement détectables. J'en connais qui aiment ça mais qui se font régulièrement piéger !

    Les zones des écrans ayant leur équivalent dans la base de données sont systématiquement référencées avec ce nom dans la base de données, non pas par rapport au répertoire puisque nous n'en avons pas, mais par rapport au fichier physique de l'entité. De plus les noms des zones des écrans ont un super-préfixe O$ pour les libellés, W$ pour les zones en saisie, H$ pour les zones cachées, C$ pour les zones de positionnement... Mine de rien, c'est assez parlant avec un peu d'habitude.
    Chaque fichier BD déclaré dans un programme possède aussi son super-préfixe (mot-clef PREFIX en RPG-IV) A$, B$, E$, F$, G$, e.t.c. excepté W$ H$ C$ O$ réservés pour les écrans, excepté Z$ pour les zones de travail, excepté P$ pour les paramètres, excepté U$/D$ pour les clefs hautes et basses, excepté K$ pour les KLIST.. Enfin... ce n'est pas si strict que cela mais c'est l'esprit. Ben entendu, d'un programme à l'autre un même fichier n'aura pas forcément le même super-préfixe, de plus nous pouvons utiliser plusieurs logiques différents du même physique (dans le même programme), ils auront chacun leur propre super-préfixe distinct. Cela enlève toute ambiguïté sur l'origine des données.

    A l'intérieur d'un programme, nos noms de zone sont donc assez souvent à 10 caractères. Nous en sommes contents depuis plus de 20 ans mais s'il y a mieux, pourquoi pas ? A voir...