API QCAPCMD (process commands) QCMDEXC+QCMDCHK+++

BoTTom |   
 
 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





©AF400