我对AS400和RPG非常limitied(0)的知识。但是,我们有我们需要从一个Java类中调用一个RPG程序的迫切要求。所以,我发现,我们可以通过JTOpen实现它。但我坚持在宣布ProgramParameter列表。我对RPG程序的以下信息

程序名称:ZM30000R 参数: 科7,0(数字)结果 账户类型2(01检查,02储蓄)点击 账户号码20(字符)点击 错误代码7(字符) DR / CR indicater 1(字符d,C)

但是,没有什么是intput和输出。如何申报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

有帮助吗?

解决方案

好了,我有一个线索,只是在参数的描述。分行,帐户类型和帐号是IN。您需要这些信息的金融订票或交易。错误代码是appearently OUT。在我与财务系统的经验是合理正常的API返回的金额被黄牌警告的方式。通常一个将使用的标志,但在金融系统的(d)EBIT或(C)REDIT是更好的方法。

在API很可能是一个金融系统的API。如果这是真的,那么我丢失量。你确定你已经完整描述?

注意,第一个参数是数字。你很幸运,没有。在iSeries和RPG都不是很宽容有关数字的类型。人们可以从位,分区,包装,小数,整数,浮点数等选择。如果RPG真的是RPG,而不是ILE RPG的,那么你可以把下来为区位,包装和字节。

我假设你到iSeries我 - 我的访问。然后,你可以观看程序调用,调试信息和转储信息。这将帮助你,如果你需要做的“试错”。如果您没有访问,路上会很辛苦。如果程序调用不是succesfull你会在你的Java类收到一个错误。但是,这将是很难找出真正的错误,而不从iSeries自己的信息。因此,真正需要的访问权限。

其他提示

您样品主要是在正确的轨道。但是,你的分支参数是数字。所以,你应该用AS400ZonedDecimal代替AS400Text:

AS400ZonedDecimal branchNbr = new AS400ZonedDecimal(7,0)

在RPG程序可以期望填充,而不是划。没什么大不了的,只是使用AS400PackedDecimal代替。

如你构造您ProgramParameter对象,你的构造要求取决于它们是否输入或输出参数到你的程序是不同的。对于输入参数,只要传递toBytes()的结果。有没有必要列入长度。对于只输出参数,只是通过的长度。

我和罗伯特的回答都认为有一些缺失的信息,但他的错误代码的outputness假设似乎是有效的。不过我猜想的是,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调用程序之前添加库到库列表中。

FWIW:这是一个更容易使用PCML而不是ProgramCall调用的IBM i主机程序和服务程序

在编译器将甚至产生PCML文档为您服务。

请参阅 http://javadoc.midrange.com/ jtopen / COM / IBM / AS400 /数据/ ProgramCallDocument.html 获得的信息。

如果你没有连接,那么你真的不能做什么是问。你怎么测试呢?有数字参数或者是他们所有的字符?

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