Jcl-basic-sort-tricks

提供:Dev Guides
移動先:案内検索

JCL-基本的なソートのコツ

ユーティリティプログラムを使用して達成できる企業の世界での日々のアプリケーション要件を以下に示します。

1. ファイルには100レコードがあります。 最初の10レコードを出力ファイルに書き込む必要があります。

//JSTEP020 EXEC PGM=ICETOOL
//TOOLMSG  DD SYSOUT=*
//DFSMSG   DD SYSOUT=*
//IN1      DD DSN=MYDATA.URMI.STOPAFT,DISP=SHR
//OUT1     DD SYSOUT=*
//TOOLIN   DD *
  COPY FROM(IN1) TO(OUT1) USING(CTL1)
/*
//CTL1CNTL DD *
  OPTION STOPAFT=10
/*

オプションSTOPAFTは、10番目のレコードの後に​​入力ファイルの読み取りを停止し、プログラムを終了します。 したがって、10個のレコードが出力に書き込まれます。

2. 入力ファイルには、同じ従業員番号の1つ以上のレコードがあります。 一意のレコードを出力に書き込みます。

//STEP010  EXEC PGM=SORT
//SYSOUT   DD SYSOUT=*
//SORTIN   DD DSN=MYDATA.URMI.DUPIN,DISP=SHR
//SORTOUT  DD SYSOUT=*
//SYSIN    DD *
  SORT FIELDS=(1,15,ZD,A)
  SUM FIELDS=NONE
/*

SUM FIELDS = NONEは、SORT FIELDSで指定されたフィールドの重複を削除します。 上記の例では、従業員番号はフィールド位置1,15にあります。 出力ファイルには、昇順でソートされた一意の従業員番号が含まれます。

3. 入力レコードの内容を上書きします。

//JSTEP010 EXEC PGM=SORT
//SORTIN   DD DSN= MYDATA.URMI.SAMPLE.MAIN,DISP=SHR
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT= *
//SYSIN    DD*
 OPTION COPY
  INREC OVERLAY=(47:1,6)
/*

入力ファイルでは、位置1,6のコンテンツは位置47,6に上書きされ、出力ファイルにコピーされます。 INREC OVERLAY操作は、出力にコピーする前に入力ファイルのデータを書き換えるために使用されます。

  • 4. 出力ファイルにシーケンス番号を追加します。 *
//JSTEP010 EXEC PGM=SORT
//SORTIN   DD*
  data1
  data2
  data3
/*
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT= *
//SYSIN    DD*
 OPTION COPY
 BUILD=(1:1,5,10:SEQNUM,4,ZD,START=1000,INCR=2)
/*

出力は次のようになります。

data1    1000
data2    1002
data3    1004

4桁のシーケンス番号が出力の位置10に追加され、1000から始まり、レコードごとに2ずつ増えます。

  • 5. ヘッダー/トレーラーを出力ファイルに追加します。 *
//JSTEP010 EXEC PGM=SORT
//SORTIN   DD*
  data1
  data2
  data3
/*
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT= *
//SYSIN    DD*
 SORT FIELDS=COPY
  OUTFIL REMOVECC,
  HEADER1=(1:C'HDR',10:X'020110131C'),
  TRAILER1=(1:C'TRL',TOT=(10,9,PD,TO=PD,LENGTH=9))
/*

出力は次のようになります。

HDR       20110131
data1
data2
data3
TRL       000000003

TOTは、入力ファイルのレコード数を計算します。 HDRおよびTRLは、ユーザー定義のヘッダー/トレーラーに識別子として追加され、ユーザーのニーズに応じてカスタマイズできます。

  • 6. 条件付き処理 *
//JSTEP010 EXEC PGM=SORT
//SORTIN   DD*
  data1select
  data2
  data3select
/*
//SORTOUT  DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSOUT   DD SYSOUT= *
//SYSIN    DD*
  INREC  IFTHEN=(WHEN=(6,1,CH,NE,C' '),BUILD=(1:1,15),
         IFTHEN=(WHEN=(6,1,CH,EQ,C' '),BUILD=(1:1,5,7:C'EMPTY    ')
  OPTION COPY
/*

出力は次のようになります。

data1select
data2 EMPTY
data3select

ファイルの6番目の位置に基づいて、出力ファイルのビルドは異なります。 6番目の位置がSPACESの場合、テキスト「EMPTY」が入力レコードに追加されます。 そうでない場合、入力レコードはそのまま出力に書き込まれます。

7. ファイルのバックアップ

//JSTEP001 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT= *
//SYSIN    DD*
//SYSOUT   DD SYSOUT=*
//SORTOUT  DD DUMMY
//SYSUT1   DD DSN=MYDATA.URMI.ORIG,DISP=SHR
//SYSUT2   DD DSN=MYDATA.URMI.BACKUP,DISP=(NEW,CATLG,DELETE),
//            DCB=*.SYSUT1,SPACE=(CYL,(50,1),RLSE)

IEBGENERは、SYSUT1のファイルをSYSUT2のファイルにコピーします。 SYSUT2のファイルは、上記の例のSYSUT1と同じDCBを取ることに注意してください。

  • 8. ファイル比較 *
//STEP010  EXEC PGM=SORT
//MAIN     DD*
  1000
  1001
  1003
  1005
//LOOKUP   DD *
  1000
  1002
  1003
//MATCH    DD DSN=MYDATA.URMI.SAMPLE.MATCH,DISP=OLD
//NOMATCH1 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH1,DISP=OLD
//NOMATCH2 DD DSN=MYDATA.URMI.SAMPLE.NOMATCH2,DISP=OLD
//SYSOUT   DD SYSOUT= *
//SYSIN    DD*
  JOINKEYS F1=MAIN,FIELDS=(1,4,A)
  JOINKEYS F2=LOOKUP,FIELDS=(1,4,A)
  JOIN UNPAIRED,F1,F2
  REFORMAT FIELDS=(?,F1:1,4,F2:1,4)
  OPTION COPY
  OUTFIL FNAMES=MATCH,INCLUDE=(1,1,CH,EQ,C'B'),BUILD=(1:2,4)
  OUTFIL FNAMES=NOMATCH1,INCLUDE=(1,1,CH,EQ,C'1'),BUILD=(1:2,4)
  OUTFIL FNAMES=NOMATCH2,INCLUDE=(1,1,CH,EQ,C'2'),BUILD=(1:2,4)
/*
  • JOINKEYSは、2つのファイルが比較されるフィールドを指定します。
  • フィールドの再フォーマット=? 出力BUILDの最初の位置に「B」(一致したレコード)、「1」(file1に存在するがfile2には存在しない)、または「2」(file2に存在するがfile1に存在しない)を配置します。
  • JOIN UNPAIREDは、2つのファイルに対して完全な外部結合を行います。

出力は次のようになります。

MATCH File
1000
1003

NOMATCH1 File
1001
1005

NOMATCH2 File
1002

ICETOOLを使用しても同じ機能を実現できます。