从Java调用AS400 RPG

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

程序名称:ZM30000R参数:分支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); 

任何帮助都非常有用。

感谢致敬,

SRINIVAS

好吧,我只是通过参数的描述有一个线索。 分行,帐户类型和帐号为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的信息,很难确定真正的错误。 因此,确实需要访问。

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

 AS400ZonedDecimal branchNbr = new AS400ZonedDecimal(7,0) 

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

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

我同意Robert的答案,即有一些缺失的信息,但他对错误代码输出性的假设似乎是有效的。 但是,我猜想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 

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

FWIW:使用PCML而不是ProgramCall调用IBM i主机程序和服务程序要容易得多。

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

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

如果你没有连接,那么你真的不能做什么问。 你是如何测试的? 有数字参数还是它们都是字符?