An important use for BEFORE BREAK  
 

 Post a new Code Sample   Modify this Code Sample

BEFORE BREAK PROCESSING can be an important clause in structuring a Natural program.

The three programs in this post show the need for this clause when using IF...ESCAPE TOP
(or ACCEPT/REJECT) inconjunction with AT BREAK.


* THIS IS THE FIRST IN A SERIES OF THREE PROGRAMS
* THAT SHOW AN IMPORTANT USE FOR BEFORE BREAK PROCESSING.

* THIS FIRST PROGRAM IS NOT PARTICULARLY EXCITING.
* WE ARE MERELY READING A SERIES OF RECORDS FROM
* OUR FILE IN LOGICAL SEQUENCE BY NAME.
*
* AT THE BREAK OF THE NAME FIELD WE SIMPLY WRITE OUT THE
* NAME THAT WAS JUST COMPLETED AND THE NAME THAT WILL
* BE PROCESSED NEXT.
*
* THE "IF NAME NE OLD (NAME)" STATEMENT ELIMINATES A
* DOUBLE PRINTING OF THE LAST NAME.
* (COMMENT OUT THE "IF" AND THE "END-IF" AND RUN
* TO SEE WHAT I MEAN).
*
DEFINE DATA LOCAL
1 MYVIEW VIEW OF EMPLOYEES
  2 NAME
  2 FIRST-NAME
  2 SALARY (1)
END-DEFINE
*
INCLUDE AATITLER
INCLUDE AASETC
*
READ (15) MYVIEW IN LOGICAL SEQUENCE
     BY NAME STARTING FROM 'JONES'
*
     AT BREAK OF NAME
        WRITE // 10T 'END OF NAME' OLD (NAME)
        IF NAME NE OLD (NAME)
           WRITE   // 10T 'NEXT NAME IS' NAME
           END-IF
        NEWPAGE
        END-BREAK
*
DISPLAY 5T NAME FIRST-NAME SALARY (1)
END-READ
*
END

-------------------------------------------------------
Output from the program above:

    PAGE #   1                    DATE:    03/16/11
    PROGRAM: BEFORE05             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JONES                VIRGINIA                  46000
    JONES                MARSHA                    50000
    JONES                ROBERT                    31000
    JONES                LILLY                     24000
    JONES                EDWARD                    37600
    JONES                MARTHA                    21000
    JONES                LAUREL                    30000
    JONES                KEVIN                      7000
    JONES                GREGORY                    4800
 
 
         END OF NAME JONES
 
 
         NEXT NAME IS JOPER
-----------------------------------------------------------
    PAGE #   2                    DATE:    03/16/11
    PROGRAM: BEFORE05             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JOPER                MANFRED                   24923
 
 
         END OF NAME JOPER
 
 
         NEXT NAME IS JOUSSELIN
----------------------------------------------------------
    PAGE #   3                    DATE:    03/16/11
    PROGRAM: BEFORE05             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JOUSSELIN            DANIEL                     1036
 
 
         END OF NAME JOUSSELIN
 
 
         NEXT NAME IS JUBE
---------------------------------------------------------
    PAGE #   4                    DATE:    03/16/11
    PROGRAM: BEFORE05             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JUBE                 GABRIEL                     783
 
 
         END OF NAME JUBE
 
 
         NEXT NAME IS JUNG
--------------------------------------------------------
    PAGE #   5                    DATE:    03/16/11
    PROGRAM: BEFORE05             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JUNG                 ERNST                     24358
 
 
         END OF NAME JUNG
 
 
         NEXT NAME IS JUNKIN
----------------------------------------------------------
    PAGE #   6                    DATE:    03/16/11
    PROGRAM: BEFORE05             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JUNKIN               JEREMY                     6800
 
 
         END OF NAME JUNKIN
 
 
         NEXT NAME IS KAISER
-----------------------------------------------------------
    PAGE #   7                    DATE:    03/16/11
    PROGRAM: BEFORE05             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    KAISER               REINER                    24358
 
 
         END OF NAME KAISER       
-----------------------------------------------------------

Now we complicate matters by adding an IF...ESCAPE TOP clause
to exclude certain records from being processed. We could also
have used ACCEPT/REJECT. The "messed up" output is the same
in both cases.

* NOW FOR WHAT SHOULD BE A SIMPLE CHANGE. WE ONLY
* WISH TO DISPLAY RECORDS IF THE SALARY IS GREATER THAN
* OR EQUAL TO 24,000. 
*
* IN THIS PROGRAM WE ERRONEOUSLY ADDED JUST
* A SIMPLE IF...ESCAPE TOP TO OUR PREVIOUS PROGRAM.
*
* IF YOU TAKE A LOOK AT THE OUTPUT BELOW YOU WILL
* SEE WHAT A MESS WE CREATED.
*
* IN PARTICULAR, LOOK AT THE PAGES WITH JOPER-JOSSELIN
* OR JOPER-JUBE ETC. NO OUTPUT ON THESE PAGES.
* ASLO, THERE ARE NAMES THAT APPEAR AS "NEXT NAME"
* WHICH NEVER APPEAR.
*
* THE PROBLEM IS QUITE SIMPLE. THE AT BREAK TEST IS
* DONE BEFORE THE IF...ESCAPE TOP TEST. ALSO, ALL
* THE RECORDS FOR A GIVEN NAME MAY FAIL OUR SALARY TEST.
*
DEFINE DATA LOCAL
1 MYVIEW VIEW OF EMPLOYEES
  2 NAME
  2 FIRST-NAME
  2 SALARY (1)
END-DEFINE
*
INCLUDE AATITLER
INCLUDE AASETC
*
READ (15) MYVIEW IN LOGICAL SEQUENCE
     BY NAME STARTING FROM 'JONES'
*     
      IF SALARY (1) LT 24000
         ESCAPE TOP
         END-IF
*
        AT BREAK OF NAME
           WRITE // 10T 'END OF NAME' OLD (NAME)
           IF NAME NE OLD (NAME)
              WRITE   // 10T 'NEXT NAME IS' NAME
              END-IF        
            NEWPAGE
        END-BREAK
*
DISPLAY 5T NAME FIRST-NAME SALARY (1)
END-READ
*
END
-------------------------------------------------------
Output from the program above

    PAGE #   1                    DATE:    03/16/11
    PROGRAM: BEFORE06             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JONES                VIRGINIA                  46000
    JONES                MARSHA                    50000
    JONES                ROBERT                    31000
    JONES                LILLY                     24000
    JONES                EDWARD                    37600
    JONES                LAUREL                    30000
 
 
         END OF NAME JONES
 
 
         NEXT NAME IS JOPER
---------------------------------------------------------
    PAGE #   2                    DATE:    03/16/11
    PROGRAM: BEFORE06             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JOPER                MANFRED                   24923
 
 
         END OF NAME JOPER
 
 
         NEXT NAME IS JOUSSELIN
---------------------------------------------------------
    PAGE #   3                    DATE:    03/16/11
    PROGRAM: BEFORE06             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
 
 
         END OF NAME JOPER
 
 
         NEXT NAME IS JUBE
----------------------------------------------------------
    PAGE #   4                    DATE:    03/16/11
    PROGRAM: BEFORE06             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
 
 
         END OF NAME JOPER
 
 
         NEXT NAME IS JUNG
--------------------------------------------------------
    PAGE #   5                    DATE:    03/16/11
    PROGRAM: BEFORE06             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JUNG                 ERNST                     24358
 
 
         END OF NAME JUNG
 
 
         NEXT NAME IS JUNKIN
----------------------------------------------------------
    PAGE #   6                    DATE:    03/16/11
    PROGRAM: BEFORE06             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
 
 
         END OF NAME JUNG
 
 
         NEXT NAME IS KAISER
--------------------------------------------------------
    PAGE #   7                    DATE:    03/16/11
    PROGRAM: BEFORE06             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    KAISER               REINER                    24358
 
 
         END OF NAME KAISER       
---------------------------------------------------------

Now we will use BEFORE BREAK to correct our program:

* HERE IS A SOLUTION TO THE PROBLEM SHOWN ABOVE IN BEFORE06.
*
* THE IF...ESCAPE TOP CLAUSE IS NOW WITHIN A
* BEFORE BREAK CLAUSE, WHICH IS EXECUTED BEFORE
* THE AT BREAK CLAUSE.
*
DEFINE DATA LOCAL
1 MYVIEW VIEW OF EMPLOYEES
  2 NAME
  2 FIRST-NAME
  2 SALARY (1)
END-DEFINE
*
INCLUDE AATITLER
INCLUDE AASETC
*
READ (15) MYVIEW IN LOGICAL SEQUENCE
     BY NAME STARTING FROM 'JONES'
*
       BEFORE BREAK PROCESSING
              IF SALARY (1) LT 24000
                 ESCAPE TOP
                 END-IF
       END-BEFORE
*
        AT BREAK OF NAME
           WRITE // 10T 'END OF NAME' OLD (NAME)
           IF NAME NE OLD (NAME)
              WRITE   // 10T 'NEXT NAME IS' NAME
              END-IF      
           NEWPAGE
        END-BREAK
*
DISPLAY 5T NAME FIRST-NAME SALARY (1)
END-READ
*
END
---------------------------------------------------
Output from the program above:

    PAGE #   1                    DATE:    03/16/11
    PROGRAM: BEFORE07             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JONES                VIRGINIA                  46000
    JONES                MARSHA                    50000
    JONES                ROBERT                    31000
    JONES                LILLY                     24000
    JONES                EDWARD                    37600
    JONES                LAUREL                    30000
 
 
         END OF NAME JONES
 
 
         NEXT NAME IS JOPER
---------------------------------------------------------
    PAGE #   2                    DATE:    03/16/11
    PROGRAM: BEFORE07             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JOPER                MANFRED                   24923
 
 
         END OF NAME JOPER
 
 
         NEXT NAME IS JUNG
----------------------------------------------------------
    PAGE #   3                    DATE:    03/16/11
    PROGRAM: BEFORE07             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    JUNG                 ERNST                     24358
 
 
         END OF NAME JUNG
 
 
         NEXT NAME IS KAISER
--------------------------------------------------------
    PAGE #   4                    DATE:    03/16/11
    PROGRAM: BEFORE07             LIBRARY: SNIPPET
 
            NAME              FIRST-NAME        ANNUAL
                                                SALARY
    -------------------- -------------------- ----------
 
    KAISER               REINER                    24358
 
 
         END OF NAME KAISER   
---------------------------------------------------------

Note in the output from BEFORE07, there are no pages without records.
Compare the four pages from BEFORE07 with the seven pages from BEFORE06.           

Description :


Disclaimer :

Utilities and samples shown here are not official parts of the Software AG products. These utilities and samples are not eligible for technical support through Software AG Customer Care. Software AG makes no guarantees pertaining to the functionality, scalability, robustness, or degree of testing of these utilities and samples. Customers are strongly advised to consider these utilities and samples as "working examples" from which they should build and test their own solutions

 
Search Community Websites
Natural Products
Roadmap (Aug, 2012)
NaturalONE
Natural General
Natural for Mainframes
Natural for Linux, Unix and OpenVMS
Natural for Windows
Natural Add-Ons
Terms of Use    Privacy Policy    Imprint    Copyright © 2012 Software AG    Contact Us