MOVE dan INITIALIZE

Perpindahan data elementer dan grup beserta aturan konversi antartipe yang menyertainya.

Daftar isi

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.

cobol move-konversi.cbl
       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.
text Keluaran
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) : 0042

Buat berkas sumbernya di direktori kerja, lalu kompilasi dengan perintah berikut. Jalankan ./move-konversi untuk melihat keluarannya.

bash
# kompilasi program konversi MOVE
cobc -x move-konversi.cbl

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

cobol move-grup-initialize.cbl
       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.
text Keluaran
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#