|
John Sutor wrote:
You should use the same type to get data out, as you used to put data in. I wrote a small class to help getting it right which might be useful to you. First you create an AS400FunctionCall instance which may then be called several times. I use Jakarta Commons Lang and Log4j here but that can easily be removed. Note: I have only actually tried with AS400Text as datatypes.I am trying to get a return Parameter from a variable that is changed in a CL program. My code looks as followingAS400Text text3 = new AS400Text(5); byte[] parm3 = text3.toBytes(milesParm); parameterList[3] = new ProgramParameter(parm3);THEN I call the program byte[] getMiles = parameterList[3].getOutputData(); milesParm = getMiles.toString(); Fairly new to this so not sure that I am even trying to do this the correct way can someone point me in the right direction??
--- usageAS400DataType[] dataTypes = new AS400DataType[] { new AS400Text(1024), new AS400Text(1024) }; AS400FunctionCall call = new AS400FunctionCall(as400, "BASSCHTD.PGM", dataTypes);
List l = call.run(new String[] {setup, "2X" + jobNumber}); String fixparm = (String) l.get(1); ----- class package foobar.utils; import java.beans.PropertyVetoException; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.log4j.Logger; import com.ibm.as400.access.AS400; import com.ibm.as400.access.AS400DataType; import com.ibm.as400.access.AS400Message; import com.ibm.as400.access.AS400SecurityException; import com.ibm.as400.access.ErrorCompletingRequestException; import com.ibm.as400.access.ExtendedIllegalArgumentException; import com.ibm.as400.access.Job; import com.ibm.as400.access.JobLog; import com.ibm.as400.access.ObjectDoesNotExistException; import com.ibm.as400.access.ProgramCall; import com.ibm.as400.access.ProgramParameter; public class AS400FunctionCall { private static Logger log = Logger.getLogger(AS400FunctionCall.class); private AS400DataType[] dataType; private String programName; private ProgramCall programCall;public AS400FunctionCall(AS400 as400, String programName, AS400DataType[] dataType) { if (programName.indexOf("/") == -1) {
programName = "/QSYS.LIB/%LIBL%.LIB/" + programName; }this.programName = programName;
this.dataType = dataType;ProgramParameter[] parameter = new ProgramParameter[dataType.length];
for(int i = 0; i < dataType.length; i++) {parameter[i] = new ProgramParameter(dataType[i].getByteLength());
}Log4JUtils.debug(log, "Creating ProgramCall to " + programName + " on AS400: " + as400);
programCall = new ProgramCall(as400, programName, parameter); }public List run() {
return run(new String[0]); }public List run(String[] values) {
if (values == null) { throw new IllegalArgumentException("values is null"); } try { long start = System.currentTimeMillis(); List result = run_(values); long end = System.currentTimeMillis(); log.debug("Execution took " + (end - start) + " ms"); return result; } catch (Exception e) { throw new RuntimeException("Error calling AS/400 function", e); } }public List run_(String[] values) throws PropertyVetoException, AS400SecurityException, ErrorCompletingRequestException, IOException, InterruptedException, ObjectDoesNotExistException {
Log4JUtils.debug(log, "Calling " + programName + " with " + Arrays.asList(values)); ProgramParameter[] parameter = programCall.getParameterList(); if (values != null) {
for(int i = 0; i < values.length; i++) { try {parameter[i].setInputData(dataType[i].toBytes(values[i]));
} catch (ExtendedIllegalArgumentException e) {throw new IllegalArgumentException("argument " + i + " does not work with data type " + ToStringBuilder.reflectionToString(dataType[i]) + " ("+ e + ")");
} } }log.debug("User library list before run() : " + Arrays.asList(programCall.getServerJob().getUserLibraryList()));
boolean run = programCall.run();if (run) {
List l = new ArrayList(); for(int i = 0; i < dataType.length; i++) {Object o = dataType[i].toObject(parameter[i].getOutputData());
l.add(o); }log.debug("User library list after run(): " + Arrays.asList(programCall.getServerJob().getUserLibraryList()));
Log4JUtils.debug(log, "Returning " + l); return l; } else { // Figure out what to tell caller AS400Message[] messageList = programCall.getMessageList(); AS400Message message = messageList[0]; String id = message.getID();if ("MCH0802".equals(id)) { // ID: MCH0802 text: Total parameters passed does not match number required. throw new IllegalArgumentException(programName+ ": " + ToStringBuilder.reflectionToString(message));
}// Unknown reason, give details
Job serverJob = programCall.getServerJob(); JobLog jobLog = serverJob.getJobLog();throw new RuntimeException(ToStringBuilder.reflectionToString(jobLog) + ToStringBuilder.reflectionToString(messageList));
} } } -- Thorbjørn
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 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.