Web services et format numérique

RPG (3 et 4, free), CL, SQL, etc...
Répondre
florian67
Messages : 134
Enregistré le : lun. 23 déc. 2013, 17:03:12

Message par florian67 »

Bonjour,

C'est plus une constatation qu'une question.

J'ai remarqué que lors de l'exposition d'un service Web depuis l'AS400,
pour tout ce qui est numérique, il faut utiliser le type integer.

Exemple :
J'ai exposé un service avec 3 paramètres : 2 caractères et 1 tableau de DS. (dim 999).
La DS à une variable caractère et une numérique signée. --> ça ne fonctionnait pas.
Par contre si je remplace la variable numérique signée par un integer et ça passe.

Faut-il toujours utiliser le type integer pour une variable numérique lors de l'exposition d'un programme AS400?

Merci d'avance.
Florian

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

non, non

Message par cmasse »

Non, je ne vois pas. je viens d'exposer ce test là, ca marche pafaitement

Code : Tout sélectionner

**FREE
ctl-opt PGMINFO(*PCML:*MODULE);
dcl-pi *n;
      param1 packed(3 : 0);
      param2 packed(3 : 0);
end-pi;
param2 = param1 * 2;
return;            
Attention, dans une DS, il est prudent d'initialiser (CLEAR)
Christian Massé (Volubis.fr)

florian67
Messages : 134
Enregistré le : lun. 23 déc. 2013, 17:03:12

Message par florian67 »

Est-ce que vous pouvez essayer avec un tableau de DS en input/output?

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

pareil

Message par cmasse »

Pareil, ce code fonctionne

Code : Tout sélectionner

**FREE
ctl-opt PGMINFO(*PCML:*MODULE);
dcl-ds dstemp template;
  p1 packed(3 : 0);
  p2 packed(3 : 0);
END-DS;
dcl-s i int(5);
dcl-pi *n;
      dsparm likeds(dstemp) dim(10);
end-pi;
for i = 1 to 10;
  dsparm(i).p2 = dsparm(i).p1 * 2;
ENDFOR;
return;                      
Christian Massé (Volubis.fr)

florian67
Messages : 134
Enregistré le : lun. 23 déc. 2013, 17:03:12

Message par florian67 »

Nous on avait ceci:

Code : Tout sélectionner

d LigneCCFL       ds                          
d  ccfl_conti                    2a   inz('') 
d  ccfl_nulib                    7s 0 inz(0)  

d ACCONGCFL       pi                                             
d  i_dtcon                       8s 0                            
d  i_nucon                       7s 0                            
d  o_t_ccfl                           likeds(LigneCCFL) dim(999) 
ce code fonctionne:

Code : Tout sélectionner

d LigneCCFL       ds                          
d  ccfl_conti                    2a   inz('') 
d  ccfl_nulib                   10i 0 inz(0)  

d ACCONGCFL       pi                                             
d  i_dtcon                       8s 0                            
d  i_nucon                       5s 0                            
d  o_t_ccfl                           likeds(LigneCCFL) dim(999) 
Est-ce qu'on a fait une erreur quelque part?

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

INZ(*likeds)

Message par cmasse »

L’initialisation à 0 de la DS qui sert de modèle (LigneCCFL) n'est pas répercutée sur o_t_ccfl ,sauf à utiliser INZ(*LIKEDS).Mais ici ce n'est pas possible -> on ne peut pas initialiser par INZ un paramètre.

Arrivez vous à debuger le pgm ? est-ce que ca plante avant ?

Avez vous essayé le packé, plutôt que le numérique étendu (S) ?
Christian Massé (Volubis.fr)

florian67
Messages : 134
Enregistré le : lun. 23 déc. 2013, 17:03:12

Message par florian67 »

De mémoire oui mais on peut refaire un test dans le doute.
Est-ce que ça ne viendrait pas du signé des autres paramètres?

florian67
Messages : 134
Enregistré le : lun. 23 déc. 2013, 17:03:12

Message par florian67 »

Nous avons essayé en mettant du packé mais on a le message suivant:

soap:Server java.lang.NumberFormatException: Low-order nibble of the byte at array offset 17 is not valid. Byte value: 00.

Code : Tout sélectionner

d LigneCCFL       ds                         
d  ccfl_conti                    2a   inz('')
d  ccfl_nulib                    7p 0 inz(0) 

d ACCONGCFL       pi                  extpgm('ACCONGCFL')       
d  p_dtcon                       8s 0                           
d  p_nucon                       5s 0                           
d  p_t_ccfl                           likeds(LigneCCFL) dim(999)

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

CLEAR

Message par cmasse »

renseignez vous les paramètres en entrée avec des valeurs (après tout c'est en entrée/sortie) ? Sinon commencez votre code CLEAR de la DS pour voir ...
Christian Massé (Volubis.fr)

florian67
Messages : 134
Enregistré le : lun. 23 déc. 2013, 17:03:12

Message par florian67 »

J'ai un peu avancé sur le sujet depuis le temps :)

En fait j'ai fais des tests sur le déploiement.
C'est étrange car quand je veux déployer un service avec une DS en input/output il ne veut pas que je laisse le "detect length fields".

Mais du coup l'ordre des paramètres à l'envoi et au retour n'est pas le même. Il me répond comme ça :

Code : Tout sélectionner

accongaeResponse
 	
return
 	
Group 1
 	
	
PRM_DTCON (decimal):	null
	
PRM_NUCON (decimal):	91182
	
PRM_TYPOP (string):	INI
 Group 2
 	
	PRM_DS_CAE
 	
	Group 1
	Group 2
	Group 3
	Group 4
	Group 5
	Group 6
	Group 7
	Group 8
	Group 9
	Group 10
	Group 11
	Group 12
 	
PRM_DTCON (decimal):	20160219
	
PRM_NUCON (decimal):	null
	
PRM_TYPOP (string):	null
La réponse est :

Code : Tout sélectionner

91182 INI 0 77 91182 0675830 ATLPF 0 DMD ACH 0 20160219 P 20160219 K 20160219

florian67
Messages : 134
Enregistré le : lun. 23 déc. 2013, 17:03:12

Message par florian67 »

J'ai un autre exemple plus simple :

1 variable alpha en input / Output
1 ds en input / output
(case "detect lenght fields" décochée car ds en input/output)

Résultat :

Code : Tout sélectionner

	testswResponse
 	
	return
 	
	Group 1
 	
	
          TRANSPORTEUR (string):	toto
 	Group 2
 	
	  PRM_DSCLIENT
 	
                NOMCLIENT (string):	Dupond
                NUMEROCLIENT (decimal):	3
 	
    TRANSPORTEUR (string):	null
Je ne comprends pas pourquoi le paramètre Transporteur revient deux fois?
C'est quoi cette notion de "group" ?
Je pense que mon problème vient de la.

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

tests

Message par cmasse »

J'ai fait qq tests avec ce code

Code : Tout sélectionner

**free
ctl-opt PGMINFO(*PCML:*MODULE);
dcl-ds tempds template;
  p1_retour char(1);
  p2_retour char(2);
END-DS;
dcl-pi *n;
 p1 char(1);
 p2 likeds(tempds);
END-PI;

p2.p1_retour = p1;
p2.p2_retour = p1 + p1;
*INLR = *on;        
je ne vois pas du tout vos "groupes"

sous SOAPui

Envelope sent

Code : Tout sélectionner

<soapenv&#58;Envelope xmlns&#58;soapenv="http&#58;//schemas.xmlsoap.org/soap/envelope/" xmlns&#58;tes="http&#58;//testwsio.wsbeans.iseries/">
   <soapenv&#58;Header/>
   <soapenv&#58;Body>
      <tes&#58;testwsio>
         <arg0>
            <p1>A</p1>
            <p2>
               <p1_RETOUR>?</p1_RETOUR>
               <p2_RETOUR>?</p2_RETOUR>
            </p2>
         </arg0>
      </tes&#58;testwsio>
   </soapenv&#58;Body>
</soapenv&#58;Envelope>
Envelope receive

Code : Tout sélectionner

<soap&#58;Envelope xmlns&#58;soap="http&#58;//schemas.xmlsoap.org/soap/envelope/">
   <soap&#58;Body>
      <ns2&#58;testwsioResponse xmlns&#58;ns2="http&#58;//testwsio.wsbeans.iseries/">
         <return>
            <p1>A</p1>
            <p2>
               <p1_RETOUR>A</p1_RETOUR>
               <p2_RETOUR>AA</p2_RETOUR>
            </p2>
         </return>
      </ns2&#58;testwsioResponse>
   </soap&#58;Body>
</soap&#58;Envelope>
Christian Massé (Volubis.fr)

florian67
Messages : 134
Enregistré le : lun. 23 déc. 2013, 17:03:12

Message par florian67 »

Sous SOAP-UI ça fonctionne aussi pour moi mais sur le "test service" dans l'interface IBM, ça met les groupes ...

D'ailleurs j'ai remarqué un truc, en décochant la case "detect length fields", il respect les majuscules / minuscules. Si on laisse coché, il met en majuscule.

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

SoapUI

Message par cmasse »

En cas de doute, faites vos tests sous soapUi qui est plus fiable et qui restitue exactement le flux HTTP.

A noter : POSTMAN est aussi très utile pour les web services REST.
Christian Massé (Volubis.fr)

Répondre