Le problème qui se pose, lors d’une soumission de programme, les variables d’appel numérique packées sont perdues.
A l’intérieure nous avons 0, elle vient d’un écran, le programme qui gère l’écran appelle un CLLE dans lequel il passe cette variable CODUEX correctement.
Prototypage
dcl-pr statistiques_temperature extpgm('BAMP306C');
p_jour_semaine like(r_jour_sem) const; // Jour de référence fin de priode
p_nbr_sous_periode packed(3:0) const;
p_typ_sous_period char(1) const;
p_date_reference char(10) const;
p_code_clientf like(r_code_client) const;
p_code_unite_exploit like(r_code_unite_exploit) const;
END-PR;
En décimale :
00000000
En hexa :
000000000F
Dans le CLLE appelé, nous avons les variables suivantes :
PGM PARM(&JOURSEM &NBPERIODE &TYPPERIOD &DATE &CODCLI +
&CODUEX)
DCL VAR(&CODUEX) TYPE(*DEC) LEN(8 0)
DCL VAR(&CODCLI) TYPE(*CHAR) LEN(8)
DCL VAR(&JOURSEM) TYPE(*CHAR) LEN(8)
DCL VAR(&NBPERIODE) TYPE(*DEC) LEN(3 0)
DCL VAR(&TYPPERIOD) TYPE(*CHAR) LEN(1)
DCL VAR(&DATE) TYPE(*CHAR) LEN(10)
Valeurs des variables de départ dans le programme RPG :
P_JOUR_SEMAINE = Dimanche
P_NBR_SOUS_PERIODE = 001.
P_TYP_SOUS_PERIOD = W
G_CODCLI = 1121168
En hexadécimal :
P_JOUR_SEMAINE = C489948195838885
P_NBR_SOUS_PERIODE = 001F
P_TYP_SOUS_PERIOD = E6
G_CODCLI = F1F1F2F1F1F6F840
Si on regarde la valeur hexa dans le CLLE nous avons ‘000000000F’X :
&JOURSEM = Dimanche
&NBPERIODE = 001.
&TYPPERIOD = W
&DATE = 2016-11-08
&CODCLI = 1121168
&CODUEX = 00000000.
et en hexadécimal :
&JOURSEM = C489948195838885
&NBPERIODE = 001F
&TYPPERIOD = E6
&DATE = F2F0F1F660F1F160F0F8
&CODCLI = F1F1F2F1F1F6F840
&CODUEX = 000000000F
dans le CLLE puis la soumission est faite avec cette commande :
SBMJOB CMD(CALL PGM(BAMP304R) PARM(&JOURSEM &NBPERIODE +
&TYPPERIOD &DATE &CODCLI &CODUEX)) +
JOB(EXTRC_SOND)
Le prototype du BAMP304R est :
dcl-pr statistiques_temperature extpgm('BAMP304R');
p_jour_semaine like(r_jour_sem) const; // Jour de référence fin de période
p_nbr_sous_periode packed(3:0) const;
p_typ_sous_period char(1);
p_date_reference char(10) const;
p_code_client like(r_code_client) const;
p_code_unite_exploit like(r_code_unite_exploit) const;
END-PR;
dcl-pi statistiques_temperature;
p_jour_semaine like(r_jour_sem) const; // Jour de référence fin de période
p_nbr_sous_periode packed(3:0) const;
p_typ_sous_period char(1);
p_date_reference char(10) const;
p_code_client like(r_code_client) const;
p_code_unite_exploit like(r_code_unite_exploit) const;
end-pi;
Les zones p_nbr_sous_periode et p_code_unite_exploit ne sont pas transmises correctement, elles sont égales en à :
P_JOUR_SEMAINE = Dimanche
P_NBR_SOUS_PERIODE = 000.
P_TYP_SOUS_PERIOD = W
P_DATE_REFERENCE = 2016-11-08
P_CODE_CLIENT = 1121168
P_CODE_UNITE_EXPLOIT = 00000000.
Le F en hexadécimal qui, je pense, est le signe a disparu :
P_JOUR_SEMAINE = C489948195838885
P_NBR_SOUS_PERIODE = 0000
P_TYP_SOUS_PERIOD = E6
P_DATE_REFERENCE = F2F0F1F660F1F160F0F8
P_CODE_CLIENT = F1F1F2F1F1F6F840
P_CODE_UNITE_EXPLOIT = 0000000000
Comment corriger le problème ?
A première vue, c’est comme si on lançait la commande CALL sur une ligne de commande.
Dans ce cas, les valeur numérique sont considérées comme étant packées 15p 5.
En changeant les prototypage du programme appelé, cela a fonctionné :
dcl-pr statistiques_temperature extpgm('BAMP304R');
p_jour_semaine like(r_jour_sem) const; // Jour de référence fin de priode
p_nbr_sous_periode packed(15:5) const;
p_typ_sous_period char(1);
p_date_reference char(10) const;
p_code_client like(r_code_client) const;
p_code_unite_exploit packed(15:5) const;
END-PR;
dcl-pi statistiques_temperature;
p_jour_semaine like(r_jour_sem) const; // Jour de référence fin de période
p_nbr_sous_periode packed(15:5) const;
p_typ_sous_period char(1);
p_date_reference char(10) const;
p_code_client like(r_code_client) const;
p_code_unite_exploit packed(15:5) const;
end-pi;