从Java调用AS400 RPG

时间:2010-01-20 20:50:04

标签: java ibm-midrange rpgle

我对AS400和RPG有非常有限的(0)知识。但是我们迫切需要从java类调用RPG程序。所以我发现我们可以通过JTOpen实现它。但我坚持宣布ProgramParameter列表。我有关于RPG计划的以下信息

程序名称:ZM30000R 参数: 分支7,0(数字)
账户类型2(01检查,02节省)
帐号20(字符)
错误代码7(字符) DR / CR指示符1(字符D,C)

但是没有关于intput和output是什么的线索。如何声明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);

任何帮助都非常有用。

谢谢和问候,

SRINIVAS

4 个答案:

答案 0 :(得分:4)

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

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

请注意,第一个参数是数字。你不幸运。 iSeries和RPG对数字的类型并不十分宽容。可以选择Bit,Zoned,Packed,Decimal,Integer,Float等。如果RPG真的是RPG而不是ILE RPG,那么你可以把它带到Zoned,Packed和Byte。

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

答案 1 :(得分: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以将库添加到库列表中。

答案 2 :(得分:1)

FWIW:致电IBM i主机程序并简化起来要容易得多使用PCML而不是ProgramCall的服务程序。

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

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

答案 3 :(得分:0)

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