我的文件中有一个 7 位压缩十进制字段。如何定义可以提取/分离这 7 位数字的数据项?
例如,我想在一个数据项中包含前两位数字,而在另一个数据项中包含其他数字,以便以后可以操作它们。
在其他一些语言中,可能常见的事情之一是“除以 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
第一种方法也适用于已签名的源字段(只需在每个 PICture 子句的适当位置放置一个 S)。
第二个不适用于签名字段,因为源符号不会传播到该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)”或类似名称,也不要给它们起误导性的名称。
01 阵列。
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 two-array 重新定义了-array。
03 harry occurs 256 pic x(02).
91分1。
03 filler pic x(01) value low-values.
93 sub1-byte2 pic x(01).
01 sub2 重新定义 sub1 comp。
01 pd pic x(04)。
01 酒吧图片 9 (04)。
01 鸡蛋。
03 eggs1 pic x(01).
03 eggs2 pic x(01).
执行不同的酒吧
从 1 到 1
直到酒吧 > 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 个半字节的值。
压缩十进制字段中第四个字节的右手半字节用于符号。