Accueil du site > Les articles > API QCMDCHK pour la saisie de lignes de commandes
Version à imprimer Enregistrer au format PDF

API QCMDCHK pour la saisie de lignes de commandes

lundi 9 janvier 2006, par Grégory Jarrige Visites  20621

L’API QCMDCHK est méconnue et c’est bien dommage car elle est fort utile dans certains cas. Cet article a pour objectif de vous expliquer ce que vous pouvez en faire.


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 ?