Topik ini membahas perpindahan data pada Divisi PROCEDURE dengan verb MOVE dan INITIALIZE. Pembahasan mencakup aturan konversi pada perpindahan antaritem elementer, salinan grup dalam bentuk byte, MOVE CORRESPONDING yang selektif, serta pengosongan data terstruktur dengan INITIALIZE. Setiap aturan didemonstrasikan melalui program yang dikompilasi dan dijalankan dengan GnuCOBOL 3.2, sehingga keluaran yang ditampilkan adalah keluaran nyata, bukan ilustrasi.
Perpindahan numerik ke numerik#
MOVE antaritem numerik menyelaraskan kedua nilai pada titik desimal tersirat, mengisi kekurangan digit dengan nol, dan memangkas digit yang berlebih. Huruf V pada picture numerik menandai posisi titik desimal tersirat, sehingga PIC 9(3)V99 menyimpan tiga digit di depan dan dua digit di belakang desimal tanpa menyimpan karakter titiknya. Pemangkasan terjadi di dua sisi. Digit di depan yang tidak muat terpangkas dari kiri, sedangkan digit desimal berlebih terpangkas dari kanan. Seluruh proses terjadi tanpa pesan error apa pun.
Program berikut menunjukkan tiga perpindahan numerik beserta dua perpindahan yang melibatkan alfanumerik.
IDENTIFICATION DIVISION.
PROGRAM-ID. MOVE-KONVERSI.
*--------------------------------------------------------------
* Konversi pada MOVE elementer: numerik ke numerik, numerik ke
* alfanumerik, dan alfanumerik ke numerik.
*--------------------------------------------------------------
DATA DIVISION.
WORKING-STORAGE SECTION.
01 SUMBER-DES PIC 9(3)V99 VALUE 123.45.
01 LEGA PIC 9(3)V99.
01 SEMPIT PIC 9(2)V99.
01 POTONG-DESIMAL PIC 9(2)V99.
01 TAMPIL-DES PIC ZZ9.99.
01 TUJUAN-X PIC X(6).
01 ANGKA-42 PIC 9(4) VALUE 42.
01 TEKS-DIGIT PIC X(2) VALUE "42".
01 TUJUAN-NUM PIC 9(4).
PROCEDURE DIVISION.
NUMERIK-KE-NUMERIK.
MOVE 12.5 TO LEGA
MOVE SUMBER-DES TO SEMPIT
MOVE 12.567 TO POTONG-DESIMAL
MOVE LEGA TO TAMPIL-DES
DISPLAY "12.5 -> PIC 9(3)V99 : " TAMPIL-DES
MOVE SEMPIT TO TAMPIL-DES
DISPLAY "123.45 -> PIC 9(2)V99 : " TAMPIL-DES
MOVE POTONG-DESIMAL TO TAMPIL-DES
DISPLAY "12.567 -> PIC 9(2)V99 : " TAMPIL-DES.
NUMERIK-KE-ALFANUMERIK.
MOVE ANGKA-42 TO TUJUAN-X
DISPLAY "PIC 9(4) isi 42 ke X(6) : [" TUJUAN-X "]".
ALFANUMERIK-KE-NUMERIK.
MOVE TEKS-DIGIT TO TUJUAN-NUM
DISPLAY "X(2) isi '42' ke PIC 9(4) : " TUJUAN-NUM.
AKHIR-PROGRAM.
STOP RUN.12.5 -> PIC 9(3)V99 : 12.50
123.45 -> PIC 9(2)V99 : 23.45
12.567 -> PIC 9(2)V99 : 12.56
PIC 9(4) isi 42 ke X(6) : [0042 ]
X(2) isi '42' ke PIC 9(4) : 0042Buat berkas sumbernya di direktori kerja, lalu kompilasi dengan perintah
berikut. Jalankan ./move-konversi untuk melihat keluarannya.
# kompilasi program konversi MOVE
cobc -x move-konversi.cblTiga baris pertama keluaran memperlihatkan perilaku penyelarasan desimal.
Nilai 12.5 yang masuk ke PIC 9(3)V99 tersimpan sebagai 012.50 karena field
wajib memuat tiga digit di depan desimal, sehingga nol mengisi posisi yang
kosong. Field tampilan TAMPIL-DES bertipe ZZ9.99 menyembunyikan nol
terdepan tersebut, sehingga keluarannya menampilkan 12.50. Nilai 123.45
yang masuk ke PIC 9(2)V99 menjadi 23.45 karena field hanya
menyediakan dua digit di depan desimal, sehingga digit ratusan terpangkas.
Nilai 12.567 pada field yang sama menjadi 12.56 karena digit desimal ketiga
tidak muat. MOVE tidak pernah membulatkan. Klausa ROUNDED yang membulatkan
hasil terpangkas hanya tersedia pada verb aritmetika, sedangkan pemangkasan
pada MOVE membuang digit berlebih tanpa pembulatan.
Perpindahan yang melibatkan alfanumerik#
Perpindahan antara item numerik dan alfanumerik sah sepanjang nilai
numeriknya berupa bilangan bulat, dan arah perpindahan menentukan sisi
penyelarasannya. Apabila sumbernya numerik dan tujuannya alfanumerik, nilai
sumber terlebih dahulu diambil dalam bentuk tampilannya, yaitu digit beserta
nol pengisi milik picture sumber. Penyelarasan kemudian mengikuti aturan
alfanumerik yang rata kiri. Field PIC 9(4) berisi 42 tersimpan sebagai
0042, sehingga perpindahan ke PIC X(6) menghasilkan 0042 lengkap dengan
dua spasi pengisi di belakangnya. Tanda kurung siku pada keluaran program
sengaja digunakan agar spasi pengisi tersebut terlihat.
Arah sebaliknya mengikuti aturan numerik. Apabila sumbernya alfanumerik dan
tujuannya numerik, perpindahan sah hanya bila seluruh isi sumber berupa
digit, dan penyelarasannya rata kanan dengan nol pengisi di kiri. Field
X(2) berisi 42 menjadi 0042 setelah masuk ke PIC 9(4). Kedua arah ini
menjelaskan mengapa keluaran [0042 ] dan 0042 muncul pada dua baris
terakhir program.
Salinan grup dan MOVE CORRESPONDING#
MOVE antaritem grup menyalin seluruh byte sumber ke tujuan tanpa konversi apa pun, sedangkan MOVE CORRESPONDING hanya menyalin pasangan field elementer yang bernama sama di kedua grup. Pada salinan byte, picture setiap anak grup sama sekali diabaikan sehingga hasilnya murni mengikuti tata letak memori sumber. Pada MOVE CORRESPONDING, pencocokan dilakukan terhadap nama field elementer, sehingga field yang tidak memiliki pasangan dibiarkan tak tersentuh. Kedua bentuk ini menghasilkan isi akhir yang berbeda pada grup yang susunannya tidak identik.
Program berikut membandingkan keduanya, kemudian mengosongkan dan mengisi ulang sebuah catatan kerja dengan INITIALIZE.
IDENTIFICATION DIVISION.
PROGRAM-ID. MOVE-GRUP.
*--------------------------------------------------------------
* MOVE grup sebagai salinan byte, MOVE CORRESPONDING yang
* selektif, dan INITIALIZE dengan klausanya.
*--------------------------------------------------------------
DATA DIVISION.
WORKING-STORAGE SECTION.
01 REKAM-SUMBER.
05 KODE PIC X(3) VALUE "K01".
05 JUMLAH PIC 9(2) VALUE 12.
05 CATATAN PIC X(4) VALUE "ASLI".
01 REKAM-TUJUAN.
05 KODE PIC X(3).
05 JUMLAH PIC 9(2).
05 SISIPAN PIC X(4) VALUE "XXXX".
01 CATATAN-KERJA.
05 JUDUL PIC X(12) VALUE "CATATAN UJI".
05 TOTAL PIC 9(4)V99 VALUE 250.5.
05 STATUS-A PIC X(5) VALUE "AKTIF".
01 TAMPIL-TOTAL PIC Z(4)9.99.
PROCEDURE DIVISION.
SALIN-SELEKTIF.
MOVE CORRESPONDING REKAM-SUMBER TO REKAM-TUJUAN
DISPLAY "MOVE CORRESPONDING : [" REKAM-TUJUAN "]".
SALIN-PENUH.
MOVE REKAM-SUMBER TO REKAM-TUJUAN
DISPLAY "MOVE grup : [" REKAM-TUJUAN "]".
KOSONGKAN-CATATAN.
INITIALIZE CATATAN-KERJA
MOVE TOTAL TO TAMPIL-TOTAL
DISPLAY "INITIALIZE : [" JUDUL "] "
TAMPIL-TOTAL " [" STATUS-A "]".
ISI-ULANG-CATATAN.
INITIALIZE CATATAN-KERJA
REPLACING NUMERIC BY 9
ALPHANUMERIC BY "X"
MOVE TOTAL TO TAMPIL-TOTAL
DISPLAY "INITIALIZE REPLACE : [" JUDUL "] "
TAMPIL-TOTAL " [" STATUS-A "]".
AKHIR-PROGRAM.
STOP RUN.MOVE CORRESPONDING : [K0112XXXX]
MOVE grup : [K0112ASLI]
INITIALIZE : [ ] 0.00 [ ]
INITIALIZE REPLACE : [X ] 9.00 [X ]Baris pertama keluaran memperlihatkan hasil MOVE CORRESPONDING. Hanya
KODE dan JUMLAH yang tersalin, sedangkan SISIPAN tetap berisi XXXX
karena namanya tidak memiliki pasangan di grup sumber. Baris kedua
memperlihatkan salinan byte penuh. Sembilan byte milik REKAM-SUMBER disalin
menimpa seluruh isi REKAM-TUJUAN, termasuk SISIPAN yang kini berisi ASLI.
Mengosongkan data dengan INITIALIZE#
INITIALIZE mengosongkan field elementer di dalam sebuah item grup, yaitu
field numerik diisi nol dan field alfanumerik diisi spasi. Verb ini menyusuri
seluruh anak grup hingga level elementer, sehingga satu pernyataan singkat
menggantikan rangkaian MOVE ke setiap field. Dua baris terakhir keluaran
memperlihatkan efeknya. Setelah INITIALIZE CATATAN-KERJA, field JUDUL
berisi dua belas spasi, field TOTAL bernilai nol, dan field STATUS-A
berisi lima spasi.
Klausa opsional REPLACING mengganti nilai pengisinya tanpa mengubah struktur
program. Pernyataan INITIALIZE ... REPLACING NUMERIC BY 9 ALPHANUMERIC BY "X"
mengisi setiap field numerik dengan 9 dan setiap field alfanumerik dengan
huruf X pada posisi paling kiri. Field TOTAL menampilkan 9.00, sedangkan
field teks yang panjangnya dua belas karakter hanya menerima satu huruf X di
depan karena penyelarasan alfanumerik tetap rata kiri. Gunakan INITIALIZE
pada awal pemrosesan untuk menyiapkan area kerja, dan gunakan REPLACING
apabila nilai pengisi tertentu lebih bermakna daripada nol dan spasi.
Kesalahan umum#
- Mengharapkan MOVE membulatkan hasil. Nilai 12.567 yang dipindahkan ke PIC 9(2)V99 menjadi 12.56 karena digit terakhir dipangkas. Apabila pembulatan diperlukan, pindahkan nilai tersebut melalui verb aritmetika dengan klausa ROUNDED.
- Menyalin field alfanumerik yang berisi spasi atau huruf ke field numerik. Hasilnya tidak terdefinisi, dan program dapat membaca angka yang salah tanpa pesan error. Pastikan isinya digit sebelum perpindahan dilakukan.
- Mengira MOVE CORRESPONDING menyalin seluruh grup. Field tanpa pasangan nama dibiarkan berisi nilai lama. Gunakan MOVE grup biasa apabila salinan byte penuh yang diinginkan.
Ringkasan#
- MOVE numerik ke numerik menyelaraskan titik desimal, mengisi nol pada digit yang kurang, dan memangkas digit berlebih tanpa pembulatan maupun pesan error.
- Perpindahan numerik ke alfanumerik rata kiri dengan spasi pengisi, sedangkan alfanumerik ke numerik rata kanan dengan nol pengisi dan hanya sah bila isinya digit.
- MOVE grup menyalin byte tanpa konversi, sedangkan MOVE CORRESPONDING menyalin pasangan field yang bernama sama saja.
- INITIALIZE mengosongkan numerik menjadi nol dan alfanumerik menjadi spasi, dan klausa REPLACING mengganti nilai pengisinya.
Referensi#
- GnuCOBOL — Free Software Foundation — Situs proyek GnuCOBOL 3.2 yang digunakan untuk mengompilasi dan menjalankan seluruh contoh pada topik ini.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi yang memuat aturan perpindahan data untuk MOVE, CORRESPONDING, dan INITIALIZE.