0

我对 AS400 和 RPG 的了解非常有限 (0)。但是我们有一个迫切的需求,我们需要从一个 java 类中调用一个 RPG 程序。所以我发现我们可以通过JTOpen来实现。但我坚持声明 ProgramParameter 列表。我有以下关于 RPG 程序的信息

程序名称:ZM30000R 参数:Branch 7,0(数字)
账户类型 2(01-支票,02 储蓄)
帐号 20(字符)
错误代码 7(字符)DR/CR 指示符 1(字符 D,C)

但不知道什么是输入和输出。如何声明 ProgramParameter。我做了如下。我也无法测试,因为我没有与这些系统的连接。

// Create AS400 Text objects for the different lengths
          // of parameters you are sending in.
          AS400Text branchTxt = new AS400Text(7);
          AS400Text accntTypeTxt = new AS400Text(2);
          AS400Text accntNumberTxt = new AS400Text(20);
          AS400Text errorCodeTxt = new AS400Text(7);
          AS400Text DCIndicatorTxt = new AS400Text(1);            

          // declare and instantiate  your parameter list.
          ProgramParameter[] parmList = new ProgramParameter[5];

          // assign values to your parameters using the AS400Text class to convert to bytes
          // the second parameter is an integer which sets the length of your parameter output
          parmList[0] = new ProgramParameter( branchTxt.toBytes(branch),7);
          parmList[1] = new ProgramParameter( accntTypeTxt.toBytes(accntTypeTxt),2);      
          parmList[2] = new ProgramParameter( accntNumberTxt.toBytes(accntNumberTxt),20);      
          parmList[3] = new ProgramParameter( errorCodeTxt.toBytes(""),7);      
          parmList[4] = new ProgramParameter( DCIndicatorTxt.toBytes(indicator),5);

任何帮助都会非常有用。

谢谢并恭祝安康,

斯里尼瓦斯

4

4 回答 4

4

好吧,仅通过参数的描述,我确实有一个线索。分行、账户类型和帐号为 IN。您需要该信息进行财务预订或交易。错误代码显然是 OUT。根据我在金融系统方面的经验,API 返回金额的入账方式是合理的正常现象。通常人们会使用这个符号,但在金融系统中,(D)ebit 或 (C)redit 是更好的方式。

API 很可能是金融系统的 API。如果这是真的,那么我错过了金额。你确定你有完整的描述吗?

请注意,第一个参数是数字。你不走运。iSeries 和 RPG 对数字的类型不是很宽容。可以从位、分区、打包、十进制、整数、浮点等中进行选择。如果 RPG 真的是 RPG 而不是 ILE RPG,那么您可以将其归结为 Zoned、Packed 和 Byte。

我假设您可以访问 iSeries。然后就可以观看程序调用、调试信息和转储信息了。如果您必须进行“反复试验”,这将对您有所帮助。如果您无法访问,道路将非常艰难。如果程序调用不成功,您将在 java 类中收到错误。但是如果没有来自 iSeries 的信息,您将很难识别真正的错误。因此,确实需要访问。

于 2010-01-20T21:09:18.750 回答
3

您的样本大部分都在正确的轨道上。但是您的分支参数是数字。所以你应该使用 AS400ZonedDecimal 而不是 AS400Text:

AS400ZonedDecimal branchNbr = new AS400ZonedDecimal(7,0)

RPG 程序可能期望打包而不是分区。没什么大不了的,只需使用 AS400PackedDecimal 代替。

在构造 ProgramParameter 对象时,构造函数的要求会有所不同,具体取决于它们是程序的输入参数还是输出参数。对于输入参数,只需传递 toBytes() 结果。不需要包括长度。对于仅输出参数,只需传递长度。

我同意罗伯特的回答,即缺少一些信息,但他对错误代码输出的假设似乎是有效的。但是,我猜想 DCIndicator 参数是输入的,因为您的样本传递了一个值。对于错误代码参数,在您的程序调用之后,您需要提取该值并对其进行处理。鉴于您已经拥有的,这就是程序调用的工作方式。请注意,我指定了“MyLibrary”的库名称。这是为了举例。您必须确定您的程序对象在哪个库中。

ProgramCall pgm = new ProgramCall(as400, QSYSObjectPathName.toPath("MyLibrary","ZM30000R","PGM"), parmList);
if (pgm.run() == true) {
    String sErrorCode = (String) errorCodeTxt.toObject(parmList[3].getOutputData());

    //Do something with your output data.
}
else {
    AS400Message[] messageList = pgm.getMessageList();
    for (int i=0; i<messageList.length; i++) {
        String sMessageID = messageList[i].getID();
        String sMessageText = messageList[i].getText();

        //Do something with the error messages
    }
}

其他需要考虑的是库列表。RPG 程序是否希望某些库出现在库列表中?如果是这样,您应该在调用程序之前发出 CommandCalls 将库添加到库列表中。

于 2010-01-21T21:21:42.743 回答
1

FWIW:使用 PCML 而不是ProgramCall.

编译器甚至会为您生成 PCML 文档。

有关详细信息,请参阅http://javadoc.midrange.com/jtopen/com/ibm/as400/data/ProgramCallDocument.html

于 2010-06-03T13:39:20.843 回答
0

如果您没有连接,那么您真的无法按照要求进行操作。你如何测试它?是否有数字参数或者它们都是字符?

于 2010-01-20T22:12:24.593 回答