API QCMDCHK pour la saisie de lignes de commandes

La plupart des développeurs AS/400 connaissent les commandes QCMD et QCMDEXC. La première permet d’appeler une ligne de commande à  l’intérieur d’un programme. La seconde permet d’exécuter une commande AS/400 préalablement constituée.

J’ai découvert tout récemment, grâce à  un collègue (merci Gérald), l’existence de la commande QCMDCHK.

Dans un précédent article, je vous expliquais comment faire « entrer une zone de 512 caractères dans un écran de 80 caractères ». Si vous avez lu cet article, vous savez que mon objectif était de pouvoir saisir une ligne de commande. Mais pour éviter que cette ligne de commande ne contienne des commandes erronées, je souhaitais pouvoir presser la touche F4 (guide) sur cette zone, pour faire apparaître une véritable ligne de commande, pouvoir y saisir des commandes et paramètres, et récupérer le contenu de cette ligne de commande pour pouvoir la stocker ensuite dans mon fichier. Eh bien, la commande QCMDCHK permet de faire ça.

Les paramètres de cette commande sont au nombre de 2 :

 la commande AS/400

 la longueur de la variable contenant cette commande AS/400 (et non pas la longueur de la commande elle-même)

Pour intégrer cette commande plus facilement dans mon programme Adelia, j’ai écrit un petit CL dont le source est le suivant :


PGM PARM(&CMD)

DCL VAR(&CMD) TYPE(*CHAR) LEN(512)
DCL VAR(&USR) TYPE(*CHAR) LEN(10)
DCL VAR(&MSG) TYPE(*CHAR) LEN(100) VALUE(‘X’)
DCL VAR(&RETOUR) TYPE(*CHAR) LEN(2)

/*————————————————————————*/
MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERREUR))
MONMSG MSGID(CPA0000) EXEC(GOTO CMDLBL(ERREUR))
/*————————————————————————*/
RTVJOBA USER(&USR)
/*————————————————————————*/

CALL PGM(QCMDCHK) PARM(&CMD 512)

GOTO CMDLBL(FIN)
/*————————————————————————*/
ERREUR: CHGVAR VAR(&RETOUR) VALUE(‘ER’)
DMPCLPGM
IF COND(&MSG = ‘X’) THEN(DO)
RCVMSG MSGTYPE(*EXCP) MSG(&MSG)
ENDDO
SNDMSG MSG(‘CMDCHKCL : ‘ *CAT &MSG) TOUSR(&USR)

/*————————————————————————*/
FIN: ENDPGM

A l’intérieur de mon programme Adelia, j’ai ajouté dans le pavé TRAITEMENT_GUIDE le pavé suivant :


GUIDE ZW_CMD
W_JOB_CMD = *BLANK
W_JOB_CMD = ‘? ‘ // ZW_CMD
APPELER CMDCHKCL W_JOB_CMD
ZW_CMD = *BLANK
ZW_CMD = W_JOB_CMD
FIN_GUIDE

Et voilà , le fait d’ajouter un « ? » en début de commande a pour effet de passer en mode invite, quelle que soit la commande déjà  constituée. Et si la zone ZW_CMD est vide au départ, on passe en mode « invite » de toute façon, puisque la zone est chargée avec un « ? ».
A la sortie du pgm CMDCHKCL, on recharge la zone écran avec la commande finale, et le tour est joué.

Facile non ?

Print Friendly, PDF & Email