压缩型数据类型

来源:互联网 发布:ps4版辐射4捏脸数据 编辑:程序博客网 时间:2024/06/11 05:29

业务场景:

1.通过交易将EXECL表中数据LOAD到主机中

遇到难题:

1.带符号位的数据录入时保持,SQLCODE=-804,显示出的数据为乱码

根本原因:

1.主机编码格式为EBCDIC,不是ASCII。

处理方法:

1.修改EXECL表中带符号位的数据。

总结:

1.通过交易将数据以FTP的方式传入主机,会生成数据文件,若数据为负数时,则末尾为小写英文字母(p,q,r,s,t,u,v,w,x,y,z)。


eg.

若主机中数据项为: 

01 RTFW-RATEPIC S9(4)V9( 8)  COMP-3.

将“3.14”写入EXECL并导入,OK

将“-3.14”写入EXECL并导入,ERROR。必须写成“-3.14000000”,则OK。该数据在主机中显示为00031400000p.(p表示0)

将“-3.14000002”写入EXECL并导入,OK。该数据在主机中显示为00031400000r.(r表示2)

将“-3.14000078”写入EXECL并导入,OK。该数据在主机中显示为00031400007x.(x表示8)

.......注意EXECL文档为ASCII编码格式:




这种问题时常发生,今天与遇到了一时半会还没想起来。。顺便整理了下COBOL的常见压缩类型复习复习。

(1) Write out number to file by following format:

01 FILLER.

05 …

05 NUMBER-1 PIC 9(5)V99.

05 …

05 NUMBER-2 PIC 9(5)V99COMP-3.

05 …

05 NUMBER-3 PIC 9(5)99COMP.

The first output record use positive value.

The second output record use negative value.

Cheak the output,use the "hex on" on TSO,read and understand.

What should be.

解答

       IDENTIFICATION DIVISION.

       PROGRAM-ID. TEST1.

       ENVIRONMENT DIVISION.

       INPUT-OUTPUT SECTION.

       FILE-CONTROL.

           SELECT TESTOUT ASSIGN TO TESTOUT.

       DATA DIVISION.

       FILE SECTION.

       FD  TESTOUT.

       01  TEST1-REC.

           05  FILLER               PIC X.

           05  NUMBER-1-POSI        PIC 9(5)V99.

           05  FILLER               PIC X.

           05  NUMBER-1-NEGA        PIC 9(5)V99.

           05  FILLER               PIC X.

           05  NUMBER-2-POSI        PIC 9(5)V99 COMP-3.

           05  FILLER               PIC X.

           05  NUMBER-2-NEGA        PIC 9(5)V99 COMP-3.

           05  FILLER               PIC X.

           05  NUMBER-3-POSI        PIC 9(5)V99 COMP.

           05  FILLER               PIC X.

           05  NUMBER-3-NEGA        PIC 9(5)V99 COMP.

       WORKING-STORAGE SECTION.

       LINKAGE SECTION.

       PROCEDURE DIVISION.

       000-OPEN-MOVE.

           OPEN  OUTPUT TESTOUT.

           MOVE  1234567 TO NUMBER-1-POSI

           MOVE -1234567 TO NUMBER-1-NEGA

           DISPLAY 'NUMBER-1-POSI : ' NUMBER-1-POSI

           DISPLAY 'NUMBER-1-NEGA : ' NUMBER-1-NEGA

           MOVE  1234567 TO NUMBER-2-POSI

           MOVE -1234567 TO NUMBER-2-NEGA

           DISPLAY 'NUMBER-2-POSI : ' NUMBER-2-POSI

           DISPLAY 'NUMBER-2-NEGA : ' NUMBER-2-NEGA

           MOVE  1234567 TO NUMBER-3-POSI

           MOVE -1234567 TO NUMBER-3-NEGA

           DISPLAY 'NUMBER-3-POSI : ' NUMBER-3-POSI

           DISPLAY 'NUMBER-3-NEGA : ' NUMBER-3-NEGA

           WRITE  TEST1-REC.

           CLOSE  TESTOUT.

           STOP RUN.

运行效果:


终端显示如图:


注意COMP-3型数据的存储:(长度/2)+ 1 个字节。

COMP型数据的存储 :1~4,占2个字节

5~9,占4个字节

 10~18,占8个字节。

十六进制的运算,如NUMBER-2-POSI,占4个字节。将123456700存入,即3456700

注意!!!  该数据项的格式为9(5)V99 COMP. 插入的数据不含小数位,小数位自动以0作为填充,计算十六进制此处必须加上小数位!!!即, 9(5)V99 COMP.

由于没有设置符号位S,所以转换后不会存在正数C或负数D。

PCOM中显示16进制为上下依次排列;右边不足的以F进行填补。

 

在如NUMBER-3-POSI,存入COMP中,即十进制转换成16进制。

转换方法(10转16进制):

十六进制有16个基数,0~9,A(A=10),B(B=11),C(C=12),D(D=13),E(E=14),F(F=15).

十六进制的8421原则(要么1、要么0),

10 0 0/ 0 1 0 0 / 0 0 1 0 / 0 0 01

 该位值为8              该位值为4               该位值为2            该位值为1

 

                     题中将3456700以COMP型存储并计算16进制

将3456700/16=216043···12 即转为16进制的第一位:C

再将216043/16=13502···11 即转为16进制的第二为:B

再将13502/16=843···14即转为16进制的第三为:E

再将843/16=52···11即转为16进制的第四为:B

再将52/16=3···4即转为16进制的第五位为:4、3

则十六进制为34BEBC,由于该数据项占4个字节,所以缺失为补0.

即0034BEBC

 

另外,因为显示压缩型的数据,因此不会做显示。通常默认的为[USAGE IS] DISPLAY.即该数据项适用于打印、显示,采用的是标准格式(一个字节放一个字符)。








0 0
原创粉丝点击