Envoyé par
le_thon
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.
.
Partager