2012-02-10 77 views
0

下面的JCL应该选择每个记录的第一个副本,由于“选项副本”并且仅在第4字节长度为7的“NETWORK”下保持相同顺序,以及''在字节59长度为1,在字节不包括在字节3长度5和“GRAND”与“总计”记录3长度5.DFSORT在仅查找第一个副本时选择重复项

它示出了具有“网络”的任何记录在字节4长度7

//SORT EXEC PGM=ICETOOL 
//TOOLMSG DD SYSOUT=* 
//DFSMSG DD SYSOUT=* 
//IN DD DISP=SHR,DSN=INPUT.FILE 
//T1  DD DSN=&&T1,DISP=(MOD,PASS),SPACE=(TRK,(5,5)) 
//OUT DD SYSOUT=* 
//OUTFIL DD SYSOUT=* 
//TOOLIN DD * 
* DROP EVERYTHING WE DON'T WANT 
    SELECT FROM(IN) TO(OUT) ON(1,134,CH) USING(CTL1) FIRST 
/* 
//CTL1CNTL DD * 
    OPTION COPY 
    INCLUDE COND=((4,7,CH,EQ,C'NETWORK',OR, 
       59,1,CH,EQ,C'.'),AND, 
       (3,5,CH,NE,C'TOTAL',AND, 
        3,5,CH,NE,C'GRAND')) 
/* 

如果我在第4字节长度为7时只更改了'NETWORK'的条件,它只显示1条记录,这正是我所期望的。输入每次都是一样的。

//CTL1CNTL DD * 
    OPTION COPY 
    INCLUDE COND=((4,7,CH,EQ,C'NETWORK')) 
/* 

我想不出有什么区别,导致其他条件来改变它,所以它具有重复

的评论2表明,这个问题是与包括条件。

我已经尝试了下面的内容,第一个选择是在做我正在做的原创,第二个SELECT没有包含条件,因为它们已经发生在第一个选择中。目前还有复制与网络记录的字节长度为4 7.用网络记录的其余部分是完全相同的,所以应该只有1

//TOOLIN DD * 
* DROP EVERYTHING WE DON'T WANT 
    SELECT FROM(IN) TO(T1) ON(1,133,CH) USING(CTL1) FIRST 
    SELECT FROM(T1) TO(OUT) ON(1,133,CH) USING(CTL2) FIRST 
/* 
//CTL1CNTL DD * 
    OPTION COPY 
    INCLUDE COND=((4,7,CH,EQ,C'NETWORK',OR, 
        59,1,CH,EQ,C'.'),AND, 
        (3,5,CH,NE,C'TOTAL',AND, 
        3,5,CH,NE,C'GRAND')) 
/* 
//CTL2CNTL DD * 
    OPTION COPY 
/* 
+0

你的问题是与包括条件或ICETOOL选择? 对于你的描述,你可能有太多的记录,因为它落在第一个OR条件。 – user823959 2012-02-10 18:33:41

+0

重新检查你的AND和OR和括号,以确保它正在做你想做的事。请记住,电脑是世界上最愚蠢的东西;它完全符合你的要求。 :) 此外,我不知道// SORTDIAG DD DUMMY语句是否会在这里帮助,但你永远不知道;我会在那里扔一个,看看额外的消息。 – zarchasmpgmr 2012-02-10 22:32:32

回答

3

选择第一个运营商期望的输入进行排序,这它确实在检查重复之前,你没有指定“选项副本”

我想删除重复项,并保持它的输入顺序。

下面做它通过添加一个序列号,允许临时文件进行排序回输入顺序

//TOOLIN DD * 
* SELECT REMOVING THE DUPLICATES AND ONLY INCLUDING THE FIELDS WANTED 
* TO TEMP DD T1 
    SELECT FROM(IN) TO(T1) ON(1,133,CH) USING(CTL1) FIRST 
* COPY FROM TEMP DD T1 TO DD OUT USING CTL2 STATEMENTS 
    COPY FROM(T1) TO(OUT) USING(CTL2) 
/* 
//CTL1CNTL DD * 
    INCLUDE COND=((4,7,CH,EQ,C'NETWORK',OR, 
       59,1,CH,EQ,C'.'),AND, 
       (3,5,CH,NE,C'TOTAL',AND, 
        3,5,CH,NE,C'GRAND')) 
* ADD SEQUENCE NUMBER 8 NUMBERS LONG TYPE SIGNED ZONED DECIMAL AT THE 
* END OF EACH RECORD 
    INREC OVERLAY=(134:SEQNUM,8,ZD) 
/* 
//CTL2CNTL DD * 
* SORT ON THE SEQUENCE NUMBER WHICH PUTS THE RECORDS BACK IN INPUT 
* ORDER 
    SORT FIELDS=(134,8,CH,A) 
/* 
+0

为什么使用COPY然后在CTL2中有SORT?为什么不只是SORT?记录扩展了八个字节,并且永不返回到原始大小,这可以通过OUTREC/OUTFIL BUILD =(1,133)完成。尽管“接受”,比INCLUDE错误,错误,错误。如果4,7是NETWORK,那么3,5永远不可能是TOTAL或GRAND。 – 2013-01-22 01:12:13

+0

我的答案并不像它那样好。你想给我更多的细节我会很乐意改进它? – Deuian 2013-01-29 22:27:16

+0

首先,你需要用文字解释你想要INCLUDE做什么。它可能实际上是“工作”,但至少应该简化。然后你必须描述NETWORK如何出现在你的数据中。如果包含NETWORK的行彼此相邻,则可以选择使用OPTION COPY进行重复数据删除。但是,如果通过文件分发它们,则需要将它们排序(或允许它们默认排序),以将它们组合在一起以进行重复数据删除。 – 2013-01-29 23:50:38

相关问题