Domanda

utilizzare la classe com.ibm.as400.data.ProgramCallDocument di interfacciarsi con i nostri programmi RPG su iSeries attraverso Java. Nella maggior parte dei casi per le nostre applicazioni WebSphere abbiamo fronteggiato la nostra programmi Synon RPG / CL con di e utilizzato il PCML di interfacciarsi con loro. Inoltre, non abbiamo normalmente lavorato con le strutture come InputOutput.

Questa volta uno dei nostri sviluppatori RPG creato il programma in RPG IV (non Synon) e ci ha dato la PCML di interfacciarsi con questo programma. Abbiamo tre parms InputOutput come stringhe regolari. Non un grande affare. Abbiamo fatto prima. Ora la quarta parm come si può vedere è una struttura di conteggio 100 ed è InputOutput.

Tutto ciò che sono sempre indietro dal programma RPG quando cerchiamo di invocarlo è tonnellate di grezzi (cioè, hex 40). I parms String tornano bene. Ma la struct non lo fa. Tutti gli indici sono altro che spazi vuoti.

Quando abbiamo avuto la convalida programmatore RPG, può vedere che il suo programma effettivamente restituire la matrice di strutture. Ha anche scritto un CL rapido e sporco per assicurarsi che il suo programma è stato infatti valori tornando, e mi ha detto che il CL ha dimostrato che era.

Così ora sono perplesso. Ho anche cercato di trovare un modo per passare in un valore e vedere se questo fa la differenza. Ma non importa quello che sia rendono infelice (come io non corrispondono alla lista parms), o torno solo spazi vuoti. Qualche idea su una direzione andare?

Ecco il file 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>

E per caricare il ProgramCallDocument come segue:

//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 );
    }
}

e poi invochiamo il nostro programma con newPcml.callProgram('program'); e da quello che possiamo vedere, l'invocazione sta tornando vero. Ma quando andiamo a leggere la struct non c'è nulla. Ho anche usato com.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true); per cercare di vedere i parms e questo è ciò che mi lascia perplesso. Non vediamo come non c'è problema, ma non stiamo ottenendo quello che ci aspettiamo.

Qualsiasi aiuto o senso sarebbe apprezzato. Finora il Javadocs ed esempi on-line, non sono stati i più utili.

È stato utile?

Soluzione

Ok. Questo è stupido non abbiamo pensato di controllare questo in precedenza. Ma il problema era il caso nostre corde / caratteri. Anche se i nostri iSeries qui praticamente si occupa di lettere superiore con carter durante la digitazione, perché stiamo usando jt400.jar Credo che legge le nostre lettere minuscole nella nostra applicazione Java e invia i eqivalents byte di questi giunge iSeries e quindi non abbiamo fatto incontro sul DB legge nel programma RPG. I nostri iSeries ragazzo appena modificati a programmi tutto "per superiore" che viene fornito in modo abbiamo ottenuto intorno al problema. Abbiamo appena pensato che era ok, a causa di come la maggior parte delle cose automaticamente "al superiore" su iSeries. Immagino ci sbagliavamo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top