DFSORT在仅查找第一个副本时选择重复项

时间:2012-02-10 17:53:55

标签: mainframe dfsort

下面的JCL应该选择每个记录的第一个副本,因为" OPTION COPY"保持它们的顺序相同。并且只能使用“网络”#39;在字节4长度7和'。'字节59长度为1,不包括带有' TOTAL'在字节3长度5和' GRAND'在字节3长度为5.

它会显示任何带有' NETWORK'的记录。在字节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'))
/*

如果我改变它的条件只有' NETWORK'在字节4长度7它只显示1条记录,这是我所期望的。每次输入都是相同的。

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

我无法弄清楚导致其他条件改变的差异是什么,所以它有重复

其中2条评论表明问题与包含条件有关。

我已经尝试了下面的内容,第一个选择是做我正在做的原始,第二个SELECT没有包含条件,因为它们已经在第一个选择中发生了。在第4字节长度7处仍有重复的NETWORK记录。使用NETWORK的记录的其余部分完全相同,因此应该只有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
/*

1 个答案:

答案 0 :(得分:3)

SELECT FIRST运算符期望对输入进行排序,一旦未指定“OPTION COPY”,它就会在检查重复项之前执行此操作

我想删除重复项并按输入顺序保留。

下面是通过添加一个序列号来实现的,该序列号允许将临时文件分类回输入顺序

//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)
/*