从Java调用AS400 RPG
我对AS400和RPG的知识非常有限(0)。但是我们有迫切的要求,我们需要从java类调用RPG程序。所以我发现我们可以通过JTOpen来实现它。但我坚持宣布ProgramParameter列表。我对RPG程序从Java调用AS400 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()结果即可。没有必要包括长度。对于仅输出参数,只需传递长度即可。
我同意罗伯特的答案,有一些缺少的信息,但他对错误代码的输出的假设似乎有效。但是,我猜想,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以将库添加到库列表中。
感谢Tracy的建议,AS400PackedDecimal声明已经解决了这个问题。 – Srinivas 2010-01-25 17:06:20
FWIW:使用PCML而不是ProgramCall
调用IBM i主机程序&服务程序要容易得多。
编译器甚至会为您生成PCML文档。
有关详细信息,请参阅http://javadoc.midrange.com/jtopen/com/ibm/as400/data/ProgramCallDocument.html。
我给你提了一些关于如何在另一个问题中测试一个java调用rpg程序的提示。 – robertnl 2010-01-20 20:56:31
哦,看!这很紧急!放下一切并回答它!或者,不要讽刺,每个在这里提出问题的人都希望得到答案。你*不会通过试图在社区中点燃火焰而获得更好的回应。你应该链接到你关于同一主题的上一个问题(http://*.com/questions/2103928/as400-rpg-simulator),并解释这个问题是如何与它相关的。 – dmckee 2010-01-20 20:58:57
事实上,dmckee,你是对的。这个问题可能会好得多。对as400一无所知也没有帮助。 这仅仅是我经历了java和rpg之间的接口有多困难和困惑,我可以回答这两个问题。希望它能帮助Phani解决真正的问题。解决这个问题可能需要另一个步骤(或问题;-) – robertnl 2010-01-20 21:22:00