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?
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.
While Neal's answer may be correct for the Cobol variant he and the OP are using, it is worth noting that some Cobol compilers will allow nested COPY ... REPLACING
statements.
Indeed we have many instances where we use this in our code.
For example, I have many Cobol module programs that include a copymember in the following way:
COPY 'uwxxxxsel.prg' REPLACING
LEADING "xxxxSEL" BY "AREASEL".
and the 'uwxxxxsel.prg' copymember contains the following COPY
of another file as follows:
COPY 'uwf8list.prg'
REPLACING LEADING 'XXXXXX-F8-' BY 'SELECT-F8-'
==FUNCTION-KEY== BY ==F8-FUNCTION-KEY==.
and this works fine.
I use this as a kind of 'inheritance' structure for common functionality.
There is one gotcha, though, with our Compiler. The higher level REPLACING
does not continue after the nested REPLACING
, but as long as the nested REPLACING
is the last thing in the copymember, it is fine.
来源:https://stackoverflow.com/questions/7386301/copy-statement-with-replacing-in-cobol