×
The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.
Of course given a CLP performing so much & probably complex work,
there should be well-defined & recoverable phases. As well, use of
QTEMP to make a backup copy of a master file that is going to be
deleted does not fit into any _reasonable_ design, except where the
DROP is under commitment control such that a ROLLBACK has the file
coming back. Often such complex "scripts" implemented as CLP would
set a "phase" of processing both internally & externally, such that
both retry & restart features are possible; implemented with an
effective select\case statement with GOTO or CALLSUBR of the
appropriate phase, for lack of variable target\entry points in a CLP.
Poor programming is poor programming. Having a global monitor
[to replace the language-specific default monitor\handler] is not
inherently poor programming, only for misuse [i.e. negative outcome
for whatever was the use] of the feature. In the following rewrite,
an interruption\failure in "RecreateMasterFile" leaves a not-found
error condition for the rename on its retry, but with review of the
code and with the inquiry after emailing failure details, just like
with a CPA0701 someone can "undo" the prior rename and reply to the
inquiry to "retry" the failing phase; by review of the failure, the
developer may decide to add a separate phase or logic to recover
from a failure in that phase of processing.
<code>
MONMSG CPF0000 EXEC(GOTO ErrStuff)
...
rtvdtaara MYLIB/AppDtaAra &phase
RestartAt:
if &phaseCode *ne '000000' then(do)
select
when (&phaseCode *eq '009040') then(goto p009040)
...
otherwise ...
endselect
enddo
...
Page 20
...
p009040: chgvar &phase '009040:ReCreateMasterFile'
callsubr setphase
RNMOBJ MYLIB/MASTERFILE *FILE MASTERBKUP
CALL ProgramToRecreateMasterFile
...
p011080: chgvar &phase '011080:DeleteMasterBkup'
callsubr setphase
DLTF MYLIB/MASTERBKUP
...
Page 27
...
return
setphase: subr setphase
chgdtaara MYLIB/AppDtaAra &phase
...
endsubr
errstuff:
if &terminated then(do)
dmpclpgm
monmsg cpf0000
dspjoblog output(*print)
monmsg cpf0000
return /* prevent loop */
enddo
else do(chgvar &terminated '1')
/* handle errors with pretty email */
callsubr SndInqWait rtnval(&RorC)
If (&RorC *eq 'R') then(goto RestartAt)
...
</code>
Regards, Chuck
rob@xxxxxxxxx wrote:
Sample
MONMSG CPF0000 GOTO(ERRSTUFF)
...
Page 20
...
CPYF MYLIB/MASTERFILE QTEMP/WORKFILE...
DLTF MYLIB/MASTERFILE
CALL ProgramToRecreateMasterFile
...
Page 27
...
goto end
errstuff:
/* handle errors with pretty email */
end:
Now, instead of taking an R when ProgramToRecreateMasterFile blew
up I have no MASTERFILE. And my QTEMP copy of WORKFILE is gone.
But at least I have pretty email.
The other problem is that developers often get lazy by relying
upon the generic top level MONMSG and errors go on for years
unnoticed - seen that. But that's mostly without the goto.
As an Amazon Associate we earn from qualifying purchases.