从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

+1

我给你提了一些关于如何在另一个问题中测试一个java调用rpg程序的提示。 – robertnl 2010-01-20 20:56:31

+1

哦,看!这很紧急!放下一切并回答它!或者,不要讽刺,每个在这里提出问题的人都希望得到答案。你*不会通过试图在社区中点燃火焰而获得更好的回应。你应该链接到你关于同一主题的上一个问题(http://*.com/questions/2103928/as400-rpg-simulator),并解释这个问题是如何与它相关的。 – dmckee 2010-01-20 20:58:57

+1

事实上,dmckee,你是对的。这个问题可能会好得多。对as400一无所知也没有帮助。 这仅仅是我经历了java和rpg之间的接口有多困难和困惑,我可以回答这两个问题。希望它能帮助Phani解决真正的问题。解决这个问题可能需要另一个步骤(或问题;-) – robertnl 2010-01-20 21:22:00

好吧,我有一个线索,只是在参数的描述。分行,账户类型和账号都是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以将库添加到库列表中。

+1

感谢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