

AWS Layanan Modernisasi Mainframe (Managed Runtime Environment experience) tidak lagi terbuka untuk pelanggan baru. Untuk kemampuan yang mirip dengan Layanan Modernisasi AWS Mainframe (pengalaman Lingkungan Runtime Terkelola), jelajahi Layanan Modernisasi AWS Mainframe (Pengalaman yang Dikelola Sendiri). Pelanggan yang sudah ada dapat terus menggunakan layanan ini seperti biasa. Untuk informasi selengkapnya, lihat Perubahan [AWS ketersediaan Modernisasi Mainframe](https://docs.aws.amazon.com/m2/latest/userguide/mainframe-modernization-availability-change.html).

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Urutkan Utilitas
<a name="system-sort-utilities"></a>

Utilitas sortir bergantung pada kumpulan data yang referensinya memiliki arti khusus untuk utilitas. Oleh karena itu, semua utilitas pengurutan di sisi modern memiliki pola pemanggilan yang sama dalam skrip asyik:

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

di mana `mpr` adalah sebuah `MainProgramRunner` instance (lihat bagian Scripts calling programs di [halaman ini](https://docs.aws.amazon.com/m2/latest/userguide/ba-shared-structure.html#ba-shared-structure-run-call)). Alias utilitas sortir diberikan di bagian di bawah ini.

Entri `DD` (definisi kumpulan data) dari skrip JCL dimodernisasi sebagai entri dalam detail konfigurasi file yang berfungsi sebagai argumen untuk metode. `mpr.withFileConfigurations()` Lihat contoh di bawah ini untuk ilustrasi konsep itu.

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

### Tujuan
<a name="sort-purpose"></a>

Program ini mengemulasi berbagai utilitas SORT mainframe, yang digunakan untuk sort/merge/copy data dari kumpulan data, berdasarkan kriteria yang disediakan. Alias program berikut dapat digunakan (dan cocok dengan nama utilitas pengurutan warisan yang sesuai):
+ `SORT`
+ `SYNCSORT`
+ `ICEMAN`

Detail tentang SORT/MERGE arahan yang ditemukan di kartu kontrol dan fitur utilitas pengurutan lama tidak diberikan di sini tetapi harus diambil dari dokumentasi platform warisan yang relevan yang ada.

### Tanda tangan
<a name="sort-signature"></a>

Program ini tidak mengambil argumen apa pun tetapi bergantung pada referensi kumpulan data tertentu sebagai gantinya:
+ `SYSIN`Dataset (alias “kartu kontrol”) memegang pernyataan kontrol sort/merge 
+ `SYMNAMES`Dataset opsional menyimpan arahan substitusi variabel dalam konten SYSIN
+ Opsional `SORTXDUP` atau `SORTXSUM` dataset dapat digunakan untuk menyimpan catatan duplikat
+ Kumpulan data diawali dengan `SORTIN` atau `SORTDBIN` menyimpan catatan yang akan diproses (input)
+ `SORTOUT`Dataset menyimpan hasil dari program (output)
+ `SORTWK`Definisi untuk kumpulan data SORT WORK yang ditemukan di beberapa skrip pekerjaan lama diabaikan (dan tidak direpresentasikan dalam panggilan modern); kumpulan data kerja sortir akan selalu dialokasikan secara dinamis di lingkungan modern
+ Dua kumpulan data yang DD-nya dimulai dengan `SORTJN` (awalan) berisi catatan yang akan diperhatikan oleh arahan kunci gabungan (digunakan untuk menggabungkan kumpulan data selama proses pengurutan)

Misalnya, mempertimbangkan arahan kunci gabungan berikut:

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

Di sini, tombol gabung memiliki panjang 5, dan dimulai dari:
+ posisi 13 untuk catatan dalam dataset `SORTJNF1` (rangkaian awalan dan file) `SORTJN` `F1`
+ posisi 24 untuk catatan dalam dataset `SORTJNF2` (rangkaian awalan dan file) `SORTJN` `F2`

### Cek/Penanganan Kesalahan
<a name="sort-error"></a>
+ Jika file input (`SORTIN`) memiliki `SHR` disposisi tetapi tidak dapat ditemukan, pesan kesalahan dicatat, kode pengembalian program diatur ke 1 dan program yang dijalankan dihentikan (tidak ada pengurutan yang akan terjadi, tidak ada output yang akan dihasilkan)

Untuk kasus-kasus berikut, `RuntimeException` memegang pesan khusus akan dilemparkan:
+ Jika pemanggilan program memerlukan koneksi ke database (saat `SORTDBIN` dataset digunakan, tidak`SORTIN`) tetapi sumber data yang tidak valid dapat ditemukan
+ Jika file output (`SORTOUT`) tidak didefinisikan dengan benar
+ Jika perintah yang ditemukan di kartu kontrol tidak dapat dipahami atau tidak didukung
+ Jika tidak persis dua file input disediakan untuk sebuah `SORT JOINKEYS` kasus

### Penggunaan Sampel
<a name="sort-sample"></a>

#### GABUNGKAN Sampel
<a name="sort-merge-sample"></a>

Berikut adalah contoh `ICEMAN` pemanggilan dari cuplikan skrip pekerjaan:

Kartu kontrol inline dan perintah untuk menggabungkan bidang dari file input (lihat entri) `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
/*
```

Dan cuplikan skrip groovy modern yang cocok -- harap dicatat bahwa, seperti yang telah disebutkan, `SORTWK` entri tidak diperhitungkan selama proses modernisasi, dan bahwa kartu kontrol sebaris sama persis dengan konten kartu kontrol lama.

```
// 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")
                })
        }
    }
}
```

#### Contoh SORT Sederhana
<a name="sort-simple-sample"></a>

Langkah SORT lama sederhana (cuplikan skrip pekerjaan) dengan kartu kontrol sebaris, diambil dari aplikasi sampel carddemo:

```
//*********************************************************************
//* 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)
/*
```

dan cuplikan skrip groovy modern yang cocok:

```
// 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")
                })
        }
    }
}
```

Harap dicatat bahwa kartu kontrol sebaris digunakan “apa adanya”, tanpa modifikasi apa pun dari konten kartu kontrol lama.

## ICETOOL
<a name="icetool"></a>

### Tujuan
<a name="icetool-purpose"></a>

Utilitas ICETOOL digunakan untuk melakukan beberapa operasi pada kumpulan data dalam satu langkah pekerjaan (manipulasi data, penyortiran dan analisis).

Operator inti berikut sedang didukung:
+ `COPY`- Menyalin data dari input ke file output
+ `SORT`- Mengurutkan data menggunakan kartu/kriteria pengurutan tertentu
+ `SELECT`- Menyaring dan memilih catatan tertentu berdasarkan kondisi
+ `SPLICE`- Merges/joins data dari berbagai sumber
+ `COUNT`- Hitungan catatan memenuhi kriteria yang ditentukan
+ `OCCUR`- Menganalisis pola kejadian dalam data

Untuk operator SPLICE, utilitas akan menggunakan pendekatan multi-threaded berdasarkan strategi chunking data untuk memastikan kinerja yang dioptimalkan.

Detail tentang operator harus diambil dari dokumentasi platform lama yang tepat.

### Tanda tangan
<a name="icetool-signature"></a>

`ICETOOL`Utilitas tidak mengambil parameter apa pun, tetapi bergantung pada kumpulan data tertentu:
+ `TOOLIN`dataset berisi pernyataan kontrol yang akan diproses oleh utilitas
+ `TOOLMSG`dan `DFSMSG` kumpulan data tidak digunakan oleh `ICETOOL` utilitas modern untuk saat ini (diabaikan)
+ `IN`adalah awalan untuk dataset masukan (catatan yang akan diproses)
+ `OUT`adalah awalan untuk dataset keluaran (catatan yang dihasilkan dari pemrosesan)
+ kumpulan data lain mungkin direferensikan oleh pernyataan kontrol di kartu kontrol

### Cek/Penanganan Kesalahan
<a name="icetool-error"></a>

Untuk kasus berikut, a `RuntimeException` akan dilemparkan dengan pesan terkait:
+ Jika operator yang digunakan dalam salah satu pernyataan kontrol tidak didukung
+ Untuk operator mana pun, jika arahan yang tidak didukung disediakan

### Penggunaan Sampel
<a name="icetool-sample"></a>

#### Contoh ICETOOL SORT
<a name="icetool-sort-sample"></a>

Berikut adalah contoh jcl lama menggunakan ICETOOL untuk tujuan penyortiran:
+ setiap pernyataan kontrol operator SORT menggunakan kartu kontrol khusus, yang referensinya ditentukan melalui kata kunci USING
+ semua kartu kontrol didefinisikan setelah `TOOLIN` definisi, dan diinline (lihat `SEL1CNTL` dan ikuti `*CNTL` entri)

```
//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' '
//*
```

Setelah dimodernisasi, cuplikan skrip asyik yang cocok terlihat seperti:

```
// 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")
                })
        }
    }
}
```

Catatan:
+ Kartu kontrol inline digunakan “apa adanya”; tidak ada transformasi apa pun yang terjadi, dari kartu kontrol lama
+ `TOOLMSG`dan `DFSMSG` didefinisikan dalam versi modern, tetapi akan diabaikan saat dijalankan
+ Baik dalam versi lama maupun modern, kartu kontrol didefinisikan dengan `CNTL` akhiran, tetapi direferensikan tanpa akhiran dalam arahan dari `TOOLIN` kumpulan data: misalnya Dalam, mengacu pada definisi kumpulan data `SORT FROM(IN1) TO(OUT1) USING(SEL1)` `USING(SEL1)` `SEL1CNTL`

#### Contoh ICETOOL COPY
<a name="icetool-copy-sample"></a>

Berikut adalah contoh ICETOOL lain, menggunakan operator COPY. `TOOLIN`Sebaris dalam cuplikan skrip 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')
//*
```

Dan inilah cuplikan skrip groovy modern yang cocok:

```
// 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>

### Tujuan
<a name="mfsort-purpose"></a>

Program utilitas ini dimaksudkan untuk meniru perilaku utilitas pengurutan bernama MFSORT yang ditemukan di lingkungan Micro Focus (biasanya dipanggil dari baris perintah atau dalam skrip pada lingkungan lama).

Secara internal, program ini mendelegasikan operasi pengurutan yang sebenarnya ke program [SORT/SYNCSORT/ICEMAN](#sort-syncsort-iceman) utilitas.

### Tanda tangan
<a name="mfsort-signature"></a>

Hanya sintaks warisan berikut yang didukung: `mfsort take <control card>`

Instruksi langsung memanggil sebagai `mfsort <instructions>` TIDAK didukung.

Tidak memerlukan argumen apa pun; direktif *take* ditiru menggunakan kumpulan data yang direferensikan sebagai`TAKE`, yang berisi perintah agar MFSORT beroperasi.

### Cek/Penanganan Kesalahan
<a name="mfsort-error"></a>
+ Jika `TAKE` dataset hilang atau tidak valid, a `RuntimeException` akan dilemparkan
+ [Cek/Penanganan Kesalahan](#sort-error)Berlaku di sini juga, mengingat delegasi dari MFSORT ke SORT

### Penggunaan Sampel
<a name="mfsort-sample"></a>

Perintah pemanggilan berikut menunjukkan contoh penggunaan MFSORT:

```
mfsort take TESTSRT1.CTL
```

Berikut adalah cuplikan skrip groovy adaptasi modern yang cocok:

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