4

我的文件中有一个 7 位压缩十进制字段。如何定义可以提取/分离这 7 位数字的数据项?

例如,我想在一个数据项中包含前两位数字,而在另一个数据项中包含其他数字,以便以后可以操作它们。

4

2 回答 2

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-digitsfive-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)”或类似名称,也不要给它们起误导性的名称。

于 2016-11-14T08:52:51.493 回答
0

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 个半字节的值。

压缩十进制字段中第四个字节的右手半字节用于符号。

于 2017-12-30T01:08:40.733 回答