- A MONITOR statement
- One or more ON-ERROR groups
- An ENDMON statement.
After the MONITOR statement, control passes to the next statement. The monitor block consists of all the statements from the MONITOR statement to the first ON-ERROR statement. If an error occurs when the monitor block is processed, control is passed to the appropriate ON-ERROR group.
If all the statements in the MONITOR block are processed without errors, control passes to the statement following the ENDMON statement.
The monitor group can be specified anywhere in calculations. It can be nested within IF, DO, SELECT, or other monitor groups. The IF, DO, and SELECT groups can be nested within monitor groups.
If a monitor group is nested within another monitor group, the innermost group is considered first when an error occurs. If that monitor group does not handle the error condition, the next group is considered.
The following RPGLE sample code for monitor on-error submits a job to create a file in the IFS and then tries to use that file. At first it checks whether the file exists or not. After it finds the file, its possible that the program creating the file may still be writing data to it so it may be in use causing the copy object command to fail. If the copy object fails due to object in use error (CPFA09E) then the program waits for more time and tries again.
h option(*nodebugio) d $cmp s 2a d $ord s 6a d $bocd s 2a d $session s 24a d $status s 1a d dtaq_name s 10a d dtaq_lib s 10a d dtaq_len s 5p 0 d dtaq_data s 256 d $web_path s 101a d $pdf_path s 101a d $path s 50a inz('/directory') d $pdf_name s 50a d $found s 1a d $count s 3s 0 d @CmdStr s 512a inz d @Apostr s 1a inz(X'7D') * Program Information d progstatus sds d parms *parms d progname *proc d errmsgID 40 46 d errmsg 91 169 d jobname 244 253 d userid 254 263 d jobnumber 264 269 d ExcCmd PR ExtPgm('QCMDEXC') d Cmd_Str 512a Options(*VARSIZE) d Const d Cmd_Len 15p 5 Const c *entry plist c parm $cmp c parm $ord c parm $bocd c parm $session c parm $status c eval $status = *blanks c eval $pdf_name = %trim(userid) + '.PDF' c eval dtaq_data = $cmp + c $ord + c $bocd + c $path + c $pdf_name c*--- Sending request to Data Queue to generate my PDF file c call 'QSNDDTAQ' c parm '@INVOICE' dtaq_name c parm '*LIBL' dtaq_lib c parm 256 dtaq_len c parm dtaq_data c eval $path = %trim($path) + '/' c eval @CmdStr = 'DLYJOB DLY(5)' c callp ExcCmd(%Trim(@CmdStr) : c %Len(%Trim(@CmdStr))) c dou $count > 20 c call 'CHKIFS' c parm $path c parm $pdf_name c parm $found c if $found = 'Y' c leave c endif c eval @CmdStr = 'DLYJOB DLY(3)' c callp ExcCmd(%Trim(@CmdStr) : c %Len(%Trim(@CmdStr))) c eval $count = $count + 1 c enddo c if $found = 'Y' c eval $web_path = '/MySite/InvoicePdf/' + c %trim($session) + '.pdf' c eval $pdf_path = %trim($path) + c %trim($pdf_name) c eval @CmdStr = 'CPY OBJ(' + @Apostr + c %trim($pdf_path) + c @Apostr + ') TOOBJ(' + c @Apostr + c %trim($web_path) + c @Apostr + ') REPLACE(*YES)' /free $count = 0; dou $count > 10; monitor; callp ExcCmd(%Trim(@CmdStr) : %Len(%Trim(@CmdStr))); on-error; select; when errmsgID = 'CPFA09E'; callp ExcCmd('DLYJOB DLY(3)':13); $count = $count + 1; iter; other; leave; endsl; endmon; $status = 'Y'; leave; enddo; /end-free c endif c eval *inlr = *on c return
No comments:
Post a Comment
NO JUNK, Please try to keep this clean and related to the topic at hand.
Comments are for users to ask questions, collaborate or improve on existing.