Page 1 sur 1

Posté : jeu. 16 juin 2016, 08:28:22
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

non, non

Posté : jeu. 16 juin 2016, 08:39:37
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)

Posté : jeu. 16 juin 2016, 08:45:59
par florian67
Est-ce que vous pouvez essayer avec un tableau de DS en input/output?

pareil

Posté : jeu. 16 juin 2016, 09:21:24
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;                      

Posté : jeu. 16 juin 2016, 09:31:17
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?

INZ(*likeds)

Posté : jeu. 16 juin 2016, 09:37:21
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) ?

Posté : jeu. 16 juin 2016, 10:59:24
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?

Posté : jeu. 16 juin 2016, 12:29:56
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)

CLEAR

Posté : ven. 17 juin 2016, 11:26:42
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 ...

Posté : jeu. 23 juin 2016, 10:17:34
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

Posté : jeu. 23 juin 2016, 14:45:31
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.

tests

Posté : mar. 28 juin 2016, 08:39:05
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>

Posté : mar. 28 juin 2016, 08:47:02
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.

SoapUI

Posté : mar. 28 juin 2016, 11:16:04
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.