我有一本以下的字帖:
(...)
05 ESTGWABC-S-OUT.
10 ESTGWABC-S-COD-NUM PIC 9(003).
10 ESTGWABC-S-DESC-COD PIC X(020).
(...)
10 ESTGWABC-S-VAL-PAY PIC 9(015)V99.
10 ESTGWABC-S-QTD-REG PIC 9(002).
10 ESTGWABC-S-REG-PEOP OCCURS 0 TO 20 TIMES
DEPENDING ON ESTGWABC-S-QTD-REG.
15 ESTGWABC-S-CCONTR PIC 9(009).
15 ESTGWABC-S-VAL-PAY PIC 9(015)V99.
10 ESTGWABC-S-DEPEN PIC 9(005).
(...)
在我的程序中,我想在使用它之前初始化它,所以我正在做以下事情:
INITIALIZE ESTGWABC-S-OUT
REPLACING ALPHANUMERIC BY SPACES
NUMERIC BY ZEROS
但是我收到了编译错误:
"ESTGWABC-S-OUT" was found in an "INITIALIZE" statement but was variable-length or variably located. The operand was discarded from the "INITIALIZE" statement.
任何人都可以告诉我如何解决它或我做错了什么?非常感谢你。
答案 0 :(得分:5)
任何人都可以告诉我如何解决它或我做错了什么?
不要使用INITIALIZE
而你没有做错任何事。
基本上,标准COBOL
为数据记录的组织设置规则。然后,它定义INITIALIZE
语句的行为,以正确操作这些数据记录。
可变长度表之后的数据项是“可变位置”。这不符合标准COBOL,后者要求任何可变长度数据项(在本例中为ESTGWABC-S-REG-PEOP
)位于record description entry
的最后。 ESTGWABC-S-DEPEN
的位置将根据表格ESTGWABC-S-REG-PEOP
中的条目数量而变化。当表格大小更改ESTGWABC-S-DEPEN
时,将不再是初始化的数据项。
要允许使用INITIALIZE
,必须更改“字帖”。
以下是如何将INITIALIZE
与符合标准的可变长度记录一起使用的示例。这是通过带有标记的Micro Focus编译器完成的,以强制COBOL 85
一致性。
$set ans85 flag"ans85" flagas"s"
identification division.
program-id. var-len.
data division.
working-storage section.
01 n pic 9(2).
01 a.
02 fixed-part.
03 b pic x(2).
03 c pic 9(2).
02 variable-part.
03 d occurs 0 to 10 depending c.
04 e pic x(2).
04 f pic 9(2).
procedure division.
begin.
initialize fixed-part
perform varying n from 1 by 1 until n > 10
initialize d (n)
end-perform
stop run
.
end program var-len.