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):
SORTSYNCSORTICEMAN
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/mergeSYMNAMESDataset opsional menyimpan arahan substitusi variabel dalam konten SYSINOpsional
SORTXDUPatauSORTXSUMdataset dapat digunakan untuk menyimpan catatan duplikatKumpulan data diawali dengan
SORTINatauSORTDBINmenyimpan 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 modernDua 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)SORTJNF1posisi 24 untuk catatan dalam dataset
SORTJNF2(rangkaian awalan dan file)SORTJNF2
Cek/Penanganan Kesalahan
Jika file input (
SORTIN) memilikiSHRdisposisi 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
SORTDBINdataset digunakan, tidakSORTIN) tetapi sumber data yang tidak valid dapat ditemukanJika file output (
SORTOUT) tidak didefinisikan dengan benarJika perintah yang ditemukan di kartu kontrol tidak dapat dipahami atau tidak didukung
Jika tidak persis dua file input disediakan untuk sebuah
SORT JOINKEYSkasus
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 outputSORT- Mengurutkan data menggunakan kartu/kriteria pengurutan tertentuSELECT- Menyaring dan memilih catatan tertentu berdasarkan kondisiSPLICE- Merges/joins data dari berbagai sumberCOUNT- Hitungan catatan memenuhi kriteria yang ditentukanOCCUR- 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 utilitasTOOLMSGdanDFSMSGkumpulan data tidak digunakan olehICETOOLutilitas 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
TOOLINdefinisi, dan diinline (lihatSEL1CNTLdan ikuti*CNTLentri)
//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
TOOLMSGdanDFSMSGdidefinisikan dalam versi modern, tetapi akan diabaikan saat dijalankanBaik dalam versi lama maupun modern, kartu kontrol didefinisikan dengan
CNTLakhiran, tetapi direferensikan tanpa akhiran dalam arahan dariTOOLINkumpulan data: misalnya Dalam, mengacu pada definisi kumpulan dataSORT 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
TAKEdataset hilang atau tidak valid, aRuntimeExceptionakan dilemparkanCek/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");