Hi Michael,
I can think of a couple of ways without changing the PLIST. One is to send a specific escape message from COMMPGM to DRIVERA. DRIVERA will need the program status data structure to check for the returned error message.
Something like this in DRIVERA...
callp(E) COMMPGM();
if %error;
if (PgmSDSMsgID = 'COM0110'); // this is the message ID sent by COMMPGM when "BAD STUFF HAPPENED"
// Do expected failure stuff
iter;
else;
// Do unexpected failure stuff
iter;
endif;
else;
// Do other stuff
endif;
Another possibility is to use a user space. When you obtain a pointer to a user space the contents of the user space is accessible until the pointer is lost.
In DRIVERA...
D getSpacePointer PR *
D userSpaceName 10A
D userSpaceLib 10A
D ptrToSpace S *
D someDataStruct DS based(ptrToSpace)
D errorIDInCOMM 7A
ptrToSpace = getSpacePointer(youruserspacename:youruserspacelib);
errorIDInCOMM = *Blanks;
// Do some stuff
callp(E) COMMPGM();
if (errorIDInCOMM = 'COM0110'); // Some "BAD STUFF HAPPENED"
// Do expected failure stuff
iter;
else;
// Do unexpected failure stuff
iter;
endif;
// Continue processing
In COMMPGM
D getSpacePointer PR *
D userSpaceName 10A
D userSpaceLib 10A
D ptrToSpace S *
D someDataStruct DS based(ptrToSpace)
D errorIDInCOMM 7A
ptrToSpace = getSpacePointer(youruserspacename:youruserspacelib);
// Do some stuff
// Oops! SOMETHING BAD HAPPENED!!
errorIDInCOMM = 'COM0101';
// return to DRIVERA
You can get as fancy with the structure of the user space as needed.
HTH.
Gary Monnier
-----Original Message-----
From: rpg400-l-bounces@xxxxxxxxxxxx [mailto:rpg400-l-bounces@xxxxxxxxxxxx] On Behalf Of Koester, Michael
Sent: Wednesday, September 28, 2011 3:01 PM
To: RPG400-L@xxxxxxxxxxxx
Subject: Changing a called sqlrpgle program to return a value
I'm trying to get my head around this, but failing...
I have a driver program (DRIVERA) that does a bunch of stuff, runs a bunch of private subprocedures, calls some service programs, and calls another program (COMMPGM) that handles some communications with another platform, calls other relevant service programs, runs private subprocedures, etc. Both DRIVERA and COMMPGM are *PGMs (created from SQLRPGLE source), with *INLR and all that. COMMPGM is something of a driver program itself, handling sockets connections, throwing lots of transactions to the other platform, receiving results, writing records to a logfile, etc. Its only caller is DRIVERA.
Now I have a need to return a value from COMMPGM, back to DRIVERA, so DRIVERA can deal appropriately with abnormal situations encountered in COMMPGM. Since I'd set COMMPGM up with a Prototype instead of a *entry PLIST, I figured I'd just adjust that prototype and Procedure Interface to include the return value definition and I'd be well on my way... until the source editor reminded me that extpgm was not compatible with a return value. Apparently I need to use extproc instead? I expect that means other things will need to change, but I don't know exactly what, and that's where I need help.
Essentially the process should look like this:
DRIVERA:
...Do some stuff...
DOU done;
If not done;
...Do more stuff...
If COMMPGM(a : b : c) = 'TYPE-A BAD STUFF HAPPENED';
...Do failure stuff...
ITER;
else;
...Do other stuff...
endif;
endif;
enddo;
...Do cleanup stuff...
INLR = *on;
I'd really rather not go back to the PLIST approach, but I don't get to spend a week figuring out how to get a compiled object, and another week finding & fixing the run-time issues brought on by my naiveté. Is there hope? Should be simple, right? We're running v6.1
Thanks.
Michael
--
This is the RPG programming on the IBM i / System i (RPG400-L) mailing list To post a message email: RPG400-L@xxxxxxxxxxxx <mailto:RPG400-L@xxxxxxxxxxxx> To subscribe, unsubscribe, or change list options,
visit:
http://lists.midrange.com/mailman/listinfo/rpg400-l <
http://lists.midrange.com/mailman/listinfo/rpg400-l>
or email: RPG400-L-request@xxxxxxxxxxxx <mailto:RPG400-L-request@xxxxxxxxxxxx>
Before posting, please take a moment to review the archives at
http://archive.midrange.com/rpg400-l <
http://archive.midrange.com/rpg400-l> .
As an Amazon Associate we earn from qualifying purchases.