2012-02-10 28 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

相關問題