2016-02-05 47 views
2

压缩十进制我有我想要的数值格式的日期(日月年)进入一个压缩十进制/ COMP-3的3个字节的要求。 必须将日期移动到仅分配3个字符/字节的文件中。 这是我试过的。COBOL数据类型转换:在DDMMYY转换日期的3个字节

03 WD-DDMMYY-DT-NUMERIC   PIC 9(06).  
03 WD-DDMMYY-DT-COMP3   PIC S9(06) COMP-3. 
03 WD-DDMMYY-REDF REDEFINES WD-DDMMYY-DT-COMP3. 
    05 WD-3CHARS-DT-COMP3  PIC X(03).  
    05 FILLER     PIC X(01).  


Move WD-DDMMYY-DT-NUMERIC   to WD-DDMMYY-DT-COMP3 
Move WD-3CHARS-DT-COMP3   to file-variable --> X(03)   

我没有得到所需的输出值。 怎么办?

+0

您是否可以包含一些示例日期以及您希望在三个字节中查看这些日期的内容? –

回答

0
01 WORKING-VARIABLES. 
03 WD-DDMMYY-DT-NUMERIC   PIC 9(06).  
03 WD-3CHARS-DT-COMP3-X. 
    05 WD-DDMMYY-DT-COMP3  PIC 9(08) COMP-3. 
03 FILLER REDEFINES WD-3CHARS-DT-COMP3-X. 
    05 FILLER     PIC X(01). 
    05 WD-3CHARS-DT-COMP3  PIC X(03). 


MOVE 311216      TO WD-DDMMYY-DT-NUMERIC. 
MULTIPLY WD-DDMMYY-DT-NUMERIC 
    BY 10      GIVING WD-DDMMYY-DT-COMP3. 
Move WD-3CHARS-DT-COMP3   to FILE-O-FIELD. 

应该解决你的问题。

3

你也想在另一个程序后“解压”你的约会,所以使用REDEFINES而不是下属填充十进制组:

 05 WD-DDMMYY-DT-NUMERIC    PIC 9(06).  
     05 WD-DDMMYY-DT-PD PACKED-DECIMAL PIC 9(06)V9 
               VALUE ZERO. 
     05 FILLER 
      REDEFINES 
       WD-DDMMYY-DT-PD. 
      10 WD-BCD      PIC X(03). 
      10 FILLER      PIC X. 

     MOVE WD-DDMMYY-DT-NUMERIC  TO WD-DDMMYY-DT-PD 
     MOVE WD-BCD     TO wherever-you-want 

低位半字节(半字节)表示操作符号(C表示正数,D表示负数,F表示无操作符号,被视为正数 - 也有一些非首选符号,A,B,E)。

对于压缩十进制的数字部分,一位数字需要一个nybble。

对于压缩十进制数,任何给定的字节数都会允许奇数个数位恰好符合。偶数位数字必须始终以零为前缀(您不用担心,编译器会为您执行此操作)。

要获得“包装”六个十进制数字为三个字节,你必须忽略符号(记住,一个半字节用于甚至无符号场)。这个结果是一个称为二进制编码十进制(BCD)的约定。 COBOL没有对BCD的本地支持,所以你必须编码。但并不多。

为了让标志变得方便起见,您需要将您的数字转移到左侧的一个nybble,同时将您的标志留在原来的位置。单独留下标志不是问题,COBOL会为您做到这一点。向左移动就像乘以10的乘方。要移动一个左边,乘以10.

但是,有一种更好的方式来安排移位,即定义压缩十进制字段以使其具有一个小数位(V9)。当你的日期,显然是一个整数,移动到这个字段时,小数部分将为零(一位数),日期日期将在零之前。

值得注意的是与IBM企业COBOL V5由10的幂的任何乘法或除法作为适当的移位实际上实现。

这将意味着由V5编译器生成的代码将是由10乘法和进入到一个带有一个小数位非常相似。也许相同(我无法检查)。

要 “解压” 日期:

 05 WD-DDMMYY-DT-NUMERIC    PIC 9(06).  
     05 WD-DDMMYY-DT-PD PACKED-DECIMAL PIC 9(06)V9 
               VALUE ZERO. 
     05 FILLER 
      REDEFINES 
       WD-DDMMYY-DT-PD. 
      10 WD-BCD      PIC X(03). 
      10 FILLER      PIC X. 

     MOVE wherever-you-want  TO WD-BCD 
     MOVE WD-DDMMYY-DT-PD   TO WD-DDMMYY-DT-NUMERIC 

注意零值在这个定义。企业COBOL的工作方式(无论如何是V4.2)实际上并不是必须的,但它对程序员来说是纪录片。低位字节(第四个)永远不会从其初始值改变,这意味着它始终包含X'0F'。编译器实际上会“短路”这个,因为它会强制输出无论如何都是无符号的,所以不需要来自源字段的符号。

3

票据答案是正确的,但我会尽量给出一个更加直观的答案使用日期150131(2015年1月31日)

如果你声明的字段

05 WD-DDMMYY-DT-NUMERIC    PIC 9(06) comp-3. 

然后150131中存储在WD-DDMMYY-DT-NUMERIC中作为x'01 50 13 1c',它占用4个字节。但是,如果你申报领域像

05 WD-DDMMYY-DT-NUMERIC    PIC 9(06)V9 comp-3. 
    05 FILLER REDEFINES  WD-DDMMYY-DT-PD. 
     10 WD-BCD      PIC X(03). 

然后150131存储在WD-DDMMYY-DT数字为X'15 01 31 0C”再次占用4个字节,但WD-BCD持有X '15 01 31'其中包含所有日期,长度为3个字节

+0

谢谢布鲁斯!它按预期工作。 :) –