我在COBOL程序中有以下变量,当它被读取时从文件中获取它的值:
01 Employee-number PIC 09(8) comp
01 Employee-number-x redefines
Employee-number PIC x(04)
我在同一个程序中有另一个变量:
01 D-element-number PIC 9(04)
现在,
将Employee-number
移至D-element-number
然后我将此D-element-number
写入文件
从输入文件中读取的值是:
0013
0024
所以此值来到Employee-number
和Employee-number-x
,我将此值移至D-Element-number
并将此变量写入输出文件。
但是我在输出文件中得到了这个:
4660
FFFF
4660
4660
是X'1234'
但我希望看到类似的内容:
1234
FFFF
1234
我怎样才能做到这一点?
我可以更改D-element-number
的定义,但不能更改其他内容。
答案 0 :(得分:3)
假设你有X'00001234'你想要C'00001234',请看这里。 http://ibmmainframes.com/viewtopic.php?p=234231#234231
暂时忽略剩下的讨论,只关注那篇文章。
这是关键部分:
PERFORM UNTIL X-WS-1000 > X-WS-1000-MAX
MOVE WS-1000-BYTE-TBL (X-WS-1000)
TO WS-PACKED-X (1:1)
MOVE WS-PACKED TO WS-DISPLAY
MOVE WS-DISPLAY-X TO WS-2000-BYTE-TBL (X-WS-2000)
SET X-WS-1000 UP BY 1
SET X-WS-2000 UP BY 1
END-PERFORM
您需要完全存储定义(不要“纠正”任何内容)。
它的工作原理是让编译器使用“unpack”指令(UNPK)。这个一次只能处理一个字节,这很容易解释。
X'12'(一个字节字段示例)放在一个双字节字段中。 X'12ii'(其中ii的值是“无关的”)。
然后,UNPK将这个“打包”号码变成一个“分区”号码。 “Zone”是一个字节的前四个bts,对于Zoned数字,这四个位都设置为1。所以你得到一个F.然后你从第一个字节得到最左边的数字。然后你得到第二个输出字节,前四位设置为F,然后是第二个输入数字。然后UNPK继续最后一个字节,其中包含一个不相关的数字和一个不相关的符号。对于分区编号,符号和最右边的数字占用相同的字节(区域中的符号),因此您得到一整个不相关的字节。
X'12' - > X'12ii' - > X'F1F1ii”。
三字节输出的前两个字节是C'12'。
不,对数字来说什么都没关系,但是字母搞得一团糟:
X'AB' - > X'ABii' - > X'FAFBii'
虽然F和a数字给出了一个可显示的数字,但对于F和一个字母,结果并没有直接意义。
现在INSPECT ...... CONVERTING来拯救:FA被翻译成C'A'(X'C1),而字母翻到F.
CONVERTING之后的结果将是C'AB'。
应该给你足够的工作。
还有其他方法,但这是对使用UNPK和TRANSLATE(TR)以及翻译值表的经典Assembler技术的公平COBOL近似。
如果您使用自己喜欢的搜索引擎。你应该能够使用计算(多个),表查找更好的方法,我甚至看到了“有效”的256-EVEN EVALUATE,但我想它在“慢”方面有点小。
进一步思考,你实际上有一个BCD(二进制编码十进制)不是吗?这是一个Packed Decimal,没有符号。你的领域没有任何阿尔法。
转换起来更简单。
01 the-converted-value PACKED-DECIMAL PIC 9(8)V9 VALUE ZERO.
01 FILLER REDEFINES the-converted-value.
05 the-binary-value PIC X(4).
05 FILLER PIC X.
MOVE Employee-number-x TO the-binary-value
MOVE the-converted-value TO D-element-number (with Gilbert's correction to PIC 9(8)).
“小数位”是ii,忽略值和忽略符号。您不再需要INSPECT ... CONVERTING ...因为您只有数字。如果你有BCD ......
您回答自己的问题的一个非常好的方法就是首先了解如何在二进制字段中创建数字。
答案 1 :(得分:0)
没试过,但我认为它可能有用:
01 WN-GROUP.
05 Employee-number PIC 9(8) comp.
05 PACKED-ZERO PIC 9(1) COMP-3 VALUE ZERO.
01 WN-PACKED redefines WN-GROUP PIC 9(9) COMP-3.
01 WN-UNPACKED PIC 9(9).
然后在你的程序中:
MOVE your-number TO Employee-number
MOVE WN-PACKED TO WN-UNPACKED.
最后你可以移动或显示WN-PACKED(1:8)。