Pembaruan berkas master adalah pekerjaan batch klasik, yaitu menerapkan sekumpulan transaksi pada berkas master sehingga menghasilkan versi master yang baru. Topik ini membahas algoritma pencocokan dua berkas terurut yang menyelesaikan pekerjaan itu dalam satu kali lewat, lengkap dengan statistik jumlah pembaruan dan transaksi tanpa pasangan. Algoritma diperkenalkan melalui dua berkas data kecil dan satu program utuh yang benar-benar dijalankan, sehingga isi berkas hasil dapat diperiksa langsung.
Prinsip satu kali lewat#
Dua berkas terlibat pada pekerjaan ini. Berkas master memuat data induk yang relatif stabil, sedangkan berkas transaksi memuat perubahan yang terkumpul sejak pembaruan terakhir. Keduanya wajib terurut naik menurut kunci yang sama, misalnya kode anggota, karena seluruh logika algoritma bertumpu pada urutan itu.
Program menahan satu rekaman terkini dari tiap berkas, sebagaimana dua penunjuk yang bergerak maju. Perbandingan kedua kunci itu menghasilkan tiga kasus.
- Kunci sama. Transaksi diterapkan pada rekaman master, hasilnya ditulis ke berkas master baru, dan kedua penunjuk maju.
- Kunci master lebih kecil. Rekaman master tersalin apa adanya ke berkas master baru dan penunjuk master maju.
- Kunci transaksi lebih kecil. Transaksi tidak memiliki pasangan, kejadian itu dicatat pada penghitung, dan penunjuk transaksi maju.
Alasan algoritma ini selesai dalam satu kali lewat terletak pada urutan. Karena kedua berkas terurut naik, kunci yang lebih kecil pada saat itu tidak mungkin menemukan pasangannya pada sisa berkas yang kuncinya seluruhnya lebih besar, sehingga rekaman tersebut selesai diproses dan tidak pernah dikunjungi ulang. Kompleksitas waktunya adalah , dengan banyaknya rekaman master dan banyaknya transaksi. Setelah salah satu berkas habis, sisa berkas yang lain diproses dengan aturan yang sama, yaitu salin sisa rekaman master atau catat sisa transaksi tanpa pasangan.
Hasil pembaruan ditulis ke berkas baru dan tidak menimpa berkas master yang lama. Pola ini adalah kebiasaan kerja batch yang menjaga berkas lama tetap utuh sebagai cadangan, sehingga kerja yang gagal di tengah proses tidak merusak data induk. Setelah kerja selesai dan diperiksa, berkas baru mengambil peran master untuk siklus pembaruan berikutnya.
Data contoh#
Berkas master memuat lima rekaman. Setiap barisnya berukuran 18 karakter, terdiri atas kode tiga karakter, satu spasi, nama sepuluh karakter, satu spasi, dan nilai tiga digit. Nilai tiga digit pada ujung baris itulah yang diperbarui oleh transaksi, sedangkan kode dan nama tersalin tanpa perubahan.
A01 ALI 010
A03 BUDI 005
A05 CITRA 012
A07 DEWI 003
A09 EKA 008Berkas transaksi memuat tiga rekaman yang lebih pendek, yaitu kode tiga karakter, satu spasi, dan nilai tambahan tiga digit. Kode A08 sengaja tidak memiliki pasangan pada master untuk memperlihatkan kasus transaksi tanpa pasangan. Kedua berkas wajib terurut naik menurut kode, dan urutan itu dapat dibaca langsung dari isinya, yaitu A01 sampai A09 pada master serta A03, A05, dan A08 pada transaksi.
A03 004
A05 001
A08 007Program pencocokan#
Program berikut membaca kedua berkas, menulis master-baru.dat, dan mencetak ringkasan statistiknya. Ketiga kasus ditulis dengan EVALUATE TRUE, sedangkan kondisi akhir kedua berkas ditampung pada WHEN tersendiri. Bendera MASTER-HABIS dan TRANS-HABIS diperiksa lebih dahulu, sehingga sisa rekaman pada salah satu berkas tetap diproses dengan benar.
IDENTIFICATION DIVISION.
PROGRAM-ID. COCOK-MASTER.
*> Pembaruan berkas master dengan berkas transaksi terurut.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT DATA-MASTER ASSIGN TO "master.dat"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT DATA-TRANS ASSIGN TO "transaksi.dat"
ORGANIZATION IS LINE SEQUENTIAL.
SELECT MASTER-BARU ASSIGN TO "master-baru.dat"
ORGANIZATION IS LINE SEQUENTIAL.
DATA DIVISION.
FILE SECTION.
FD DATA-MASTER.
01 REK-MASTER.
05 RM-KODE PIC X(3).
05 FILLER PIC X.
05 RM-NAMA PIC X(10).
05 FILLER PIC X.
05 RM-NILAI PIC 9(3).
FD DATA-TRANS.
01 REK-TRANS.
05 RT-KODE PIC X(3).
05 FILLER PIC X.
05 RT-TAMBAH PIC 9(3).
FD MASTER-BARU.
01 REK-BARU PIC X(18).
WORKING-STORAGE SECTION.
01 WS-EOM PIC X VALUE "N".
88 MASTER-HABIS VALUE "Y".
01 WS-EOT PIC X VALUE "N".
88 TRANS-HABIS VALUE "Y".
01 WS-REK-BARU.
05 WB-KODE PIC X(3).
05 FILLER PIC X VALUE SPACE.
05 WB-NAMA PIC X(10).
05 FILLER PIC X VALUE SPACE.
05 WB-NILAI PIC 9(3).
01 WS-DIPERBARUI PIC 9(3) VALUE 0.
01 WS-TERSALIN PIC 9(3) VALUE 0.
01 WS-TANPA-PASANGAN PIC 9(3) VALUE 0.
01 WS-DIP-ED PIC ZZ9.
01 WS-SAL-ED PIC ZZ9.
01 WS-TAN-ED PIC ZZ9.
PROCEDURE DIVISION.
UTAMA.
OPEN INPUT DATA-MASTER DATA-TRANS
OPEN OUTPUT MASTER-BARU
PERFORM BACA-MASTER
PERFORM BACA-TRANS
PERFORM UNTIL MASTER-HABIS AND TRANS-HABIS
EVALUATE TRUE
WHEN MASTER-HABIS
ADD 1 TO WS-TANPA-PASANGAN
PERFORM BACA-TRANS
WHEN TRANS-HABIS
PERFORM SALIN-MASTER
WHEN RM-KODE = RT-KODE
ADD RT-TAMBAH TO RM-NILAI
PERFORM TULIS-BARU
ADD 1 TO WS-DIPERBARUI
PERFORM BACA-MASTER
PERFORM BACA-TRANS
WHEN RM-KODE < RT-KODE
PERFORM SALIN-MASTER
WHEN OTHER
ADD 1 TO WS-TANPA-PASANGAN
PERFORM BACA-TRANS
END-EVALUATE
END-PERFORM
CLOSE DATA-MASTER DATA-TRANS MASTER-BARU
MOVE WS-DIPERBARUI TO WS-DIP-ED
MOVE WS-TERSALIN TO WS-SAL-ED
MOVE WS-TANPA-PASANGAN TO WS-TAN-ED
DISPLAY "Pembaruan master selesai"
DISPLAY "Master diperbarui : " WS-DIP-ED
DISPLAY "Master tersalin : " WS-SAL-ED
DISPLAY "Transaksi tanpa pasangan : " WS-TAN-ED
STOP RUN.
TULIS-BARU.
MOVE RM-KODE TO WB-KODE
MOVE RM-NAMA TO WB-NAMA
MOVE RM-NILAI TO WB-NILAI
WRITE REK-BARU FROM WS-REK-BARU.
SALIN-MASTER.
PERFORM TULIS-BARU
ADD 1 TO WS-TERSALIN
PERFORM BACA-MASTER.
BACA-MASTER.
READ DATA-MASTER
AT END MOVE "Y" TO WS-EOM
END-READ.
BACA-TRANS.
READ DATA-TRANS
AT END MOVE "Y" TO WS-EOT
END-READ.Pembaruan master selesai
Master diperbarui : 2
Master tersalin : 3
Transaksi tanpa pasangan : 1Kompilasi program dengan perintah berikut, kemudian jalankan ./cocok.
# kompilasi program pencocokan master-transaksi
cobc -x cocok.cblRekaman master baru dibangun pada WS-REK-BARU di WORKING-STORAGE, lalu ditulis dengan WRITE REK-BARU FROM WS-REK-BARU. Setiap pekerjaan yang berulang ditempatkan pada paragrafnya sendiri. TULIS-BARU menyusun rekaman keluaran, SALIN-MASTER menyalin sambil menghitung, sedangkan BACA-MASTER dan BACA-TRANS menjadi satu-satunya tempat pembacaan masing-masing berkas. Pemisahan ini membuat perubahan kecil, misalnya penambahan penghitung, hanya perlu dilakukan pada satu paragraf tanpa menyentuh algoritma utamanya. Isi berkas hasil, yaitu master-baru.dat, adalah sebagai berikut.
A01 ALI 010
A03 BUDI 009
A05 CITRA 013
A07 DEWI 003
A09 EKA 008Nilai BUDI naik dari 005 menjadi 009 karena transaksi A03 menambahkan 4, sedangkan nilai CITRA naik dari 012 menjadi 013 karena transaksi A05 menambahkan 1. Rekaman lain tersalin tanpa perubahan, dan transaksi A08 hanya tercatat pada baris Transaksi tanpa pasangan karena kodenya tidak ditemukan pada berkas master. Ringkasan statistik pada akhir keluaran berasal dari tiga penghitung, yaitu WS-DIPERBARUI, WS-TERSALIN, dan WS-TANPA-PASANGAN, yang ditampilkan melalui variabel teredit ZZ9.
Kesalahan umum#
- Salah satu berkas tidak terurut naik. Pasangan terbentuk secara keliru dan hasilnya diam-diam salah tanpa pesan error. Periksa urutan kedua berkas terlebih dahulu, atau urutkan dengan verb SORT sebelum pencocokan.
- Area rekaman keluaran tidak diinisialisasi. GnuCOBOL menolak WRITE pada berkas LINE SEQUENTIAL dengan status 71 bila rekaman memuat karakter sisa yang tidak sah. Bangun rekaman di WORKING-STORAGE dengan bagian kosongnya diberi VALUE SPACE, kemudian tulis dengan WRITE FROM.
- Salah satu penunjuk tidak maju pada kasus kunci sama. Kunci yang sama terus dibandingkan dan perulangan tidak pernah berakhir. Pastikan BACA-MASTER dan BACA-TRANS dijalankan berpasangan setelah transaksi diterapkan.
Ringkasan#
- Pencocokan master-transaksi membandingkan kunci dari rekaman yang sedang ditahan pada kedua berkas terurut, lalu memajukan penunjuk yang kuncinya lebih kecil.
- Tiga kasus utamanya adalah kunci sama, kunci master lebih kecil, dan kunci transaksi lebih kecil.
- Satu kali lewat mencukupi karena urutan menjamin rekaman tidak dikunjungi ulang, dengan kompleksitas .
- Statistik pembaruan, penyalinan, dan transaksi tanpa pasangan dilaporkan pada akhir kerja.
Referensi#
- GnuCOBOL — Free Software Foundation — Situs proyek GnuCOBOL 3.2, implementasi COBOL sumber terbuka yang dijalankan untuk menghasilkan keluaran pada topik ini.
- GnuCOBOL Manual — Free Software Foundation — Manual resmi GnuCOBOL yang mencakup organisasi berkas LINE SEQUENTIAL dan penggunaan cobc.
- IBM Enterprise COBOL for z/OS documentation — IBM — Dokumentasi resmi pemrosesan berkas sekuensial dan pernyataan EVALUATE pada COBOL komputer pusat.