Table Lookups


REDEFINES

       01 FIELD-X                   PIC X(6).
       01 FIELD-N REDEFINES FIELD-X PIC 9(4)V9(2).

Both FIELD-X and FIELD-N above refer to the same 6 byte storage area.

Loading a Table

The following example shows how REDEFINES may be used to load a table.

       01  FEDERAL-TAX-TABLE-DESCRIPTION. 
           02  FILLER PICTURE X(18) VALUE '280000003968869950'.
           02  FILLER PICTURE X(18) VALUE '129650003603457350'.
           02  FILLER PICTURE X(18) VALUE '057450003101219150'.
           02  FILLER PICTURE X(18) VALUE '026900002800363750'.
           02  FILLER PICTURE X(18) VALUE '002650001500000000'.
      * 
       01  FEDERAL-TAX-TABLE REDEFINES FEDERAL-TAX-TABLE-DESCRIPTION. 
           02  FEDERAL-TAX-ITEM OCCURS 5 TIMES 
               03  FEDERAL-TAX-LOW-LIMIT PICTURE 9(6)V9(2). 
               03  FEDERAL-TAX-RATE      PICTURE V9(3).
               03  FEDERAL-TAX-CONSTANT  PICTURE 9(5)V9(2).
      * 
       01  TAX-SUBSCRIPT                 PICTURE 9 COMP.

Indexed Table

Here is the same table again, but this time we use an Index rather than a Subscript.

       01  FEDERAL-TAX-TABLE REDEFINES FEDERAL-TAX-TABLE-DESCRIPTION. 
           02  FEDERAL-TAX-ITEM OCCURS 5 TIMES 
               INDEXED BY FEDERAL-TAX-INDEX.
               03  FEDERAL-TAX-LOW-LIMIT PICTURE 9(6)V9(2). 
               03  FEDERAL-TAX-RATE      PICTURE V9(3).
               03  FEDERAL-TAX-CONSTANT  PICTURE 9(5)V9(2).

PERFORM VARYING

This example shows a table lookup using a subscript and PERFORM VARYING.

       01 SUB-X                     PIC 9(3) COMP.
       01 TABLE-X.
          02 TABLE-ITEM OCCURS 100 TIMES.
             03 FIELD-1    PIC X(2).
             03 FIELD-2    PIC X(1).
             03 FIELD-3    PIC X(2).
       01 FOUND-IT-FLAG             PIC X.

       PROCEDURE DIVISION.

           MOVE 'N' TO FOUND-IT-FLAG.
           PERFORM LOOKUP-ROUTINE
                   VARYING SUB-X FROM 1 BY 1
                     UNTIL SUB-X > 100
                        OR FOUND-IT-FLAG = 'Y'.
           IF FOUND-IT-FLAG = 'Y'
              PERFORM FOUND-IT-ROUTINE
           ELSE
              PERFORM NOT-FOUND-ROUTINE
           END-IF.

       LOOKUP-ROUTINE.
           IF IN-FIELD = FIELD-1 (SUB-X)
              MOVE 'Y' TO FOUND-IT-FLAG.

SEARCH (Linear Search)

Let's try that same lookup again, but this time the table is indexed. Notice there is less coding necessary.

       01 TABLE-X.
          02 TABLE-ITEM OCCURS 100 TIMES
             INDEXED BY INDEX-X.
             03 FIELD-1    PIC X(2).
             03 FIELD-2    PIC X(1).
             03 FIELD-3    PIC X(2).

       PROCEDURE DIVISION.

           SET INDEX-X TO 1.
           SEARCH TABLE-ITEM
               AT END PERFORM NOT-FOUND-ROUTINE
               WHEN IN-FIELD = FIELD-1 (INDEX-X) 
                    PERFORM FOUND-IT-ROUTINE.

SEARCH ALL (Binary Search)

Notice that for SEARCH ALL we add a KEY to the table and it is no longer necessary to SET the index to 1 before searching.

       01 TABLE-X.
          02 TABLE-ITEM OCCURS 100 TIMES
             ASCENDING KEY FIELD-1
             INDEXED BY INDEX-X.
             03 FIELD-1    PIC X(2).
             03 FIELD-2    PIC X(1).
             03 FIELD-3    PIC X(2).

       PROCEDURE DIVISION.

           SEARCH ALL TABLE-ITEM
               AT END PERFORM NOT-FOUND-ROUTINE
               WHEN IN-FIELD = FIELD-1 (INDEX-X) 
                    PERFORM FOUND-IT-ROUTINE.

Cobol Home