0

以下のJCLは、各レコードの最初の複製を選択し、「OPTION COPY」のために同じ順序に保ち、バイト4の長さが7の「NETWORK」と「。」のみを使用する必要があります。バイト59の長さ1で、バイト3の長さ5に「TOTAL」、バイト3の長さ5に「GRAND」があるレコードを除く。

バイト4の長さが7の「NETWORK」のレコードが表示されます。

//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つは、問題が包含条件にあることを示唆しています。

私は以下を試しました。最初の選択は私がオリジナルで行っていたことを実行し、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
/*
4

1 に答える 1

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)
/*
于 2012-02-13T14:56:36.947 に答える