With Enterprise COBOL V5 and up you could do the following:
PERFORM VARYING JC FROM 1 BY 1 UNTIL JC > 99
IF X > 999 EXIT PERFORM CYCLE END-IF
IF FIRST-NAME = "ROBERT" EXIT PERFORM CYCLE END-IF
IF TYPE <> 195 EXIT PERFORM CYCLE END-IF
IF NOT SO-ON EXIT PERFORM CYCLE END-IF
IF NOT SO-FORTH EXIT PERFORM CYCLE END-IF
PERFORM 1050-SUCH-AND-SUCH
END-PERFORM
EXIT PERFORM CYCLE is COBOL's version of REXX "iterate", C/C++/Java "continue",
etc. EXIT PERFORM (w/o CYCLE) is like "leave/break". Only works with an
inline perform, but that's true for those other languages as well.
Inline performs have been available since COBOL 1985 standard, e.g. IBM VS
COBOL II, but EXIT PERFORM [CYCLE] were added only in the COBOL 2002 standard.
________________________________
From: IBM Mainframe Discussion List <[email protected]> on behalf of Bob
Bridges <[email protected]>
Sent: Friday, June 5, 2020 11:42 PM
To: [email protected] <[email protected]>
Subject: Re: COBOL Question
I realize this is a bit of a change in subject (and it's not as if we need yet
another one), but I avoid this construction. My phobia is based on an extreme
example: In their zeal never to use GOTOs, I've frequently seen programmers
write paragraphs like this:
PERFORM 1050-LOOP VARYING JC FROM 1 BY 1 TO 99
1050-LOOP.
IF X < 1000
IF FIRST-NAME NOT = "ROBERT"
IF TYPE = 195
IF SO-ON
IF SO-FORTH
EXECUTE 1050-SUCH-AND-SUCH
END-IF
END-IF
END-IF
END-IF
END-IF
Gives me a headache to try to evaluate that. Much better, in my opinion, to
introduce ONE LOUSY "GOTO EO-PARAGRAPH" like this:
PERFORM 1050-LOOP THRU 1059-LOOP VARYING JC FROM 1 BY 1 TO 99
1050-LOOP.
IF X > 999 GOTO 1059-LOOP.
IF FIRST-NAME = "ROBERT" GOTO 1059-LOOP.
IF TYPE <> 195 GOTO 1059-LOOP.
IF NOT SO-ON GOTO 1059-LOOP.
IF NOT SO-FORTH GOTO 1059-LOOP.
EXECUTE 1050-SUCH-AND-SUCH
1059-LOOP.
Keep in mind I haven't programmed in COBOL since Y2K; I had to look up the
syntax, I probably got part of it wrong nonetheless, and I'll bet there are
easier ways to do it nowadays. In REXX, for example, they have the ITERATE
statement:
do jc=1 to 99
if x>99 then iterate
if firstname='ROBERT' then iterate
if type<>195 then iterate
if \soon then iterate
if \soforth then iterate
call suchandsuch
end
However you do it, I vastly prefer skip-to-next-item over nested Ifs. But I
confess that one single nested IF is not going to give me a headache; I just
react when I see one. Not your fault :).
---
Bob Bridges, [email protected], cell 336 382-7313
/* In an emergency, a drawstring from a parka hood can be used to strangle a
snoring tent mate. -"Camping Tips" */
-----Original Message-----
From: IBM Mainframe Discussion List [mailto:[email protected]] On Behalf
Of Gibney, Dave
Sent: Friday, June 5, 2020 16:17
Using OP
IF TVOLL (IND1) NOT = HIGH-VALUE
AND SMOD (IND1) = 'B' OR 'R'
I would do
IF TVOLL (IND1) NOT = HIGH-VALUE
IF SMOD (IND1) = 'B' OR 'R'
Do the stuff
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN