Search code examples
arrayscobol85

COBOL85: How to find number of rows in an array dynamically


In my program I keep filling the following array with data obtained from a database table then inspect it to find certain words:

01 PRODUCTS-TABLE.
     03 PRODUCT-LINE                 PIC X(40) OCCURS 50 TIMES.

sometimes it occurs 6 times, sometimes more than 6 times.

I'd like to find the number of lines in the array every time I write data to it , how can I do that ?

I tried this but it based on a fixed length:

 INSPECT-PROCESS.
     MOVE 0 TO TALLY-1.
     INSPECT PRODUCTS-TABLE TALLYING TALLY-1 FOR ALL "PRODUCT"
     IF TALLY-1 > 0
     MOVE SER-NUMBER TO HITS-SN-OUTPUT
     MOVE FILLER-SYM TO FILLER-O
     MOVE PRODUCT-LINE(1) TO HITS-PR-OUTPUT
     WRITE HITS-REC
     PERFORM WRITE-REPORT VARYING CNT1 FROM 2 BY 1 UNTIL CNT1 = 11.

 WRITE-REPORT.
     MOVE "   " TO HITS-SN-OUTPUT
     MOVE PRODUCT-LINE(CNT1) TO HITS-TX-OUTPUT
     WRITE HITS-REC.

In the first output line it writes the SN and the first product-line then in the following lines it writes all remaining product-line and blank out SN.

Something like: 12345678 first product-line Second product-line etc

It’s working, however, it only stops when CNT1 is 11, how can I feed the procedure with a variable CNT1 based on how many lines are actually in PRODUCTS-TABLE each time?


Solution

  • I solved the problem by adding an array line counter (LINE-COUNTER-1) to count (ADD 1 TO LINE-COUNTER-1) how many times I add data to the array and stop writing the report when "WRITE-COUNTER = LINE-COUNTER-1"

     INSPECT-PROCESS.                                                 
         MOVE 0 TO TALLY-1                       
         INSPECT PRODUCTS-TABLE TALLYING TALLY-1 FOR ALL "PRODUCT"       
         IF TALLY-1 > 0            
         MOVE HOLD-SER-NUM TO HITS-SN-OUTPUT                          
         MOVE FILLER-SYM TO FILLER-O                                  
         MOVE PRODUCT-LINE(1) TO HITS-PR-OUTPUT                         
         WRITE HITS-REC                                               
         PERFORM WRITE-REPORT VARYING WRITE-COUNTER FROM 2 BY 1       
         UNTIL WRITE-COUNTER = LINE-COUNTER-1.