Suppress Runtime Display When Qshell Cancels
April 27, 2005 Hey, Ted
Tahler’s Qshell tip works great. If there is an error in a CL program that runs the Start Qshell command (STRQSH or QSH), I receive escape message QSH0005. Unfortunately, an error also causes the system to display the C runtime display when I run interactively. I have to press Enter to continue. Can I suppress the error display?
–John
Yes. I wish I had included that information when we ran the article you mentioned. You need to assign the value NONE to environment variable QIBM_QSH_CMD_OUTPUT.
addenvvar envvar(QIBM_QSH_CMD_OUTPUT) value('NONE')
Here’s more information I wish I had included: I have found that it’s often advantageous to build the Qshell command in a character variable, which can be dumped when the program cancels. When I view the entire command in the dump, my problem is often obvious.
By way of example, here’s a CL program that runs the tr (Translate) command. Let’s call it CONVERT.
pgm parm(&FromFile &ToFile &Conv) dcl &Conv *char 32 dcl &FromFile *char 64 dcl &ToFile *char 64 dcl &Abending *lgl dcl &Command *char 128 dcl &MsgID *char 7 dcl &MsgDta *char 256 dcl &MsgF *char 10 dcl &MsgFLib *char 10 dcl &MsgKey *char 4 dcl &PgmName *char 10 dcl &RtnType *char 2 dcl &Sender *char 80 monmsg cpf0000 exec(goto ForwardMsg) /* retrieve the program name */ sndpgmmsg msg(' ') topgmq(*same) msgtype(*info) keyvar(&msgkey) rcvmsg pgmq(*same) msgtype(*info) sender(&sender) rmv(*yes) chgvar &PgmName %sst(&Sender 56 10) /* convert the data */ chgvar var(&Command) + value('tr' *bcat &Conv *bcat '' *cat &ToFile) addenvvar envvar(QIBM_QSH_CMD_ESCAPE_MSG) value('Y') monmsg cpfa980 exec(do) rcvmsg msgtype(*excp) rmv(*yes) enddo addenvvar envvar(QIBM_QSH_CMD_OUTPUT) value('NONE') monmsg cpfa980 exec(do) rcvmsg msgtype(*excp) rmv(*yes) enddo QSH cmd(&Command) monmsg qsh0005 exec(goto abend) /* normal end of job */ sndpgmmsg msgid(cpf9898) msgf(qcpfmsg) msgtype(*comp) + msgdta('Program' *bcat &PgmName *bcat + 'completed normally') return /* Routine to handle unexpected errors */ Abend: if &Abending then(return) chgvar &Abending '1' dmpclpgm ForwardMsg: rcvmsg msgtype(*any) msgdta(&msgdta) msgid(&msgid) + rtntype(&RtnType) + msgf(&msgf) sndmsgflib(&msgflib) if ((&RtnType *eq '02') *or /* diagnostic */ + (&RtnType *eq '15') *or (&RtnType *eq '17')) do /* *escape */ sndpgmmsg msgid(&msgid) msgf(&msgflib/&msgf) msgtype(*diag) + msgdta(&msgdta) enddo if (&RtnType *ne ' ') then(goto ForwardMsg) Escape: sndpgmmsg msgid(cpf9898) msgf(qcpfmsg) msgtype(*escape) + msgdta('Program' *bcat &PgmName *bcat + 'ended abnormally') endpgm
The call from another program might look like this:
dcl &Conv *char 32 dcl &FromFile *char 64 dcl &ToFile *char 64 chgvar &conv value('[:lower:] [:upper:]') chgvar &FromFile + value('/QSYS.LIB/MYLIB.LIB/MYFILE.FILE/MBR1.MBR') chgvar &ToFile + value('/QSYS.LIB/MYLIB.LIB/MYFILE.FILE/MBR2.MBR') call Convert parm(&FromFile &ToFile &Conv)
–Ted