Liste de valeurs dans une commande
Vous voulez utiliser dans une commande pour un paramètre une liste de valeur paramétrable
sur la commande de votre paramétre vous avez un paramètre CHOICEPGM pour indiquer votre programme
Ce programme peut être en Rpg ou en CL ou autres, il devra juste respecter un certaine syntaxe sur le paramètre à renvoyer
Voici un petit exemple d’une commande qui permet de passer une bibliothèque de *TEST à *PROD et alternativement
La commande
CMD PROMPT('Change Type Lib')
/* NOM DE FICHIER */
PARM KWD(BIBLIO) TYPE(*CHAR) LEN(10) MIN(1) +
CHOICE(*PGM) CHOICEPGM(*LIBL/CHGLIBTYP4) +
PROMPT('Nom de la bib')
le programme de liste
PGM PARM(&PARM1 &PARM2)
DCL VAR(&PARM1) TYPE(*CHAR) LEN(21)
DCL VAR(&PARM2) TYPE(*CHAR) LEN(2000)
/*--------------------------------------------------------------*/
/* Programme CHOICEPGM */
/* */
/* PARM1 : PREMIER PARAMETRE */
/* 1 A 10 NOM DE COMMANDE */
/* 11 A 20 NOM DU PARAMETRE DE LA COMMANDE */
/* 21 A 21 TYPE (P) LISTE DE VALEURS ? ou F4 */
/* (C) TEXTE D'INVITE F11 */
/* */
/* PARM2 : DEUXIEME PARAMETRE */
/* ------>si liste */
/* 1 A 2 NOMBRE DE PARAMETRES TRANSMIS EN BINAIRE */
/* 3 A 4 TAILLE DE LA PREMIERE VALEUR EN BINAIRE */
/* 5 A N PREMIERE VALEUR */
/* N+1 A N+2 TAILLE DE LA DEUXIEME VALEUR EN BINAIRE */
/* N+3 A M DEUXIEME VALEUR */
/* ETC... 2000 */
/* */
/* ------>si texte */
/* 1 A 30 TEXTE A AFFICHER */
/* 31 A 2000 INUTILISER */
/* */
/****************************************************************/
/* */
/* Déclaration des zones de travail */
/* */
dclf qadspobj
DCL VAR(&FINFICHIER) TYPE(*LGL)
DCL VAR(&BIN) TYPE(*CHAR) LEN(2)
DCL VAR(&DEC) TYPE(*DEC) LEN(5 0)
DCL VAR(&SIGN) TYPE(*CHAR) LEN(1)
DCL VAR(&pos ) TYPE(*dec ) LEN(5)
DCL VAR(&nbr ) TYPE(*dec ) LEN(10 0)
/* */
/* Initialisation de la zone paramètre à retourner */
/* Attention elle peut contenir n'importe quoi a l'arrivée */
/* */
CHGVAR VAR(&PARM2) VALUE(' ')
/* */
/* Test de la demande P = liste de paramètres */
/* */
IF COND(%SST(&PARM1 21 1) *EQ 'P') THEN(DO)
/*--------------------------------------------------------------*/
/* */
/* 1er cas pos 21 = P demande d'une liste de valeurs */
/* */
/*--------------------------------------------------------------*/
/* */
/* Formatage de la variable à retourner */
/* Position 1 à 2 en binaire nombre de paramètres de retours */
/* conversion longueur du paramètre en binaire */
/* Position 3 à 4 en binaire longueur de la première valeur */
/* Position 5 à 14 premiére Valeur à afficher */
/* Position 15 à 16 en binaire longueur de la deuxième valeur */
/* Position 17 à 26 Deuxième Valeur à afficher */
/* etc ... */
/* xxxxyyyyyyyyyxxyyyyyyyyyxxyyyyyyyyy */
/* Génération du fichier des bibliothèques GAIA* */
/*--------------------------------------------------------------*/
DSPOBJD OBJ(QSYS/GAIA*) OBJTYPE(*LIB) OUTPUT(*OUTFILE) +
OUTFILE(QTEMP/WADSPOBJ)
OVRDBF FILE(QADSPOBJ) TOFILE(QTEMP/WADSPOBJ) +
LVLCHK(*NO) SHARE(*YES)
RTVMBRD FILE(QTEMP/WADSPOBJ) NBRCURRCD(&NBR)
/* ecriture nombre de postes */
chgvar &pos 1
CHGVAR VAR(%bin(&BIN)) VALUE(&nbr)
CHGVAR VAR(%SST(&PARM2 &pos 2)) VALUE(&BIN)
chgvar &pos 3
CHGVAR VAR(%bin(&BIN)) VALUE(10)
/* Traitement des postes */
DOUNTIL COND((&FINFICHIER) *OR &POS > 1980)
rcvf
monmsg cpf0864 exec(leave)
/* Ecriture de la longueur du poste */
CHGVAR VAR(%SST(&PARM2 &pos 2)) VALUE(&BIN)
chgvar &pos (&pos + 2)
/* ecriture du poste */
CHGVAR VAR(%SST(&PARM2 &pos 10)) VALUE(&odobnm)
chgvar &pos (&pos + 10)
enddo
dltovr FILE(QADSPOBJ)
ENDDO
/*--------------------------------------------------------------*/
/* */
/* 2ème cas pos 21 = C demande d'un texte */
/* */
/*--------------------------------------------------------------*/
IF COND(%SST(&PARM1 21 1) *EQ 'C') THEN(DO)
CHGVAR VAR(&PARM2) VALUE('Un nom valide de +
Bibliothèque')
ENDDO
ENDPGM
Le programme de traitement
PGM PARM(&LIB)
/*-----------------------------------------------------*/
/* Programme de traitement de la commande */
/* récupération du type et changement */
/* *PROD *TEST */
/*-----------------------------------------------------*/
DCL &LIB *CHAR 10
DCL &TYPE *CHAR 10
RTVLIBD LIB(&LIB) TYPE(&TYPE)
IF COND(&TYPE = '*TEST') THEN(DO)
CHGLIB LIB(&LIB) TYPE(*PROD)
ENDDO
ELSE DO
CHGLIB LIB(&LIB) TYPE(*TEST)
ENDDO
ENDPGM
C’est un exemple simple et facilement transposable, on aurait pu utiliser les vues SQL … pour obtenir la liste de bibliothèque