CLP sur les DTAQ avec API QMHQRDQD

IBM i, configuration, commandes, ...
Répondre
AGL
Messages : 15
Enregistré le : ven. 15 sept. 2023, 08:33:28

CLP sur les DTAQ avec API QMHQRDQD

Message par AGL »

Bonjour,

Je souhaite pouvoir récupérer les informations de paramétrage d'une DTAQ. J'ai vu qu'il fallait utiliser l'API QMHQRDQD.
l'OS est en V7R4.
J'ai créé un CLP avec 2 paramètres en entrée (nom de la bibliothèque et nom de la dtaq).

Voici mon PGM :

Code : Tout sélectionner

/* ----------------------------------------------------------------- */
/*      Programme pour afficher les paramètres d'une DTAQ            */
/*    2 paramètres à renseigner lors de l'exécution du PGM :         */
/*         -> &DTAQLIB : bibliothèque qui contient la DTAQ           */
/*         -> &DTAQNAME : Nom de la DTAQ à afficher                  */
/* ----------------------------------------------------------------- */
                                                                       
PGM  PARM(&DTAQLIB &DTAQNAME)                                          
                                                                       
/* ----------------------------------------------------------------- */
/* Déclaration des variables                                         */
/* ----------------------------------------------------------------- */
                                                                       
    DCL VAR(&DTAQNAME) TYPE(*CHAR) LEN(10)                             
    DCL VAR(&DTAQLIB) TYPE(*CHAR) LEN(10)                              
/* ----------------------------------------------------------------- */
/* Déclaration des variables                                         */
/* ----------------------------------------------------------------- */
                                                                       
    DCL VAR(&DTAQNAME) TYPE(*CHAR) LEN(10)                             
    DCL VAR(&DTAQLIB) TYPE(*CHAR) LEN(10)                              
                                                                       
    /* &DTAQINFO = stock les infos de la DTAQ */                       
    /* &ERRCODE = code erreur pour l'appel de l'API */                 
    /* &FORMAT = Nom du format de l'API */                             
                                                                       
    DCL VAR(&DTAQINFO) TYPE(*CHAR) LEN(1000)                           
    DCL VAR(&ERRCODE) TYPE(*CHAR) LEN(8)                               
    DCL VAR(&FORMAT) TYPE(*CHAR) LEN(8)                                
                                                                       
/* ----------------------------------------------------------------- */
/* Exécution du PGM                                                  */
/* ----------------------------------------------------------------- */
                                                                       
    /* Initialiser &ERRCODE et &FORMAT pour gérer les erreurs */       
        CHGVAR VAR(&ERRCODE) VALUE(X'0000000000000000')                
        CHGVAR VAR(&FORMAT) VALUE('DTAQ0200')                          
                                                                       
    /* Appel de l'API pour obtenir la description de la DTAQ */        
        CALL PGM(QSYS/QMHQRDQD) PARM(&DTAQNAME &DTAQLIB &DTAQINFO +    
                &FORMAT &ERRCODE)                                  
                                                                   
    /* Vérif des erreurs potentielles */                           
        IF COND(%SST(&ERRCODE 1 4) *NE '0000') THEN(DO)            
           SNDPGMMSG MSG('Erreur lors de appel API.')              
           RETURN                                                  
        ENDDO                                                      
                                                                   
    /* Afficher les informations obtenues dans un fichier */       
       SNDPGMMSG MSG('Informations de la DTAQ récupérées.')  
       DSPPFM FILE(&DTAQINFO)                                
ENDPGM 


J'ai cette erreur :

Code : Tout sélectionner

Message . . . . :   Format name  is not valid.              
Cause . . . . . :   The format name specified is not valid. 
Lorsqu'il exécute l'API.

J'ai testé de changer la valeur de la variable &FORMAT en DTAQ0100 ou DTAQ0300 mais idem. Même message d'erreur.
D'ailleurs je trouve étrange de faire mon le CALL de l'API comme ceci :

Code : Tout sélectionner

CALL PGM(QSYS/QMHQRDQD) PARM(&DTAQNAME &DTAQLIB &DTAQINFO &FORMAT &ERRCODE)  

en mettant &DTAQINFO dans le call mais sans l'avoir initialisée en amont ?

Auriez-vous des idées ?

Merci
Aurore

nbonnet
Messages : 207
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: CLP sur les DTAQ avec API QMHQRDQD

Message par nbonnet »

Bonjour,

les paramètres ne semblent pas passer dans le bon ordre.
cf https://www.ibm.com/docs/api/v1/content ... hqrdqd.htm
Nathanaël

Hurri
Messages : 44
Enregistré le : lun. 02 nov. 2020, 16:04:59

Re: CLP sur les DTAQ avec API QMHQRDQD

Message par Hurri »

Je dirais même que ce ne sont pas les bons paramètres ni les bons formats.
Il faut dans l'ordre :
La variable de retour
La longueur de cette variable de retour
Le nom du format à utiliser pour le retour (RDQD0100 ou RDQD0200)
Le nom complet de la Data Queue (Bibliothèque/Nom de la DtaQ)

AGL
Messages : 15
Enregistré le : ven. 15 sept. 2023, 08:33:28

Re: CLP sur les DTAQ avec API QMHQRDQD

Message par AGL »

Bonjour à tous les 2, merci pour vos retours !

J'ai fait quelques tests mais pour l'instant ça ne fonctionne pas encore.
Je vais continuer de chercher.

Par contre, j'ai trouvé via le lien envoyé par Nathanaël cette table QSYS2.DATA_QUEUE_INFO
j'ai fait un select dessus avec le nom de ma dtaq mais je ne suis pas certaine d'avoir toutes les informations du paramétrage de ma DTAQ DDM.

J'ai revu le PGM comme ceci :

Code : Tout sélectionner

0001.00 /* ----------------------------------------------------------------- */
0002.00 /*      Programme pour afficher les paramètres d'une DTAQ            */
0003.00 /*    2 paramètres à renseigner lors de l'exécution du PGM :         */
0004.00 /*         -> &DTAQLIB : bibliothèque qui contient la DTAQ           */
0005.00 /*         -> &DTAQNAME : Nom de la DTAQ à afficher                  */
0006.00 /* ----------------------------------------------------------------- */
0007.00                                                                        
0008.00 PGM  PARM(&DTAQLIB &DTAQNAME)                                          
0009.00                                                                        
0010.00 /* ----------------------------------------------------------------- */
0011.00 /* Déclaration des variables                                         */
0012.00 /* ----------------------------------------------------------------- */
0013.00                                                                        
0014.00     DCL VAR(&DTAQNAME) TYPE(*CHAR) LEN(10)                             
0015.00     DCL VAR(&DTAQLIB) TYPE(*CHAR) LEN(10)                              
0016.00
0017.00     /* &DTAQINFO = stock les infos de la DTAQ */       
0018.00     /* &ERRCODE = code erreur pour l'appel de l'API */                 
0019.00     /* &LENDTINFO = longueur du buffer */                              
0020.00     /* &FORMAT = Nom du format de l'API */                             
0021.00     /* &DTAQ = Nom long (bib/dtaq) */                                  
0022.00                                                                        
0023.00     DCL VAR(&DTAQINFO) TYPE(*CHAR) LEN(500)                            
0024.00     DCL VAR(&ERRCODE) TYPE(*CHAR) LEN(8)                               
0025.00     DCL VAR(&LENDTINFO) TYPE(*INT) LEN(4)                              
0026.00     DCL VAR(&FORMAT) TYPE(*CHAR) LEN(8)                                
0027.00     DCL VAR(&DTAQ) TYPE(*CHAR) LEN(25)                                 
0028.00                                                                        
0029.00 /* ----------------------------------------------------------------- */
0030.00 /* Exécution du PGM                                                  */
0031.00 /* ----------------------------------------------------------------- */
0032.00                                                                        
0033.00     /* Initialiser &ERRCODE et &FORMAT et &DTAQ               */       
0034.00         CHGVAR VAR(&ERRCODE) VALUE(X'0000000000000000')            
0035.00         CHGVAR VAR(&FORMAT) VALUE('DTAQ0100')    
0036.00         CHGVAR VAR(&LENDTINFO) VALUE(500)                              
0037.00         CHGVAR VAR(&DTAQ) VALUE(&DTAQLIB *BCAT '/' *BCAT &DTAQNAME)    
0038.00                                                                        
0039.00     /* Appel de l'API pour obtenir la description de la DTAQ */       
0040.00         CALL PGM(QSYS/QMHQRDQD) PARM(&DTAQINFO &LENDTINFO &ERRCODE  + 
0041.00               &FORMAT &DTAQ)                                          
0042.00                                                                       
0043.00     /* Vérif des erreurs potentielles */                              
0044.00         IF COND(%SST(&ERRCODE 1 4) *NE '0000') THEN(DO)               
0045.00            SNDPGMMSG MSG('Erreur lors de appel API.')                 
0046.00            RETURN                                                     
0047.00         ENDDO                                                         
0048.00                                                                       
0049.00     /* Afficher les informations obtenues dans un fichier */          
0050.00        SNDPGMMSG MSG('Informations de la DTAQ récupérées.')           
0051.00        DSPPFM FILE(&DTAQINFO)                                         
0052.00 ENDPGM  
j'ai toujours un message d'erreur :

Code : Tout sélectionner

Message . . . . :   Message CPF3CF1 reçu par FINDDTAQ à l'instruction 4000. (C
  D I R)                                                                      
Cause . . . . . : Le programme CL (langage de contrôle) FINDDTAQ de la        
  bibliothèque TEST a trouvé une erreur à l'instruction numéro 4000. Le     
  texte du message CPF3CF1 est le suivant : Error code parameter not valid..  
Je continue mes recherches :)
Aurore

Hurri
Messages : 44
Enregistré le : lun. 02 nov. 2020, 16:04:59

Re: CLP sur les DTAQ avec API QMHQRDQD

Message par Hurri »

Tu as mis le code d'erreur en 3ème position dans ton appel, alors qu'il est facultatif et en 5ème position...

AGL
Messages : 15
Enregistré le : ven. 15 sept. 2023, 08:33:28

Re: CLP sur les DTAQ avec API QMHQRDQD

Message par AGL »

Merci Hurri,

oui je l'ai vu après, je l'ai corrigé (d'ailleurs je l'ai retiré car il semblait poser problème et comme il est optionnel....)

Je me suis rendue compte que, dans l'API :
Required Parameter Group:

1 Receiver variable Output Char(*)
2 Length of receiver variable Input Binary(4)
3 Format name Input Char(8)
4 Qualified data queue name Input Char(20)


Le Qualified data queue name Input Char(20), n'est pas la concaténation BIBLIO/MADATQ
mais la concaténation DTAQ et Bibliothèque sans la barre oblique.

Et quand j'exécute mon programme, je concatène bien

Code : Tout sélectionner

CHGVAR VAR(&DTAQ) VALUE(&DTAQNAME *TCAT &DTAQLIB) 
Mais, pour faire compliqué, ma DATQ ne comporte que 7 caractères.
et quand l'API Cherche mon objet :

Code : Tout sélectionner

Message . . . . :   Message CPF9801 reçu par FINDDTAQ à l'instruction 4000. (C
  D I R)                                                                      
Cause . . . . . : Le programme CL (langage de contrôle) FINDDTAQ de la        
  bibliothèque TEST a trouvé une erreur à l'instruction numéro 4000. Le     
  texte du message CPF9801 est le suivant : Objet GPAORFXSIP non trouvé dans  
  la bibliothèque RFXREEL..          


Il cherche la DTAQ GPAORFXSIP au lieu de GPAORFX
et la bibliothèque RFXREEL au lieu de SIPRFXREEL...

Il faudrait que je puisse mettre des blancs dans mon programme en fonction du nombre de caractères réels de la DTAQ..
Une idée ?
Aurore

Hurri
Messages : 44
Enregistré le : lun. 02 nov. 2020, 16:04:59

Re: CLP sur les DTAQ avec API QMHQRDQD

Message par Hurri »

Ta variable contenant le nom fait 25 de long au lieu de 20. Çà peut expliquer çà.
Par ailleurs, si tu lis la doc, tu verras que les 10 premiers caractères sont le nom de la DTAQ et ensuite seulement la bibliothèque.
Évite donc les *BCAT...

AGL
Messages : 15
Enregistré le : ven. 15 sept. 2023, 08:33:28

Re: CLP sur les DTAQ avec API QMHQRDQD

Message par AGL »

Bonjour Hurri,

Merci pour ta réponse.
En fait j'avais déjà modifié les *BCAT et changé également la longueur de la chaîne. Voici le PGM à jour :

Code : Tout sélectionner

0001.00 /* ----------------------------------------------------------------- */
0002.00 /*      Programme pour afficher les paramètres d'une DTAQ            */
0003.00 /*    2 paramètres à renseigner lors de l'exécution du PGM :         */
0004.00 /*         -> &DTAQLIB : bibliothèque qui contient la DTAQ           */
0005.00 /*         -> &DTAQNAME : Nom de la DTAQ à afficher                  */
0006.00 /* ----------------------------------------------------------------- */
0007.00                                                                        
0008.00 PGM  PARM(&DTAQLIB &DTAQNAME)                                          
0009.00                                                                        
0010.00 /* ----------------------------------------------------------------- */
0011.00 /* Déclaration des variables                                         */
0012.00 /* ----------------------------------------------------------------- */
0013.00                                                                        
0014.00     DCL VAR(&DTAQNAME) TYPE(*CHAR) LEN(10)                             
0015.00     DCL VAR(&DTAQLIB) TYPE(*CHAR) LEN(10)                              
0016.00                                                                        
0017.00     /* &DTAQINFO = stock les infos de la DTAQ */              
0018.00     /* &ERRCODE = code erreur pour l'appel de l'API */        
0019.00     /* &LENDTINFO = longueur du buffer */                     
0020.00     /* &FORMAT = Nom du format de l'API */                    
0021.00     /* &DTAQ = Nom long (DTAQBIB) */                          
0022.00                                                               
0023.00     DCL VAR(&DTAQINFO) TYPE(*CHAR) LEN(500)                   
0024.00     DCL VAR(&ERRCODE) TYPE(*CHAR) LEN(8)                      
0025.00     DCL VAR(&LENDTINFO) TYPE(*INT) LEN(4)                     
0026.00     DCL VAR(&FORMAT) TYPE(*CHAR) LEN(8)                                
0027.00     DCL VAR(&DTAQ) TYPE(*CHAR) LEN(20)                                 
0028.00                                                                        
0029.00 /* ----------------------------------------------------------------- */
0030.00 /* Exécution du PGM                                                  */
0031.00 /* ----------------------------------------------------------------- */
0032.00                                                                        
0033.00     /* Initialiser &ERRCODE et &FORMAT et &DTAQ               */       
0034.00         CHGVAR VAR(&ERRCODE) VALUE('00000000')                         
0035.00         CHGVAR VAR(&FORMAT) VALUE('RDQD0100')                        
0036.00         CHGVAR VAR(&LENDTINFO) VALUE(500)                            
0037.00         CHGVAR VAR(&DTAQ) VALUE(&DTAQNAME *TCAT &DTAQLIB)            
0038.00         SNDPGMMSG MSG('Valeur DTAQ :' *BCAT &DTAQ)                   
0039.00     /* Appel de l'API pour obtenir la description de la DTAQ */      
0040.00         CALL PGM(QSYS/QMHQRDQD) PARM(&DTAQINFO &LENDTINFO &FORMAT   +
0041.00               &DTAQ)                                                 
0042.00                                                                      
0043.00     /* Vérif des erreurs potentielles */                             
0044.00         IF COND(%SST(&ERRCODE 1 4) *NE '0000') THEN(DO)           
0045.00            SNDPGMMSG MSG('Erreur lors de appel API.')             
0046.00            RETURN                                                 
0047.00         ENDDO                                                     
0048.00                                                                   
0049.00     /* Afficher les informations obtenues dans un fichier */      
0050.00        SNDPGMMSG MSG('Informations de la DTAQ récupérées.')       
0051.00        DSPPFM FILE(&DTAQINFO)                                     
0052.00 ENDPGM 



Comme on le voit, j'ai ajouté la ligne :

Code : Tout sélectionner

0038.00         SNDPGMMSG MSG('Valeur DTAQ :' *BCAT &DTAQ)         


Pour vérifier la lecture de ma variable &DTAQ
Quand j'exécute le programme, la variable prend la valeur suivante :

Code : Tout sélectionner

Message . . . . :   Valeur DTAQ : GPAORFXSIPRFXREEL
GPAORFX = ma datq
SIPRFXREEL = ma bibliothèque

mais le message est le suivant :

Code : Tout sélectionner

Message . . . . :   Message CPF9801 reçu par FINDDTAQ à l'instruction 4000. (C
  D I R)                                                                      
Cause . . . . . : Le programme CL (langage de contrôle) FINDDTAQ de la        
  bibliothèque TEST a trouvé une erreur à l'instruction numéro 4000. Le     
  texte du message CPF9801 est le suivant : Objet GPAORFXSIP non trouvé dans  
  la bibliothèque RFXREEL..      


-> Objet GPAORFXSIP non trouvé dans la bibliothèque RFXREEL..
-> il prend donc bien les 10 premiers caractères pour l'objet alors que je n'en ai que 7 et prend le reste pour désigner la bibliothèque :(

Je continue mes recherches... mais si vous avez la solution miracle, je suis preneuse :)
Aurore

Hurri
Messages : 44
Enregistré le : lun. 02 nov. 2020, 16:04:59

Re: CLP sur les DTAQ avec API QMHQRDQD

Message par Hurri »

Tu as remplacé le *BCAT par un *TCAT, c'est pas mieux... Tu n'as même plus le blanc de séparation !
*CAT serait autrement plus approprié tu ne crois pas ?

AGL
Messages : 15
Enregistré le : ven. 15 sept. 2023, 08:33:28

Re: CLP sur les DTAQ avec API QMHQRDQD

Message par AGL »

Bonjour Hurry,

Effectivement, j'ai modifié :

Code : Tout sélectionner

CHGVAR VAR(&DTAQ) VALUE(&DTAQNAME *CAT &DTAQLIB)
et oui ! Il me remplit &DTAQNAME de 3 blancs comme j'avais défini cette variable comme ceci :

Code : Tout sélectionner

DCL VAR(&DTAQNAME) TYPE(*CHAR) LEN(10)
j'ai bien les blancs :

Code : Tout sélectionner

Message . . . . :   Valeur DTAQ : GPAORFX   SIPRFXREEL
Donc OK pour l'exécution de l'API.

Après j'ai eu un problème dans l'affichage des infos... Car je faisais un DSPPFM FILE(&DTAQINFO) alors que c'est un buffer et non un PF...
Je travaille donc sur l'affichage des infos de la DTAQ (infos retrouvées ici : https://www.ibm.com/docs/api/v1/content ... #HDRRDQD12)

Merci pour les coups de pouce, je mettrai le code final quand j'aurai terminé l'affichage des informations.
Aurore

AGL
Messages : 15
Enregistré le : ven. 15 sept. 2023, 08:33:28

Re: CLP sur les DTAQ avec API QMHQRDQD

Message par AGL »

en fait j'ai juste fait :

Code : Tout sélectionner

  SNDPGMMSG MSG('Informations de la DTAQ récupérées : ' *CAT &DTAQINFO)   


et finalement... je me rends compte que le + simple est d'utiliser la requête SQL suivante qui contient exactement les mêmes informations et qui m'affiche en plus les noms des champs :lol:

Code : Tout sélectionner

select * from QSYS2.DATA_QUEUE_INFO
where DATA_QUEUE_LIBRARY = 'SIPRFXREEL' and DATA_QUEUE_NAME='GPAORFX'
Merci Hurri et Nathanaël pour les échanges

Aurore
Aurore

Répondre