Search code examples
cobolmainframe

"COPY" statement with "REPLACING" in COBOL


I am getting compilation error as,

A "COPY" statement with "REPLACING" phrase was found within a nested "COPY".

This is our compilation setting that we can not use REPLACING verb in nested copy. We have one copybook which is having multiple copy statements with replacing verb. Can anyone help me to resolve this error?


Solution

  • Nesting COPYBOOKS in COBOL is a bit of a trick. In general you may nest copybooks only if they do not contain the REPLACING phrase and do not cause recursion.

    Suppose you had the following two copybooks:

    COPYBOOK ABC

      01 :A:-VAR-A1     PIC X.
      01 :A:-VAR-A2     PIC X.
      COPY XYZ REPLACING ==:A:== BY ==B==.
    

    and

    COBPYOOK XYZ

      01 :A:-VAR-X1     PIC X.
      01 :A:-VAR-X2     PIC X.
    

    The nesting in COPYBOOK ABC is not allowed because it contains a REPLACING phrase.

    However, you can do the following. Drop RELACING from COPYBOOK ABC so it becomes:

    COPYBOOK ABC

      01 :A:-VAR-A1     PIC X.
      01 :A:-VAR-A2     PIC X.
      COPY XYZ.
    

    Now include COPYBOOK ABC into your source program as follows:

      REPLACE ==:A:== BY ==B==.
      COPY ABC.
      REPLACE OFF.
    

    The REPLACE directive causes all occurances of :A: to be replaced by B until a REPLACE OFF directive is encountered, and these replacements occur after all COPY directives have been actioned. The net result of the above statements would be:

      01 B-VAR-A1     PIC X.    <== from ABC
      01 B-VAR-A2     PIC X.    <== from ABC
      01 B-VAR-X1     PIC X.    <== Nested copy of XYZ from ABC
      01 B-VAR-X2     PIC X.    <== Nested copy of XYZ from ABC
    

    This is the only 'legal' way of performing replacements to nested copybooks in COBOL that I am aware of.