从 JAVA 调用 RPG 程序
Call RPG Program from JAVA
我想从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 . . . .
我试图从变量 person 更改数据类型(在 JAVA 中),我尝试使用 AS400Bin2、AS400Bin4、AS400Bin8、AS400Floa4、AS400Float8、AS400DecFloat、AS400PackedDecimal 和 AS400ZonedDecimal,但没有人工作,我明白了当我 运行 class.
时出现同样的错误
非常感谢您的帮助。
首先你应该检查你是否在所有变量中传递了正确的数据。当 RPG 中的十进制变量接收到垃圾值时会出现十进制数据错误,因此在您的情况下,您可能没有将任何值传递给 AS400 的十进制变量,但在通信时传递了垃圾值。
可能需要在 RPG 程序中添加验证以先验证数据,然后在错误出现在处理逻辑中时进行处理。
您可以找到传递给 RPG 的参数,并将相同的参数提供给 RPG 开发人员,他可以使用这些参数调试相同的参数以查找问题。
问题出在语句 13.50,P3ARCD PARM WP0003 70。
RPG 参数列表包含 7 个条目,但您在 Java 代码中只占 6 个。我认为你的参数是 "shifted up" 七个字节。尝试传递七个前导空格来说明 P0RTN。
从 JAVA 调用 RPG。
不要在数据结构中放置任何参数。
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());
}
}
}
}
我想从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 . . . .
我试图从变量 person 更改数据类型(在 JAVA 中),我尝试使用 AS400Bin2、AS400Bin4、AS400Bin8、AS400Floa4、AS400Float8、AS400DecFloat、AS400PackedDecimal 和 AS400ZonedDecimal,但没有人工作,我明白了当我 运行 class.
时出现同样的错误非常感谢您的帮助。
首先你应该检查你是否在所有变量中传递了正确的数据。当 RPG 中的十进制变量接收到垃圾值时会出现十进制数据错误,因此在您的情况下,您可能没有将任何值传递给 AS400 的十进制变量,但在通信时传递了垃圾值。
可能需要在 RPG 程序中添加验证以先验证数据,然后在错误出现在处理逻辑中时进行处理。 您可以找到传递给 RPG 的参数,并将相同的参数提供给 RPG 开发人员,他可以使用这些参数调试相同的参数以查找问题。
问题出在语句 13.50,P3ARCD PARM WP0003 70。
RPG 参数列表包含 7 个条目,但您在 Java 代码中只占 6 个。我认为你的参数是 "shifted up" 七个字节。尝试传递七个前导空格来说明 P0RTN。
从 JAVA 调用 RPG。
不要在数据结构中放置任何参数。
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());
}
}
}
}