| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		dtf Beginner
 
  Joined: 10 Dec 2004 Posts: 110 Topics: 8 Location: Colorado USA
  | 
		
			
				 Posted: Tue Dec 14, 2004 3:03 pm    Post subject: Table manipulation to create an "outline" style re | 
				     | 
			 
			
				
  | 
			 
			
				Assume that you have a table that is defined as 
 
 
 	  | Code: | 	 		  01 TABLE-AREA.
 
     05  TABLE-ELEMENT       PIC X(10)  OCCURS 100 TIMES
 
                                        INDEXED BY TE-INDEX.   | 	  
 
 
Now assume that you have the table loaded with data and you know the following:
 
 
1.	The contents of the table contain a module call trace such that the first two 
 
Characters will contain  | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		Phantom Data Mgmt Moderator
  
 
  Joined: 07 Jan 2003 Posts: 1056 Topics: 91 Location: The Blue Planet
  | 
		
			
				 Posted: Wed Dec 15, 2004 5:04 am    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				dtf,
 
 
Here is my solution:
 
 	  | Code: | 	 		  
 
       IDENTIFICATION DIVISION.                                       
 
       PROGRAM-ID.    CHALNG7.                                        
 
       AUTHOR.        PHANTOM.                                        
 
       DATE-WRITTEN.  DECEMBER 2004.                                  
 
      *                                                               
 
       ENVIRONMENT DIVISION.                                          
 
       CONFIGURATION SECTION.                                         
 
       SOURCE-COMPUTER. IBM-370.                                      
 
       OBJECT-COMPUTER. IBM-370.                                      
 
       DATA DIVISION.                                                 
 
      *                                                               
 
       WORKING-STORAGE SECTION.                                       
 
       01  TABLE-AREA.                                                
 
           05  TABLE-ELEMENT         PIC X(10)  OCCURS 100 TIMES      
 
                                                INDEXED BY TE-INDEX.  
 
       01  OUTPUT-LINE               PIC X(80).                       
 
       01  WS-LEADING-SPACES.                                         
 
           05  WS-LSPACES            PIC X(05)  OCCURS 0 TO 10        
 
                                     DEPENDING  ON WS-INDENT-CNT.    
 
       01  WS-PROGRAM-NAME.                                          
 
           05  ENTRY-RETURN-IND      PIC X(02).                      
 
           05  FILLER                PIC X(04).                      
 
           05  SEQ-NO                PIC 9(04).                      
 
       01  CNT                       PIC 9(04).                      
 
       01  WS-INDENT-CNT             PIC 9(04).                      
 
       PROCEDURE DIVISION.                                           
 
       0000-MAIN-ROUTINE.                                            
 
XXXXXX     PERFORM 0100-LOAD-TABLE  THRU 0100-EXIT                   
 
           PERFORM VARYING CNT FROM 1 BY 1 UNTIL CNT > 100 OR        
 
                                  TABLE-ELEMENT(CNT) = HIGH-VALUES   
 
                MOVE SPACES                  TO  OUTPUT-LINE         
 
                MOVE TABLE-ELEMENT(CNT)      TO  WS-PROGRAM-NAME     
 
                COMPUTE WS-INDENT-CNT        =   SEQ-NO - 1          
 
                MOVE SPACES                  TO  WS-LEADING-SPACES   
 
                STRING WS-LEADING-SPACES DELIMITED BY SIZE           
 
                WS-PROGRAM-NAME   DELIMITED BY SIZE INTO OUTPUT-LINE 
 
                DISPLAY OUTPUT-LINE                                  
 
           END-PERFORM                                       
 
           STOP RUN.                                         
 
XXXXXX*                                                      
 
XXXXXX 0100-LOAD-TABLE.                                      
 
XXXXXX     SET TE-INDEX TO +1                                
 
XXXXXX     MOVE 'E-PROG0001' TO TABLE-ELEMENT(TE-INDEX)      
 
XXXXXX     SET TE-INDEX UP BY +1                             
 
XXXXXX     MOVE 'E-PROG0002' TO TABLE-ELEMENT(TE-INDEX)      
 
XXXXXX     SET TE-INDEX UP BY +1                             
 
XXXXXX     MOVE 'E-PROG0003' TO TABLE-ELEMENT(TE-INDEX)      
 
XXXXXX     SET TE-INDEX UP BY +1                             
 
XXXXXX     MOVE 'R-PROG0003' TO TABLE-ELEMENT(TE-INDEX)      
 
XXXXXX     SET TE-INDEX UP BY +1                             
 
XXXXXX     MOVE 'E-PROG0003' TO TABLE-ELEMENT(TE-INDEX)      
 
XXXXXX     SET TE-INDEX UP BY +1                             
 
XXXXXX     MOVE 'R-PROG0003' TO TABLE-ELEMENT(TE-INDEX)      
 
XXXXXX     SET TE-INDEX UP BY +1                             
 
XXXXXX     MOVE 'R-PROG0002' TO TABLE-ELEMENT(TE-INDEX)      
 
XXXXXX     SET TE-INDEX UP BY +1                             
 
XXXXXX     MOVE 'E-PROG0002' TO TABLE-ELEMENT(TE-INDEX)        
 
XXXXXX     SET TE-INDEX UP BY +1                               
 
XXXXXX     MOVE 'E-PROG0003' TO TABLE-ELEMENT(TE-INDEX)        
 
XXXXXX     SET TE-INDEX UP BY +1                               
 
XXXXXX     MOVE 'E-PROG0005' TO TABLE-ELEMENT(TE-INDEX)        
 
XXXXXX     SET TE-INDEX UP BY +1                               
 
XXXXXX     MOVE 'R-PROG0005' TO TABLE-ELEMENT(TE-INDEX)        
 
XXXXXX     SET TE-INDEX UP BY +1                               
 
XXXXXX     MOVE 'R-PROG0003' TO TABLE-ELEMENT(TE-INDEX)        
 
XXXXXX     SET TE-INDEX UP BY +1                               
 
XXXXXX     MOVE 'R-PROG0002' TO TABLE-ELEMENT(TE-INDEX)        
 
XXXXXX     SET TE-INDEX UP BY +1                               
 
XXXXXX     MOVE 'R-PROG0001' TO TABLE-ELEMENT(TE-INDEX)        
 
XXXXXX     SET TE-INDEX UP BY +1                               
 
XXXXXX     MOVE HIGH-VALUES  TO TABLE-ELEMENT(TE-INDEX).       
 
XXXXXX 0100-EXIT. EXIT.                                        
 
 | 	  
 
 
Note:  In the above code, the lines with tag 'XXXXXX' should not be considered since they are used to load your TABLE and you said we need to assume that the table is already loaded.
 
 
So, eliminating the Table-Loading code, I think I have completed the request in 27 lines  (Working Storage + Procedure Div).
 
 
Thanks,
 
Phantom | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		dtf Beginner
 
  Joined: 10 Dec 2004 Posts: 110 Topics: 8 Location: Colorado USA
  | 
		
			
				 Posted: Wed Dec 15, 2004 8:59 am    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				Phantom,
 
 
Yes a workable solution --  good job!  
 
 
Don't know if I am supposed to give hints or not but I beleive there is what I think is a more "elegant" which involves no use of STRING or ODO but rather uses manipulation of indexes.  It is something that I stumbled on many years ago quite by accident.  The downside of my solution which I will post tomorrow, is that it appears on the surface to be incorrect, and requires some documentation for understanding.  Given that, some will think it a poor solution. The upside of it though is that when you understand how it works, you gain a clear understanding of the inner workings  of COBOL indexes.     | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		Phantom Data Mgmt Moderator
  
 
  Joined: 07 Jan 2003 Posts: 1056 Topics: 91 Location: The Blue Planet
  | 
		
			
				 Posted: Thu Dec 16, 2004 6:31 am    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				dtf,
 
 
 	  | Code: | 	 		  
 
Yes a workable solution -- good job!
 
 | 	  
 
 
Thank U.
 
 
 	  | Code: | 	 		  
 
The upside of it though is that when you understand how it works, you gain a clear understanding of the inner workings of COBOL indexes
 
 | 	  
 
 
Excellent.  I'm eager to see your solution.
 
 
Thanks,
 
Phantom | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		dtf Beginner
 
  Joined: 10 Dec 2004 Posts: 110 Topics: 8 Location: Colorado USA
  | 
		
			
				 Posted: Thu Dec 16, 2004 10:37 am    Post subject:  | 
				     | 
			 
			
				
  | 
			 
			
				 	  | Code: | 	 		  
 
       IDENTIFICATION DIVISION.                                       
 
       PROGRAM-ID.    CHALNG7.                                        
 
       AUTHOR.        DTF.                                            
 
       DATE-WRITTEN.  DECEMBER 2004.                                  
 
      *                                                               
 
       ENVIRONMENT DIVISION.                                          
 
       CONFIGURATION SECTION.                                         
 
       SOURCE-COMPUTER. IBM-370.                                      
 
       OBJECT-COMPUTER. IBM-370.                                      
 
       DATA DIVISION.                                                 
 
      *                                                               
 
       WORKING-STORAGE SECTION.                                       
 
000001 01  TABLE-AREA.                                                
 
000002     05  TABLE-ELEMENT                    OCCURS 100 TIMES      
 
000003                                          INDEXED BY TE-INDEX.  
 
000004         10  FILLER            PIC XX.                          
 
000005             88  UPON-ENTRY    VALUE 'E-'.                      
 
000006         10  FILLER            PIC X(08).                       
 
000007     05  PIC X(05)  OCCURS 1   INDEXED BY OE-INDEX.             
 
000008 01  OUTPUT-LINE.                                                 
 
000009     05  OUTPUT-ELEMENT        PIC X(10)  OCCURS 8.               
 
       PROCEDURE DIVISION.                                              
 
       0000-MAIN-ROUTINE.                                               
 
XXXXXX     PERFORM 0100-LOAD-TABLE  THRU 0100-EXIT                      
 
000010     SET OE-INDEX TO 1                                            
 
000011     SET OE-INDEX DOWN BY 1                                       
 
000012     PERFORM VARYING TE-INDEX FROM 1 BY 1 UNTIL TE-INDEX > 100 OR 
 
000013                            TABLE-ELEMENT(TE-INDEX) = HIGH-VALUES 
 
000014          MOVE SPACES                  TO  OUTPUT-LINE            
 
000015          IF UPON-ENTRY(TE-INDEX)                                 
 
000016             SET OE-INDEX UP BY 1                                 
 
000017          END-IF                                                  
 
000018          MOVE TABLE-ELEMENT(TE-INDEX) TO OUTPUT-ELEMENT(OE-INDEX)
 
000019          IF NOT UPON-ENTRY(TE-INDEX)                             
 
000020             SET OE-INDEX DOWN BY 1                               
 
000021          END-IF                                                  
 
000022          DISPLAY OUTPUT-LINE                                     
 
000023     END-PERFORM                                                  
 
            STOP RUN.                                           
 
 XXXXXX*                                                        
 
 XXXXXX 0100-LOAD-TABLE.                                        
 
 XXXXXX     MOVE 'E-PROG0001' TO TABLE-ELEMENT(01)              
 
 XXXXXX     MOVE 'E-PROG0002' TO TABLE-ELEMENT(02)              
 
 XXXXXX     MOVE 'E-PROG0003' TO TABLE-ELEMENT(03)              
 
 XXXXXX     MOVE 'R-PROG0003' TO TABLE-ELEMENT(04)              
 
 XXXXXX     MOVE 'E-PROG0003' TO TABLE-ELEMENT(05)              
 
 XXXXXX     MOVE 'R-PROG0003' TO TABLE-ELEMENT(06)              
 
 XXXXXX     MOVE 'R-PROG0002' TO TABLE-ELEMENT(07)              
 
 XXXXXX     MOVE 'E-PROG0002' TO TABLE-ELEMENT(08)              
 
 XXXXXX     MOVE 'E-PROG0003' TO TABLE-ELEMENT(09)              
 
 XXXXXX     MOVE 'E-PROG0005' TO TABLE-ELEMENT(10)              
 
 XXXXXX     MOVE 'R-PROG0005' TO TABLE-ELEMENT(11)              
 
 XXXXXX     MOVE 'R-PROG0003' TO TABLE-ELEMENT(12)              
 
 XXXXXX     MOVE 'R-PROG0002' TO TABLE-ELEMENT(13)              
 
 XXXXXX     MOVE 'R-PROG0001' TO TABLE-ELEMENT(14)              
 
 XXXXXX     MOVE HIGH-VALUES  TO TABLE-ELEMENT(15).             
 
 XXXXXX 0100-EXIT. EXIT.                                        
 
 | 	  
 
 
The interesting thing here is the use of "OE-INDEX". There may be a problem if you have the compile option set that does range checking since at one point the index gets set to zero, and it also gets set to values exceeding its definition.  This could be avoided by using some kind of first time flag since it is only set to zero for a "first time" task, and actually redefining the output table and giving the OE-INDEX 16 occurrences.  
 
 
What is really fascinating is that what ever the length of the field is associated with the index is what determines the displacement. So for instance if you change that FILLER length to 2, you'd end up with offsets of 2 instead of 5 when you ran the program. 
 
 
As I said, I found this out several years ago by making a mistake of using the wrong index for a table item. The results of that intrigued me, and I actually ended up using it in a tool that I wrote that does something similar to the call trace in this sample problem. | 
			 
		  | 
	
	
		| Back to top | 
		 | 
	
	
		  | 
	
	
		| 
		
		 | 
	
	
		 |