gpt4 book ai didi

java - 使用 jt400.jar API 从 RPG 程序中检索结构数组

转载 作者:行者123 更新时间:2023-11-30 09:51:54 25 4
gpt4 key购买 nike

我们使用 com.ibm.as400.data.ProgramCallDocument 类通过 Java 与 iSeries 上的 RPG 程序交互。在我们的 WebSphere 应用程序的大多数情况下,我们将 RPG/Synon 程序置于 CL 的前端,并使用 PCML 与它们进行交互。我们通常也没有使用结构作为输入输出。

这次,我们的一位 RPG 开发人员在 RPG IV(不是 Synon)中创建了程序,并为我们提供了与该程序交互的 PCML。我们有三个输入输出参数作为常规字符串。没什么大不了的。我们以前做过。现在,您可以看到第四个参数是计数为 100 的结构,它是输入输出。

当我们尝试调用 RPG 程序时,我们从 RPG 程序返回的只是大量空白(即十六进制 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>

并按如下方式加载 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'); 调用我们的程序,从我们所见,调用返回 true。但是当我们去读出结构时,什么也没有。我什至使用 com.ibm.as400.data.PcmlMessageLog.setTraceEnabled(true); 来尝试查看参数,这让我感到困惑。我们看起来没有问题,但我们没有得到我们期望的结果。

如有任何帮助或指导,我们将不胜感激。到目前为止,Javadoc 和在线示例并不是最有帮助的。

最佳答案

好的。这太愚蠢了,我们没想到要早点检查。但问题出在我们的字符串/字符上。尽管我们这里的 iSeries 在打字时几乎处理大写字母,因为我们使用的是 jt400.jar,我相信它会在我们的 Java 应用程序中读取我们的小写字母并将它们的字节等价物发送到 iSeries,因此我们没有匹配 RPG 程序中的 DB 读取。我们的 iSeries 人员刚刚修改了这个程序以“升级”所有进来的东西,这样我们就解决了这个问题。我们只是假设它没问题,因为在 iSeries 上大多数东西是如何自动“升级到 Upper”的。我猜我们错了。

关于java - 使用 jt400.jar API 从 RPG 程序中检索结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4454108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com