Skip to main content

Problem:

My table has a number of occurrences that is variable.

Is it possible to manage this table dynamically ?

Resolution:

The example is :

The table is managed dynamically

The table is sort

       IDENTIFICATION DIVISION.

       PROGRAM-ID. PROG.

       WORKING-STORAGE SECTION.

       01  TABLE-DYNAMIQUE IS TYPEDEF.

           10  LI-AIDE-TABLE-CLEF           PIC  X(10).

           10  LI-AIDE-TABLE-INDEX          PIC  9(05).

           10  LI-AIDE-TABLE-AFFICH         PIC  X(60).

       01 W-TABLE-AIDE                      TABLE-DYNAMIQUE.

       01 i                                 PIC  9(08).

       01  WS-AIDE.

           05  WS-AIDE-NOMBRE-MAX           PIC  9(05).

       01 mem-pointer                       USAGE POINTER.

       01 mem-size                          PIC X(04) COMP-5.

       01 flags                             PIC X(04) COMP-5.

       01 status-code                       PIC X(04) COMP-5.

       01 mem-ind          pic 9(08).

       01 W-OK              PIC X(01).

       LINKAGE SECTION.

       01 LI-AIDE-TABLE                     PIC X ANY LENGTH.

       01  LI-AIDE.

           05  LI-AIDE-NOMBRE-MAX           PIC  9(05).

           05  LI-AIDE-IND                  PIC  9(05).

           05  LI-AIDE-FENETRE.

               10  LI-AIDE-COLONNE          PIC  9(02).

               10  LI-AIDE-ABS              PIC  9(02).

               10  LI-AIDE-ORD              PIC  9(02).

           05  LI-AIDE-OCC-AFFICH           PIC  9(02).

           05  LI-AIDE-TITRE                PIC  X(78).

           05  LI-AIDE-AIDE                 PIC  X(78).

           05  LI-AIDE-ACCEPT               PIC  9(01).

           05  LI-AIDE-CURSEUR              PIC  9(05).

       PROCEDURE DIVISION.

       P00.

           PERFORM ALLOUER-MEM.

           DISPLAY "CBL_ALLOC_MEM".

           PERFORM ALIMENTER-TABLE.

           DISPLAY "FIN ALIM TABLE".

           CALL "Sav"   USING WS-AIDE LI-AIDE-TABLE.

           CANCEL "Sav".

           DISPLAY "SUITE:".

           ACCEPT W-OK.

           call "Sorttab" using WS-aide li-aide-table.

           CALL "Sav" USING WS-AIDE LI-AIDE-TABLE.

           PERFORM LIBERER-MEM.

           GO TO FP.

       ERREUR-MEM.

           DISPLAY "ERREUR MEM".

       FP.

           STOP RUN.

       ALLOUER-MEM SECTION.

       P00.

           DISPLAY " Number of Occurs"  

           ACCEPT  WS-AIDE-NOMBRE-MAX.

           IF WS-AIDE-NOMBRE-MAX EQUAL 0

           MOVE 10 TO WS-AIDE-NOMBRE-MAX .

           COMPUTE mem-size = LENGTH OF TABLE-DYNAMIQUE *

                              WS-AIDE-NOMBRE-MAX

           CALL "CBL_ALLOC_MEM"       USING mem-pointer

                                   BY VALUE mem-size

                                            flags

                                  RETURNING status-code.

           IF (status-code NOT = ZERO)

               GO TO ERREUR-MEM

           END-IF.

           SET ADDRESS LI-AIDE-TABLE     TO mem-pointer.

       FP.

           EXIT.

       ALIMENTER-TABLE SECTION.

       P00.

           MOVE 1                        TO mem-ind.

           PERFORM VARYING i FROM 1 BY 1

                     UNTIL (i > WS-AIDE-NOMBRE-MAX)

             MOVE SPACES                 TO W-TABLE-AIDE

             COMPUTE  LI-AIDE-TABLE-INDEX OF W-TABLE-AIDE

             = function random() * 100000

             STRING "STr_" i   INTO LI-AIDE-TABLE-AFFICH

                                         OF W-TABLE-AIDE

             MOVE W-TABLE-AIDE    TO LI-AIDE-TABLE

                (mem-ind : LENGTH OF TABLE-DYNAMIQUE)

             COMPUTE mem-ind = i * LENGTH OF TABLE-DYNAMIQUE

                1

           END-PERFORM.

       FP.

           EXIT.

       LIBERER-MEM SECTION.

       P00.

        CALL "CBL_FREE_MEM" USING BY VALUE mem-pointer

                                  RETURNING status-code.

           IF (status-code NOT = ZERO)

               GO TO ERREUR-MEM

           END-IF.

       FP.

           EXIT.

       IDENTIFICATION DIVISION.

       PROGRAM-ID. SAV.

       select f1 assign "RESULT"

       organization line sequential.

       fd f1 .

       01 f1-enr pic x(183).

       WORKING-STORAGE SECTION.

       01  TABLE-DYNAMIQUE IS TYPEDEF.

           10  LI-AIDE-TABLE-CLEF           PIC  X(10).

           10  LI-AIDE-TABLE-INDEX          PIC  9(05).

           10  LI-AIDE-TABLE-AFFICH         PIC  X(60).

       01 W-TABLE-AIDE                      TABLE-DYNAMIQUE.

       01 i                                 PIC  9(08).

       01  WS-AIDE.

           05  WS-AIDE-NOMBRE-MAX           PIC  9(05).

       01 mem-pointer                       USAGE POINTER.

       01 mem-size                          PIC X(04) COMP-5.

       01 flags                             PIC X(04) COMP-5.

       01 status-code                       PIC X(04) COMP-5.

       01 mem-ind          pic 9(08).

       01 W-OK              PIC X(01).

       LINKAGE SECTION.

       01 LI-AIDE-TABLE                     PIC X ANY LENGTH.

       01  LI-AIDE.

           05  LI-AIDE-NOMBRE-MAX           PIC  9(05).

           05  LI-AIDE-IND                  PIC  9(05).

           05  LI-AIDE-FENETRE.

               10  LI-AIDE-COLONNE          PIC  9(02).

               10  LI-AIDE-ABS              PIC  9(02).

               10  LI-AIDE-ORD              PIC  9(02).

           05  LI-AIDE-OCC-AFFICH           PIC  9(02).

           05  LI-AIDE-TITRE                PIC  X(78).

           05  LI-AIDE-AIDE                 PIC  X(78).

           05  LI-AIDE-ACCEPT               PIC  9(01).

           05  LI-AIDE-CURSEUR              PIC  9(05).

       PROCEDURE DIVISION  USING LI-AIDE LI-AIDE-TABLE.

       P00.

           open extend f1.

           PERFORM VARYING i FROM 1 BY LENGTH OF TABLE-DYNAMIQUE

                     UNTIL (i > LI-AIDE-NOMBRE-MAX *

                                LENGTH OF TABLE-DYNAMIQUE)

               MOVE LI-AIDE-TABLE(i : LENGTH OF TABLE-DYNAMIQUE)

                                         TO W-TABLE-AIDE

               write f1-enr from W-TABLE-AIDE

           END-PERFORM.

       FP.

           move all "-" to f1-enr.

           write f1-enr.

           close f1.

           EXIT PROGRAM.

       END PROGRAM SAV.

       IDENTIFICATION DIVISION.

       PROGRAM-ID. SORTTAB.

       LINKAGE SECTION.

       01 LI-AIDE-TABLE                     PIC X ANY LENGTH.

       01 example4.

           05 ex4-tabl1 occurs 2 to 20000 depending li-aide-nombre-max.

           10  LI-AIDE-TABLE-CLEF           PIC  X(10).

           10  LI-AIDE-TABLE-INDEX          PIC  9(05).

           10  LI-AIDE-TABLE-AFFICH         PIC  X(60).

       01  LI-AIDE.

           05  LI-AIDE-NOMBRE-MAX           PIC  9(05).

           05  LI-AIDE-IND                  PIC  9(05).

           05  LI-AIDE-FENETRE.

               10  LI-AIDE-COLONNE          PIC  9(02).

               10  LI-AIDE-ABS              PIC  9(02).

               10  LI-AIDE-ORD              PIC  9(02).

           05  LI-AIDE-OCC-AFFICH           PIC  9(02).

           05  LI-AIDE-TITRE                PIC  X(78).

           05  LI-AIDE-AIDE                 PIC  X(78).

           05  LI-AIDE-ACCEPT               PIC  9(01).

           05  LI-AIDE-CURSEUR              PIC  9(05).

       PROCEDURE DIVISION  USING LI-AIDE LI-AIDE-TABLE.

       main section.

           set address of example4 to address of li-aide-table.

           perform sort-example4

           exit program.

       sort-example4.

        sort ex4-tabl1 ascending li-aide-table-index of example4

          with duplicates.

           exit.

         END PROGRAM SORTTAB.

The source file is attached

Attachments:

prog.cbl

Old KB# 2339

#ServerExpress
#AcuCobol
#COBOL
#RMCOBOL
#netexpress