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



