客户要求看实时报表,可是从数据库导出来的数据却包含如下所示的显示不怎么友好的数据,这时可以用SORT来转换成客户想要的格式。
转换之前的文件用HEX ON
命令显示如下。可以看出后面三个字段都是PD类型的,并且都占据8位长度。
VIEW IBMUSER.DFSORT.PDTOCSF.SORTIN Columns 00001 00045
Command ===> HEX ON Scroll ===> CSR
=COLS> ----+----1----+----2----+----3----+----4----+
****** ***************************** Top of Data ******************************
000001 AAAA,20130102,1,MD, à? , é , ? & i
CCCC6FFFFFFFF6F6DC600001670600512110600705380
1111B20130102B1B44B0000440CB0013100CB0003049C
----------------------------------------------------
000002 BBBB,20130102,2,MD, , è?íaà , ?-? d
CCCC6FFFFFFFF6F6DC600000000600745440604670800
2222B20130102B2B44B0000000CB0147524CB0303743C
----------------------------------------------------
000003 CCCC,20130102,3,MD, & , & -b? , & -b?
CCCC6FFFFFFFF6F6DC600031150600516860600516860
3333B20130102B3B44B0011270CB0008026CB0008026C
----------------------------------------------------
000004 DDDD,20130102,4,MD, é?ae? , de , &
CCCC6FFFFFFFF6F6DC600544870600008840600000250
4444B20130102B4B44B0016250DB0000450CB0000700D
转换要求:
- 每条record的前面19位格式不变。后面三个PD字段中第一个PD字段保留6位小数,第二、三个PD字段保留3位小数;
- 如果是负数,则保留符号'-',若是正数,省略'+';
- 如果值是0,也要准确显示;
转换之后的文件如下,可以看出,转换结果完全满足客户对报表的需求。
VIEW IBMUSER.DFSORT.PDTOCSF.SORTOUT Columns 00001 00072
Command ===> Scroll ===> CSR
****** ***************************** Top of Data ******************************
000001 AAAA,20130102,1,MD, 1.464700, 51132110.100, 70035034.890
000002 BBBB,20130102,2,MD, 0.000000, 174475542.440, 4360730784.030
000003 CCCC,20130102,3,MD, 1311.217500, 50186082.660, 50186082.660
000004 DDDD,20130102,4,MD, -51464.285700, 8485.400, -720.500
要实现上面的数据转换,下面是我用到的SORT:
//IBMUSERS JOB '00000000',CLASS=0,NOTIFY=&SYSUID,
// MSGCLASS=R,TIME=NOLIMIT
//SORT EXEC PGM=SYNCSORT
//SORTIN DD DSN=IBMUSER.DFSORT.PDTOCSF.SORTIN,DISP=SHR
//SORTOUT DD DSN=IBMUSER.DFSORT.PDTOCSF.SORTOUT,
// DISP=(NEW,CATLG,DELETE),
// UNIT=SYSDA,
// SPACE=(CYL,(1,2),RLSE),
// DCB=(RECFM=FB,BLKSIZE=0)
//SYSOUT DD SYSOUT=*
//SYSIN DD *
SORT FIELDS=COPY
INREC BUILD=(1,19,20,8,PD,EDIT=(SIIIIIIIIIIT.IIIIII),SIGNS=(,-,,),
C',',29,8,PD,EDIT=(SIIIIIIIIIIIIIT.III),SIGNS=(,-,,),
C',',38,8,PD,EDIT=(SIIIIIIIIIIIIIT.III),SIGNS=(,-,,))
这里面有3点要说明:
第1,在SORTOUT里面,DCB=(RECFM=FB,BLKSIZE=0)
不必加LRECL参数,SORT会自动帮你算出来。
第2,SIGNS=(,-,,)的解释: blank for lp, '-' for ln, blank for tp, blank for tn
.
leading positive sign (lp)
leading negative sign (ln)
trailing positive sign (tp)
trailing negative sign (tn)
第3,原则上EDIT语句可以实现任意格式的输出要求。这里小数点前面的那个"T"是用来保证数据为0.000这种值的时候能正常输出,而不会输出blank。
Comments !