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 <IBM-MAIN@LISTSERV.UA.EDU> on behalf of Bob 
Bridges <robhbrid...@gmail.com>
Sent: Friday, June 5, 2020 11:42 PM
To: IBM-MAIN@LISTSERV.UA.EDU <IBM-MAIN@LISTSERV.UA.EDU>
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, robhbrid...@gmail.com, 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:IBM-MAIN@LISTSERV.UA.EDU] 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 lists...@listserv.ua.edu with the message: INFO IBM-MAIN

----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to lists...@listserv.ua.edu with the message: INFO IBM-MAIN

Reply via email to