我的文件上有一个7位数的压缩十进制字段。如何定义将提取/分离这7个数字的数据项?
例如,我希望一个数据项中的前两位数字和另一个数据项中的其他数字,所以我可以稍后操作它们。
答案 0 :(得分:5)
在其他一些语言中,可能常见的一件事就是“除以10的倍数”,当然是适当的倍数。
但是,不要考虑使用COBOL。 “鸿沟”是“昂贵的”。
05 input-packed-decimal
PACKED-DECIMAL PIC 9(7).
然后:
05 FILLER
REDEFINES input-packed-decimal.
10 ipd-split-two-and-five
PACKED-DECIMAL PIC 99V9(5).
01 two-digits PIC 99.
01 five-digits PIC 9(5).
01 FILLER
REDEFINES five-digits.
05 five-digits-as-decimals PIC V9(5).
MOVE ipd-split-two-and-five TO two-digits
five-digits-as-decimals
然后,您可以使用two-digits
和five-digits
来表达您想要的任何内容。
另一种方式:
01 ws-input-seven PIC 9(7).
01 FILLER
REDEFINES ws-input-seven.
05 two-digits PIC 99.
05 five-digits PIC 9(5).
MOVE input-packed-decimal TO ws-input-seven
第一种方法也适用于签名的源字段(只需将S放在每个PICture子句中的适当位置)。
第二个不适用于带符号的字段,因为源符号不会传播到two-digits
字段,因为MOVE甚至不知道存在这样的字段。
在REDEFINESing PACKED-DECIMAL或BINARY字段时要小心(在IBM大型机上,这些字段也可以包含USAGE COMP-3和COMP / COMP-4 / COMP-5)。始终,在使用相同或类似的USAGE定义时,定义相同的位数。对于REDEFINES字段,编译器将始终假设您知道自己在做什么,因此它不会为您执行任何“截断源”。因此,当您使用从属于REDEFINES的字段时,您必须确保您不会明确地或隐含地期望截断源。
要获得第二个数字,请不要这样做:
05 FILLER
REDEFINES input-packed-decimal.
10 ignore-one-use-2nd-next-five
PACKED-DECIMAL PIC 9V9(5).
要获得第二个数字,请像以前一样使用PACKED-DECIMAL PIC 99V9(5),但只用一个数字位置定义接收字段。然后编译器会愉快地生成代码以执行您期望的截断。
如果您“无法使用REDEFINES”,则必须在WORKING-STORAGE中创建一个与输入字段具有相同特征的新字段,然后使用它。
我在这里使用的数据名仅用于这个一般性解释。为您的任务使用好的,描述性的名称。如果前两位是部分类型,后五位是部分号,请确保命名清楚。
不要将它们命名为“Var(n)”或类似名称,并且不要给它们带来误导性的名称。
答案 1 :(得分:0)
01 the-array。
03 filler pic x(02) value '00'.
03 filler pic x(02) value '01'.
03 filler pic x(02) value '02'.
等等,直到
03 filler pic x(02) value 'FF'.
01双数组重新定义了数组。
03 harry occurs 256 pic x(02).
91 sub1。
03 filler pic x(01) value low-values.
93 sub1-byte2 pic x(01).
01 sub2重新定义了sub1 comp。
01 pd pic x(04)。
01 pub pic 9(04)。
01个鸡蛋。
03 eggs1 pic x(01).
03 eggs2 pic x(01).
执行不同的发布
从1开始
直到pub> 4
move pd(pub:1) to sub1-byte2
move harry(sub2 + 1) to eggs
display eggs1 egg2
端执行。
这是一个256个2字节字段的数组,其值为'00'到'FF'。
通过保存压缩十进制字段的4字节字段。
将每个字节用作数组的下标(加1以确保'00'指向数组中的第一个字段)。
指向的2字节字段具有2个半字节的值,表示来自压缩十进制字段的该字节。
压缩十进制字段中第四个字节的右手半字节用于符号。