我们使用 com.ibm.as400.data.ProgramCallDocument 通过Java在iSeries上与我们的RPG程序进行交互。在大多数情况下,对于我们的WebSphere应用程序,我们已经与CL进行了RPG/Synon程序,并使用PCML与它们接口。我们也通常没有将structs作为InputOutput工作。

这次,我们的RPG开发人员之一在RPG IV(非同步)中创建了该程序,并给了我们与此程序接口的PCML。我们有三个输入图PARM作为常规字符串。没有大碍。我们以前做过。现在,您可以看到的第四个parm是计数100的结构,它是InputOutput。

当我们尝试调用它是大量的空白时,我们将从RPG程序中恢复过来(即,十六进制40)。字符串parm恢复正常。但是结构没有。所有的犹豫只不过是空白。

当我们有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); 试图看Parms,这就是让我感到困惑的原因。我们看起来没有问题,但是我们没有得到我们的期望。

任何帮助或指导都将不胜感激。到目前为止,Javadocs和示例在线并没有最有帮助。

有帮助吗?

解决方案

好的。这是愚蠢的,我们不想先检查一下。但是问题在于我们的字符串/魅力。即使我们的iSeries在打字时几乎要处理上壳字母,因为我们正在使用JT400。我相信它在Java应用程序中读取了我们的下部案例字母,并将它们的字节equverentent发送到iSeries中,因此我们没有在RPG程序中读取DB上的匹配。我们的iSeries Guy只是将该程序修改为“到达”所有内容,因此我们解决了问题。我们只是假设这是可以的,因为大多数事情在iSeries上自动“到上限”。猜猜我们错了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top