|
Has anyone tried & been successful using ProgramCall to call an RPG ILE
program which expects a mixture of text and numeric input/output parameters?
I've had no problem using ProgramCall and ServiceProgramCall when all
input/output parameters are text. However, if any parms are zoned-decimal
(using AS400ZonedDecimal) or packed-decimal (using AS400PackedDecimal), my
java programs blow-up when trying to retrieve ANY (numeric or text) output
data from the call. This happens when using the IBM Enterprise Toolkit for
AS/400 (in VAJ) or the JAVA Toolkit located on the AS/400 (V5R1).
I believe I'm passing the parameters correctly since the RPG programs run
fine. I've also used the debugger while they were running (using STRSRVJOB)
and verified that the parms looked good.
The problem occurs when I attempt to retrieve a text parameter's output data
(String result = (String)
AS400Text.toObject(ProgramParameter.getOutPutData())). It's dying inside
one of the Toolkit's classes. Using the Exception's printStackTrace() I get
the following errors:
========================================================================
java.lang.ArrayIndexOutOfBoundsException
java.lang.Throwable()
java.lang.Exception()
java.lang.RuntimeException()
java.lang.IndexOutOfBoundsException()
java.lang.ArrayIndexOutOfBoundsException()
int com.ibm.as400.access.ConvTableInputStream.read(byte [], int,
int)
int com.ibm.as400.access.ConvTableInputStream.read(byte [], int,
int)
int java.io.InputStream.read(byte [])
int java.io.InputStreamReader.fill(char [], int, int)
int java.io.InputStreamReader.read(char [], int, int)
java.lang.String
com.ibm.as400.access.ConvTable.byteArrayToString(byte [], int, int)
java.lang.String
com.ibm.as400.access.ConverterImplRemote.byteArrayToString(byte [], int,
int)
java.lang.Object com.ibm.as400.access.AS400Text.toObject(byte [])
boolean ers.expensereport.ExpenseItem.validateData(java.lang.String,
java.util.Date, int, com.ibm.as400.access.AS400, ers.ERSMessages)
boolean ers.expensereport.ExpenseItem.validate(java.lang.String,
java.util.Date, int, com.ibm.as400.access.AS400, ers.ERSMessages)
boolean ers.expensereport.ExpenseReport.validateExpenseItems()
boolean ers.expensereport.ExpenseReport.validate()
void
ers.expensereport.ChangeExpenseReport.performTask(javax.servlet.http.HttpSer
vletRequest, javax.servlet.http.HttpServletResponse)
void
ers.expensereport.ChangeExpenseReport.doPost(javax.servlet.http.HttpServletR
equest, javax.servlet.http.HttpServletResponse)
void
javax.servlet.http.HttpServlet.service(javax.servlet.http.HttpServletRequest
, javax.servlet.http.HttpServletResponse)
void
javax.servlet.http.HttpServlet.service(javax.servlet.ServletRequest,
javax.servlet.ServletResponse)
void
com.ibm.servlet.engine.webapp.StrictServletInstance.doService(javax.servlet.
ServletRequest, javax.servlet.ServletResponse)
void
com.ibm.servlet.engine.webapp.StrictLifecycleServlet._service(javax.servlet.
ServletRequest, javax.servlet.ServletResponse)
void
com.ibm.servlet.engine.webapp.IdleServletState.service(com.ibm.servlet.engin
e.webapp.StrictLifecycleServlet, javax.servlet.ServletRequest,
javax.servlet.ServletResponse)
void
com.ibm.servlet.engine.webapp.StrictLifecycleServlet.service(javax.servlet.S
ervletRequest, javax.servlet.ServletResponse)
void
com.ibm.servlet.engine.webapp.ServletInstance.service(javax.servlet.ServletR
equest, javax.servlet.ServletResponse,
com.ibm.servlet.engine.webapp.WebAppServletInvocationEvent)
void
com.ibm.servlet.engine.webapp.ValidServletReferenceState.dispatch(com.ibm.se
rvlet.engine.webapp.ServletInstanceReference, javax.servlet.ServletRequest,
javax.servlet.ServletResponse,
com.ibm.servlet.engine.webapp.WebAppServletInvocationEvent)
void
com.ibm.servlet.engine.webapp.ServletInstanceReference.dispatch(javax.servle
t.ServletRequest, javax.servlet.ServletResponse,
com.ibm.servlet.engine.webapp.WebAppServletInvocationEvent)
void
com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.handleWebAppDispatch(c
om.ibm.servlet.engine.webapp.WebAppRequest,
com.ibm.servlet.engine.webapp.WebAppResponse, boolean)
void
com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.dispatch(javax.servlet
.ServletRequest, javax.servlet.ServletResponse, boolean)
void
com.ibm.servlet.engine.webapp.WebAppRequestDispatcher.forward(javax.servlet.
ServletRequest, javax.servlet.ServletResponse)
void
com.ibm.servlet.engine.srt.WebAppInvoker.handleInvocationHook(java.lang.Obje
ct)
void
com.ibm.servlet.engine.invocation.CachedInvocation.handleInvocation(java.lan
g.Object)
void
com.ibm.servlet.engine.srp.ServletRequestProcessor.dispatchByURI(java.lang.S
tring, com.ibm.servlet.engine.srp.ISRPConnection)
void
com.ibm.servlet.engine.oselistener.OSEListenerDispatcher.service(com.ibm.ser
vlet.engine.oselistener.api.IOSEConnection)
void
com.ibm.servlet.engine.http_transport.HttpTransportHandler.handleConnection(
java.net.Socket)
void
com.ibm.servlet.engine.http_transport.HttpTransportHandler.run()
void java.lang.Thread.run()
========================================================================
I'd be grateful for any suggestions. I include below the java code for the
method that calls the RPG program.
Thank you.
private boolean validateData(
String employeeNumber,
Date weekEndingDate,
int sequenceNumber,
AS400 system,
ERSMessages ersMessages) {
boolean validatedOk = true;
try {
// converter classes
AS400Text textConverter;
SimpleDateFormat dateFormatter = new
SimpleDateFormat("yyyy-MM-dd");
AS400Bin4 bin4Converter;
AS400PackedDecimal packedDecimalConverter;
AS400ZonedDecimal zonedDecimalConverter;
String dateString;
// start service
if (!system.isConnected(AS400.COMMAND)) {
system.connectService(AS400.COMMAND);
}
// program call has 10 parameters, all input/output
ProgramParameter[] parmList = new ProgramParameter[10];
// parameter 1 - employee number
textConverter = new AS400Text(10, system.getCcsid(),
system); // text converter
parmList[0] =
new ProgramParameter(
textConverter.toBytes(employeeNumber),
textConverter.getByteLength());
// parameter 2 - expense report week ending date.
textConverter = new AS400Text(10, system.getCcsid(),
system); // text converter
// format date
dateString = dateFormatter.format(weekEndingDate);
parmList[1] =
new ProgramParameter(
textConverter.toBytes(dateString),
textConverter.getByteLength());
// parameter 3 - sequence number
zonedDecimalConverter = new AS400ZonedDecimal(2, 0);
parmList[2] =
new ProgramParameter(
zonedDecimalConverter.toBytes(new
BigDecimal(sequenceNumber)),
zonedDecimalConverter.getByteLength());
// parameter 4 - item number number
zonedDecimalConverter = new AS400ZonedDecimal(2, 0);
parmList[3] =
new ProgramParameter(
zonedDecimalConverter.toBytes(new
BigDecimal(itemNumber)),
zonedDecimalConverter.getByteLength());
// parameter 5 - expense date
textConverter = new AS400Text(10, system.getCcsid(),
system); // text converter
// format date
dateString = dateFormatter.format(expenseDate);
parmList[4] =
new ProgramParameter(
textConverter.toBytes(dateString),
textConverter.getByteLength());
// parameter 6 - expense amount
packedDecimalConverter = new AS400PackedDecimal(9, 2);
parmList[5] =
new ProgramParameter(
packedDecimalConverter.toBytes(expenseAmount),
packedDecimalConverter.getByteLength());
// parameter 7 - explanation mandatory?
textConverter = new AS400Text(1, system.getCcsid(), system);
// text converter
parmList[6] =
new ProgramParameter(textConverter.toBytes(" "),
textConverter.getByteLength());
// parameter 8 - explanation exist?
textConverter = new AS400Text(1, system.getCcsid(), system);
// text converter
parmList[7] =
new ProgramParameter(textConverter.toBytes(" "),
textConverter.getByteLength());
// parameter 9 - error code
textConverter = new AS400Text(7, system.getCcsid(), system);
// text converter
parmList[8] =
new ProgramParameter(
textConverter.toBytes(" "),
textConverter.getByteLength());
// parameter 10 - error description
textConverter = new AS400Text(40, system.getCcsid(),
system); // text converter
parmList[9] =
new ProgramParameter(
textConverter.toBytes("
"),
textConverter.getByteLength());
// set up program call
ProgramCall pgm = new ProgramCall(system);
QSYSObjectPathName fullPgmName =
new QSYSObjectPathName("*LIBL", "ERS9040SPI",
"PGM");
try {
pgm.setProgram(fullPgmName.getPath(), parmList);
} catch (Exception e) {
// if error, print error messages to stdout
AS400Message[] messageList = pgm.getMessageList();
for (int msg = 0; msg < messageList.length; msg++) {
System.out.println(messageList[msg]);
throw (e);
}
}
// run the program
if (pgm.run() != true) {
// if error, print error messages to stdout
AS400Message[] messageList = pgm.getMessageList();
for (int msg = 0; msg < messageList.length; msg++) {
System.out.println(messageList[msg]);
}
} else {
// retrieve if explanation is mandatory, and if
explanation exists
String explanationMandatory =
(String)
textConverter.toObject(parmList[6].getOutputData()); **** BOMBS HERE ***
String explanationExists =
(String)
textConverter.toObject(parmList[7].getOutputData()); **** BOMBS HERE ***
if (explanationMandatory.equals("Y") &&
!explanationExists.equals("Y")) {
validatedOk = false;
if (ersMessages != null) {
ersMessages.setMessageId("ERR0095");
ersMessages.setSubstitutionText("");
errorMessages.add(
"'Expense Item "
+ itemNumber
+ " for"
+
dateFormatter.format(expenseDate)
+ ": "
+
ersMessages.getMessage());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return validatedOk;
}
John Lee jlee@lear.com <mailto:jlee@lear.com>
Information Technology
Lear Corporation
24467 Ten Mile Road
Southfield, Michigan 48034
(248) 368 8741 (direct)
(248) 372 7350 (fax)
+---
| This is the JAVA/400 Mailing List!
| To submit a new message, send your mail to JAVA400-L@midrange.com.
| To subscribe to this list send email to JAVA400-L-SUB@midrange.com.
| To unsubscribe from this list send email to JAVA400-L-UNSUB@midrange.com.
| Questions should be directed to the list owner: joe@zappie.net
+---
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.