

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

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

# ソートユーティリティ
<a name="system-sort-utilities"></a>

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

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

ここで、 `mpr`は`MainProgramRunner`インスタンスです ([このページ](https://docs.aws.amazon.com/m2/latest/userguide/ba-shared-structure.html#ba-shared-structure-run-call)の「プログラムを呼び出すスクリプト」セクションを参照してください）。ソートユーティリティのエイリアスは、以下のセクションで説明します。

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

## SORT/SYNCSORT/ICEMAN
<a name="sort-syncsort-iceman"></a>

### 目的
<a name="sort-purpose"></a>

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

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

### Signature
<a name="sort-signature"></a>

プログラムは引数を取りませんが、代わりに特定のデータセット参照に依存します。
+ `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`)

### チェック/エラー処理
<a name="sort-error"></a>
+ 入力ファイル (`SORTIN`) に`SHR`処理があるが見つからない場合、エラーメッセージが記録され、プログラムのリターンコードが 1 に設定され、プログラムの実行が停止されます (ソートは行われず、出力は生成されません）。

次の場合、専用メッセージ`RuntimeException`を保持する がスローされます。
+ プログラム呼び出しでデータベースへの接続が必要な場合 ( `SORTDBIN` ではなくデータセットを使用する場合`SORTIN`)、有効なデータソースが見つからなかった場合
+ 出力ファイル (`SORTOUT`) が正しく定義されていない場合
+ コントロールカードで見つかったコマンドが理解できない場合、またはサポートされていない場合
+ `SORT JOINKEYS` ケースに 2 つの入力ファイルしか提供されていない場合

### サンプルの使用
<a name="sort-sample"></a>

#### MERGE サンプル
<a name="sort-merge-sample"></a>

ジョブスクリプトスニペットからの`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 サンプル
<a name="sort-simple-sample"></a>

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
<a name="icetool"></a>

### 目的
<a name="icetool-purpose"></a>

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

次のコア演算子がサポートされています。
+ `COPY` - 入力ファイルから出力ファイルへのデータのコピー
+ `SORT` - 指定されたソートカード/基準を使用してデータをソートします
+ `SELECT` - 条件に基づいて特定のレコードをフィルタリングして選択します
+ `SPLICE` - 複数のソースからのデータをマージ/結合する
+ `COUNT` - 指定された基準を満たすレコードをカウントします
+ `OCCUR` - データ内の出現パターンを分析します

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

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

### Signature
<a name="icetool-signature"></a>

`ICETOOL` ユーティリティはパラメータを取りませんが、特定のデータセットに依存します。
+ `TOOLIN` データセットには、 ユーティリティによって処理されるコントロールステートメントが含まれています。
+ `TOOLMSG` および `DFSMSG`データセットは、現在モダナイズされた`ICETOOL`ユーティリティでは使用されていません (無視)
+ `IN` は、入力データセット (処理されるレコード) のプレフィックスです。
+ `OUT` は出力データセットのプレフィックスです (処理によって生じるレコード）。
+ 他のデータセットは、コントロールカードのコントロールステートメントによって参照される場合があります。

### チェック/エラー処理
<a name="icetool-error"></a>

以下の場合、 は関連するメッセージとともにスロー`RuntimeException`されます。
+ コントロールステートメントのいずれかで使用されている演算子がサポートされていない場合
+ サポートされていないディレクティブが指定されている場合、任意の演算子の場合

### サンプルの使用
<a name="icetool-sample"></a>

#### ICETOOL SORT サンプル
<a name="icetool-sort-sample"></a>

ソート目的で 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")
                })
        }
    }
}
```

注記:
+ インラインコントロールカードは「そのまま」使用され、レガシーコントロールカードからの変換は一切行われません。
+ `TOOLMSG` と `DFSMSG`はモダナイズされたバージョンで定義されますが、実行時に無視されます
+ レガシーバージョンとモダナイズバージョンの両方で、コントロールカードは`CNTL`サフィックスで定義されますが、`TOOLIN`データセットからのディレクティブのサフィックスなしで参照されます。例: では`SORT FROM(IN1) TO(OUT1) USING(SEL1)`、 は`SEL1CNTL`データセット定義`USING(SEL1)`を参照します。

#### ICETOOL コピーサンプル
<a name="icetool-copy-sample"></a>

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
<a name="mfsort"></a>

### 目的
<a name="mfsort-purpose"></a>

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

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

### Signature
<a name="mfsort-signature"></a>

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

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

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

### チェック/エラー処理
<a name="mfsort-error"></a>
+ `TAKE` データセットがないか無効である場合、 `RuntimeException` がスローされます。
+ MFSORT から SORT への委任を考慮すると、 もここで[チェック/エラー処理](#sort-error)適用されます。

### サンプルの使用
<a name="mfsort-sample"></a>

次のコマンド呼び出しは、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");
```