2

I have the following variable in COBOL program which gets its value from a file, when it is read:

01 Employee-number PIC 09(8) comp
01 Employee-number-x redefines 
   Employee-number PIC x(04)

I have another variable in the same program:

01 D-element-number PIC 9(04)

Now,

Move Employee-number to D-element-number

Then I write this D-element-number to a file

value read from input file is :

0013 
0024

so this value comes to Employee-number and Employee-number-x and I move this value to D-Element-number and write this variable to a output file.

But I get this in the output file:

4660
FFFF
4660

4660 is the decimal equivalent of X'1234'

But I want to see something like:

1234
FFFF
1234

How can I achieve this ?

I am allowed to change the definition of D-element-number but nothing else.

4

2 回答 2

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

您需要确切的存储定义来配合它(不要“更正”任何东西)。

它通过让编译器使用“解包”指令(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。

转换后的结果将是 C'AB'。

应该给你足够的工作。

还有其他方法,但这是对带有 UNPK 和 TRANSLATE (TR) 以及翻译值表的经典汇编程序技术的公平 COBOL 近似。

如果您使用自己喜欢的搜索引擎。您应该能够使用计算(不止一个),表格查找来改进更多方法,我什至看到了“有效”的 256-WHEN EVALUATE,但我想它有点“慢”。

进一步思考,您实际上有一个 BCD(二进制编码的十进制),不是吗?这是一个压缩十进制,没有符号。您的领域中没有任何 alpha。

这甚至更容易转换。

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...

回答自己的问题的一个非常好的方法是首先找出数字是如何在二进制字段中创建的。

于 2013-08-19T20:11:15.950 回答
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)。

于 2013-09-18T13:47:31.837 回答