RPGLE parametres alphanumerique long

RPG (3 et 4, free), CL, SQL, etc...
Répondre
manae
Messages : 58
Enregistré le : mar. 21 juin 2011, 07:08:24

RPGLE parametres alphanumerique long

Message par manae »

Bonjour,

Nous avons un problème avec les paramètres alpha en rpgle.
exemple

Code : Tout sélectionner

 DART0010          PR                  extpgm('ART0010') 
D                               50A 
D                               50A     
D* 
DART0010          PI 
D XCODRT                        50A                                        Code retour 
D XLIBRT                        50A                   

 C* 
  /free 

   XLIBRT=%trim('libelle en dur dans le code codelib bbbbbb610derX2A'); 
   XCODRT=%trim('Code en dur dans le code5678901234567890123456789A'); 

   dump(a); 
   *InLR=*on; 

  /end-free
 dans le dump
 NOM                   ATTRIBUTS            VALEUR                                                                                 
_QRNL_PRMCPY_XCODRT   POINTER              SPP:C08866B1BA001646                                                                   
_QRNL_PRMCPY_XLIBRT   POINTER              SPP:C08866B1BA001667                                                                   
_QRNL_PSTR_XCODRT     POINTER              SPP:C08866B1BA001646                                                                   
_QRNL_PSTR_XLIBRT     POINTER              SPP:C08866B1BA001667                                                                   
XCODRT                CHAR(50)             'Code en dur dans le code5678901234567890123456789A'                                   
                      VALUE IN HEX         'C39684854085954084A49940848195A24093854083968485F5F6F7F8F9F0F1F2F3F4F5F6F7F8F9F0'X   
                        41                 'F1F2F3F4F5F6F7F8F9C1'X                                                               
XLIBRT                CHAR(50)             '4567890123456789Ans le code codelib bbbbbb610derX2'                                   
                      VALUE IN HEX         'F4F5F6F7F8F9F0F1F2F3F4F5F6F7F8F9C195A2409385408396848540839684859389824082828282'X   
                        41                 '8282F6F1F0848599E7F2'X                                                               
* * * * *   F I N  D E  C L I C H E  R P G  * * * * *              
En retour nous avons le XCODRT juste et le début du XLIBRT avec les 17 derniers caractères du XCODRT.
Nous avons l'impression que les deux chaînes se chevauchent.
Comment peut on résoudre ce problème ?

Cordialement

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

Message par cmasse »

Les passages de paramètres sont fait par pointeur.

cela est complément transparent quand un PGM appel un PGM, mais pose un problème quand vous appelez depuis la ligne de commande. Est-ce le cas ?

je crains que oui, dans ce cas, la commande CALL stocke les données transmises dans un espace temporaire et passe l'adresse où elle a stocké (les pointeurs).

la question est comment stocker ? la réponse est pour le numérique 15,5, pour le char 32 minimum, la lg de la chaine si vous transmettez plus que 32c.


si vous faites l'appel en passant deux fois espace, c'est donc 32 (et pas 50 !)

d’ailleurs la différence entre _QRNL_PSTR_XLIBRT et _QRNL_PSTR_XCODRT est de 21 en décimal, soit 33 en Héxa (32 + 1 de décalage)

essayez de faire le CALL en passant "50 espaces + un" (* par exemple)
Modifié en dernier par cmasse le jeu. 11 juin 2015, 07:16:05, modifié 2 fois.
Christian Massé (Volubis.fr)

manae
Messages : 58
Enregistré le : mar. 21 juin 2011, 07:08:24

Message par manae »

le problème c'est que l'appel a été fait à partir d'un cl, et que le les valeurs de retours dans le CL ne sont pas bonnes.
Un dump du cl le confirme.
Le code ( très simple) utilisé pour l'appel, ci-dessous.

Cordialement,

Code : Tout sélectionner

   
             PGM        PARM(&CCODRET &CLIBRET)                               
                                                                              
             DCL        VAR(&CCODRET) TYPE(*CHAR) LEN(50)                     
             DCL        VAR(&CLIBRET) TYPE(*CHAR) LEN(50)                     
                                                                              
             CALL       ART0010 PARM(&CCODRET &CLIBRET)                       
             dmpclpgm                                                         
             ENDPGM

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

Message par cmasse »

OUi, mais le CL reçoit lui même les paramètres, n'est-il pas appelé depuis la ligne de commandes? (auquel cas le problème reste le même !!)
Christian Massé (Volubis.fr)

manae
Messages : 58
Enregistré le : mar. 21 juin 2011, 07:08:24

Message par manae »

Oui, effectivement vous avez raison.
Il faut faire attention aux paramètres passés en ligne de commande.

Merci
Bonne journée
Cordialement.

Répondre