从JAVA调用RPG程序

时间:2015-11-20 18:53:01

标签: java ibm-midrange rpg

我想从JAVA调用RPG程序,RPG程序会收到以下参数:

0013.00       * Entry parameters                             
0013.10      C           *ENTRY    PLIST                     
0013.20      C                     PARM           P0RTN   7  
0013.30      C           P1ATCD    PARM           WP0001  1  
0013.40      C           P2AMCD    PARM           WP0002  7  
0013.50      C           P3ARCD    PARM           WP0003  70 
0013.60      C           P4BGCD    PARM           WP0004  6  
0013.70      C           P5EFDX    PARM           WP0005  80 
0013.80      C           P6V9VA    PARM P6V9VA    WP0006 132 

这是RPG中的数据结构:

0010.70       * Parameter declarations                            
0010.80      IP1PARM      DS                                      
0010.90       * I : MAP Company ID                                
0011.00      I                                        1   1 P1ATCD
0011.10      IP2PARM      DS                                      
0011.20       * I : MAP Product ID                                
0011.30      I                                        1   7 P2AMCD
0011.40      IP3PARM      DS                                      
0011.50       * I : MAP Person/Company ID                         
0011.60      I                                    P   1   40P3ARCD
0011.70      IP4PARM      DS                                      
0011.80       * I : MAP Fund ID                                   
0011.90      I                                        1   6 P4BGCD
0012.00      IP5PARM      DS                                      
0012.10       * I : MAP Wk Evaluation Date                        
0012.20      I                                    P   1   50P5EFDX
0012.30      IP6PARM      DS                                      
0012.40       * B : MAP Capital Total                             
0012.50      I                                    P   1   72P6V9VA
0012.60      I            DS                                      

这是我在JAVA中调用程序的代码:

ProgramParameter[] parameterList = new ProgramParameter[6];
// First parameter is to input a name.
AS400Text nametext = new AS400Text(1);
parameterList[0] = new ProgramParameter(nametext.toBytes("F"));
parameterList[0].setParameterType(ProgramParameter.PASS_BY_VALUE);
nametext = new AS400Text(7);
parameterList[1] = new ProgramParameter(nametext.toBytes("XXX"));
parameterList[1].setParameterType(ProgramParameter.PASS_BY_VALUE);
AS400ZonedDecimal  person = new AS400ZonedDecimal(4,0);
//AS400Text person= new AS400Text(4);
parameterList[2] = new ProgramParameter(person.toBytes(452));
parameterList[2].setParameterType(ProgramParameter.PASS_BY_VALUE);
nametext = new AS400Text(6);
parameterList[3] = new ProgramParameter(nametext.toBytes("XXXXXX"));
AS400PackedDecimal evaluationDate = new AS400PackedDecimal(8, 0);
parameterList[4] = new ProgramParameter(evaluationDate.toBytes(20150715));
//parameter is to get the answer, up to 50 bytes long.
parameterList[5] = new ProgramParameter(50);

但是,当我运行程序时,我从AS400收到一条消息,这是文本:

Message ID . . . . . . :   RPG0907       Severity . . . . . . . :   99         
Message type . . . . . :   Inquiry                                             
Date sent  . . . . . . :   20/11/15      Time sent  . . . . . . :   19:38:27   

Message . . . . :   PROGRAM 1350 decimal-data error in field (C G S D F).      
Cause . . . . . :   The RPG program PROGRAM in library LIBRARY found a        
decimal-data error at statement 1350. One field did not contain valid        
numeric data.  The digit and/or sign is not valid.                           
Recovery  . . . :   Enter C to cancel, G to continue processing at *GETIN, S   
to obtain a system dump, or D to obtain an RPG formatted dump.               
Possible choices for replying to message . . . . . . . . . . . . . . . :       
D -- Obtain RPG formatted dump.                                              
S -- Obtain system dump.                                                     
G -- Continue processing at *GETIN.                                          
C -- Cancel.                                                                 
                                                                   More... 
Type reply below, then press Enter.                                            
Reply  . . . .      

我试图从变量人(在JAVA中)更改数据类型,我尝试使用AS400Bin2,AS400Bin4,AS400Bin8,AS400Floa4,AS400Float8,AS400DecFloat,AS400PackedDecimal和AS400ZonedDecimal,但没有人工作,我运行时遇到同样的错误上课。

非常感谢你的帮助。

4 个答案:

答案 0 :(得分:1)

问题出在声明13.50,P3ARCD PARM WP0003 70.

RPG参数列表包含7个条目,但您在Java代码中只占6个。我认为你的参数已经向上移动了#34;七个字节。尝试通过七个前导空格来考虑P0RTN。

答案 1 :(得分:0)

首先,您应该检查是否在所有变量中传递了正确的数据。当RPG中的十进制变量收到垃圾值时会出现十进制数据错误,所以在您的情况下,您可能没有将任何值传递给AS400的十进制变量,但是在通信时传递了垃圾值。

可能需要在RPG程序中添加验证以首先验证数据,然后在错误进入处理逻辑时进行处理。 您可以找到传递给RPG的参数,同样可以给RPG开发人员,他可以使用这些参数进行调试以找到问题。

答案 2 :(得分:0)

从JAVA调用RPG 不要在数据结构中放置任何参数。

答案 3 :(得分:0)

  

目标AS400程序接受了两个字符串参数,创建了只能用于通信,经过测试并可以正常工作的特殊用户ID,lib使用jt400.jar

import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400Message;
import com.ibm.as400.access.AS400Text;
import com.ibm.as400.access.ProgramCall;
import com.ibm.as400.access.ProgramParameter;

public class CallingAS400PGM {

private static final String HOST = "192.168.1.1";//AS400 IP
private static final String UID = "UNAME"; //userid
private static final String PWD = "PWORD"; //password

public static void main(String[] args) {
    //AS400 RPG progam path
    String fullProgramName = "/QSYS.LIB/PBFORM12.LIB/PBFORM12CL.PGM";

    AS400 as400 = null;
    ProgramParameter[] parmList;//parameter list witch is accepting AS400 RPG program
    ProgramCall programCall;
    try {
        // Create an AS400 object
        as400 = new AS400(HOST, UID, PWD);

        // Create a parameter list
        // The list must have both input and output parameters
        parmList = new ProgramParameter[2];

        // Convert the Strings to IBM format
        AS400Text nametext1 = new AS400Text(2);
        AS400Text nametext2 = new AS400Text(200);

        // Create the input parameter // get the exact patameter type and length, if 
        not this not be working  
        parmList[0] = new ProgramParameter(nametext1.toBytes("1"),2);
        parmList[1] = new ProgramParameter(nametext2.toBytes("Ravinath 
        Fernando"),200);
        // Create the output parameter

        programCall = new ProgramCall(as400);
        programCall.setProgram(fullProgramName, parmList);

        if (!programCall.run()) {
            /**
             * If the AS/400 is not run then look at the message list to
             * find out why it didn't run.
             */
            AS400Message[] messageList = programCall.getMessageList();
            for (AS400Message message : messageList) {
                System.out.println(message.getID() + " - " + message.getText());
            }
        } else {
            System.out.println("success");
            /**
             * Else the program is successfull. Process the output, which
             * contains the returned data.
             */
            //use same parameter type which will be return from AS400 program
            AS400Text text1 = new AS400Text(2);
            System.out.println(text1.toObject(parmList[0].getOutputData()));
            AS400Text text2 = new AS400Text(200);
            System.out.println(text2.toObject(parmList[1].getOutputData()));
        }
        as400.disconnectService(AS400.COMMAND);
        //-----------------------
    } catch (Exception e) {
        e.printStackTrace();
        System.err.println(":: Exception ::" + e.toString());
    } finally {
        try {
            // Make sure to disconnect 
            if (as400 != null) {
                as400.disconnectAllServices();
            }
        } catch (Exception e) {
            System.err.println(":: Exception ::" + e.toString());
        }
    }
}
}