IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Juin 2010
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Juin 2010
    Messages : 37
    Points : 46
    Points
    46
    Par défaut 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
    Nouveau membre du Club
    Homme Profil pro
    Analyste système
    Inscrit en
    Janvier 2020
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Analyste système
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2020
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    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
    Homme Profil pro
    Analyste-Programmeur IBM i, IBM Cognos TM1
    Inscrit en
    Août 2002
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste-Programmeur IBM i, IBM Cognos TM1
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2002
    Messages : 234
    Points : 355
    Points
    355
    Par défaut 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... 😆

    Larry57

Discussions similaires

  1. Comment faire des etats pour une application web ?
    Par ovh dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 06/07/2021, 03h25
  2. Réponses: 9
    Dernier message: 05/01/2007, 10h51
  3. Comment faire un exécutable d'une application access
    Par b_steph_2 dans le forum Runtime
    Réponses: 4
    Dernier message: 09/02/2006, 16h21
  4. [Son] Faire des bruits avec une application java
    Par mammistegon dans le forum Multimédia
    Réponses: 6
    Dernier message: 22/01/2005, 17h17
  5. Faire un raccoucis vers une application sous wine
    Par zamanika dans le forum Applications et environnements graphiques
    Réponses: 7
    Dernier message: 01/10/2004, 14h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo