Julian Escobar
Julian Escobar

Reputation: 23

Call RPG Program from JAVA

I want to call a RPG program from JAVA, the RPG program receive this parameters:

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:

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:

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:

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.

Thanks a lot for you help.

Upvotes: 1

Views: 2249

Answers (4)

Ravinath
Ravinath

Reputation: 1750

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

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());
        }
    }
}
}

Upvotes: 0

danny117
danny117

Reputation: 5651

Call RPG from JAVA.
Don't put any parameters in a data structure.

Upvotes: 0

Montana
Montana

Reputation: 81

The problem is at statement 13.50, P3ARCD PARM WP0003 70.

The RPG parameter list contains 7 entries, but you are only account for 6 in your Java code. I think your parameters are "shifted up" seven bytes. Try passing seven leading spaces to account for P0RTN.

Upvotes: 1

Shrikant Pandore
Shrikant Pandore

Reputation: 1

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.

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. 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.

Upvotes: 0

Related Questions