0

How do I create a table from a copybook in Cobol?

The copybook has several groups in it and only need one of them to be in a table.

Do I need to use the copybook multiple times replacing the start of variables so that the compiler views them as different things?

I can edit the copybook as long as the other programs using it will compile.

It is on an IBM Mainframe.

See my answer below for my final solution. Thanks to @Bruce Martin

zurbergram
  • 421
  • 6
  • 20
  • Your question can't be answered correctly unless you provide the copybook and show what you want to replace exactly. – NoChance Jan 02 '15 at 20:28
  • @EmmadKareem you're missing the point i want to use a copybook with multiple 01 groups but i only need one of the groups to have multiple instances of it in a table – zurbergram Jan 02 '15 at 20:53
  • If the copybook represents a physical file structure, you can't do that. If the 01 level is redefined using REDEFINES clause, then there is no problem because all 01s would be overlaying the same memory area. Again, show the copy book contents for better answer. – NoChance Jan 02 '15 at 20:57
  • @EmmadKareem thanks, going from java to cobol sucks cause you can't seem to do a lot of the stuff thats a no brainer – zurbergram Jan 02 '15 at 20:59
  • Well, if you get used to it you will like it, the language can be mastered quickly without an endless learning curve. – NoChance Jan 02 '15 at 21:04
  • Which cobol Compiler ??, if it supports copy with in a copy; create a separate copybook for your occurs copybook and copy it in to your code and the existing copybook. – Bruce Martin Jan 02 '15 at 21:52
  • You seem to be asking two different, effectively unrelated questions. (1) How to use a copybook for the descriptions of elements in a table? And (2) how to use only some lines of a copybook? Separate questions should post separately so answers can be found by others later. What platform are you compiling COBOL on? – user2338816 Jan 03 '15 at 02:31
  • @BillWoodger Not sure what "...it is _this_" refers to. Multiple questions? Or 'specific' table from a portion of a copybook? Still, platform could help. If iSeries, e.g., a useful answer might be very different from zSeries. It'd also help with asking for clarifications. – user2338816 Jan 04 '15 at 05:22
  • @BruceMartin it's on am IBM mainframe – zurbergram Jan 04 '15 at 14:03
  • Can you clear up comments on your question and the answer, as I think all the information is now in either the question or an answer. I failed to post my comment from this morning. Do you need to reference the fields from the record whilst in the table? If yes, there is a way which is perhaps more like what you were after. I can write you a guarantee that changing the copybook as Bruce has suggested will not cause any problem at all with the other programs... – Bill Woodger Jan 05 '15 at 21:30

3 Answers3

2

You say that you can't change the copybook. Well, the copybook can be changed in such a way that it affects nothing else.

This is an example from the Enterprise COBOL Language Reference:

Example 3
If the following conventions are followed in library text, then parts of names (for
example the prefix portion of data names) can be changed with the REPLACING
phrase.
In this example, the library text PAYLIB consists of the following data division
entries:
01 :TAG:.
   02 :TAG:-WEEK     PIC S99.
   02 :TAG:-GROSS-PAY     PIC S9(5)V99.
   02 :TAG:-HOURS     PIC S999 OCCURS 1 TO 52 TIMES
      DEPENDING ON :TAG:-WEEK OF :TAG:.
The programmer can use the COPY statement in the data division of a program as
follows:
COPY PAYLIB REPLACING ==:TAG:== BY ==Payroll==.
Usage Note: It is important to notice in this example the required use of colons or
parentheses as delimiters in the library text. Colons are recommended for clarity
because parentheses can be used for a subscript, for instance in referencing a table
element.
In this program, the library text is copied; the resulting text is treated as if it had
been written as follows:
01 PAYROLL.
   02 PAYROLL-WEEK PIC S99.
   02 PAYROLL-GROSS-PAY     PIC S9(5)V99.
   02 PAYROLL-HOURS     PIC S999 OCCURS 1 TO 52 TIMES
      DEPENDING ON PAYROLL-WEEK OF PAYROLL.
The changes shown are made only for this program. The text, as it appears in the
library, remains unchanged.

So, for that 01 within the existing copybook, you can replace the data definitions after the 01 with a COPY ... REPLACING ... to give the same prefix (assuming the data-names have prefixes....) and then create your new copybook with adjusted level-numbers if needed (for instance, the example show level-numbers 02, which is always silly, but this is probably not the only example of that in the world). The different level numbers will not affect any existing code (as the compiler normalises all level numbers anyway, so the compiler will always treat the lowest level number after the 01 as 02, the second-lowest as 03, etc).

Then you can use your new copybook in your table.

Be aware that you will have to use subscripting to reference any fields in the table.

If you really cannot change the copybook (some odd diktat, happens at times) then perhaps the best bet would be to make a new copybook which is the same, but with different prefixes, and without the 01-level, for flexibility.

We now need the purpose of storing the records.


It seems that you have something like this:

copy reclyout.

01  record-layout-1.
...
01  record-layout-2.
... 
01  record-layout-3.
... 

And with that, you want to store the record-layout-2 records, only, in a table.

As Bruce Martin asked, knowledge of which compiler and OS you are using would be useful. Some, not all, COBOL compilers support nested copy statements. You could replace the layout of your record in the original copybook with a copy statement for a new copybook which contained the layout.

You'd have a minor issue that you'd need the 01 itself to be outside the copybook, and you'd need to allow a sufficient gap in the level-numbers to allow for your table definition to include the new copybook.

01  The-Table.
    05  some-name OCCURS 100 TIMES.
copy newlyout.

The highest-level data definition(s) in the copybook would have to begin with level-numbers greater than 05. This is not much of a problem to achieve. COBOL compilers will "normalise" the level-numbers anyway, and the chance of you making something less flexible by doing this is almost nil. It is your best solution if your compiler supports nested copy statements.

Yes, using COPY with REPLACING would be very useful. It is always ugly to have to use qualification of data-names (or labels).

If not, consider doing the same thing, but removing that particular layout from the existing copybook and simply including the new copybook after the original copy statement(s). Whether you are able to do this will depend on how much the copybook is used elsewhere. Take it to your analyst/boss.

If that is not possible, make a new copybook for the table, and use comments and other documentation available to you to establish a relationship between the two data-definitions. Not ideal, but a common way that it is done.

Another possibility is to simply define areas within the table, and use the record-layout, via a MOVE to the record-layout. This is another common way, which does need documentation and checks for the lengths in the table/record-layout and is an ungainly/inefficient way to do it. Again, you'll come across that way, probably.

If you cough on the compiler/OS there are some other ways as well.

Bill Woodger
  • 12,968
  • 4
  • 38
  • 47
1

The IBM's mainframe supports nested copybooks, so you can change your copybook to a nested copybook

Also have a look at

so

01  record-layout-1.
...
01  record-layout-2.
... 
01  record-layout-3.
... 

can be changed to

01  record-layout-1.
...
01  record-layout-2.
... 
01  record-layout-3.
copy newCopy.
... 

and in your program you can use the newCopy or what ever you call it. You will probably want to renumber copybook levels while you are at it.

So if the original copybook is

01  record-layout-3.
    05 field-1          pic x(4).
    05 field-2 ... 

you would create the new copybook as

    25 field-1          pic x(4).
    25 field-2 ... 

The actual level numbers are not important, they just need to be > 01 for the copybook. Using 25 will make it easy to embed in your working storage.


A few companies make it a standard- copybooks must not contain 01 levels so that copybooks can also be embedded in Working storage. This is rare though

Community
  • 1
  • 1
Bruce Martin
  • 10,358
  • 1
  • 27
  • 38
1

My final solution.

I actually ended not having to create a table from copybooks but still needed the 01 groups variables to be their own copybooks to create multiple instances of variables with the same structure just with different 01 group names and variable names.

I ended up creating individual copybook books for the 01 groups variables, and then using a Replace block to make the nested copybook look like the original. See below for final result.

 REPLACE ==(TAGEIGHT)== BY ==N==.   

 01  STD-NACHA-FILE-HEADER.         
 COPY ABRYNAFH.                 

 01  STD-NACHA-BATCH-HEADER.        
 COPY ABRYNABH.                 

 01  STD-NACHA-DETAIL-TRANS.        
 COPY ABRYNADT.                 

 01  STD-NACHA-DETAIL-ADDENDA-REC.  
 COPY ABRYNADA.                 

 01  STD-NACHA-BATCH-TOTAL-REC.     
 COPY ABRYNABT.                 

 01  STD-NACHA-FILE-TOTAL-REC.      
 COPY ABRYNAFT.                 

 01  STD-NACHA-FILE-PAD-REC.        
 COPY ABRYNAFP.                 

  01  STD-NACHA-RETURN-REC.
 COPY ABRYNARR.       

 REPLACE OFF.            

I went here for how to use Replace within a copybook.

Community
  • 1
  • 1
zurbergram
  • 421
  • 6
  • 20