Получить массив структур из программы RPG с использованием JT400.jar API

StackOverflow https://stackoverflow.com/questions/4454108

  •  10-10-2019
  •  | 
  •  

Вопрос

Мы используем com.ibm.as400.data.ProgramCallDocument Класс, чтобы взаимодействовать с нашими программами RPG на Iseries через Java. В большинстве случаев для наших приложений WebSphere мы заставили наши программы RPG/Synon с CL и использовали PCML для взаимодействия с ними. Мы также обычно не работали со структурами в качестве ввода.

На этот раз один из наших разработчиков RPG создал программу в RPG IV (не Synon) и дал нам PCML для взаимодействия с этой программой. У нас есть три партизации ввода в качестве обычных строк. Не ахти какое дело. Мы делали это раньше. Теперь четвертый Parm, как вы можете видеть, - это структура подсчета 100, и это вход.

Все, что мы возвращаемся из программы RPG, когда мы пытаемся вызвать ее, это тонны пробелов (то есть Hex 40). Струнные партизации возвращаются нормально. Но структура нет. Все индексы - не что иное, как пробелы.

Когда у нас была проверка программиста RPG, он может видеть, что его программа действительно возвращает массив структур. Он также написал быстрый и грязный CL, чтобы убедиться, что его программа действительно возвращала ценности, и сказал, что CL доказал это.

Так что теперь я в тупике. Я даже пытался найти способ пройти ценность и посмотреть, имеет ли это значение. Но независимо от того, что я делаю это несчастным (так как я не сопоставляю список PARMS), либо возвращаюсь только за пробелы. Есть идеи в направлении идти?

Вот файл 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>

И загрузить программу CallDocument следующим образом:

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

А потом мы ссылаемся на нашу программу newPcml.callProgram('program'); И из того, что мы видим, призыв возвращается правдой. Но когда мы идем, чтобы зачитать структуру, ничего нет. Я даже использовал com.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true); Чтобы попытаться увидеть партию, и это то, что меня озадачивает. Мы выглядим так, как будто нет проблем, но мы не получаем то, что ожидаем.

Любая помощь или направление будут оценены. Пока что Javadocs и примеры онлайн не были самыми полезными.

Это было полезно?

Решение

Ok. Это глупо, что мы не думали проверить это раньше. Но проблема заключалась в случае наших струн/Chars. Несмотря на то, что наши Iseries здесь в значительной степени связаны с верхними буквами при наборе, потому что мы используем JT400.jar, я считаю Матч на DB читает в программе RPG. Наш парень из Iseries только что изменил эту программу на «верхнюю» все, что приходит, поэтому мы обошли эту проблему. Мы просто предположили, что все в порядке, из -за того, как большинство вещей автоматически «до верхнего» на Iseries. Думаю, мы были не правы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top