2010-12-15 67 views
2

Nous utilisons la classe com.ibm.as400.data.ProgramCallDocument pour interfacer nos programmes RPG sur l'iSeries via Java. Dans la plupart des cas pour nos applications WebSphere, nous avons dirigé nos programmes RPG/Synon avec des CL et utilisé le PCML pour les interfacer. Nous n'avons pas non plus travaillé avec des structures comme inputoutput.Récupérer un tableau de structures d'un programme RPG en utilisant les API jt400.jar

Cette fois l'un de nos développeurs RPG a créé le programme en RPG IV (pas Synon) et nous a donné le PCML pour interfacer avec ce programme. Nous avons trois paramètres inputoutput en tant que chaînes normales. Pas un gros problème. Nous l'avons déjà fait. Maintenant, le quatrième parm comme vous pouvez le voir est une structure du nombre 100 et c'est inputoutput. Tout ce que nous revenons du programme RPG quand nous essayons de l'invoquer est des tonnes d'espaces (ie, hex 40). Les paramètres de String reviennent bien. Mais la structure ne le fait pas. Tous les indeces ne sont rien d'autre que des blancs.

Lorsque le programmeur RPG était validé, il pouvait voir que son programme renvoyait bien le tableau des structures. Il rédigea également un CL rapide et sale pour s'assurer que son programme retournait effectivement des valeurs, et il a dit que le CL l'avait prouvé.

Alors maintenant, je suis perplexe. J'ai même essayé de trouver un moyen de transmettre une valeur et de voir si cela fait une différence. Mais peu importe ce que je rends soit malheureux (car je ne correspond pas à la liste des paramètres), ou je reçois seulement des blancs. Une idée sur une direction à suivre?

Voici le fichier PCML

<pcml version="4.0"> 
    <!-- RPG program: IL010S20 --> 
    <!-- created: 2010-07-13-11.28.53 --> 
    <!-- source: CPPGENL/QRPGLESRC(IL010S20) --> 
    <!-- 2208 --> 
    <struct name="ADDRINFO"> 
     <data name="PREDIRECTION" type="char" length="2" usage="inherit" /> 
     <data name="STREETNAME" type="char" length="30" usage="inherit" /> 
     <data name="POSTDIRECTION" type="char" length="2" usage="inherit" /> 
     <data name="STREETTYPE" type="char" length="4" usage="inherit" /> 
     <data name="LOWADDRESS" type="char" length="11" usage="inherit" /> 
     <data name="HIGHADDRESS" type="char" length="11" usage="inherit" /> 
     <data name="ODDEVEN" type="char" length="1" usage="inherit" /> 
     <data name="TERRID" type="char" length="2" usage="inherit" /> 
     <data name="TAXCODE" type="char" length="5" usage="inherit" /> 
     <data name="TERRNAME" type="char" length="30" usage="inherit" /> 
    </struct> 
    <!-- 2226 --> 
    <program name="program" path="/QSYS.LIB/DEVOBJL.LIB/IL010S20.PGM"> 
     <data name="STATE" type="char" length="2" usage="inputoutput" /> 
     <data name="ZIP" type="char" length="5" usage="inputoutput" /> 
     <data name="STREET" type="char" length="30" usage="inputoutput" />    
     <data name="RETURNADDR" type="struct" struct="ADDRINFO" count="100" usage="inputoutput" /> 
    </program> 
</pcml> 

Et pour charger le ProgramCallDocument comme suit:

//sys is our AS400 object and parameters is a HashMap. 
ProgramCallDocument newPcml = new ProgramCallDocument(sys, pcmlfileName); 
Iterator parametersKeysI = parameters.keySet().iterator(); 
StringBuffer loggingStatement = new StringBuffer(); 
while(parametersKeysI.hasNext()) { 
    String key = (String)parametersKeysI.next(); 

    if("program.RETURNADDR".equalsIgnoreCase(key)) { 
     AS400Structure [] structure = (AS400Structure[]) parameters.get(key); 
     int [] indeces = new int[1]; 
     indeces[0] = 0; 
     for(int i = 0; i < structure.length; i++) { 
     indeces[0] = i; 
     Object paramValue = structure[i]; 
     loggingStatement.append(paramValue).append(", "); 
     newPcml.setValue(key, indeces, paramValue); 
     } 
    } 
    else { 
     Object paramValue = parameters.get(key); 
     loggingStatement.append(paramValue).append(", "); 
     //set the value 
     newPcml.setValue(key, paramValue); 
    } 
} 

et nous invoquons notre programme avec newPcml.callProgram('program'); et de ce que nous pouvons voir, l'invocation revient vrai. Mais quand nous allons lire la structure il n'y a rien. J'ai même utilisé com.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true); pour essayer de voir les paramètres et c'est ce qui me laisse perplexe. On dirait qu'il n'y a pas de problème, mais nous n'obtenons pas ce que nous attendons.

Toute aide ou direction serait appréciée. Jusqu'à présent, les Javadocs et les exemples en ligne n'ont pas été les plus utiles.

Répondre

2

Ok. C'est stupide, nous n'avons pas pensé à vérifier cela plus tôt. Mais le problème était cas sur nos chaînes/caractères. Même si notre iSeries ici traite à peu près des lettres en majuscule lors de la frappe, parce que nous utilisons jt400.jar je crois qu'il lit nos lettres minuscules dans notre application Java et envoie les octets eqivalents d'entre eux dans l'iSeries et donc nous n'avons pas correspondre sur les lectures DB dans le programme RPG. Notre gars de iSeries vient de modifier ce programme pour "to Upper" tout ce qui arrive donc nous avons contourné le problème. Nous avons juste supposé que c'était correct, à cause de la façon dont la plupart des choses automatiquement "vers le haut" sur l'iSeries. Devinez nous avions tort.