Verb berkas sekuensial mengatur siklus hidup sebuah berkas mulai dari saat dibuka sampai ditutup, yaitu OPEN, READ, WRITE, REWRITE, dan CLOSE. Topik ini membahas empat mode OPEN beserta arah aksesnya, pola pembacaan sampai habis dengan READ AT END, penulisan record baru, dan pembaruan record dengan REWRITE. Setiap langkah didemonstrasikan oleh program yang benar-benar dijalankan, yaitu program penulis berkas jadwal piket, program pembacanya, dan program pengubah satu record di dalamnya. Setelah membacanya, siklus berkas sekuensial yang lengkap dapat dibangun tanpa menebak-nebak verb mana yang dipakai pada mode mana.
Mode OPEN dan arah pemrosesan#
OPEN adalah verb pertama yang dijalankan atas sebuah berkas, dan mode yang mengikutinya menentukan verb mana yang boleh dipakai sesudahnya. Mode INPUT membuka berkas untuk dibaca saja, sedangkan mode OUTPUT menyiapkan berkas baru untuk ditulis. Mode EXTEND membuka berkas yang sudah ada dan menempatkan posisi tulis di akhirnya, sehingga record baru menempel sesudah record lama. Mode I-O membuka berkas untuk dibaca dan ditulis sekaligus, dan mode inilah satu-satunya yang mengizinkan REWRITE. FILE STATUS yang dideklarasikan pada SELECT melengkapi keempat mode tersebut dengan kode dua digit atas setiap operasi.
| Mode | Arah akses | Catatan penting |
|---|---|---|
INPUT | Baca saja | WRITE dan REWRITE tidak sah pada mode ini |
OUTPUT | Tulis berkas baru | Isi berkas lama dengan nama sama ikut hilang |
EXTEND | Tulis di akhir berkas | Record lama dipertahankan dan tidak dapat dibaca |
I-O | Baca dan tulis | Satu-satunya mode yang mengizinkan REWRITE |
CLOSE menandai berakhirnya pemakaian berkas dan melepaskannya dari program. Kebiasaan yang benar adalah menutup berkas segera setelah selesai diproses, karena CLOSE yang berhasil memberi status 00 pada FILE STATUS dan memastikan seluruh data sudah tersimpan lengkap.
READ AT END dan pola baca sampai habis#
READ menyalin record berikutnya dari berkas ke area record yang didefinisikan pada FD, lalu memajukan posisi baca. Pada berkas sekuensial, kehabisan record bukan error melainkan keadaan yang dinanti, dan keadaan itu ditandai oleh frasa AT END. Frasa NOT AT END melengkapinya dengan pernyataan yang hanya dieksekusi apabila record berhasil dibaca, sehingga pemrosesan record dan penandaan akhir berkas terpisah dengan jelas. Pola baca sampai habis (end of file loop) memadukan keduanya dengan satu sakelar dan PERFORM UNTIL.
BACA-SEMUA.
OPEN INPUT berkas-piket.
PERFORM UNTIL sw-akhir = "Y"
READ berkas-piket
AT END
MOVE "Y" TO sw-akhir
NOT AT END
DISPLAY pk-nomor " " pk-nama " " pk-hari
END-READ
END-PERFORM.
CLOSE berkas-piket.Sakelar sw-akhir diisi N sebelum perulangan dan berubah menjadi Y tepat ketika AT END terpicu. Penempatan READ pada satu titik di dalam perulangan menjamin setiap record diproses tepat satu kali, dan tidak ada pembacaan tambahan setelah akhir berkas tercapai. Pola ini berulang pada hampir seluruh program batch, sehingga bentuknya cukup dikenali satu kali saja.
Menulis dan membaca ulang berkas piket#
Program pertama membuat berkas piket.dat berisi lima record jadwal piket. Record terdiri atas nomor urut dua digit, nama sepuluh karakter, dan hari enam karakter, sehingga panjangnya tetap 18 karakter. Isi data disiapkan pada tabel WORKING-STORAGE, kemudian ditulis ke berkas satu per satu dengan WRITE.
IDENTIFICATION DIVISION.
PROGRAM-ID. TULIS-PIKET.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT berkas-piket ASSIGN TO "piket.dat"
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS fs-piket.
DATA DIVISION.
FILE SECTION.
FD berkas-piket.
01 r-piket.
02 pk-nomor PIC 9(2).
02 pk-nama PIC X(10).
02 pk-hari PIC X(6).
WORKING-STORAGE SECTION.
01 fs-piket PIC XX.
01 dt-piket.
02 dt-baris OCCURS 5 TIMES.
03 dt-nomor PIC 9(2).
03 dt-nama PIC X(10).
03 dt-hari PIC X(6).
01 i PIC 9.
PROCEDURE DIVISION.
ISI-TABEL.
MOVE "01Ali Senin " TO dt-baris (1).
MOVE "02Budi Selasa" TO dt-baris (2).
MOVE "03Citra Rabu " TO dt-baris (3).
MOVE "04Dewi Kamis " TO dt-baris (4).
MOVE "05Eko Jumat " TO dt-baris (5).
TULIS-BERKAS.
OPEN OUTPUT berkas-piket.
PERFORM VARYING i FROM 1 BY 1 UNTIL i > 5
MOVE dt-baris (i) TO r-piket
WRITE r-piket
END-PERFORM.
CLOSE berkas-piket.
DISPLAY "5 record ditulis ke piket.dat, status " fs-piket.
STOP RUN.5 record ditulis ke piket.dat, status 00Kompilasi program dengan perintah berikut, kemudian jalankan ./tulis-piket.
# kompilasi program penulis berkas piket
cobc -x tulis-piket.cblProgram kedua membaca ulang seluruh isi berkas dengan pola baca sampai habis yang diperkenalkan pada bagian sebelumnya.
IDENTIFICATION DIVISION.
PROGRAM-ID. BACA-PIKET.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT berkas-piket ASSIGN TO "piket.dat"
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS fs-piket.
DATA DIVISION.
FILE SECTION.
FD berkas-piket.
01 r-piket.
02 pk-nomor PIC 9(2).
02 pk-nama PIC X(10).
02 pk-hari PIC X(6).
WORKING-STORAGE SECTION.
01 fs-piket PIC XX.
01 sw-akhir PIC X VALUE "N".
PROCEDURE DIVISION.
BACA-SEMUA.
OPEN INPUT berkas-piket.
PERFORM UNTIL sw-akhir = "Y"
READ berkas-piket
AT END
MOVE "Y" TO sw-akhir
NOT AT END
DISPLAY pk-nomor " " pk-nama " " pk-hari
END-READ
END-PERFORM.
CLOSE berkas-piket.
DISPLAY "Status berkas setelah CLOSE: " fs-piket.
STOP RUN.01 Ali Senin
02 Budi Selasa
03 Citra Rabu
04 Dewi Kamis
05 Eko Jumat
Status berkas setelah CLOSE: 00Kompilasi program kedua, kemudian jalankan ./baca-piket pada direktori yang sama dengan piket.dat.
# kompilasi program pembaca berkas piket
cobc -x baca-piket.cblKeluaran dari kedua program saling melengkapi sebagai bukti siklus tulis dan baca. Lima record yang ditulis oleh program pertama muncul dengan urutan yang sama pada program kedua, dan status 00 setelah CLOSE menegaskan berkas ditutup dalam keadaan bersih. Spasi pengisi pada field PIC X tampil apa adanya pada DISPLAY, misalnya Ali diikuti spasi hingga batas sepuluh karakter, karena berkas sekuensial menyimpan record dalam panjang yang tetap dan tidak menghapus spasi pengisi tersebut.
REWRITE untuk memperbarui record#
REWRITE mengganti record yang terakhir dibaca dengan isi area record saat ini, sehingga pembaruan data tidak memerlukan penulisan ulang seluruh berkas. Syaratnya ada dua, yaitu berkas dibuka dengan mode I-O dan record yang dituju sudah berhasil dibaca pada pembukaan yang sama. Program berikut membaca dua record pertama, mengganti nama pada record kedua, menulis ulang record itu, lalu membuka ulang berkas sebagai pembuktian.
IDENTIFICATION DIVISION.
PROGRAM-ID. UBAH-PIKET.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT berkas-piket ASSIGN TO "piket.dat"
ORGANIZATION IS SEQUENTIAL
FILE STATUS IS fs-piket.
DATA DIVISION.
FILE SECTION.
FD berkas-piket.
01 r-piket.
02 pk-nomor PIC 9(2).
02 pk-nama PIC X(10).
02 pk-hari PIC X(6).
WORKING-STORAGE SECTION.
01 fs-piket PIC XX.
01 sw-akhir PIC X VALUE "N".
PROCEDURE DIVISION.
UBAH-RECORD.
OPEN I-O berkas-piket.
READ berkas-piket.
READ berkas-piket
NOT AT END
MOVE "Farhan" TO pk-nama
END-READ.
REWRITE r-piket.
DISPLAY "Record 02 kini: " pk-nomor " " pk-nama " " pk-hari.
CLOSE berkas-piket.
BUKTIKAN-ULANG.
OPEN INPUT berkas-piket.
PERFORM UNTIL sw-akhir = "Y"
READ berkas-piket
AT END
MOVE "Y" TO sw-akhir
NOT AT END
DISPLAY pk-nomor " " pk-nama " " pk-hari
END-READ
END-PERFORM.
CLOSE berkas-piket.
DISPLAY "Status berkas setelah CLOSE: " fs-piket.
STOP RUN.Record 02 kini: 02 Farhan Selasa
01 Ali Senin
02 Farhan Selasa
03 Citra Rabu
04 Dewi Kamis
05 Eko Jumat
Status berkas setelah CLOSE: 00Kompilasi program ketiga, kemudian jalankan ./ubah-piket.
# kompilasi program pengubah record piket
cobc -x ubah-piket.cblBaris pertama keluaran menunjukkan isi area record sesaat sesudah REWRITE, sedangkan lima baris berikutnya berasal dari pembacaan ulang seluruh berkas. Nama pada record nomor 02 berubah dari Budi menjadi Farhan, sedangkan empat record lainnya tetap utuh. Perhatikan bahwa REWRITE tidak menambah record baru, melainkan menimpa record yang ditunjuk oleh READ terakhir.
Kesalahan umum#
- REWRITE dijalankan tanpa READ terlebih dahulu. Pada berkas yang dibuka
I-O, verb ini hanya mengganti record yang ditunjuk oleh pembacaan terakhir, dan pelanggarannya tampil sebagaiFILE STATUS43. Baca record yang dituju, ubah field yang diperlukan, kemudian tulis ulang. - OPEN
OUTPUTdipakai untuk menambah data pada berkas lama. Mode ini mengganti seluruh isi berkas, sehingga data lama hilang tanpa peringatan. Gunakan modeEXTENDuntuk menambah record di akhir berkas yang sudah ada. - Perulangan baca berhenti sebelum AT END ditangani. READ yang diulang sesudah akhir berkas tanpa sakelar penghenti menghasilkan status berkas yang salah dan data yang tercetak ganda. Ikuti pola PERFORM UNTIL dengan sakelar yang diisi pada AT END.
Ringkasan#
- Mode OPEN menentukan arah akses, yaitu
INPUTuntuk baca,OUTPUTuntuk berkas baru,EXTENDuntuk menambah di akhir, danI-Ountuk baca tulis sekaligus. - READ menyalin record berikutnya ke area record FD dan menandai kehabisan data melalui AT END, yang dipadukan dengan NOT AT END pada pola baca sampai habis.
- REWRITE mengganti record terakhir yang dibaca, dengan syarat mode
I-Odan pembacaan yang sah, sedangkan CLOSE menutup berkas dengan status00. - Berkas sekuensial menyimpan record berdempetan dengan panjang tetap, sehingga spasi pengisi field tetap tersimpan di dalam berkas.
Referensi#
- GnuCOBOL — Free Software Foundation — Situs proyek GnuCOBOL 3.2 yang dijalankan untuk menghasilkan seluruh keluaran pada topik ini.
- GnuCOBOL Manual — Free Software Foundation — Manual resmi GnuCOBOL yang memuat perilaku verb berkas OPEN, READ, WRITE, REWRITE, dan CLOSE.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi mode pembukaan berkas dan frasa AT END pada pemrosesan sekuensial.