Mainframe Connector menggunakan parser berbasis ANTLR4 yang mendukung copybook COBOL standar.
Dokumen ini mencantumkan tugas pra-pemrosesan yang dilakukan oleh parser copybook,
jenis data yang didukung dan batasan penggunaan, serta cara mengonfigurasi pengubah kolom
menggunakan konfigurasi transcoder dengan perintah qsam decode dan qsam
encode.
Prapemrosesan
Sebelum mengurai copybook, parser copybook melakukan pra-pemrosesan data dan melakukan langkah-langkah berikut:
- Menghapus baris komentar (
*di kolom 7, atau komentar*>dan*>CEinline). - Menyelesaikan kelanjutan baris (
-di kolom 7 diikuti dengan literal yang dikutip). - Mengosongkan area nomor urut (kolom 1–6) dan kolom 73 dan seterusnya. Kode harus dimulai di kolom 8 atau yang lebih baru.
- Mempertahankan pernyataan khusus pra-pemroses seperti
EJECT,SKIP1,SKIP2,SKIP3, danTITLE. Pernyataan ini diurai, tetapi diabaikan. Copybook yang berisi parameter preprocessor yang dapat digunakan olehCOPY REPLACINGtidak didukung oleh parser copybook. Dalam copybook ini, ID diapit oleh titik dua (:).
Jenis data dan batasan yang didukung
Berikut adalah jenis data yang didukung oleh parser copybook dan batasan penggunaannya:
- Hanya satu data
01tingkat teratas yang diizinkan dalam copybook, dan data01tidak boleh memiliki klausaOCCURS. - Kolom level
66(RENAMES/alias) dan level77(mandiri) tidak didukung. Level88(nama kondisi) diuraikan dan diabaikan. - Semua kolom dasar (non-grup) harus memiliki klausa
PICTURE, kecuali untuk kolom floating point heksadesimal (COMP-1danCOMP-2). KolomPICTUREberikut didukung:- Alfabet (
PIC A), alfanumerik (PIC X), dan alfanumerik yang diedit (A,X,9,B,0,/). PIC G(DBCS; memerlukanUSAGE DISPLAY-1).PIC N(nasional atau DBCS) dan diedit secara nasional (N,B,0,/).PIC U(UTF-8), termasukPIC U BYTE-LENGTH n.- Numerik (
9,S,V) dan numerik yang diedit ($,B,/,V,Z,0,9,,,.,*,+,-,CR,DB). Perhatikan bahwaPIC P(posisi penskalaan) tidak didukung. - Kolom desimal berzona dan desimal yang dipadatkan dengan presisi hingga 18 didekode menjadi jenis 64-bit (
LONGatauDECIMAL64), dan kolom presisi yang lebih tinggi didekode menjadi jenis presisi arbitrer (BIG_INTEGERatauBIG_DECIMAL). Jikaschema_validation_modeditetapkan keBIG_QUERY, presisi maksimum yang didukung adalah 76 (BIGNUMERIC) dan skala maksimumnya adalah 38 (untukPOSTGRES, presisi maksimumnya adalah 147.455 dan skala maksimumnya adalah 16.383; untukMYSQL, presisi maksimumnya adalah 65 dan skala maksimumnya adalah 30).
- Alfabet (
- IBM Hexadecimal Floating-Point (HFP) didukung menggunakan
COMP-1/COMPUTATIONAL-1(presisi tunggal, 4 byte) danCOMP-2/COMPUTATIONAL-2(presisi ganda, 8 byte), atau dengan menerapkan pengubah kolomhfpdalam konfigurasi transcoder. - Klausa
REDEFINESdidukung pada kolom berukuran statis jika semua varian yang didefinisikan ulang memiliki ukuran byte yang sama. Kolom yang didefinisikan ulang tidak dapat direferensikan sebagai kolom panjang klausaOCCURS DEPENDING ONatau sebagaitarget_fieldpengubahnull_if. - Klausa
OCCURSdidukung untuk array panjang tetap (OCCURS n TIMES), array panjang dinamis (OCCURS min TO max TIMES DEPENDING ON field), dan array panjang dinamis yang dipaketkan (OCCURS UNBOUNDED DEPENDING ON field). FrasaASCENDING/DESCENDING KEYdanINDEXED BYdalam klausaOCCURStidak didukung, danDEPENDING ONharus merujuk ke nama kolom dalam cakupan. - Hanya klausa
USAGEberikut yang didukung:DISPLAY(default untuk kolom alfanumerik dan desimal berzona)DISPLAY-1(DBCS)NATIONAL(default untuk kolomPIC N; dienkode sebagaiUTF-16BE)UTF-8(default untuk kolomPIC U)BINARY,COMP,COMPUTATIONAL,COMP-4,COMPUTATIONAL-4,COMP-5,COMPUTATIONAL-5COMP-3,COMPUTATIONAL-3,PACKED-DECIMALCOMP-1,COMPUTATIONAL-1,COMP-2,COMPUTATIONAL-2
DATEdanTIMESTAMPdidukung menggunakan konfigurasi transcoder.- Indikator null didukung menggunakan konfigurasi transcoder.
- Kolom himpunan karakter double-byte (DBCS)
PIC GdanPIC Ndidukung. Secara default, kolomPIC Ntanpa klausaUSAGEakan diberiUSAGE NATIONAL(UTF-16BE). Untuk menggunakan kolomPIC Nsebagai DBCS, tentukanUSAGE DISPLAY-1di copybook atau ganti encoding karakternya dalam konfigurasi transcoder. - String karakter dengan panjang variabel didukung menggunakan konfigurasi transcoder.
- Klausa
SIGN(LEADING,TRAILING,SEPARATE CHARACTER) didukung. - Komentar didukung.
Dukungan untuk kolom tanggal dan stempel waktu
Mainframe Connector mendukung decoding dan encoding kolom tanggal dan stempel waktu menggunakan pengubah kolom format_date dan format_timestamp dalam konfigurasi transcoder (--transcode-configuration). Anda dapat menerapkan pengubah ini di seluruh kolom yang cocok menggunakan field_suffixes atau ke kolom tertentu menggunakan field_overrides:
{
"field_suffixes": [
{
"suffix": "SUFFIX_STRING",
"modifier": {
"format_date": {
"formats": [
{
"size": FIELD_SIZE,
"pattern": "FORMAT_PATTERN"
}
]
}
}
}
]
}
Daftar berikut menjelaskan properti konfigurasi secara lebih mendetail:
suffix: Mencocokkan kolom copybook apa pun yang namanya diakhiri dengan-SUFFIX_STRINGatau_SUFFIX_STRING(tidak peka huruf besar/kecil). Pastikansuffixtidak berisi tanda hubung atau garis bawah di awal. Atau, gunakanfield_overridesdengan"field": "FIELD_NAME"untuk menargetkan masing-masing kolom.format_date/format_timestamp: Menentukan pengubah yang digunakan untuk mengurai atau memformat kolom:format_datedapat diterapkan ke kolom string berukuran (PIC X) atau kolom numerik bilangan bulat (sepertiPIC 9(n),COMP, atauCOMP-3dengan skala0dan presisi hingga 18, yang dikonversi secara dinamis ke representasi string tanpa tanda sebelum pemformatan).format_timestampdapat diterapkan ke kolom string berukuran (PIC X). Stempel waktu ditafsirkan dalam UTC kecuali jika zona waktu atau offset disertakan dalam pola.
formats: Daftar objekDateTimeFormat, yang masing-masing menentukan:size: Ukuran kolom yang menerapkan pola (panjang byte untuk kolom string, atau presisi untuk kolom numerik).pattern: Pola tanggal atau stempel waktu. Selama decoding (qsam decode), format yang cocok dengan ukuran kolom dievaluasi secara berurutan hingga ada yang cocok. Selama encoding (qsam encode), hanya format pencocokan pertama untuk ukuran kolom yang digunakan. Untuk mengetahui informasi selengkapnya tentang format yang valid, lihat Format tanggal dan stempel waktu yang didukung.
- Menghapus akhiran (Opsional): Untuk menghapus
-SUFFIX_STRINGatau_SUFFIX_STRINGdari nama kolom output, tambahkan transformasirenameke arraytransformationsdalam konfigurasi transcoder Anda.
Contoh
Untuk memformat kolom 8 byte yang diakhiri dengan
-DT8atau_DT8sebagaiDATEdengan polayyyyMMdd, dan kolom 10 byte yang diakhiri dengan-DTatau_DTdenganMM-dd-yyyyatauMM/dd/yyyy:{ "field_suffixes": [ { "suffix": "DT8", "modifier": { "format_date": { "formats": [ { "size": 8, "pattern": "yyyyMMdd" } ] } } }, { "suffix": "DT", "modifier": { "format_date": { "formats": [ { "size": 10, "pattern": "MM-dd-yyyy" }, { "size": 10, "pattern": "MM/dd/yyyy" } ] } } } ] }Untuk memformat kolom 26 byte yang diakhiri dengan
-TIMESTAMP,_TIMESTAMP,-TS, atau_TSsebagaiTIMESTAMPdengan polayyyy-MM-dd HH.mm.ss.SSSSSSdan menghapus akhiran dari nama kolom output:{ "field_suffixes": [ { "suffix": "TIMESTAMP", "modifier": { "format_timestamp": { "formats": [ { "size": 26, "pattern": "yyyy-MM-dd HH.mm.ss.SSSSSS" } ] } } }, { "suffix": "TS", "modifier": { "format_timestamp": { "formats": [ { "size": 26, "pattern": "yyyy-MM-dd HH.mm.ss.SSSSSS" } ] } } } ], "transformations": [ { "rename": { "find": "^(.*)[-_](TIMESTAMP|TS)$", "replace": "$1" } } ] }
Dukungan untuk indikator null
Mainframe Connector mendukung indikator null melalui pengubah kolom null_if dalam konfigurasi transcoder (--transcode-configuration).
Untuk mengonfigurasi indikator null berbasis akhiran (dengan kolom seperti COL1-NID
bertindak sebagai indikator null untuk COL1 dalam data yang sama), tentukan entri di
field_suffixes dengan "is_inverse": true dan "target_field": "$self":
{
"field_suffixes": [
{
"suffix": "NULL_INDICATOR_NAME",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "NULL_VALUE",
"non_null_value": "NOT_NULL_VALUE"
}
}
}
]
}
Daftar berikut menjelaskan parameter yang dapat Anda gunakan untuk mengonfigurasi indikator null:
suffix: Sesuai dengan akhiran-NULL_INDICATORNAMEatauNULL_INDICATOR_NAMEyang mengidentifikasi kolom indikator null dalam copybook.is_inverse: Jika ditetapkan ketruepadaFieldSuffix, pengubah diterapkan ke kolom yang setara yang namanya cocok dengan kolom indikator tanpa akhiran (misalnya,COL1jika indikatornya adalahCOL1-NID1), dan"$self"mengacu pada kolom indikator itu sendiri. Anda juga dapat menerapkannull_iflangsung pada kolom tertentu menggunakanfield_overridesdan menetapkantarget_fieldke nama kolom indikator.null_valueataunull_values: Menentukan nilai tunggal (null_value) atau daftar nilai (null_values) ditarget_fieldyang menandakan bahwa kolom yang direferensikan adalahnull.non_null_valueataunon_null_values: (Opsional) Menentukan nilai tunggal (non_null_value) atau daftar nilai (non_null_values) ditarget_fielduntuk memberi sinyal bahwa kolom yang direferensikan bukannull. Jika dihilangkan, nilai apa pun selainnull_valueataunull_valuesakan diperlakukan sebagai bukan null. Setidaknya salah satu darinull_value(s)ataunon_null_value(s)harus ditentukan.- Mengecualikan atau mempertahankan kolom indikator null: Secara default, kolom indikator null dipertahankan sebagai kolom dalam skema output. Untuk menghilangkan
kolom indikator null dari tabel output saat masih menggunakannya selama
transcoding, tambahkan
transformasi
excludeuntuk kolom indikator dalam arraytransformations(jangan terapkan pengubahfillerke kolom indikator null, karenafillerakan melewati dekode kolom sepenuhnya). - Mengganti jenis kolom indikator: (Opsional) Untuk memaksa
kolom indikator null didekode sebagai
bytesataubinary, tambahkan aturanfield_suffixes(ataufield_overrides) non-inverse untuk kolom indikator dengan"modifier": { "bytes": {} }atau"modifier": { "binary": {} }. Untukbytes, nyatakannull_valuedannon_null_valuesebagai string heksadesimal (misalnya,"FF"atau"00").
Contoh
Dalam contoh berikut, COL1-NID1 dan FIELD-NID2 dikecualikan dari
tabel output setelah dievaluasi sebagai indikator null, sedangkan COL2-NULL
dipertahankan dalam skema output.
Cuplikan copybook:
01 REC.
10 COL1-NID1 PIC S9(4) USAGE COMP.
10 COL1 PIC S9(6) USAGE COMP.
10 FIELD PIC X(10).
10 FIELD-NID2 PIC X(1).
10 COL2 PIC X(10).
10 COL2-NULL PIC X(1).
Konfigurasi transcoder (transcode-configuration.json):
{
"field_suffixes": [
{
"suffix": "NID1",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "-1",
"non_null_value": "0"
}
}
},
{
"suffix": "NID2",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "?"
}
}
},
{
"suffix": "NULL",
"is_inverse": true,
"modifier": {
"null_if": {
"target_field": "$self",
"null_value": "?"
}
}
}
],
"transformations": [
{
"exclude": {
"field": "COL1-NID1"
}
},
{
"exclude": {
"field": "FIELD-NID2"
}
}
]
}
Dukungan untuk kolom DBCS
Saat menggunakan kolom DBCS (PIC G atau PIC N dengan USAGE DISPLAY-1), pastikan hal berikut:
- Kolom
PIC Gharus menentukanUSAGE DISPLAY-1secara eksplisit. - Kolom
PIC Ntanpa klausaUSAGEditetapkan secara default keUSAGE NATIONAL(UTF-16BE). Untuk memperlakukan kolomPIC Nsebagai kolom DBCS, tentukanUSAGE DISPLAY-1di copybook (atau ganti encoding-nya dalam konfigurasi transcoder). - Secara default, kolom
USAGE DISPLAY-1didekode dan dienkode menggunakan himpunan karakter DBCScp300(x-IBM300), yang mengharapkan byte DBCS mentah tanpa karakter kontrol shift-out (0x0E) dan shift-in (0x0F). - Untuk menggunakan himpunan karakter DBCS yang berbeda (seperti
Cp834) atau himpunan karakter multi-byte (MBCS) yang menggunakan byte shift-out (0x0E) dan shift-in (0x0F) (sepertix-IBM930,x-IBM933,x-IBM935,x-IBM937,x-IBM939,x-IBM942,x-IBM942C,x-IBM943,x-IBM943C,x-IBM949,x-IBM949C,x-IBM950,x-IBM964,x-IBM970, ataux-IBM1364), konfigurasikan pengubah kolomstringdalam konfigurasi transcoder (--transcode-configuration).
Anda dapat menetapkan encoding DBCS secara global untuk semua kolom USAGE DISPLAY-1 menggunakan
defaults.dbcs,
atau untuk kolom tertentu menggunakan field_overrides atau field_suffixes:
{
"defaults": {
"dbcs": {
"string": {
"encoding": "x-IBM930"
}
}
}
}
Dukungan untuk string karakter dengan panjang variabel
Parser copybook mendukung kolom grup string karakter dengan panjang variabel menggunakan pengubah kolom varlen dalam konfigurasi transcoder:
10 VAR-GRP.
15 VAR-LEN PIC 9(4) USAGE COMP.
15 VAR-TEXT PIC X(50).
Saat menggunakan pengubah kolom varlen, pastikan hal berikut:
Terapkan pengubah
varlenke item grup (misalnya,VAR-GRP) menggunakanfield_overridesataufield_suffixesdalam konfigurasi transcoder:{ "field_overrides": [ { "field": "VAR-GRP", "modifier": { "varlen": {} } } ] }Item grup harus berisi tepat dua subkolom:
- Subkolom pertama harus didekode menjadi bilangan bulat 64-bit (
LONG, seperti kolom bilangan bulat desimal binerCOMPatau zoned) yang menentukan panjang byte data string. - Subkolom kedua harus berupa kolom string yang tidak diubah (seperti
PIC X(n),PIC N(n), atauPIC U(n)).
- Subkolom pertama harus didekode menjadi bilangan bulat 64-bit (
Tidak diperlukan akhiran subkolom tertentu (seperti
-LENatau-TEXT), dan kolom yang dihasilkan dalam skema output menggunakan nama item grup (VAR-GRP).
Kolom dan konstruksi yang tidak didukung
Bagian berikut menjelaskan kolom dan konstruksi yang tidak didukung oleh parser copybook.
Konstruksi COBOL yang tidak didukung
Parser copybook dapat mengurai konstruksi COBOL berikut, meskipun konstruksi ini tidak didukung. Jika Anda menggunakan konstruksi ini dalam copybook, Mainframe Connector akan menampilkan error:
ALIGNEDBLANK WHEN ZEROCOMMON,OWN,LOCALDYNAMIC LENGTH(sepertiPIC X DYNAMIC LENGTHatauPIC U DYNAMIC LENGTH LIMIT n)INTEGER,STRINGJUSTIFIEDASCENDING/DESCENDING KEYdiOCCURSINDEXED BYdiOCCURSRECEIVED BYRECORD AREARENAMESSYNCHRONIZED/SYNCTHREAD-LOCALTYPE IS ...TYPEDEFUSING LANGUAGE/CONVENTION
Jenis data yang tidak didukung
Jenis USAGE berikut dapat diurai oleh tata bahasa, tetapi tidak didukung
oleh compiler copybook:
BITCONTROL-POINTDATEDOUBLEEVENTFUNCTION-POINTERINDEXKANJILOCKPOINTERPROCEDURE-POINTERREALSQLTASK