ソートユーティリティ - AWS Mainframe Modernization

AWS Mainframe Modernization Service (マネージドランタイム環境エクスペリエンス) は、新規のお客様に公開されなくなりました。 AWS Mainframe Modernization Service (マネージドランタイム環境エクスペリエンス) と同様の機能については、 AWS Mainframe Modernization Service (セルフマネージドエクスペリエンス) をご覧ください。既存のお客様は、通常どおりサービスを引き続き使用できます。詳細については、AWS 「 Mainframe Modernization の可用性の変更」を参照してください。

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ソートユーティリティ

ソートユーティリティは、リファレンスがユーティリティの特別な意味を持つデータセットに依存します。したがって、モダナイズされた側のすべてのソートユーティリティは、groovy スクリプトで同じ呼び出しパターンを共有します。

mpr.withFileConfigurations(<FILE CONFIGURATIONS DETAILS>...) .withParameters(params) .runProgram("<SORT UTILITY ALIAS>")

ここで、 mprMainProgramRunnerインスタンスです (このページの「プログラムを呼び出すスクリプト」セクションを参照してください)。ソートユーティリティのエイリアスは、以下のセクションで説明します。

JCL スクリプトからの DD (データセット定義) エントリは、 mpr.withFileConfigurations()メソッドの引数として機能するファイル設定の詳細のエントリとしてモダナイズされます。その概念の図については、以下のサンプルを参照してください。

SORT/SYNCSORT/ICEMAN

目的

このプログラムは、提供された基準に基づいてデータセットからデータをsort/merge/copyするために使用されるさまざまなメインフレーム SORT ユーティリティをエミュレートします。次のプログラムエイリアスを使用できます (対応するレガシーソートユーティリティ名と一致します)。

  • SORT

  • SYNCSORT

  • ICEMAN

コントロールカードにある SORT/MERGE ディレクティブとレガシーソートユーティリティ機能の詳細については、ここでは説明していませんが、既存の関連するレガシープラットフォームのドキュメントから取得する必要があります。

Signature

プログラムは引数を取りませんが、代わりに特定のデータセット参照に依存します。

  • SYSIN データセット (「コントロールカード」) はソート/マージコントロールステートメントを保持します。

  • オプションのSYMNAMESデータセットは、SYSIN コンテンツに変数置換ディレクティブを保持します。

  • オプションの SORTXDUPまたは SORTXSUMデータセットを使用して、重複レコードを保存できます。

  • 処理するレコードがプレフィックス付きSORTINまたはSORTDBIN保持されているデータセット (入力)

  • SORTOUT データセットはプログラムの結果を保持します (出力)

  • 一部のレガシージョブスクリプトで見つかった SORT WORK データセットSORTWKの定義は無視されます (モダナイズされた呼び出しでは表示されません)。ソート作業データセットは常にモダナイズ環境で動的に割り当てられます。

  • DD が SORTJN (プレフィックス) で始まる 2 つのデータセットには、結合キーディレクティブ (ソートプロセス中にデータセットを結合するために使用される) に関係するレコードが含まれています。

たとえば、次の結合キーディレクティブを考慮します。

JOINKEYS FILE=F1,FIELDS=(13,5,A) JOINKEYS FILE=F2,FIELDS=(24,5,A)

ここでは、結合キーの長さは 5 で、以下から始まります。

  • データセット内のレコードの 13 位 SORTJNF1 (SORTJNプレフィックス と ファイル の連結F1)

  • データセット内のレコードの 24 位 SORTJNF2 (SORTJNプレフィックス と ファイル の連結F2)

チェック/エラー処理

  • 入力ファイル (SORTIN) にSHR処理があるが見つからない場合、エラーメッセージが記録され、プログラムのリターンコードが 1 に設定され、プログラムの実行が停止されます (ソートは行われず、出力は生成されません)。

次の場合、専用メッセージRuntimeExceptionを保持する がスローされます。

  • プログラム呼び出しでデータベースへの接続が必要な場合 ( SORTDBIN ではなくデータセットを使用する場合SORTIN)、有効なデータソースが見つからなかった場合

  • 出力ファイル (SORTOUT) が正しく定義されていない場合

  • コントロールカードで見つかったコマンドが理解できない場合、またはサポートされていない場合

  • SORT JOINKEYS ケースに 2 つの入力ファイルしか提供されていない場合

サンプルの使用

MERGE サンプル

ジョブスクリプトスニペットからのICEMAN呼び出しの例を次に示します。

コントロールカードはインラインで、入力ファイルからフィールドをマージするコマンドがあります ( SYSINエントリを参照)。

//* //PASOSO03 EXEC PGM=ICEMAN,REGION=0M //SORTIN01 DD DSN=input(input809a.data),DISP=SHR,LRECL=10 //SORTIN02 DD DSN=input(input809b.data),DISP=SHR,LRECL=10 //SORTOUT DD DSN=output(out809.txt),DISP=(,PASS),LRECL=10 //SORTWK01 DD SPACE=(281,(156300,156300),RLSE),AVGREC=U //SORTWK02 DD SPACE=(281,(156300,156300),RLSE),AVGREC=U //SYSIN DD * MERGE FIELDS=(1,6,PD,A,7,2,CH,A) END /*

また、一致するモダナイズされた groovy スクリプトスニペット -- 前述のように、モダナイゼーションプロセス中にSORTWKエントリは考慮されず、インラインコントロールカードはレガシーコントロールカードの内容と完全に一致していることに注意してください。

// STEP PASOSO03 - PGM - ICEMAN*************************************************** def stepPASOSO03(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("PASOSO03", "ICEMAN", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .fileSystem("SORTIN01") .path("input(input809a.data)").recordSize(10) .disposition("SHR") .build() .fileSystem("SORTIN02") .path("input(input809b.data)").recordSize(10) .disposition("SHR") .build() .fileSystem("SORTOUT") .path("output(out809.txt)").recordSize(10) .normalTermination("PASS") .build() .fileSystem("SYSIN") .stream( """ MERGE FIELDS=(1,6,PD,A,7,2,CH,A) END """, getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("ICEMAN") }) } } }

シンプルな SORT サンプル

Carddemo サンプルアプリケーションから取得した、インラインコントロールカードを使用したシンプルなレガシー SORT ステップ (ジョブスクリプトスニペット)。

//********************************************************************* //* CREATE COPY OF TRANSACT FILE WITH CARD NUMBER AND TRAN ID AS KEY //********************************************************************* //STEP010 EXEC PGM=SORT //SORTIN DD DISP=SHR,DSN=AWS.M2.CARDDEMO.TRANSACT.VSAM.KSDS //SYSPRINT DD SYSOUT=* //SYSOUT DD SYSOUT=* //SORTOUT DD DSN=AWS.M2.CARDDEMO.TRXFL.SEQ, // DISP=(NEW,CATLG,DELETE),UNIT=SYSDA, // DCB=(LRECL=350,BLKSIZE=3500,RECFM=FB), // SPACE=(CYL,(1,1),RLSE) //SYSIN DD * SORT FIELDS=(263,16,CH,A,1,16,CH,A) OUTREC FIELDS=(1:263,16,17:1,262,279:279,50) /*

および一致するモダナイズされた groovy スクリプトスニペット:

// STEP STEP010 - PGM - SORT****************************************************** def stepSTEP010(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("STEP010", "SORT", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .bluesam("SORTIN") .dataset("AWS.M2.CARDDEMO.TRANSACT.VSAM.KSDS") .disposition("SHR") .build() .systemOut("SYSPRINT") .output("*") .build() .systemOut("SYSOUT") .output("*") .build() .fileSystem("SORTOUT") .path("AWS.M2.CARDDEMO.TRXFL.SEQ").recordSize(350) .disposition("NEW") .normalTermination("CATLG") .abnormalTermination("DELETE") .build() .fileSystem("SYSIN") .stream( """ SORT FIELDS=(263,16,CH,A,1,16,CH,A) OUTREC FIELDS=(1:263,16,17:1,262,279:279,50)""", getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("SORT") }) } } }

インラインコントロールカードは「そのまま」使用され、従来のコントロールカードの内容から変更されることはありません。

ICETOOL

目的

ICETOOL ユーティリティは、単一のジョブステップ (データ操作、ソート、分析) でデータセットに対して複数のオペレーションを実行するために使用されます。

次のコア演算子がサポートされています。

  • COPY - 入力ファイルから出力ファイルへのデータのコピー

  • SORT - 指定されたソートカード/基準を使用してデータをソートします

  • SELECT - 条件に基づいて特定のレコードをフィルタリングして選択します

  • SPLICE - 複数のソースからのデータをマージ/結合する

  • COUNT - 指定された基準を満たすレコードをカウントします

  • OCCUR - データ内の出現パターンを分析します

SPLICE 演算子の場合、ユーティリティはデータチャンキング戦略に基づくマルチスレッドアプローチを使用して、パフォーマンスを最適化します。

演算子の詳細については、適切なレガシープラットフォームドキュメントから取得する必要があります。

Signature

ICETOOL ユーティリティはパラメータを取りませんが、特定のデータセットに依存します。

  • TOOLIN データセットには、 ユーティリティによって処理されるコントロールステートメントが含まれています。

  • TOOLMSG および DFSMSGデータセットは、現在モダナイズされたICETOOLユーティリティでは使用されていません (無視)

  • IN は、入力データセット (処理されるレコード) のプレフィックスです。

  • OUT は出力データセットのプレフィックスです (処理によって生じるレコード)。

  • 他のデータセットは、コントロールカードのコントロールステートメントによって参照される場合があります。

チェック/エラー処理

以下の場合、 は関連するメッセージとともにスローRuntimeExceptionされます。

  • コントロールステートメントのいずれかで使用されている演算子がサポートされていない場合

  • サポートされていないディレクティブが指定されている場合、任意の演算子の場合

サンプルの使用

ICETOOL SORT サンプル

ソート目的で ICETOOL を使用するレガシー jcl サンプルは次のとおりです。

  • 各 SORT オペレーターコントロールステートメントは、USING キーワードを使用してリファレンスを指定する専用のコントロールカードを使用します。

  • すべてのコントロールカードはTOOLIN定義の後に定義され、インライン化されます (SEL1CNTL「」および「次の*CNTLエントリ」を参照)。

//SAMPLO52 EXEC PGM=ICETOOL,REGION=1024K //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //IN1 DD DSN=input(input846a.data),DISP=SHR // DCB=(RECFM=F,LRECL=8) //IN2 DD DSN=input(input846b.data),DISP=SHR // DCB=(RECFM=F,LRECL=8) //OUT1 DD DSN=output(out846a.txt),DISP=(,CATLG) // DCB=(RECFM=F,LRECL=8) //OUT2 DD DSN=output(out846b.txt),DISP=(,CATLG) // DCB=(RECFM=V) //OUT3 DD DSN=output(out846c.txt),DISP=(,CATLG) // DCB=(RECFM=V) //TOOLIN DD * SORT FROM(IN1) TO(OUT1) USING(SEL1) SORT FROM(IN2) TO(OUT1) USING(SEL2) SORT FROM(IN1) TO(OUT2) USING(SEL3) SORT FROM(IN2) TO(OUT2) USING(SEL4) SORT FROM(IN1) TO(OUT3) USING(SEL5) SORT FROM(IN2) TO(OUT3) USING(SEL6) /* //SEL1CNTL DD * OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')) //* //SEL2CNTL DD * OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')) //* //SEL3CNTL DD * OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //* //SEL4CNTL DD * OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //* //SEL5CNTL DD * OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //* //SEL6CNTL DD * OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,7,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' ' //*

モダナイズされると、一致する groovy スクリプトスニペットは次のようになります。

// STEP SAMPLO52 - PGM - ICETOOL************************************************** def stepSAMPLO52(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("SAMPLO52", "ICETOOL", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .systemOut("TOOLMSG") .output("*") .build() .systemOut("DFSMSG") .output("*") .build() .fileSystem("IN1") .path("input(input846a.data)").recordSize(8) .disposition("SHR") .build() .fileSystem("IN2") .path("input(input846b.data)").recordSize(8) .disposition("SHR") .build() .fileSystem("OUT1") .path("output(out846a.txt)").recordSize(8) .normalTermination("CATLG") .build() .fileSystem("OUT2") .path("output(out846b.txt)").rdw(true) .normalTermination("CATLG") .build() .fileSystem("OUT3") .path("output(out846c.txt)").rdw(true) .normalTermination("CATLG") .build() .fileSystem("TOOLIN") .stream( """ SORT FROM(IN1) TO(OUT1) USING(SEL1) SORT FROM(IN2) TO(OUT1) USING(SEL2) SORT FROM(IN1) TO(OUT2) USING(SEL3) SORT FROM(IN2) TO(OUT2) USING(SEL4) SORT FROM(IN1) TO(OUT3) USING(SEL5) SORT FROM(IN2) TO(OUT3) USING(SEL6) """, getEncoding()) .build() .fileSystem("SEL1CNTL") .stream( """ OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')) """, getEncoding()) .build() .fileSystem("SEL2CNTL") .stream( """ OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*'))""", getEncoding()) .build() .fileSystem("SEL3CNTL") .stream( """ OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .fileSystem("SEL4CNTL") .stream( """ OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .fileSystem("SEL5CNTL") .stream( """ OPTION COPY OUTFIL BUILD=(1,8,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .fileSystem("SEL6CNTL") .stream( """ OPTION COPY,SKIPREC=1 OUTFIL BUILD=(1,7,JFY=(SHIFT=LEFT,TRAIL=C'*')), FTOV,VLTRIM=C' '""", getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("ICETOOL") }) } } }

注記:

  • インラインコントロールカードは「そのまま」使用され、レガシーコントロールカードからの変換は一切行われません。

  • TOOLMSGDFSMSGはモダナイズされたバージョンで定義されますが、実行時に無視されます

  • レガシーバージョンとモダナイズバージョンの両方で、コントロールカードはCNTLサフィックスで定義されますが、TOOLINデータセットからのディレクティブのサフィックスなしで参照されます。例: ではSORT FROM(IN1) TO(OUT1) USING(SEL1)、 はSEL1CNTLデータセット定義USING(SEL1)を参照します。

ICETOOL コピーサンプル

COPY 演算子を使用した別の ICETOOL サンプルは次のとおりです。TOOLIN は jcl スクリプトスニペットでインライン化されています。

//SAMPLO51 EXEC PGM=ICETOOL,REGION=1024K //TOOLMSG DD SYSOUT=* //DFSMSG DD SYSOUT=* //IN1 DD DSN=input(input831.data),DISP=SHR // DCB=(RECFM=F,LRECL=12) //OUT1 DD DSN=output(out831a.txt),DISP=OLD // DCB=(RECFM=F,LRECL=12) //OUT2 DD DSN=output(out831b.txt),DISP=OLD // DCB=(RECFM=F,LRECL=12) //TOOLIN DD * COPY FROM(IN1) TO(OUT1,OUT2) USING(SEL1) /* //SEL1CNTL DD * OPTION COPY OUTFIL INCLUDE=(7,2,CH,EQ,C'10') //*

一致するモダナイズされた groovy スクリプトスニペットは次のとおりです。

// STEP SAMPLO51 - PGM - ICETOOL************************************************** def stepSAMPLO51(Object shell, Map params, Map programResults){ shell.with { if (checkValidProgramResults(programResults)) { return execStep("SAMPLO51", "ICETOOL", programResults, { mpr .withFileConfigurations(new FileConfigurationUtils() .withJobContext(jobContext) .systemOut("TOOLMSG") .output("*") .build() .systemOut("DFSMSG") .output("*") .build() .fileSystem("IN1") .path("input(input831.data)").recordSize(12) .disposition("SHR") .build() .fileSystem("OUT1") .path("output(out831a.txt)").recordSize(12) .disposition("OLD") .build() .fileSystem("OUT2") .path("output(out831b.txt)").recordSize(12) .disposition("OLD") .build() .fileSystem("TOOLIN") .stream( """ COPY FROM(IN1) TO(OUT1,OUT2) USING(SEL1) COPY FROM(IN1) TO(OUT3,OUT4) COPY FROM(IN1) TO(OUT4) COPY FROM(IN1) TO(OUT5,OUT6) """, getEncoding()) .build() .fileSystem("SEL1CNTL") .stream( """ OPTION COPY OUTFIL INCLUDE=(7,2,CH,EQ,C'10')""", getEncoding()) .build() .getFileConfigurations()) .withParameters(params) .runProgram("ICETOOL") }) } } }

MFSORT

目的

このユーティリティプログラムは、Micro Focus 環境で見つかった MFSORT という名前のソートユーティリティの動作を模倣することを目的としています (通常はコマンドラインまたはレガシー環境のスクリプトから呼び出されます)。

内部的には、プログラムは実際のソートオペレーションをSORT/SYNCSORT/ICEMANユーティリティプログラムに委任しています。

Signature

次のレガシー構文のみがサポートされています。 mfsort take <control card>

の直接指示では、 mfsort <instructions>はサポートされていません。

引数はかかりません。ake ディレクティブは、MFSORT が動作するためのコマンドを含む TAKEとして参照されるデータセットを使用してエミュレートされます。

チェック/エラー処理

  • TAKE データセットがないか無効である場合、 RuntimeException がスローされます。

  • MFSORT から SORT への委任を考慮すると、 もここでチェック/エラー処理適用されます。

サンプルの使用

次のコマンド呼び出しは、MFSORT の使用例を示しています。

mfsort take TESTSRT1.CTL

以下は、一致するモダナイズされた適応型 groovy スクリプトスニペットです。

mpr.withFileConfigurations(new FileConfigurationUtils() .fileSystem("TAKE") .path("input(TESTSRT1.CTL)") .build() .getFileConfigurations()) .withArguments("input") // relative path for use and give files .runProgram("MFSORT");