我有一个字段图片X(03),其日期为X' 160101'格式yymmdd。
我想知道如何将其转换为pic x(06)。
到目前为止,我试图将它移回9(03)comp并移动 9(03)comp to a 9(06)但它没有工作。
我该怎么做?
答案 0 :(得分:3)
你拥有的是二进制编码的十进制(BCD)。也就是说,数据保存在二进制字段中,但它是十进制表示,而不是二进制,这对于值很重要。 X'160101'将是1,442,049。 X'160201'将是1,442,305。因此,如果您能够将其视为二进制字段(您必须预先设置二进制零以使其成为二进制字段的正确长度),则必须进行一些愚蠢的计算。
所以你做了一些与众不同的事情。 BCD不是本机COBOL数据类型。 PACKED-DECIMAL(通常与COMP-3 / COMPUTATIONAL-3相同)是BCD类型,其包括低位(最右侧)半字节中的符号值。所以不是一个BCD,但你可以将你的BCD视为PACKED-DECIMAL:
01 BCD-TO-PACKED.
05 BTP-SOURCE-BCD PIC XXX.
05 BTP-PACKED-ZERO PACKED-DECIMAL PIC 9 VALUE ZERO.
01 FILLER
REDEFINES BCD-TO-PACKED.
05 BTP-PACKED-TO-MOVE
PAKCED-DECIMAL PIC 9(6)V9.
01 DATE-AS-PIC-X PIC X(6).
01 DATA-AS-CHARACTER-NUMERIC
REDEFINES DATE-AS-PIC-X PIC 9(6).
MOVE your-source-value TO BTP-SOURCE-BCD
MOVE BTP-PACKED-TO-MOVE TO DATA-AS-CHARACTER-NUMERIC
之后,您可以愉快地引用DATE-AS-PIC-X来随心所欲地做任何事情。
BCD-TO-PACKED是一个四字节的组字段,它通过VALUE子句并且没有任何变化,最后由X'0F'组成。这是一个带有一位数和零值的无符号压缩十进制字段。
然后你为BTP-SOURCE-BCD做X-to-X MOVE。 BCD-TO-PACKED现在看起来像这样:X'1601010F'。这对于压缩十进制字段完全有效。你可以把它除以10来得到你的日期(将它重新定义为PACKED-DECIMAL PIC 9(7)),但为什么要浪费CPU?
相反,在REDEFINES中定义一个小数位(V9)。当编译器生成代码以将其移动到另一个没有小数位的数字字段时,源小数位将被删除。普雷斯托!除以10除以。
注意:所选的数据名称有助于解释。您应该使您的数据对数据有意义,而不仅仅是使用“陈腐”名称。 “字符数字”在COBOL中称为USAGE DISPLAY,如果未提供USAGE,则为默认值。 USAGE这个词本身很少使用。因此,当存在PIC X或PIC 9字段而没有其他用途时,使用USAGE DISPLAY。
注意:您可能不应该使用两位数的年份。您将无法处理早于2000年或晚于2199年的日期。历史使用两位数的年份是由于昂贵的磁盘存储和“数据冗余”(所有世纪值都是19,所以为什么保持值为19 80同一帐户的不同时间)。如果使用两位数年份,请确保某个地方与本世纪有关。
注意:如果您尝试将PIC X字段移动到数字字段,编译器将假定您在字段中有有效的字符编号,这是原始尝试失败的原因之一。
答案 1 :(得分:2)
如果你搜索stackoverflow,你应该找到答案(这已经得到了解答)。
但是创建一个像(my-date-x保存日期)的字段:
03 my-date-x pic x(3).
03 my-date-9 pic 9(6).
03 date-ymdv0 pic 9(6)v9 comp-3.
03 date-x pic x(3) redefines date-ymdv0.
代码是
Move 0 to date-ymdv0
Move my-date-x to date-x
Move date-ymdv0 to my-date-9
它起作用的原因是 9(6)v9 comp3 160101存储为x'1601010c' 这就是你所拥有的(最后+一个0c)。