DFSORT выбирает дубликаты при поиске только первого дубликата - PullRequest
0 голосов
/ 10 февраля 2012

Приведенный ниже JCL должен выбирать первый дубликат каждой записи, сохраняя их в том же порядке из-за «OPTION COPY» и только с «NETWORK» в байте 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 без условий включения, потому что они уже произошли в первом выборе,Все еще есть дубликаты записей с NETWORK в байте 4 длиной 7. Остальные записи с 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 Ответ

3 голосов
/ 13 февраля 2012

Оператор 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)
/*
...