Urutkan Utilitas - AWS Modernisasi Mainframe

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.

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

Urutkan Utilitas

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). 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

Tujuan

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

Program ini tidak mengambil argumen apa pun tetapi bergantung pada referensi kumpulan data tertentu sebagai gantinya:

  • SYSINDataset (alias “kartu kontrol”) memegang pernyataan kontrol sort/merge

  • SYMNAMESDataset 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)

  • SORTOUTDataset menyimpan hasil dari program (output)

  • SORTWKDefinisi 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

  • 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, tidakSORTIN) 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

GABUNGKAN Sampel

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

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

Tujuan

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

ICETOOLUtilitas tidak mengambil parameter apa pun, tetapi bergantung pada kumpulan data tertentu:

  • TOOLINdataset berisi pernyataan kontrol yang akan diproses oleh utilitas

  • TOOLMSGdan DFSMSG kumpulan data tidak digunakan oleh ICETOOL utilitas modern untuk saat ini (diabaikan)

  • INadalah awalan untuk dataset masukan (catatan yang akan diproses)

  • OUTadalah awalan untuk dataset keluaran (catatan yang dihasilkan dari pemrosesan)

  • kumpulan data lain mungkin direferensikan oleh pernyataan kontrol di kartu kontrol

Cek/Penanganan Kesalahan

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

Contoh ICETOOL SORT

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

  • TOOLMSGdan 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

Berikut adalah contoh ICETOOL lain, menggunakan operator COPY. TOOLINSebaris 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

Tujuan

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 utilitas.

Tanda tangan

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 sebagaiTAKE, yang berisi perintah agar MFSORT beroperasi.

Cek/Penanganan Kesalahan

  • Jika TAKE dataset hilang atau tidak valid, a RuntimeException akan dilemparkan

  • Cek/Penanganan KesalahanBerlaku di sini juga, mengingat delegasi dari MFSORT ke SORT

Penggunaan Sampel

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");