Mode Organisasi dan Akses

Organisasi sekuensial, relatif, dan terindeks beserta mode akses yang menyertainya.

Daftar isi

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.

cobol Bentuk umum klausa SELECT untuk berkas terindeks
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.

OrganisasiMode akses yang didukungVerb yang tersedia
SEQUENTIALSEQUENTIALOPEN, READ dengan AT END, WRITE, REWRITE, CLOSE
LINE SEQUENTIALSEQUENTIALOPEN, READ dengan AT END, WRITE, REWRITE, CLOSE
RELATIVESEQUENTIAL, RANDOM, DYNAMICOPEN, READ, WRITE, REWRITE, DELETE, START, CLOSE
INDEXEDSEQUENTIAL, RANDOM, DYNAMICOPEN, 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 dataPilihan yang tepat
Pemrosesan batch berurutan dari awal sampai akhir berkasSEQUENTIAL dengan mode SEQUENTIAL
Pertukaran data teks dengan alat lain atau data yang perlu dibaca manusiaLINE SEQUENTIAL
Akses langsung menurut nomor posisi recordRELATIVE dengan mode RANDOM
Akses langsung menurut kunci logis diselingi telusuran berurutanINDEXED 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.

cobol select-organisasi.cbl
       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.
text Keluaran
Sekuensial      status 00
Line sekuensial status 00
Relatif         status 00
Terindeks       status 00

Kompilasi program dengan perintah berikut, kemudian jalankan ./select-organisasi.

bash
# kompilasi program deklarasi empat organisasi
cobc -x select-organisasi.cbl

Empat 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 KEY dideklarasikan 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 seperti rk-nomor pada program contoh.
  • READ NEXT ditulis untuk berkas dengan mode RANDOM. Penelusuran berurutan hanya sah pada mode SEQUENTIAL dan DYNAMIC, sehingga cobc menolak gabungan tersebut saat kompilasi. Gunakan mode DYNAMIC apabila program perlu membaca acak dan menelusuri berurutan pada berkas yang sama.
  • REWRITE dijalankan pada berkas yang dibuka dengan mode OUTPUT. Verb ini memerlukan mode I-O dan record yang sudah berhasil dibaca terlebih dahulu, dan pelanggarannya terlihat pada FILE STATUS bernilai 43. Buka berkas dengan OPEN I-O, baca recordnya, ubah field yang dituju, kemudian jalankan REWRITE.

Ringkasan#

  • Tiga organisasi inti COBOL adalah SEQUENTIAL, RELATIVE, dan INDEXED, sedangkan LINE SEQUENTIAL adalah organisasi teks yang didukung GnuCOBOL.
  • Mode akses SEQUENTIAL, RANDOM, dan DYNAMIC menentukan verb yang sah, antara lain READ NEXT, DELETE, dan START yang tidak tersedia untuk organisasi sekuensial.
  • Klausa SELECT ... ASSIGN TO memasangkan nama logis dengan nama fisik, dan FILE STATUS merekam 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#