Organisasi berkas menentukan bagaimana record disusun di dalam berkas fisik, sedangkan mode akses menentukan urutan record dibaca atau ditulis. Topik ini membahas tiga organisasi inti COBOL beserta varian LINE SEQUENTIAL pada GnuCOBOL, tiga mode akses yang menyertainya, serta klausa SELECT dan ASSIGN TO yang menghubungkan nama logis di dalam program dengan nama berkas fisik di direktori kerja. Setelah membacanya, kombinasi organisasi dan mode akses dapat dipilih sesuai pola akses data yang dibutuhkan, dan deklarasinya dapat dituliskan dengan benar pada ENVIRONMENT DIVISION.
Empat organisasi berkas#
Organisasi berkas adalah aturan penyusunan record pada media penyimpanan. Organisasi SEQUENTIAL menyusun record berdempetan menurut urutan penulisannya, dengan panjang record yang mengikuti definisi FD dan tanpa pemisah apa pun di antara record. Organisasi LINE SEQUENTIAL menyusun setiap record sebagai satu baris teks yang diakhiri karakter baris baru, sehingga berkasnya dapat diperiksa dengan perintah cat atau editor teks biasa. Organisasi RELATIVE membagi berkas menjadi slot bernomor dengan panjang yang sama, dan nomor slot tersebut dinyatakan melalui klausa RELATIVE KEY. Organisasi INDEXED menyimpan record yang aksesnya diarahkan oleh kunci logis yang dideklarasikan melalui klausa RECORD KEY. Pemilihan organisasi bukan perkara selera karena masing-masing menghasilkan format fisik yang berbeda, sebagaimana dibuktikan pada bagian akhir topik ini.
Seluruh organisasi dideklarasikan pada ENVIRONMENT DIVISION melalui klausa SELECT. Bentuknya menggabungkan ASSIGN, ORGANIZATION, ACCESS, kunci bila relevan, dan FILE STATUS dalam satu deklarasi.
SELECT berkas-anggota ASSIGN TO "anggota.dat"
ORGANIZATION IS INDEXED
ACCESS IS DYNAMIC
RECORD KEY IS fk-kode
FILE STATUS IS fs-anggota.Klausa ASSIGN TO menunjuk nama fisik berkas pada direktori kerja, sedangkan nama logis berkas-anggota dipakai oleh setiap verb berkas di divisi PROCEDURE. Nama keduanya tidak perlu sama karena perannya berbeda, yaitu nama logis untuk kode program dan nama fisik untuk sistem berkas. Klausa FILE STATUS menampung kode dua digit hasil setiap operasi berkas, dan kode 00 menandakan pembukaan, penulisan, atau penutupan yang berhasil tanpa hambatan. Klausa ORGANIZATION yang tidak dituliskan membuat berkas dianggap berorganisasi SEQUENTIAL, sehingga kebiasaan menuliskannya secara eksplisit mencegah salah tafsir saat kode dibaca kembali.
Mode akses dan verb yang tersedia#
Mode akses menyatakan urutan record yang dilalui program. Mode SEQUENTIAL menelusuri record satu per satu mulai dari awal berkas, sehingga cocok untuk pemrosesan laporan dan pencocokan berkas. Mode RANDOM melompat langsung ke record yang ditunjuk kunci atau nomor slot, sehingga satu record dicapai tanpa membaca record lain. Mode DYNAMIC menggabungkan keduanya pada satu pembukaan berkas, sehingga telusuran berurutan dan lompatan kunci dapat berseling sesuai kebutuhan. Verb yang sah untuk suatu berkas ditentukan oleh gabungan organisasi dan mode aksesnya, sebagaimana dirangkum tabel berikut.
| Organisasi | Mode akses yang didukung | Verb yang tersedia |
|---|---|---|
SEQUENTIAL | SEQUENTIAL | OPEN, READ dengan AT END, WRITE, REWRITE, CLOSE |
LINE SEQUENTIAL | SEQUENTIAL | OPEN, READ dengan AT END, WRITE, REWRITE, CLOSE |
RELATIVE | SEQUENTIAL, RANDOM, DYNAMIC | OPEN, READ, WRITE, REWRITE, DELETE, START, CLOSE |
INDEXED | SEQUENTIAL, RANDOM, DYNAMIC | OPEN, READ, READ NEXT, WRITE, REWRITE, DELETE, START, CLOSE |
Dua batasan pada tabel tersebut paling sering menimbulkan kejutan. DELETE dan START tidak dimiliki oleh organisasi sekuensial, karena record pada organisasi tersebut tidak memiliki kunci yang dapat dicari maupun dihapus menurut identitas. Pembacaan berurutan berbentuk READ NEXT hanya tersedia pada mode SEQUENTIAL dan DYNAMIC, sedangkan pembacaan acak menurut kunci hanya tersedia pada mode RANDOM dan DYNAMIC. Pemilihan kombinasi mengikuti pola akses data, dan pemetaannya dirangkum sebagai berikut.
| Pola akses data | Pilihan yang tepat |
|---|---|
| Pemrosesan batch berurutan dari awal sampai akhir berkas | SEQUENTIAL dengan mode SEQUENTIAL |
| Pertukaran data teks dengan alat lain atau data yang perlu dibaca manusia | LINE SEQUENTIAL |
| Akses langsung menurut nomor posisi record | RELATIVE dengan mode RANDOM |
| Akses langsung menurut kunci logis diselingi telusuran berurutan | INDEXED dengan mode DYNAMIC |
Program pembuktian empat organisasi#
Program berikut mendeklarasikan empat berkas dengan empat organisasi berbeda di dalam satu ENVIRONMENT DIVISION, menulis satu record ke masing-masing berkas, lalu menampilkan status berkas dari setiap operasi tulis.
IDENTIFICATION DIVISION.
PROGRAM-ID. SELECT-ORG.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT berkas-sekuensial ASSIGN TO "sekuensial.dat"
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS fs-sek.
SELECT berkas-baris ASSIGN TO "baris.txt"
ORGANIZATION IS LINE SEQUENTIAL
FILE STATUS IS fs-ls.
SELECT berkas-relatif ASSIGN TO "relatif.dat"
ORGANIZATION IS RELATIVE
ACCESS IS RANDOM
RELATIVE KEY IS rk-nomor
FILE STATUS IS fs-rel.
SELECT berkas-indeks ASSIGN TO "indeks.dat"
ORGANIZATION IS INDEXED
ACCESS IS RANDOM
RECORD KEY IS fk-kode
FILE STATUS IS fs-idx.
DATA DIVISION.
FILE SECTION.
FD berkas-sekuensial.
01 r-sek PIC X(16).
FD berkas-baris.
01 r-ls PIC X(16).
FD berkas-relatif.
01 r-rel PIC X(16).
FD berkas-indeks.
01 r-idx.
02 fk-kode PIC X(4).
02 fi-isi PIC X(12).
WORKING-STORAGE SECTION.
01 rk-nomor PIC 9(4).
01 fs-sek PIC XX.
01 fs-ls PIC XX.
01 fs-rel PIC XX.
01 fs-idx PIC XX.
PROCEDURE DIVISION.
MULAI.
OPEN OUTPUT berkas-sekuensial berkas-baris
berkas-relatif berkas-indeks
MOVE "DATA A" TO r-sek
WRITE r-sek
DISPLAY "Sekuensial status " fs-sek
MOVE "DATA B" TO r-ls
WRITE r-ls
DISPLAY "Line sekuensial status " fs-ls
MOVE 1 TO rk-nomor
MOVE "DATA C" TO r-rel
WRITE r-rel
DISPLAY "Relatif status " fs-rel
MOVE "K001" TO fk-kode
MOVE "DATA D" TO fi-isi
WRITE r-idx
DISPLAY "Terindeks status " fs-idx
CLOSE berkas-sekuensial berkas-baris
berkas-relatif berkas-indeks
STOP RUN.Sekuensial status 00
Line sekuensial status 00
Relatif status 00
Terindeks status 00Kompilasi program dengan perintah berikut, kemudian jalankan ./select-organisasi.
# kompilasi program deklarasi empat organisasi
cobc -x select-organisasi.cblEmpat baris keluaran bernilai 00 menunjukkan bahwa seluruh deklarasi diterima dan setiap operasi tulis berhasil. Perbedaan organisasi baru terlihat pada berkas fisik yang dihasilkan di direktori kerja. Berkas sekuensial.dat berukuran 16 byte berisi teks DATA A beserta spasi pengisinya tanpa pemisah apa pun, sedangkan baris.txt berisi DATA B sebagai satu baris teks yang diakhiri baris baru. Berkas relatif.dat menyimpan penanda slot sebelum isinya karena runtime perlu melacak kekosongan slot, sedangkan indeks.dat memakai format internal milik runtime yang dilengkapi struktur untuk pencarian kunci. Satu record yang sama berubah wujud menjadi empat format fisik yang berbeda hanya karena deklarasinya berbeda.
Kesalahan umum#
RELATIVE KEYdideklarasikan sebagai bagian dari record FD. Item kunci relatif wajib berada di luar record, misalnya pada WORKING-STORAGE, karena item itu milik program dan bukan milik isi berkas. Pindahkan deklarasinya ke WORKING-STORAGE sepertirk-nomorpada program contoh.- READ NEXT ditulis untuk berkas dengan mode
RANDOM. Penelusuran berurutan hanya sah pada modeSEQUENTIALdanDYNAMIC, sehingga cobc menolak gabungan tersebut saat kompilasi. Gunakan modeDYNAMICapabila program perlu membaca acak dan menelusuri berurutan pada berkas yang sama. - REWRITE dijalankan pada berkas yang dibuka dengan mode
OUTPUT. Verb ini memerlukan modeI-Odan record yang sudah berhasil dibaca terlebih dahulu, dan pelanggarannya terlihat padaFILE STATUSbernilai 43. Buka berkas denganOPEN I-O, baca recordnya, ubah field yang dituju, kemudian jalankan REWRITE.
Ringkasan#
- Tiga organisasi inti COBOL adalah
SEQUENTIAL,RELATIVE, danINDEXED, sedangkanLINE SEQUENTIALadalah organisasi teks yang didukung GnuCOBOL. - Mode akses
SEQUENTIAL,RANDOM, danDYNAMICmenentukan verb yang sah, antara lain READ NEXT, DELETE, dan START yang tidak tersedia untuk organisasi sekuensial. - Klausa
SELECT ... ASSIGN TOmemasangkan nama logis dengan nama fisik, danFILE STATUSmerekam hasil setiap operasi dalam dua digit. - Record yang sama menghasilkan format fisik yang berbeda pada setiap organisasi, mulai dari record berdempet, baris teks, slot bernomor, sampai format internal berindeks.
Referensi#
- GnuCOBOL — Free Software Foundation — Situs proyek GnuCOBOL 3.2 yang menjadi implementasi COBOL untuk seluruh keluaran pada topik ini.
- GnuCOBOL Manual — Free Software Foundation — Manual resmi GnuCOBOL yang memuat klausa SELECT beserta organisasi berkas yang didukungnya.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi pernyataan SELECT, organisasi berkas, dan mode akses pada COBOL komputer pusat.