Make a CL Program or Module Retrieve Its Name
April 21, 2004 Hey, Ted
As if I didn’t have enough to do, I wasted an hour on a wild goose chase. A user contacted me when a program cancelled. The message she received told her that program XYZ had ended abnormally. It took me a while to determine that program ABC had cancelled instead. It turned out that ABC was a clone of XYZ and still included the following, misleading CL command.
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Program + XYZ ended abnormally') MSGTYPE(*ESCAPE)
I would like to make CL programs determine their own names, so that I can make sure each program reports the correct name in error messages, even when cloned. I have not found a CL command or an API to make a program retrieve its own name. Is this possible?
Yes. The trick is to make a program send a message to itself and retrieve the program name from the message about the sender. The following code works in OPM CL programs, ILE CL programs, and ILE CL modules.
dcl &MsgKey *char 4 dcl &PgmName *char 10 dcl &Sender *char 80 sndpgmmsg msg(' ') topgmq(*same) msgtype(*info) keyvar(&msgkey) rcvmsg pgmq(*same) msgtype(*info) sender(&sender) rmv(*yes) chgvar &PgmName %sst(&Sender 56 10)
In the case of CL modules, you should know that this routine returns the name of the program in which this module is bound, not the name of the module. In ILE modules, try the following code to retrieve both program name and module name.
dcl &MsgKey *char 4 dcl &PgmName *char 10 dcl &ModName *char 10 dcl &Sender *char 720 sndpgmmsg msg(' ') topgmq(*same) msgtype(*info) keyvar(&msgkey rcvmsg pgmq(*same) msgtype(*info) rmv(*yes) + sender(&sender) senderfmt(*long) chgvar &PgmName %sst(&Sender 42 10) chgvar &ModName %sst(&Sender 54 10)