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