データのコピー

デフォルトにより、DSC (データ・セット・コピー) 機能は、単に 1 つのデータ・セットの内容を別のデータ・セットに (使用可能であれば、DFSORT を使用して) コピーします。下記のバッチ・ジョブからの抜粋では、以下のことを行うように DSC 機能を拡張しています。

  • 最初の 2 文字が「01」または「02」であるレコードのみを入力ストリームに組み込む。
  • 「01」タイプのレコードの「salary」(位置 27 にある 4 バイトのパック 10 進数フィールド) および「month 1 payment」(位置 31 にある 4 バイトの 2 進数フィールド) フィールドの合計値を集計する 2 行を SYSPRINT に加える。
  • それぞれの出力レコードで、最初に現れた「Grant Smith」を「Fred Bloggs」に変更する。
  • 最初の 2 文字が「02」であるレコードのみをデフォルトの出力データ・セット (DDOUT) に書き込む。1 から 6 桁目にシーケンス・フィールドを追加して、残りのデータは桁移動する。
  • 最初の 2 文字が「01」であるレコードのみを、変更せずに別のデータ・セット (OUT01) に書き込む。
  • 最初の 10 個の出力レコードを 16 進形式で (SYSPRINT へ) 印刷する。
⋮
//DDIN     DD DSN=FMNUSER.FMNAFDAT.SAMPMVS,DISP=SHR
//DDOUT    DD DSN=FMNUSER.FMNAFDAT.SAMP02,DISP=SHR
//OUT01    DD DSN=FMNUSER.FMNAFDAT.SAMP01,DISP=SHR
//SYSIN    DD *
$$FILEM DSC INPUT=DDIN,
$$FILEM     PROC=*
*FASTPROC
 INCLUDE COND=(1,2,CH,EQ,C'02',OR,1,2,CH,EQ,C'01')
 OUTFIL FNAMES=DDOUT,INCLUDE=(1,2,CH,EQ,C'02')
 OUTREC=(SEQNUM,6,ZD,1,74)
 OUTFIL FNAMES=OUT01,INCLUDE=(1,2,CH,EQ,C'01')
*REXXPROC
 outrec = change(outrec,'Grant Smith','Fred Bloggs')
 /* Print the first 10 output records in hex */
 if prtcount() < 10 then print(outrec,'hex')
 if fld(1,2) == '01' then do
   tally(27,4,'P','Salary Total')
   tally(31,4,'B','Total Month 1 Payment')
 end
/+
/*
⋮