Rancang Batch

Merancang record, berkas, dan total kontrol lebih dahulu sebelum menulis satu baris kode pun.

Daftar isi

Program batch yang gagal hampir selalu dapat dilacak ke rancangannya, bukan ke kodenya. Topik ini menyusun cetak biru laporan aging piutang sebelum satu baris program pun ditulis, mencakup definisi rekaman masukan, aturan penghitungan umur, pembagian bucket umur, skema total kontrol, dan bentuk keluaran laporan. Setelah topik ini selesai dibaca, setiap variabel kerja dan setiap percabangan pada tahap pembangunan memiliki dasar rancangan yang dapat dirujuk kembali.

Definisi rekaman masukan#

Rekaman masukan adalah satu baris berukuran tetap 34 karakter yang mewakili satu faktur piutang. Lebar yang tetap membuat posisi setiap field dapat dihitung, sehingga pergeseran satu karakter pun langsung terlihat pada hasil pembacaan. Berkas disimpan dengan organisasi LINE SEQUENTIAL agar isinya berupa teks biasa yang dapat dibuka dengan editor mana pun.

FieldPICPosisiIsi
RP-FAKTURX(6)1-6Nomor faktur unik
FILLERX7Spasi pemisah
RP-NAMAX(8)8-15Nama pelanggan singkat
FILLERX16Spasi pemisah
RP-TGL9(8)17-24Tanggal faktur berformat YYYYMMDD
FILLERX25Spasi pemisah
RP-NILAI9(7)V9926-34Nilai pokok, dua digit terakhir adalah sen

Field FILLER wajib dideklarasikan walaupun isinya tidak diproses, karena satu field yang terlewat menggeser seluruh field sesudahnya. Nilai pokok tersimpan tanpa titik desimal, dan klausa V pada picture menyatakan posisi desimalnya, sehingga sembilan digit 012500050 berarti 125,000.50. Bentuk tanpa titik inilah bentuk lazim data batch, yaitu ringkas dan berukuran pasti.

Lebar yang tetap juga membuat deskripsi FD dan berkas data saling mengunci satu sama lain. Setiap baris berkas uji wajib berukuran tepat 34 karakter, sehingga panjang yang menyimpang terlihat sebagai penyimpangan data dan bukan sebagai kesalahan program. Rancangan semacam ini menjadi pegangan tetap ketika berkas uji disusun pada tahap pembangunan, karena posisi setiap field sudah tertulis sebelum baris data pertama diketik.

Aturan umur dan bucket umur#

Umur faktur adalah selisih hari antara tanggal proses dan tanggal faktur. Tanggal proses dinyatakan sebagai konstanta WORKING-STORAGE bernama WS-TGL-PROSES dengan nilai 20261130, sehingga hasil program sama pada setiap eksekusi dan dapat dibandingkan baris demi baris. Penghitungan umurnya menggunakan fungsi intrinsik (intrinsic function) INTEGER-OF-DATE, yaitu fungsi bawaan yang mengubah tanggal berformat YYYYMMDD menjadi bilangan hari sejak tanggal acuan tertentu. Selisih kedua bilangan langsung menyatakan umur dalam hari, termasuk penanganan panjang bulan dan tahun kabisat.

Empat bucket umur menampung rekaman menurut rentang umurnya. Pemilihannya menggunakan kondisi bertingkat sebagaimana tabel berikut.

BucketRentang umurKondisi pemilih
10 sampai 30 hariWS-UMUR <= 30
231 sampai 60 hariWS-UMUR <= 60
361 sampai 90 hariWS-UMUR <= 90
4lebih dari 90 hariWHEN OTHER

Urutan pengujian menyusuri tabel dari atas ke bawah, sehingga umur 30 jatuh ke bucket 1 pada kondisi pertama, umur 60 jatuh ke bucket 2, dan umur 90 jatuh ke bucket 3. Kondisi kesamaan (=) tidak digunakan sama sekali karena setiap rentang ditutup oleh pengujian <= berikutnya. Bucket keempat menampung sisanya melalui WHEN OTHER, sehingga tidak ada umur yang terlewat. Aturan tersebut diterjemahkan menjadi potongan EVALUATE TRUE berikut.

cobol Aturan pemilihan bucket dengan EVALUATE TRUE
      * tidak-dijalankan
      *> Umur dihitung sebagai selisih dua bilangan hari.
           COMPUTE WS-UMUR = FUNCTION INTEGER-OF-DATE(WS-TGL-PROSES)
                           - FUNCTION INTEGER-OF-DATE(RP-TGL)
           EVALUATE TRUE
               WHEN WS-UMUR <= 30
                   MOVE 1 TO WS-BUCKET
               WHEN WS-UMUR <= 60
                   MOVE 2 TO WS-BUCKET
               WHEN WS-UMUR <= 90
                   MOVE 3 TO WS-BUCKET
               WHEN OTHER
                   MOVE 4 TO WS-BUCKET
           END-EVALUATE

Skema total kontrol#

Total kontrol adalah sekumpulan angka yang wajib saling cocok sebelum laporan dinyatakan sah. Rancangan ini menetapkan empat angka, yaitu jumlah rekaman yang dibaca, jumlah rekaman pada setiap bucket, jumlah nilai pada setiap bucket, dan total nilai keseluruhan. Aturannya hanya satu, yaitu jumlah seluruh bucket wajib sama dengan total keseluruhan, baik untuk hitungan rekaman maupun hitungan nilai.

Aturan itu bekerja karena kedua hitungan diperoleh dari jalan yang berbeda. Total bertambah pada setiap rekaman yang dibaca, sedangkan jumlah bucket dirangkum kembali dari empat akumulator bucket pada waktu laporan dicetak. Apabila satu rekaman terlewat atau terhitung dua kali, salah satu pasangan angka tidak akan cocok dan laporan dinyatakan gagal kontrol. Pada sistem sungguhan, angka pembanding sering berasal dari rekaman kontrol yang disertakan pada berkas masukan atau dari hasil eksekusi sebelumnya, tetapi prinsipnya tetap sama, yaitu dua jalur penghitungan yang wajib bertemu pada angka yang sama. Skema semacam ini lazim disertakan pada laporan batch karena pemeriksaannya berjalan otomatis tanpa alat tambahan.

Kerangka data dan alur program#

Seluruh keputusan di atas diturunkan menjadi kerangka WORKING-STORAGE berikut. Kerangka ini memuat variabel status berkas, tanggal proses konstan, akumulator per bucket dalam tabel OCCURS empat elemen, dan variabel hasil edit untuk pencetakan.

cobol Kerangka WORKING-STORAGE program aging piutang
      * tidak-dijalankan
      *> Kerangka data kerja sebagaimana dirancang pada topik ini.
       WORKING-STORAGE SECTION.
       01  WS-STATUS            PIC XX      VALUE "00".
       01  WS-EOL               PIC X       VALUE "N".
           88  SELESAI                      VALUE "Y".
       01  WS-TGL-PROSES        PIC 9(8)    VALUE 20261130.
       01  WS-UMUR              PIC 9(3)    VALUE 0.
       01  WS-BUCKET            PIC 9       VALUE 0.
       01  WS-IDX               PIC 9       VALUE 0.
       01  WS-JML-REC           PIC 9(3)    VALUE 0.
       01  WS-REK-BUCKET        PIC 9(3)    VALUE 0 OCCURS 4 TIMES.
       01  WS-NILAI-BUCKET      PIC 9(9)V99 VALUE 0 OCCURS 4 TIMES.
       01  WS-TOTAL             PIC 9(9)V99 VALUE 0.
       01  WS-JUMLAH-BUCKET     PIC 9(9)V99 VALUE 0.
       01  WS-JUMLAH-REC-BKT    PIC 9(3)    VALUE 0.

Alur program mengikuti enam langkah tetap yang dirangkum diagram berikut, yaitu membaca rekaman, menghitung umur, menentukan bucket, mengakumulasi nilai, mencetak baris detail, dan mencetak rekap beserta total kontrol setelah berkas habis. Enam langkah itu dipetakan langsung ke struktur program, yaitu paragraf UTAMA untuk pembukaan berkas dan perulangan baca, paragraf PROSES-REKAMAN untuk empat langkah pertengahan, serta paragraf CETAK-REKAP dan CETAK-KONTROL untuk rekap beserta total kontrol.

Baca rekamanHitung umur fakturTentukan bucket umurAkumulasi ke bucketCetak baris detailCetak rekapdan total kontrolLima langkah pertama berulang untuk setiap rekaman, langkah terakhir berjalan setelah berkas habis
Alur program aging piutang

Laporan akhir tersusun atas tiga bagian dengan urutan tetap. Bagian pertama mencetak satu baris detail per faktur yang memuat nomor, nama, tanggal, umur, dan nilai pokok. Bagian kedua mencetak rekap per bucket yang memuat jumlah rekaman dan jumlah nilai setiap bucket. Bagian ketiga mencetak total kontrol beserta hasil pemeriksaannya, sehingga keabsahan laporan terbaca langsung dari halaman yang sama.

Kesalahan umum#

  • Field FILLER tidak dideklarasikan. Seluruh field sesudahnya bergeser dan tanggal terbaca salah. Deklarasikan setiap posisi, termasuk yang berisi spasi pemisah.
  • Batas bucket ditulis sebagai kesamaan, misalnya = 30, = 60, dan = 90. Umur di antara dua batas tidak masuk bucket mana pun lalu jatuh ke WHEN OTHER yang keliru. Gunakan rentang bertingkat <= sebagaimana tabel bucket.
  • Total kontrol dibandingkan dengan salinan dirinya sendiri. Pemeriksaan selalu menyatakan cocok sehingga tidak mendeteksi apa pun. Pastikan kedua angka berasal dari akumulasi yang berbeda jalan.

Ringkasan#

  • Rekaman masukan berukuran tetap 34 karakter dengan dua digit sen pada nilai pokoknya.
  • Umur dihitung dari selisih INTEGER-OF-DATE antara tanggal proses konstan dan tanggal faktur, lalu dipetakan ke empat bucket bertingkat.
  • Total kontrol membandingkan jumlah rekaman dan jumlah nilai seluruh bucket dengan total keseluruhan yang dihitung dari jalan akumulasi berbeda.
  • Laporan akhir tersusun atas baris detail, rekap per bucket, dan bagian total kontrol.

Referensi#