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

AS/400 Discussion :

Faire "tourner" une application.


Sujet :

AS/400

  1. #1
    Membre du Club
    Faire "tourner" une application.
    Bonjour,
    Comme souvent, je remercie condate d'avoir exposé sa façon de faire pour la description d'une base de données. Personnellement, il me semble que l'utilisation d'un répertoire de données est obligatoire, mais souvent on récupère ce que l'on trouve …
    D'autre part (et toujours pour condate), avoir un seul programme pour gérer la mise à jour, la copie, la suppression, la création ou la visualisation pose un problème d'autorisation sur ces opérations.
    En effet, Madame X peut avoir le droit d'afficher un client sans pouvoir le supprimer ou le modifier. Et Monsieur condate peut avoir le droit de modifier un fournisseur sans avoir le droit de le supprimer …
    Une sécurité utilisateur au niveau d'un programme qui gère création, suppression, modification et visualisation est donc compliquée.
    Si chaque fonction (création, visualisation, suppression, modification …) fait l'objet d'un programme différent, c'est plus simple a gérer.

    Mais ce soir je vais vous présenter le point d'entrée d'une application. Il s'agit du paramètre INITIAL PROGRAMM (INLPGM) et LIBRARY (bibliothèque du Initial Programm) choisi lors de la création d'un profil utilisateur (CRTUSRPRF). Donc il s'agit d'un profil utilisateur.

    Je propose que le paramètre INLPGM = MOTEUR et la bibliothèque est MYLIB.
    Alors quand le profil se connecte (SIGNON) c'est le programme MOTEUR de MYLIB qui est lancé.

    Voici le code source du programme (CLP) que je vous présente :

    0001.00 PGM
    0002.00
    0003.00 DCL VAR(&PGM) TYPE(*CHAR) LEN(8)
    0004.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10)
    0005.00 DCL VAR(&TEXT) TYPE(*CHAR) LEN(50)
    0006.00 DCL VAR(&TEST) TYPE(*CHAR) LEN(3)
    0007.00
    0008.00 /* SUPPRESSION DES OVRDBF */
    0009.00 DLTOVR FILE(*ALL)
    0010.00 MONMSG MSGID(CPF0000)
    0011.00
    0012.00 /* AJOUT DES BIBLIOTHEQUES NECESSAIRE */
    0013.00 ADDLIBLE LIB(VOTREBIB)
    0014.00 MONMSG MSGID(CPF0000)
    0015.00 /* ADDLIBLE LIB(TATA) */
    0016.00 /* MONMSG MSGID(CPF0000) */
    0017.00
    0018.00
    0019.00 /* ON INITIALISE LA LDA EN POSITION 17 A 26 AVEC LE USER */
    0020.00 RTVJOBA USER(&USER)
    0021.00 CHGDTAARA DTAARA(*LDA (17 10)) VALUE(&USER)
    0022.00
    0023.00 /* RECUPERATION DES 3 PREMIER CARACTERES DU TEXT USER */
    0024.00 /* POUR TEST SIGNOFF OU NON EN FIN DU CLP */
    0025.00 RTVUSRPRF TEXT(&TEXT)
    0026.00 CHGVAR VAR(&TEST) VALUE(%SUBSTRING(&TEXT 1 3))
    0027.00
    0028.00 /* ON INITIALISE LA LDA DE 1 A 8 AVEC LE NOM DU CLP M0000000 */
    0029.00 /* MENU GENERAL */
    0030.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE('M0000000')
    0031.00
    0032.00 /* ON INITIALISE LA LDA DE 9 A 16 A BLANC */
    0033.00 /* PROGRAMME APPELANT */
    0034.00 CHGDTAARA DTAARA(*LDA (9 8)) VALUE(' ')
    0035.00
    0036.00 /******************************************************************/
    0037.00 /* BOUCLE PRINCIPALE DE L'APPLICATION */
    0038.00 /******************************************************************/
    0039.00
    0040.00 BOUCLE: RTVDTAARA DTAARA(*LDA (1 8)) RTNVAR(&PGM)
    0041.00
    0042.00 /* ON TEST LE PROGRAMME A APPELER : SI <> DE BLANC, ON L'APPELE */
    0043.00 IF COND(&PGM *NE ' ') THEN(DO)
    0044.00
    0045.00 /* SI PAS A BLANC, ON APPEL LE PROGRAMME */
    0046.00 CALL PGM(&PGM)
    0047.00
    0048.00 /* LORSQU'ON REVIENT DU PROG APPELE, ON BOUCLE SUR LEC */
    0049.00 GOTO BOUCLE
    0050.00
    0051.00 ENDDO
    0052.00
    0053.00 /* ON TESTE LES 3 PREMIERS CARACTERES DU TEXT USER */
    0054.00 /* POUR EVITER LE SIGNOFF (pour moi, c'est "ste" */
    0055.00 IF COND(&TEST *NE 'ste') THEN(SIGNOFF)
    0056.00
    0057.00 FIN: ENDPGM

    Explications:
    Les positions 1 à 8 de la LDA sont initialisées avec le nom du programme d'entrée dans l'application
    Ce CL boucle sur lui même tant que les positions 1 à 8 de la LDA sont non vides.
    Il appelle le programme en position 1 à 8 de la LDA (donc au départ le point d'entrée de l'appli).
    Au sortir du programme appelé, il teste les positions 1 à 8 de la LDA.
    Si c'est blanc, on sort de la boucle et on fait un SIGNOFF (sauf le test des 3 premiers caractères du TEXT du profil utilisateur pour vous éviter le SIGNOFF … Vous pouvez changer cela)
    Si c'est pas blanc, on retourne dans la boucle et on appelle le programme dont le nom est en position 1 à 8 de la LDA

    Dans cet exemple, c'est le programme M0000000 qui est appelé quand on rentre dans la boucle de MOTEUR.
    Voici ce que fait M0000000

    0001.00 /********************************************************************
    0002.00 /* GESTION MENU PRINCIPAL
    0003.00 /********************************************************************
    0004.00 PGM
    0005.00
    0006.00 /* DECLARATION DU DSPF DU MENU PRINCIPAL GENERAL */
    0007.00 DCLF FILE(M0000000)
    0008.00
    0009.00 /* AFFICHAGE DE L'ECRAN */
    0010.00
    0011.00 AFFIC: SNDRCVF RCDFMT(F1)
    0012.00
    0013.00 /* SI F3, ON SORT DU PROG EN METTANT A BLANC LE NOM DU PROG */
    0014.00 /* DANS LA LDA EN POSITION 1 8 */
    0015.00
    0016.00 IF COND(&IN03 *EQ '1') THEN(DO)
    0017.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE(' ')
    0018.00 ENDDO
    0019.00
    0020.00 /* SI F5, ON REAFFICHE L'ECRAN PRINCIPAL */
    0021.00 IF COND(&IN05 *EQ '1') THEN(DO)
    0022.00 CHGVAR VAR(&WSOPT2) VALUE(' ')
    0023.00 GOTO CMDLBL(AFFIC)
    0024.00 ENDDO
    0025.00
    0026.00 /* SI UNE OPTION EST SAISIE ON LANCE LE PROGRAMME CORRESPONDANT */
    0027.00 /* EN METTANT SON NOM EN POSITION 1 8 DE LA LDA */
    0028.00
    0029.00
    0030.00 /* OPTION 1 : GESTION DES CLIENTS */
    0031.00 IF COND(&WSOPT2 *EQ '1' *OR &WSOPT2 *EQ ' 1') -
    0032.00 THEN(DO)
    0033.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE('I1000000')
    0034.00 ENDDO
    0035.00
    0036.00 /* OPTION 2 : GESTION DES COMMANDES */
    0037.00 IF COND(&WSOPT2 *EQ '2' *OR &WSOPT2 *EQ ' 2') -
    0038.00 THEN(DO)
    0039.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE('I2000000')
    0040.00 ENDDO
    0041.00
    0042.00 /* OPTION 3 : GESTION DES ARTICLES * */
    0043.00 IF COND(&WSOPT2 *EQ '3' *OR &WSOPT2 *EQ ' 3') -
    0044.00 THEN(DO)
    0045.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE('I3000000')
    0046.00 ENDDO
    0047.00
    0048.00 /* OPTION 4 : GESTION DES CODES * */
    0049.00 IF COND(&WSOPT2 *EQ '4' *OR &WSOPT2 *EQ ' 4') -
    0050.00 THEN(DO)
    0051.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE('M4000000')
    0052.00 ENDDO
    0053.00
    0054.00 /* OPTION 24 : FIN DE SESSION */
    0055.00 IF COND(&WSOPT2 *EQ '24') -
    0056.00 THEN(DO)
    0057.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE(' ')
    0058.00 ENDDO
    0059.00
    0060.00 CHGDTAARA DTAARA(*LDA (9 8)) VALUE('M0000000')
    0061.00
    0062.00 FIN: ENDPGM

    En fonction de l'option choisie, on met en position 1 à 8 de la LDA le nom du prochain programme a lancer et on sort pour retourner dans MOTEUR. Sa boucle va lancer le programme.

    PROBLEME : Dès qu'il y a un ou des paramètres a passer pour le programme a lancer … Voir la ligne 0046.00 de MOTEUR qui fait CALL (&PGM) , sans paramètres, il faut faire un CALL dans le programme en cours.
    Actuellement, je réfléchis à cela.
    Vous avez des idées ? votre propre solution ? des pistes ? répondez moi.
    Je compte sur vous pour m'aider.

    Si vous avez des questions, des critiques, des remarques ou tout autre chose à dire sur ce post, répondez aussi. Je m'engage à vous répondre avec sincérité.

    Bonne soirée à toutes et tous et à demain pour vous parler des sous-fichiers.

    .

  2. #2
    Membre à l'essai
    Citation Envoyé par le_thon Voir le message
    Bonjour,
    Comme souvent, je remercie condate d'avoir exposé sa façon de faire pour la description d'une base de données. Personnellement, il me semble que l'utilisation d'un répertoire de données est obligatoire, mais souvent on récupère ce que l'on trouve …
    D'autre part (et toujours pour condate), avoir un seul programme pour gérer la mise à jour, la copie, la suppression, la création ou la visualisation pose un problème d'autorisation sur ces opérations.
    En effet, Madame X peut avoir le droit d'afficher un client sans pouvoir le supprimer ou le modifier. Et Monsieur condate peut avoir le droit de modifier un fournisseur sans avoir le droit de le supprimer …
    Une sécurité utilisateur au niveau d'un programme qui gère création, suppression, modification et visualisation est donc compliquée.
    Si chaque fonction (création, visualisation, suppression, modification …) fait l'objet d'un programme différent, c'est plus simple a gérer.

    Mais ce soir je vais vous présenter le point d'entrée d'une application. Il s'agit du paramètre INITIAL PROGRAMM (INLPGM) et LIBRARY (bibliothèque du Initial Programm) choisi lors de la création d'un profil utilisateur (CRTUSRPRF). Donc il s'agit d'un profil utilisateur.

    Je propose que le paramètre INLPGM = MOTEUR et la bibliothèque est MYLIB.
    Alors quand le profil se connecte (SIGNON) c'est le programme MOTEUR de MYLIB qui est lancé.

    Voici le code source du programme (CLP) que je vous présente :

    0001.00 PGM
    0002.00
    0003.00 DCL VAR(&PGM) TYPE(*CHAR) LEN(8)
    0004.00 DCL VAR(&USER) TYPE(*CHAR) LEN(10)
    0005.00 DCL VAR(&TEXT) TYPE(*CHAR) LEN(50)
    0006.00 DCL VAR(&TEST) TYPE(*CHAR) LEN(3)
    0007.00
    0008.00 /* SUPPRESSION DES OVRDBF */
    0009.00 DLTOVR FILE(*ALL)
    0010.00 MONMSG MSGID(CPF0000)
    0011.00
    0012.00 /* AJOUT DES BIBLIOTHEQUES NECESSAIRE */
    0013.00 ADDLIBLE LIB(VOTREBIB)
    0014.00 MONMSG MSGID(CPF0000)
    0015.00 /* ADDLIBLE LIB(TATA) */
    0016.00 /* MONMSG MSGID(CPF0000) */
    0017.00
    0018.00
    0019.00 /* ON INITIALISE LA LDA EN POSITION 17 A 26 AVEC LE USER */
    0020.00 RTVJOBA USER(&USER)
    0021.00 CHGDTAARA DTAARA(*LDA (17 10)) VALUE(&USER)
    0022.00
    0023.00 /* RECUPERATION DES 3 PREMIER CARACTERES DU TEXT USER */
    0024.00 /* POUR TEST SIGNOFF OU NON EN FIN DU CLP */
    0025.00 RTVUSRPRF TEXT(&TEXT)
    0026.00 CHGVAR VAR(&TEST) VALUE(%SUBSTRING(&TEXT 1 3))
    0027.00
    0028.00 /* ON INITIALISE LA LDA DE 1 A 8 AVEC LE NOM DU CLP M0000000 */
    0029.00 /* MENU GENERAL */
    0030.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE('M0000000')
    0031.00
    0032.00 /* ON INITIALISE LA LDA DE 9 A 16 A BLANC */
    0033.00 /* PROGRAMME APPELANT */
    0034.00 CHGDTAARA DTAARA(*LDA (9 8)) VALUE(' ')
    0035.00
    0036.00 /******************************************************************/
    0037.00 /* BOUCLE PRINCIPALE DE L'APPLICATION */
    0038.00 /******************************************************************/
    0039.00
    0040.00 BOUCLE: RTVDTAARA DTAARA(*LDA (1 8)) RTNVAR(&PGM)
    0041.00
    0042.00 /* ON TEST LE PROGRAMME A APPELER : SI <> DE BLANC, ON L'APPELE */
    0043.00 IF COND(&PGM *NE ' ') THEN(DO)
    0044.00
    0045.00 /* SI PAS A BLANC, ON APPEL LE PROGRAMME */
    0046.00 CALL PGM(&PGM)
    0047.00
    0048.00 /* LORSQU'ON REVIENT DU PROG APPELE, ON BOUCLE SUR LEC */
    0049.00 GOTO BOUCLE
    0050.00
    0051.00 ENDDO
    0052.00
    0053.00 /* ON TESTE LES 3 PREMIERS CARACTERES DU TEXT USER */
    0054.00 /* POUR EVITER LE SIGNOFF (pour moi, c'est "ste" */
    0055.00 IF COND(&TEST *NE 'ste') THEN(SIGNOFF)
    0056.00
    0057.00 FIN: ENDPGM

    Explications:
    Les positions 1 à 8 de la LDA sont initialisées avec le nom du programme d'entrée dans l'application
    Ce CL boucle sur lui même tant que les positions 1 à 8 de la LDA sont non vides.
    Il appelle le programme en position 1 à 8 de la LDA (donc au départ le point d'entrée de l'appli).
    Au sortir du programme appelé, il teste les positions 1 à 8 de la LDA.
    Si c'est blanc, on sort de la boucle et on fait un SIGNOFF (sauf le test des 3 premiers caractères du TEXT du profil utilisateur pour vous éviter le SIGNOFF … Vous pouvez changer cela)
    Si c'est pas blanc, on retourne dans la boucle et on appelle le programme dont le nom est en position 1 à 8 de la LDA

    Dans cet exemple, c'est le programme M0000000 qui est appelé quand on rentre dans la boucle de MOTEUR.
    Voici ce que fait M0000000

    0001.00 /********************************************************************
    0002.00 /* GESTION MENU PRINCIPAL
    0003.00 /********************************************************************
    0004.00 PGM
    0005.00
    0006.00 /* DECLARATION DU DSPF DU MENU PRINCIPAL GENERAL */
    0007.00 DCLF FILE(M0000000)
    0008.00
    0009.00 /* AFFICHAGE DE L'ECRAN */
    0010.00
    0011.00 AFFIC: SNDRCVF RCDFMT(F1)
    0012.00
    0013.00 /* SI F3, ON SORT DU PROG EN METTANT A BLANC LE NOM DU PROG */
    0014.00 /* DANS LA LDA EN POSITION 1 8 */
    0015.00
    0016.00 IF COND(&IN03 *EQ '1') THEN(DO)
    0017.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE(' ')
    0018.00 ENDDO
    0019.00
    0020.00 /* SI F5, ON REAFFICHE L'ECRAN PRINCIPAL */
    0021.00 IF COND(&IN05 *EQ '1') THEN(DO)
    0022.00 CHGVAR VAR(&WSOPT2) VALUE(' ')
    0023.00 GOTO CMDLBL(AFFIC)
    0024.00 ENDDO
    0025.00
    0026.00 /* SI UNE OPTION EST SAISIE ON LANCE LE PROGRAMME CORRESPONDANT */
    0027.00 /* EN METTANT SON NOM EN POSITION 1 8 DE LA LDA */
    0028.00
    0029.00
    0030.00 /* OPTION 1 : GESTION DES CLIENTS */
    0031.00 IF COND(&WSOPT2 *EQ '1' *OR &WSOPT2 *EQ ' 1') -
    0032.00 THEN(DO)
    0033.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE('I1000000')
    0034.00 ENDDO
    0035.00
    0036.00 /* OPTION 2 : GESTION DES COMMANDES */
    0037.00 IF COND(&WSOPT2 *EQ '2' *OR &WSOPT2 *EQ ' 2') -
    0038.00 THEN(DO)
    0039.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE('I2000000')
    0040.00 ENDDO
    0041.00
    0042.00 /* OPTION 3 : GESTION DES ARTICLES * */
    0043.00 IF COND(&WSOPT2 *EQ '3' *OR &WSOPT2 *EQ ' 3') -
    0044.00 THEN(DO)
    0045.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE('I3000000')
    0046.00 ENDDO
    0047.00
    0048.00 /* OPTION 4 : GESTION DES CODES * */
    0049.00 IF COND(&WSOPT2 *EQ '4' *OR &WSOPT2 *EQ ' 4') -
    0050.00 THEN(DO)
    0051.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE('M4000000')
    0052.00 ENDDO
    0053.00
    0054.00 /* OPTION 24 : FIN DE SESSION */
    0055.00 IF COND(&WSOPT2 *EQ '24') -
    0056.00 THEN(DO)
    0057.00 CHGDTAARA DTAARA(*LDA (1 8)) VALUE(' ')
    0058.00 ENDDO
    0059.00
    0060.00 CHGDTAARA DTAARA(*LDA (9 8)) VALUE('M0000000')
    0061.00
    0062.00 FIN: ENDPGM

    En fonction de l'option choisie, on met en position 1 à 8 de la LDA le nom du prochain programme a lancer et on sort pour retourner dans MOTEUR. Sa boucle va lancer le programme.

    PROBLEME : Dès qu'il y a un ou des paramètres a passer pour le programme a lancer … Voir la ligne 0046.00 de MOTEUR qui fait CALL (&PGM) , sans paramètres, il faut faire un CALL dans le programme en cours.
    Actuellement, je réfléchis à cela.
    Vous avez des idées ? votre propre solution ? des pistes ? répondez moi.
    Je compte sur vous pour m'aider.

    Si vous avez des questions, des critiques, des remarques ou tout autre chose à dire sur ce post, répondez aussi. Je m'engage à vous répondre avec sincérité.

    Bonne soirée à toutes et tous et à demain pour vous parler des sous-fichiers.

    .
    Bonjour,

    Une sécurité utilisateur au niveau d'un programme qui gère création, suppression, modification et visualisation est donc compliquée.
    Si chaque fonction (création, visualisation, suppression, modification …) fait l'objet d'un programme différent, c'est plus simple a gérer.

    C'est (partiellement) vrai. Mais une fois que le modèle des sécurités est écrit, il n'y a plus qu'à reprendre d'un programme à l'autre.

    Je suis plutôt d'accord pour le répertoire qui devrait être utilisé. Mais dans ma carrière, j'ai vu tellement de répertoires écrits de la main gauche à la mode bourrin (des horreurs) et même inutiles que j'ai plutôt tendance à m'en passer (un peu bêtement). Faites ce que je dis mais pas ce que je fais. Faites un répertoire.

    Pour le point d'entrée d'une application, nous n'avons pas ce genre de problèmes puisque nous utilisons un gestionnaire de menus. Les options, les libellés des options et les chaînes de commande appelées sont saisis dans un fichier.
    Après ça roule tout seul.

    Des petits commentaires techniques cependant :

    1) MONMSG MSGID(CPF0000) ne devrait être jamais utilisé dans un CLP, sauf cas particulier dûment maîtrisé.
    2) La *LDA ne devrait plus être utilisée depuis fort longtemps... Elle correspond à une époque où il n'était pas possible de faire autrement (IBM36). Enfin bon, ça marche...
    3) DLTOVR *ALL, tel qu'il est écrit et placé ne me paraît pas indispensable dans ce cas particulier.
    4) ...

    Mais comme on dit souvent : Les goûts et les couleurs...

  3. #3
    Membre averti
    Contrôle
    Pour ce qui est de la gestion des autorisation s, je conseille de faire une table par utilisateur sur les fonctions. Après, lors de l'appel du programme, tu appelles un petit programme qui va gérer les autorités. Celui-ci renvoie si ajout, modification, consultation... &#128518;

    Larry57

###raw>template_hook.ano_emploi###