L'API QCAPCMD est une alternative à CMDEXC et QCMDCHK avec en plus: + affichage de l'invite et exécution sur un seul appel de pgm avec récupération des mots-clés(et de la saisie, si invite) + le fait de pouvoir travailler en environnement 38 et 36 + le fait de récupérer la commande dans une autre variable (on garde trace de la variable d'origine) + Cette API peut traiter une ligne de commande - la commande n'a pas besoin d'être autorisée en environnement *EXEC - l'API vérifie les droits "possibilités restreintes" pour le profil - Affichage de l'invite s'il manque des paramètres obligatoires + Proposition d'une vérification de syntaxe type CLP,CL,CMD + Récupération des erreurs (via le paramètre code erreur commun à toutes les API), -> gestion des erreurs plus simple en HLL. |
+ QCAPCMD - CHAR(??) commande - BIN(4) lg de la variable précédente - CHAR(20) options de traitement . BIN(4) type de traitement 0= idem QCMDEXC (la cde doit être *EXEC) 1= idem QCMDCHK 2= traitement ligne de cde "possibilités restreintes" testées Invite si paramètres manquants exécution des commandes 36 si env.36 3= Vérification type de ligne de cde (même principe que 2) 4= contrôle de syntaxe CLP 5= contrôle de syntaxe CL 6= contrôle de syntaxe CMD 7= contrôle de synatxe BND (ILE) 8= options utilisateur (type PDM) |
. CHAR(1) DBCS 0=non,1=oui . CHAR(1) Invite 0= jamais 1= toujours 2= si la cde contient "?" . CHAR(1) 0= syntaxe AS 1= syntaxe 38 . CHAR(13) réservé (doit être x'00') - BIN(4) lg de la variable options de traitement - CHAR(8) format de la variable options de traitement (= CPOP0100) - CHAR(??) commande en retour la commande avec les mots-clés et la saisie utilisateur,si invite. - BIN(4) lg de la variable précédente - BIN(4) lg de la commande retournée, si > à la lg de la variable, la commande a été tronquée - CHAR(??) code erreur |
EXEMPLE: PGM PARM(&LCDE &IN04) /*reçoit ligne de commande et F4*/ DCL &LCDE *CHAR 155 DCL &IN04 *LGL DCL &RQSBLK *CHAR 20 + VALUE(X'00000002F0F0F000000000000000000000000000') DCL &CDLGX *CHAR 4 DCL &CDLG *DEC (7 0) DCL &CD512 *CHAR 512 DCL &ERRCOD *CHAR 16 VALUE(X'00000010') /* lg = 16 */ /* F4 */ IF &IN04 CHGVAR %SST(&RQSBLK 6 1) '1' ELSE CHGVAR %SST(&RQSBLK 6 1) '2' /* LIGNE DE CDE LOGEE DANS L'EXTERNAL */ SNDPGMMSG MSG(&MSG) TOPGMQ(*EXT) MSGTYPE(*RQS) + KEYVAR(&KEYPOS) RCVMSG PGMQ(*EXT) MSGKEY(&KEYPOS) RMV(*NO) /* EXECUTION x9B=155 x14=20 */ CALL QCAPCMD PARM(&LCDE X'0000009B' &RQSBLK X'00000014' + 'CPOP0100' &CD512 X'00000200' &CDLGX + &ERRCOD) /* x200= 512 */ |
CHGVAR &CDLG %BIN(&CDLGX) /* si cde retournée ==> &CDLG > à 0 */ IF (&CDLG > 0) THEN(DO) /* ligne de commande enlevée de l'external */ RCVMSG PGMQ(*EXT) MSGKEY(&KEYPOS) RMV(*YES) /* et cde retournée logée (complète ou suivie de ...) */ IF COND(&CDLG > 512) THEN(SNDPGMMSG MSG(&CD512 + *CAT '...') TOPGMQ(*EXT) MSGTYPE(*RQS) + KEYVAR(&KEYPOS)) ELSE CMD(SNDPGMMSG MSG(%SST(&CD512 1 &CDLG)) + TOPGMQ(*EXT) MSGTYPE(*RQS) KEYVAR(&KEYPOS)) RCVMSG PGMQ(*EXT) MSGKEY(&KEYPOS) RMV(*NO) /* si cde renvoyée et erreur ==> erreur à l'exécution,MàJ &LCDE */ /* en cas d'erreur type cde inconnue(&CDLG=0),on ne touche à rien */ IF (%BIN(&ERRCOD 5 4) > 0) DO /* erreur reçue */ IF COND(&CDLG > 512) THEN(CHGVAR VAR(&LCDE) + VALUE(%SST(&CD512 1 152) *CAT '...')) ELSE CHGVAR &LCDE %SST(&CD512 1 155) ENDDO ENDDO /* pas d'erreur ==> ligne de cde à blanc */ IF (%BIN(&ERRCOD 5 4) = 0) CHGVAR &LCDE ' ' ENDPGM |