Получить массив структур из программы RPG с помощью API jt400.jar

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

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

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

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

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

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

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

//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 и примеры в Интернете не были самыми полезными.


person Chris Aldrich    schedule 15.12.2010    source источник


Ответы (1)


Ok. Это глупо, мы не думали проверять это раньше. Но проблема была в наших строках / символах. Несмотря на то, что наш iSeries здесь в значительной степени работает с заглавными буквами при вводе, поскольку мы используем jt400.jar, я считаю, что он читает наши строчные буквы в нашем приложении Java и отправляет их байтовые эквиваленты в iSeries, поэтому мы не совпадение по БД читается в программе РПГ. Наш специалист по iSeries только что изменил эту программу на «Верхний уровень» для всего, что входит, так что мы решили проблему. Мы просто предположили, что все в порядке, потому что большинство вещей автоматически переходят на более высокий уровень в iSeries. Думаю, мы ошибались.

person Chris Aldrich    schedule 17.12.2010