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

							 
								

					