简体   繁体   English

从JAVA调用RPG程序

[英]Call RPG Program from JAVA

I want to call a RPG program from JAVA, the RPG program receive this parameters: 我想从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 

and this is the Data Structure in RPG: 这是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                                      

This is my code in JAVA to call the program: 这是我在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);

But, when I run the program, I get a message from AS400, this is the text: 但是,当我运行程序时,我从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  . . . .      

I was trying to change data type from variable person (in JAVA), i tried with AS400Bin2, AS400Bin4, AS400Bin8, AS400Floa4, AS400Float8, AS400DecFloat, AS400PackedDecimal and AS400ZonedDecimal, but no one works, i get the same error when I run the class. 我试图从可变人(在JAVA中)更改数据类型,我尝试使用AS400Bin2,AS400Bin4,AS400Bin8,AS400Floa4,AS400Float8,AS400DecFloat,AS400PackedDecimal和AS400ZonedDecimal,但是没有人可以使用,运行类时出现相同的错误。

Thanks a lot for you help. 非常感谢您的帮助。

The problem is at statement 13.50, P3ARCD PARM WP0003 70. 问题出在语句13.50 P3ARCD PARM WP0003 70。

The RPG parameter list contains 7 entries, but you are only account for 6 in your Java code. RPG参数列表包含7个条目,但是您在Java代码中仅占6个。 I think your parameters are "shifted up" seven bytes. 我认为您的参数被“上移”了七个字节。 Try passing seven leading spaces to account for P0RTN. 尝试传递七个前导空格以说明P0RTN。

First thing you should check whether you are passing correct data in all variables or not. 首先,您应该检查是否在所有变量中传递了正确的数据。 decimal data error comes when a decimal variable in RPG receives junk value, so in your case there might be a possibility that you are not passing any value to a decimal variable of AS400 but a junk value is getting passed while the communication. 当RPG中的十进制变量接收到垃圾值时,将出现十进制数据错误,因此,在您的情况下,可能没有将任何值传递给AS400的十进制变量,而是在通讯时传递了垃圾值。

There might be a need to add validation in RPG program to validate data first and then process if the error is coming within processing logic. 可能需要在RPG程序中添加验证以先验证数据,然后再处理错误(如果错误在处理逻辑内)。 You can find the parameter passed to RPG and same can be given to RPG developer and he can debug the same using those parameters to find the problem. 您可以找到传递给RPG的参数,也可以将其提供给RPG开发人员,他可以使用这些参数调试该参数以查找问题。

Call RPG from JAVA. 从JAVA致电RPG。
Don't put any parameters in a data structure. 不要在数据结构中放置任何参数。

The targeting AS400 program accepted two string parameters,Created special user id that can only for communication, tested and working fine with that one, lib use jt400.jar 针对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());
        }
    }
}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM