Divisi DATA menampung definisi setiap ruang data yang digunakan program, dan klausa PIC merupakan alat utamanya. Topik ini membahas tiga simbol picture yang paling mendasar, yaitu X untuk alphanumeric, A untuk alphabetic, dan 9 untuk numeric, lengkap dengan aturan penulisan pengulangannya. Setelah membacanya, ukuran setiap field dapat ditentukan secara eksak dan konsekuensi nilai yang melebihi ukuran field dapat diantisipasi.
Tiga simbol dasar X, A, dan 9#
Klausa PIC menetapkan bentuk dan ukuran sebuah field, yaitu ruang data berukuran tetap, melalui rangkaian simbol yang disebut picture. Setiap simbol mewakili tepat satu posisi karakter, sehingga ukuran field ditentukan oleh jumlah simbolnya dan tidak bergantung pada nilai yang disimpan. Simbol X menerima huruf, angka, dan spasi. Simbol A hanya menerima huruf dan spasi. Simbol 9 hanya menerima digit 0 sampai 9.
| Simbol | Kategori | Isi yang sah |
|---|---|---|
X | alphanumeric | huruf, angka, dan spasi |
A | alphabetic | huruf dan spasi |
9 | numeric | digit 0 sampai 9 |
Program berikut mengisi satu field untuk setiap kategori, lalu menampilkannya di dalam tanda kurung siku agar batas field terlihat jelas.
IDENTIFICATION DIVISION.
PROGRAM-ID. PIC-DASAR.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 NAMA-PELANGGAN PIC X(12).
01 KOTA-ASAL PIC A(8).
01 JUMLAH-UNIT PIC 9(5).
01 KODE-WILAYAH PIC 99.
PROCEDURE DIVISION.
MOVE "BUDI" TO NAMA-PELANGGAN
MOVE "BANDUNG" TO KOTA-ASAL
MOVE 42 TO JUMLAH-UNIT
MOVE 7 TO KODE-WILAYAH
DISPLAY "[" NAMA-PELANGGAN "]"
DISPLAY "[" KOTA-ASAL "]"
DISPLAY "[" JUMLAH-UNIT "]"
DISPLAY "[" KODE-WILAYAH "]"
STOP RUN.[BUDI ]
[BANDUNG ]
[00042]
[07]Keluaran di atas memperlihatkan dua perilaku penting. Field NAMA-PELANGGAN berukuran 12 posisi, sehingga nilai BUDI yang hanya empat karakter diikuti delapan spasi pengisi hingga batas field. Field numeric justru diisi nol di kiri, sehingga 42 dalam PIC 9(5) tampil sebagai 00042 dan 7 dalam PIC 99 tampil sebagai 07.
Pada contoh di atas, berkas pic-dasar.cbl menuliskan PROGRAM-ID sebagai PIC-DASAR. Konvensi yang digunakan sepanjang jalur ini menuliskan PROGRAM-ID dengan huruf kapital dan menjadikan nilainya sama dengan nama berkas tanpa ekstensi. Kebiasaan tersebut membuat hubungan antara berkas sumber, eksekutabel hasil kompilasi, dan nama program pada perintah CALL tetap mudah dilacak.
Reproduksi keluaran di atas dengan perintah berikut, lalu jalankan ./pic-dasar.
# kompilasi program menjadi eksekutabel
cobc -x pic-dasar.cblPengulangan simbol dan ukuran yang eksak#
Simbol yang sama boleh ditulis beruntun maupun difaktorkan dengan angka pengulangan di dalam tanda kurung. PIC 9(5) identik dengan PIC 99999, dan PIC X(12) identik dengan dua belas simbol X yang ditulis beruntun. Bentuk faktorisasi dipilih untuk ukuran besar agar picture tetap mudah dibaca, sedangkan bentuk beruntun lazim untuk ukuran kecil seperti PIC 99.
Ukuran field dihitung dari seluruh simbol picture, bukan dari nilai yang disimpan. Field PIC 9(3) menampung nilai 0 sampai 999 dan tidak pernah lebih, sedangkan field PIC X(4) menampung tepat empat karakter apa pun isinya. Perhitungan ini wajib dilakukan sebelum field ditulis karena compiler tidak menyesuaikan ukuran field dengan data yang akan disimpan. Rancangan record yang baik menghitung nilai maksimum setiap field terlebih dahulu, misalnya PIC 9(5) untuk jumlah unit yang tidak mungkin melebihi 99999.
Nilai yang melebihi ukuran field#
Perilaku COBOL ketika nilai lebih besar daripada ukuran field berbeda menurut kategori field yang menerimanya. Pemindahan dengan MOVE terjadi saat program berjalan dan mengikuti aturan perataan. Program berikut memindahkan nilai yang lebih panjang daripada field tujuannya.
IDENTIFICATION DIVISION.
PROGRAM-ID. PIC-PEMOTONGAN.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 TOTAL-KECIL PIC 9(3).
01 KODE PIC X(4).
01 RASIO PIC 9V99.
PROCEDURE DIVISION.
MOVE 12345 TO TOTAL-KECIL
MOVE "SISTEMKEUANGAN" TO KODE
MOVE 1.999 TO RASIO
DISPLAY "[" TOTAL-KECIL "]"
DISPLAY "[" KODE "]"
DISPLAY "[" RASIO "]"
STOP RUN.[345]
[SIST]
[1.99]Tiga baris keluaran memperlihatkan tiga bentuk pemotongan yang berbeda. Pemindahan numerik membuang digit kiri, sehingga 12345 dalam PIC 9(3) menyisakan 345 dan nilainya berubah sepenuhnya. Pemindahan alphanumeric membuang kelebihan di kanan, sehingga SISTEMKEUANGAN menjadi SIST. Digit desimal yang berlebih dipotong tanpa pembulatan, sehingga 1.999 dalam PIC 9V99 menjadi 1.99.
Reproduksi keluaran di atas dengan perintah berikut, lalu jalankan ./pic-pemotongan.
# kompilasi program menjadi eksekutabel
cobc -x pic-pemotongan.cblPerilaku lain muncul ketika nilai terlalu panjang ditulis langsung pada klausa VALUE. Program berikut memuat dua definisi semacam itu.
IDENTIFICATION DIVISION.
PROGRAM-ID. PIC-AWAL.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 KODE-PROYEK PIC X(5) VALUE "ANGGARA".
01 PEMADAM PIC 9(3) VALUE 12345.
PROCEDURE DIVISION.
DISPLAY "[" KODE-PROYEK "]"
DISPLAY "[" PEMADAM "]"
STOP RUN.[ANGGA]
[345]Kompilasi pic-awal.cbl dengan cobc -x pic-awal.cbl tetap berhasil, tetapi GnuCOBOL 3.2 menyertakan peringatan pada setiap definisi yang bermasalah, misalnya pic-awal.cbl:5: warning: value size exceeds data size [-Wothers]. Setelah program dijalankan dengan ./pic-awal, terlihat bahwa literalnya dipotong mengikuti aturan perataan masing-masing kategori. Field PIC X(5) menyimpan lima karakter pertama dari ANGGARA, sedangkan field PIC 9(3) menyimpan tiga digit terakhir dari 12345. Peringatan compiler seperti ini sebaiknya diperlakukan sebagai error yang harus dihilangkan, bukan sekadar tanda bahwa kompilasi tetap berjalan.
Kesalahan umum#
- Mengira ukuran field menyesuaikan nilai yang disimpan. Ukuran field ditetapkan picture saat kompilasi dan tidak pernah berubah, sehingga field
PIC 9(3)yang diisi 12345 tetap berukuran tiga digit dan menyimpan 345. Hitung nilai maksimum terlebih dahulu, lalu pilih picture yang menampungnya. - Menggunakan
PIC Auntuk data yang berisi digit. Definisi sepertiPIC A(4) VALUE "A12B"memicu peringatanvalue does not fit the picture stringkarena digit bukan isi yang sah untuk kategori alphabetic. GunakanPIC Xsetiap kali isi field dapat memuat angka. - Membaca hasil MOVE numerik yang terpotong seolah nilainya utuh. Pemotongan numerik membuang digit kiri, sehingga 12345 menjadi 345 dan bukan 123. Periksa ukuran field tujuan pada setiap MOVE ke field dengan picture yang berbeda.
Ringkasan#
- Simbol
X,A, dan9menentukan kategori field, dan jumlah simbol menentukan ukurannya secara eksak dalam posisi karakter. - Pengulangan dapat ditulis beruntun seperti
999atau difaktorkan seperti9(3), keduanya menghasilkan ukuran yang sama. - MOVE memotong nilai yang melebihi ukuran tujuan tanpa peringatan, yaitu membuang digit kiri untuk numerik dan bagian kanan untuk alphanumeric.
- VALUE yang lebih panjang daripada field memicu peringatan compiler pada GnuCOBOL dan dipotong saat inisialisasi.
Referensi#
- GnuCOBOL Manual — Free Software Foundation — Dokumen manual GnuCOBOL yang memuat aturan klausa PICTURE, kategori data, dan perilaku MOVE.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi yang memuat halaman klausa PICTURE beserta aturan simbol X, A, dan 9.