|
You have a choice, declared in the called procedure: Pass by reference Pass by value Pass by read-only reference Gary Dave Wall wrote: > > Sorry it took so long to get back to you. I don't know this level of > detail concerting RPG so I asked around trying to find out if character > parameters in RPG are passed on the stack or if a pointer is passed. No > one answered my question but I would think they would be passed by > reference. I would think it would work better if it was pass by reference. > Anyone else on the forum know how character parameters are passed in RPG? > > David Wall > AS/400 Toolbox for Java > > > "Price, Chris" > <chris_price@nsb.c To: >"'JAVA400-L@midrange.com'" <JAVA400-L@midrange.com> > o.uk> cc: > Sent by: Subject: RE: AS400 Toolbox >problems - ServiceProgramCall > owner-java400-l@mi > drange.com > > > 08/14/2001 10:18 > AM > Please respond to > JAVA400-L > > > > Thanks for your example. > > Unfortunately it didn't work on my system as we don't seem to have a > QTOCNETSTS service program. > > I'm trying to call my own service program, written in RPG IV. > The Java class sets the String input parameter to a test value, and calls > the procedure. The procedure compares the passed in string to a value, and > if the same returns 99, otherwise returns -1. If written as a service > program, the return value is always -1. Yet if I convert the service > program > into a program, making the nessesscary changes to the class, the return > value is 99. > > Here's a sample of my Java & RPG code: > > public class Temp > { > public static void main(String[] parameters) { > > AS400 as400 = new AS400(); > > QSYSObjectPathName sprogramName = > new QSYSObjectPathName("R1005DVOBJ", "CJPTEST", "SRVPGM"); > > ServiceProgramCall spgm = new ServiceProgramCall(as400); > > //Service Program Call > try { > // One Parameter - String in. Returns short > > ProgramParameter[] parmlist = new ProgramParameter[1]; > > AS400Text text1 = new AS400Text(10, as400); > byte[] text = text1.toBytes("CHRISPRICE"); > // parmlist[0] = new ProgramParameter(text); > parmlist[0] = new ProgramParameter(); > parmlist[0].setInputData(text); > parmlist[0].setParameterType(ProgramParameter.PASS_BY_VALUE); > > //run the serivce program > spgm.setProgram(sprogramName.getPath(), parmlist); > spgm.setProcedureName("CJPTEST_PROC"); > if (spgm.run() != true) { > AS400Message[] msgList = spgm.getMessageList(); > System.out.println("The program did not run. AS/400 > messages:"); > for (int i = 0; i < msgList.length; i++) { > System.out.println(msgList[i].getText()); > } > } else { > AS400Bin2 as400Int = new AS400Bin2(); > byte[] as400Data = spgm.getReturnValue(); > short result = as400Int.toShort(as400Data, 0); > System.out.println("Service Program Call Result is : " + > result); > > } > > } catch (Exception e) { > System.out.println("Service Program call failed"); > System.out.println(e); > } > > System.exit(0); > } > } > > The very simple RPG module: > D CJPTEST_PROC PR 5I 0 > D String 10 Value > > P CJPTEST_PROC B Export > D PI 5I 0 > D String 10 Value > C If String = 'CHRISPRICE' > C Return 99 > C Else > C Return -1 > C Endif > > -----Original Message----- > From: Dave Wall [mailto:dawall@us.ibm.com] > Sent: 14 August 2001 15:45 > To: JAVA400-L@midrange.com > Subject: Re: AS400 Toolbox problems - ServiceProgramCall > > Here is code to call entry point QtocLstNetIfc in service program > QTOCNETSTS. The entry point takes three parameters -- two strings (passed > by reference) and the error code. The strings are converted from Unicode > to EBCDIC before being sent to the server. When calling programs or > service programs, pay particular attention to lengths. The Toolbox client > passes data to the program call server who dumps the data in one big > buffer. It then passes pointers to that buffer or pulls data out of the > buffer when calling the service program. If a length is off the wrong data > will be passed, but since all data comes out of one big buffer you may not > get a addressing errors (trying to get to memory you don't own). You will > just get bad data. > > Are you trying to call an OS/400 service program or one of your own? Some > Toolbox objects are implemented by calling OS/400 service programs via > ServiceProgramCall so I know it can work. > > AS400 system = new AS400(); > > // The first parm is 20 characters, 10 chars of user space followed > by 10 chars of library. > // Create a converter for 20 chars. > AS400Text char20 = new AS400Text(20, system); > > // The second parm is the format name (8 chars). Create a > converter. > AS400Text char8 = new AS400Text(8, system); > > // Create program parameters > ProgramParameter[] parms = new ProgramParameter[3]; > > // First parm is qualified user space CHAR(20) > // CHAR(0-9) is the user space name > // CHAR(10-19) is the library name > String qSpace = "DAW DAW "; > > // First parm is the library qualified UserSpace > parms[0] = new ProgramParameter(char20.toBytes(qSpace)); > parms[0].setParameterType(ProgramParameter.PASS_BY_REFERENCE); > > // Second parm is the format > parms[1] = new ProgramParameter(char8.toBytes("NIFC0100")); > parms[1].setParameterType(ProgramParameter.PASS_BY_REFERENCE); > > // Last parm is the error code. We pass an array of 0x00s so > messages are returned. > byte[] bytes = new byte[32]; > parms[2] = new ProgramParameter(bytes, 32); > parms[2].setParameterType(ProgramParameter.PASS_BY_REFERENCE); > > ServiceProgramCall sPGMCall = null; > > System.out.println("About to create the program"); > sPGMCall = new ServiceProgramCall(system, > "/QSYS.LIB/QTOCNETSTS.SRVPGM", > "QtocLstNetIfc", > > ServiceProgramCall.NO_RETURN_VALUE, > parms); > > System.out.println(sPGMCall.run()); > > AS400Message[] ml = sPGMCall.getMessageList(); > > for (int i=0; i<ml.length; i++) > System.out.println(ml[i].getID() + ": " + ml[i].getText()); > > David Wall > 553-5329 > AS/400 Toolbox for Java > > "Price, Chris" > > <chris_price@nsb.c To: > "'java400-l@midrange.com'" <java400-l@midrange.com> > o.uk> cc: > > Sent by: Subject: AS400 Toolbox > problems - ServiceProgramCall > owner-java400-l@mi > > drange.com > > 08/14/2001 05:31 > > AM > > Please respond to > > JAVA400-L > > Has anyone successfully managed to call a procedure in a service program, > using the ServiceProgramCall class? > > I'm having major problems getting this to work: > > Passing by reference doesn't work at all - get null pointer errors in the > procedure. > > Passing by value works for integers, but Strings get garbled. I thought > this > might be a CCSID problem, but the same code works fine for a ProgramCall. > > Does anyone have any working examples using this class, there aren't any > that I can find in the toolbox documentation. > > Confused, > Chris. > > =======DISCLAIMER======= > This email transmission and any attachments may contain confidential > information which is legally privileged. You are also notified that the > contents of this email and any which you may send in reply, may be viewed > by > authorised personnel on behalf of NSB Retail Systems Plc or its > subsidiaries > (the Company) in accordance with the Company's Information Access Policy. > The content of this email is always subject to contract. The information > is > intended only for the individual or entities to whom it is addressed. If > you are not an intended recipient please contact me immediately and you are > hereby notified that any disclosure, copying, distribution, storage on any > medium or use of the information contained in this transmission is strictly > prohibited. > > +--- > | 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 > +--- > > +--- > | 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 > +--- > > =======DISCLAIMER======= > This email transmission and any attachments may contain confidential > information which is legally privileged. You are also notified that the > contents of this email and any which you may send in reply, may be viewed > by > authorised personnel on behalf of NSB Retail Systems Plc or its > subsidiaries > (the Company) in accordance with the Company's Information Access Policy. > The content of this email is always subject to contract. The information > is > intended only for the individual or entities to whom it is addressed. If > you are not an intended recipient please contact me immediately and you are > hereby notified that any disclosure, copying, distribution, storage on any > medium or use of the information contained in this transmission is strictly > prohibited. +--- | 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-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.