Nomor Level dan Grup

Hierarki record 01, item anak, item elementer, serta overlay memori dengan REDEFINES.

Daftar isi

Field sederhana yang menggunakan PIC X atau PIC 9 berdiri sendiri, sementara data bisnis nyata umumnya terkumpul dalam satu kesatuan yang disebut record. Topik ini membahas cara menyusun record dengan nomor level, perbedaan item elementer dan item grup, perilaku MOVE terhadap grup, serta REDEFINES yang membaca memori yang sama dengan picture yang berbeda.

Hierarki nomor level#

Nomor level menetapkan kedudukan sebuah item di dalam hierarki record. Nomor 01 menandai record itu sendiri, nomor di bawahnya seperti 05 dan 10 menandai item anak, dan hierarki yang sah mencakup nomor 01 sampai 49. Item yang diberi klausa PIC disebut elementary item atau item elementer karena menyimpan nilai sendiri, sedangkan item tanpa PIC disebut grup karena hanya membungkus item di bawahnya. Level 77 untuk item mandiri dan level 88 untuk nama kondisi merupakan nomor khusus yang berada di luar hierarki record ini.

cobol Contoh: hierarki record nilai ujian
      * tidak-dijalankan
       01 REKAMAN-NILAI.
          05 NOMOR-UJIAN    PIC 9(4).
          05 NILAI-AKHIR    PIC 9(3).
          05 PREDIKAT       PIC X(2).

Ukuran grup merupakan jumlah ukuran seluruh item elementer di bawahnya. Pada contoh di atas, REKAMAN-NILAI berukuran 9 byte yang berasal dari 4 byte NOMOR-UJIAN, 3 byte NILAI-AKHIR, dan 2 byte PREDIKAT. Indentasi pada kode sumber hanyalah kenyamanan membaca, sedangkan kedalaman hierarki ditentukan sepenuhnya oleh nomor levelnya, sehingga item anak langsung dari 01 sah ditulis dengan nomor 05, 10, maupun 15 tanpa mengubah makna struktur.

Item yang tidak perlu diakses prosedur dapat ditulis tanpa nama dengan kata FILLER. Item FILLER tetap menempati byte di dalam record, sehingga posisi item sesudahnya tidak bergeser, tetapi nilainya tidak dapat dirujuk karena tidak memiliki nama. Lebih dari satu record 01 juga sah berdampingan di WORKING-STORAGE, dan setiap record tersebut berdiri pada area memori tersendiri.

01 REKAMAN-NILAI (grup, 9 byte)05 NOMOR-UJIANPIC 9(4), 4 byte05 NILAI-AKHIRPIC 9(3), 3 byte05 PREDIKATPIC X(2), 2 byteItem tanpa PIC menjadi grup, item dengan PIC menjadi item elementer
Hierarki record REKAMAN-NILAI beserta ukuran setiap itemnya

MOVE grup menyalin byte tanpa konversi#

MOVE terhadap nama grup menyalin seluruh byte grup tersebut tanpa memandang picture item di dalamnya. Program berikut menyalin satu record ke record lain yang strukturnya sama, kemudian menyalin record yang sama ke sebuah field PIC X(9).

cobol level-grup.cbl
       IDENTIFICATION DIVISION.
       PROGRAM-ID. LEVEL-GRUP.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 REKAMAN-NILAI.
          05 NOMOR-UJIAN    PIC 9(4).
          05 NILAI-AKHIR    PIC 9(3).
          05 PREDIKAT       PIC X(2).
       01 SALINAN-NILAI.
          05 NOMOR-SALIN    PIC 9(4).
          05 NILAI-SALIN    PIC 9(3).
          05 PREDIKAT-SALIN PIC X(2).
       01 TEKS-GABUNGAN  PIC X(9).
       PROCEDURE DIVISION.
           MOVE 1234 TO NOMOR-UJIAN
           MOVE 87 TO NILAI-AKHIR
           MOVE "AB" TO PREDIKAT
           MOVE REKAMAN-NILAI TO SALINAN-NILAI
           DISPLAY "Nomor : " NOMOR-SALIN
           DISPLAY "Nilai : " NILAI-SALIN " " PREDIKAT-SALIN
           MOVE REKAMAN-NILAI TO TEKS-GABUNGAN
           DISPLAY "Teks  : [" TEKS-GABUNGAN "]"
           STOP RUN.
text Keluaran
Nomor : 1234
Nilai : 087 AB
Teks  : [1234087AB]

Baris ketiga keluaran memperlihatkan perilaku itu secara langsung. Field TEKS-GABUNGAN menampilkan 1234087AB, yaitu isi byte record apa adanya, karena digit pada USAGE DISPLAY tersimpan satu digit per byte sebagai karakter. Tidak ada konversi nilai yang terjadi pada MOVE grup, sehingga field numeric yang tersalin ke field X langsung terbaca sebagai teks. Salinan antarrecord dengan struktur yang sama menghasilkan isi yang identik pada setiap item, sebagaimana ditunjukkan dua baris pertama keluaran.

Reproduksi keluaran di atas dengan perintah berikut, lalu jalankan ./level-grup.

bash
# kompilasi program menjadi eksekutabel
cobc -x level-grup.cbl

REDEFINES sebagai overlay memori#

Klausa REDEFINES memasang nama dan picture baru di atas memori yang sudah didefinisikan oleh item lain, teknik yang disebut overlay. Item yang didefinisikan ulang tidak mendapat memori tambahan, sehingga kedua nama membaca byte yang sama persis. Aturannya, REDEFINES harus ditulis tepat setelah item yang didefinisikan ulang, berada pada level yang sama, dan berukuran tidak lebih besar menurut standar. Program berikut menggunakan REDEFINES pada kedua arah, yaitu field numerik yang dibaca sebagai teks dan field teks yang dihitung sebagai angka.

cobol redefines-uji.cbl
       IDENTIFICATION DIVISION.
       PROGRAM-ID. REDEFINES-UJI.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 REKAMAN-PELANGGAN.
          05 NOMOR-PELANGGAN  PIC 9(6).
          05 NOMOR-TEKS REDEFINES NOMOR-PELANGGAN PIC X(6).
          05 KODE-POS         PIC X(5).
          05 KODE-POS-ANGKA REDEFINES KODE-POS PIC 9(5).
       PROCEDURE DIVISION.
           MOVE 203145 TO NOMOR-PELANGGAN
           MOVE "45123" TO KODE-POS
           DISPLAY "Nomor pelanggan : " NOMOR-TEKS
           DISPLAY "Kode pos awal   : " KODE-POS-ANGKA
           COMPUTE KODE-POS-ANGKA = KODE-POS-ANGKA + 1
           DISPLAY "Kode pos + 1    : " KODE-POS
           STOP RUN.
text Keluaran
Nomor pelanggan : 203145
Kode pos awal   : 45123
Kode pos + 1    : 45124

NOMOR-TEKS membaca byte NOMOR-PELANGGAN sebagai teks, sehingga enam digit yang tersimpan tampil apa adanya. Arah sebaliknya lebih berguna, yaitu KODE-POS-ANGKA yang menghitung isi KODE-POS sebagai bilangan. Setelah COMPUTE menambah 1, baris ketiga keluaran menampilkan 45124 ketika KODE-POS ditampilkan, karena field tersebut memang membaca byte yang sama dengan KODE-POS-ANGKA. Pola ini lazim digunakan untuk memecah field gabungan, misalnya field tanggal 8 digit yang diuraikan menjadi tahun, bulan, dan hari.

Reproduksi keluaran di atas dengan perintah berikut, lalu jalankan ./redefines-uji.

bash
# kompilasi program menjadi eksekutabel
cobc -x redefines-uji.cbl

GnuCOBOL juga menerima REDEFINES pada level 01 di WORKING-STORAGE, sesuatu yang tidak mungkin berada di dalam hierarki record karena level 01 selalu menandai awal record dan tidak memiliki saudara. Program berikut menggunakan bentuk level 01 tersebut untuk menghitung isi field teks.

cobol redef-01.cbl
       IDENTIFICATION DIVISION.
       PROGRAM-ID. REDEF-01.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 DATA-TEKS   PIC X(4) VALUE "2026".
       01 DATA-ANGKA  REDEFINES DATA-TEKS PIC 9(4).
       PROCEDURE DIVISION.
           COMPUTE DATA-ANGKA = DATA-ANGKA + 1
           DISPLAY "Teks yang sama : " DATA-TEKS
           STOP RUN.
text Keluaran
Teks yang sama : 2027

Reproduksi keluaran di atas dengan perintah berikut, lalu jalankan ./redef-01.

bash
# kompilasi program menjadi eksekutabel
cobc -x redef-01.cbl

Kesalahan umum#

  • Mendefinisikan ulang dengan ukuran yang lebih besar. Definisi seperti 05 KODE-BESAR REDEFINES KODE-POS PIC X(7) di atas field PIC X(5) ditolak GnuCOBOL dengan pesan error: larger REDEFINES used. Samakan ukuran keduanya atau kecilkan item pendefinisian ulang.
  • Menduga MOVE grup melakukan konversi antarpicture. MOVE grup menyalin byte apa adanya, sehingga penyalinan ke grup dengan struktur berbeda membuat nilai muncul pada item yang keliru. Gunakan MOVE per item elementer ketika struktur tujuan berbeda.
  • Membaca field teks sebagai angka padahal isinya bukan digit. REDEFINES tidak memeriksa isi, sehingga KODE-POS-ANGKA yang dibaca dari teks 4A123 menghasilkan nilai tak sah saat dihitung. Pastikan isi field teks benar-benar berupa digit sebelum dihitung.

Ringkasan#

  • Nomor level 01 sampai 49 menyusun hierarki record, item dengan PIC menjadi item elementer, dan item tanpa PIC menjadi grup yang berukuran jumlah byte anak-anaknya.
  • MOVE terhadap grup menyalin byte tanpa konversi, sehingga isi record dapat dibaca sebagai teks melalui field X.
  • REDEFINES memasang picture alternatif pada memori yang sama, wajib berlevel sama dan tidak lebih besar, serta pada GnuCOBOL juga sah di level 01 dalam WORKING-STORAGE.

Referensi#