Skip to main content

Pemrosesan Secara Batch (Batch Processing)

Pemrosesan secara batch adalah sekelompok transaksi yang dikumpulkan dalam jumlah tertentu, dalam periode waktu tertentu, dan kemudian diproses bersamaan. Proses transaksi secara batch dilakukan karena alasan efisiensi waktu. Jumlah jurnal transaksi yang banyak dengan pola jurnal yang seragam akan lebih efisien diproses secara batch. Proses ini bisa dilakukan secara harian, mingguan, atau bahkan bulanan, tergantung pada skala perusahaan. Biasanya, posting dilakukan secara batch jika transaksi sudah mencapai lebih dari 50.

Pada sofware akuntansi yang terintegrasi dengan bagian lain, seperti bagian piutang, utang, dan sebagainya, proses jurnal transaksi secara batch cocok untuk diterapkan. Sistem pencatatan piutang misalnya, jurnal yang dibuat di bagian piutang sudah didesain sesuai dengan standar pencatatan jurnal piutang. Jadi, bila tagihan sudah melalui proses verifikasi dan validasi oleh otoritas piutang, maka catatan yang terkait dengan piutang akan langsung diterima oleh bagian akuntansi dalam bentuk jurnal khusus piutang. Dalam kasus ini, proses secara batch akan lebih efiesien dari pada proses secara real time.

Pada sofware akuntansi yang kita buat ini, pemrosesan secara batch dilakukan lewat menu posting, yaitu dengan membuka form posting, yang di dalamnya terdapat subform yang berisi ringkasan dari setiap jurnal yang akan diposting. Untuk membuat form posting, ikutilah langkah-langkah di bawah.
  1. Buatlah form dengan menggunakan Blank Form.
  2. Pada bagian detail, taruhlah control berupa 4 buah combo box dengan properti sebagai berikut:
    1. Combo box 1:
      1. Name=drTgllTransaksi
      2. Row Source = SELECT TglTransaksi FROM tblTempTrans Journal_Parent GROUP BY TglTransaksi HAVING TglTransaksi Between CekPeriode("TglAwalBulan") And CekPeriode( "TglAkhirBulan");
      3. Format = Short Date
      4. Bound Column=1
      5. Label Caption untuk combo ini = Dari Tanggal
      6. After Update = [Event Procedure]:
        Private Sub drTglTransaksi_AfterUpdate()
          Me.sdTglTransaksi.Requery
          Me.drTipeJurnal.Requery
          Me.sdTipeJurnal.Requery
        End Sub
    2. Combo box 2:
      1. Name=sdTgllTransaksi
      2. Row Source = SELECTTglTransaksi FROM tblTempTrans Journal_Parent GROUP BY TglTransaksi HAVING TglTransaksi Between [Forms]![frmPosting]![drTglTransaksi] And CekPeriode( "TglAkhirBulan");
      3. Format = Short Date
      4. Bound Column=1
      5. Label Caption untuk combo ini = Sampai Tanggal
      6. After Update = [Event Procedure]:
        Private Sub sdTglTransaksi_AfterUpdate()
           Me.drTipeJurnal.Requery
           Me.sdTipeJurnal.Requery
        End Sub
    3. Combo box 3:
      1. Name= drTipeJurnal
      2. Row Source = SELECT TipeJurnal FROM tblTempTrans Journal_Parent GROUP BY TipeJurnal ORDER BY TipeJurnal;
      3. Width=1”
      4. Label Caption untuk combo ini = Dari Tipe Jurnal
      5. Combo box 4:
      6. Name= sdTipeJurnal
      7. Row Source = SELECT TipeJurnal FROM tblTempTransJournal _Parent GROUP BY TipeJurnal HAVING TipeJurnal>=[ Forms]![frmPosting]![drTipeJurnal] ORDER BY TipeJurnal;
      8. Width=1”
      9. Label Caption untuk combo ini = Sampai Tipe Jurnal
      10. After Update = [Event Procedure]:
        Private Sub drTipeJurnal_AfterUpdate()
                Me.sdTipeJurnal.Requery
        End Sub
  3. Buatlah tombol perintah dengan properti Name=Command1, Caption=Lihat Jurnal, dan On Click=[Event Procedure]:
    Private Sub Command1_Click()
       Me.frmPostingSubForm.Requery
    End Sub
  4. Simpanlah lebih dahulu form yang telah dibuat ini dengan nama frmPosting, lalu bukalah dengan Form view.
  5. Gambar 1
  6. Buatlah query dengan tblTempTransJournal_Parent sebagai sumber tabel dan simpanlah dengan nama qryPosting. Design view ada di Gambar 1, sedangkan SQL view seperti ini:

    SELECT Proses, JurnalId, TipeJurnal, NoJurnal, Tgl Transaksi, Ref, NoRef, DibuatOleh, SetujuOleh FROM tblTemp TransJournal_Parent WHERE TipeJurnal Between [Forms]! [frmPosting]![drTipeJurnal] And [Forms]![frmPosting]! [sdTipeJurnal] AND TglTransaksi Between [Forms]! [frmPosting]![drTglTransaksi] And [Forms]![frmPosting]! [sdTglTransaksi];
  7. Pada Navigation pane, sorotlah query qryPosting di atas, lalu pada menu Create, klik More Forms dan pilih Datasheet untuk membuat subform dengan nama frmPostingSubForm.
  8. Melalui Design view, gantilah text box Proses dengan check box, dan isikan properti check box itu, Name= ProsesCheck. Tampilan terakhir frmPosting SubForm harus seperti Gambar 2.
    Gambar 2
  9. Ubahlah tampilan frmPosting dari Form view ke Design view.
  10. Tariklah form frmPostingSubForm pada Navigation pane persis ke bawah tombol perintah Lihat Jurnal. Buanglah label dari frmPostingSubForm karena tidak diperlukan.
  11. Persis di bawah subform frmPostingSubForm, buatlah sebuah check box dengan properti Name=ProsesSemua dan After Update = [Event Procedure]:
    Private Sub PilihSemua_AfterUpdate()
      Application.SetOption ("Confirm Action Queries"), False 
      If Me.PilihSemua = -1 Then
        DoCmd.RunSQL "UPDATE qryPosting SET qryPosting.Proses = -1;"
        Me.PilihSemuaLbl.Caption = "Jangan Pilih Semua"
      Else
        DoCmd.RunSQL " UPDATE qryPosting SET qryPosting.Proses = 0;"
        Me.PilihSemuaLbl.Caption = "Pilih Semua"
      End If
      Me.frmPostingSubForm.Requery
      Application.SetOption ("Confirm Action Queries"), True
    End Sub
  12. Buatlah tombol perintah dengan properti Name= Posting dan Caption= Posting ke Buku Besar, dan On Click=[Event Procedure]:
    Private Sub Posting_Click()
      Dim dbs As Database
      Dim rst As Recordset
      Dim NoJurnal As Integer
      Dim dtTanggal As String
      Me.frmPostingSubForm.Requery
      Set dbs = CurrentDb
      strSQL = "SELECT JurnalId, TipeJurnal, NoJurnal, TglTransaksi, Ref, NoRef, DibuatOleh, SetujuOleh, Proses " _
              & "FROM tblTempTransJournal_Parent WHERE (TglTransaksi between #" & Me.drTglTransaksi & "# and #" _
              & Me.sdTglTransaksi & "#) and (TipeJurnal between '" & Me.drTipeJurnal & "' and '" & Me.sdTipeJurnal & "')"
      Set rst = dbs.OpenRecordset(strSQL, dbOpenSnapshot)
      Application.SetOption ("Confirm Action Queries"), False 
    'Lakukan proses pengisian
      Do While Not rst.EOF
      NoJurnal = TampilkanNoJurnalPermanen(rst!TipeJurnal, rst!TglTransaksi)
      If rst!Proses = -1 Then
        If Round(DSum("[Debit]", "tblTempTransJournal_Child", "[JurnalId]=" & rst!JurnalId) - _
        DSum("[Kredit]", "tblTempTransJournal_Child", "[JurnalId]=" & rst!JurnalId), 2) <> 0 Then
          MsgBox "Total Debit tidak sama dengan Total Kredit: JurnalId #" & rst!JurnalId, vbOKOnly
          Exit Sub
        End If
        If IsNull(rst!TipeJurnal) Or rst!TipeJurnal = "" Then
          MsgBox "Tipe Jurnal tidak boleh kosong: JurnalId #" & rst!JurnalId, vbOKOnly
          Exit Sub
        End If
        If DCount("*", "tblTempTransJournal_Child", "[JurnalId]=" & rst!JurnalId & " and [Debit]=0 and [Kredit]=0") > 0 Then
          MsgBox "Ada satu atau lebih ayat jurnal di mana kolom debit dan kredit tidak terisi: JurnalId #" & rst!JurnalId, vbOKOnly
          Exit Sub
        End If
        If DCount("*", "tblTempTransJournal_Child", "[JurnalId]=" & rst!JurnalId & " and [Debit]>0 and [Kredit]>0") > 0 Then
          MsgBox "Ada satu atau lebih ayat jurnal di mana kolom debit dan kredit semuanya terisi: JurnalId #" & rst!JurnalId, vbOKOnly
          Exit Sub
        End If
        If DCount("*", "tblTempTransJournal_Child", "[JurnalId]=" & rst!JurnalId & " and [Deskripsi] is null") > 0 Then
          MsgBox "Ada satu atau lebih ayat jurnal di mana Deskripsi tidak terisi: JurnalId #" & rst!JurnalId, vbOKOnly
          Exit Sub
        End If
        If DCount("*", "tblTempTransJournal_Child", "[JurnalId]=" & rst!JurnalId & " and [KodeRek] is null") > 0 Then
          MsgBox "Ada satu atau lebih ayat jurnal di mana Kode Rekening Utama tidak terisi: JurnalId #" & rst!JurnalId, vbOKOnly
          Exit Sub
        End If
        If DCount("*", "tblTempTransJournal_Child", "[JurnalId]=" & rst!JurnalId) = 0 Then
          MsgBox "Detail pada jurnal ini tidak boleh kosong: JurnalId #" & rst!JurnalId, vbOKOnly
          Exit Sub
        End If
      End If
      strSqla = "INSERT INTO tblPermTransJournal_Parent ( JurnalIdTemp, TipeJurnal, NoJurnal, TglTransaksi, Ref, NoRef, " _
              & "DibuatOleh, SetujuOleh, Proses ) SELECT JurnalId, TipeJurnal, " _
              & NoJurnal & ", " _
              & "TglTransaksi, Ref, NoRef, DibuatOleh, '" & [TempVars]![IdPengguna] & "' as Setuju, 1 AS expr1 FROM tblTempTransJournal_Parent " _
              & "WHERE JurnalId=" & rst!JurnalId & " and Proses =-1"
      DoCmd.RunSQL strSqla
      DoCmd.RunSQL "INSERT INTO tblPermTransJournal_Child ( RefDetail, KodeRek, Deskripsi, Deriv1, Deriv2, Kuantitas, SU, HargaSatuan, TotalJumlah, Debit, Kredit, JthTempo, JurnalId) SELECT " _
                 & "tblTempTransJournal_Child.RefDetail, tblTempTransJournal_Child.KodeRek, tblTempTransJournal_Child.Deskripsi, tblTempTransJournal_Child.Deriv1, tblTempTransJournal_Child.Deriv2, tblTempTransJournal_Child.Kuantitas, tblTempTransJournal_Child.SU, tblTempTransJournal_Child.HargaSatuan, tblTempTransJournal_Child.TotalJumlah, tblTempTransJournal_Child.Debit, tblTempTransJournal_Child.Kredit, tblTempTransJournal_Child.JthTempo, tblPermTransJournal_Parent.JurnalId " _
                 & "FROM tblPermTransJournal_Parent INNER JOIN tblTempTransJournal_Child ON tblPermTransJournal_Parent.JurnalIdTemp = tblTempTransJournal_Child.JurnalId " _
                 & "WHERE tblPermTransJournal_Parent. JurnalIdTemp=" & rst!JurnalId _
                 & " ORDER BY tblTempTransJournal_Child. NoUrut;"
      DoCmd.RunSQL "DELETE tblTempTransJournal_Child.* FROM tblTempTransJournal_Child WHERE JurnalId = " & rst!JurnalId
      DoCmd.RunSQL "DELETE tblTempTransJournal_Parent.* FROM tblTempTransJournal_Parent WHERE JurnalId = " & rst!JurnalId & " and Proses =-1"
       rst.MoveNext
      Loop
      Application.SetOption ("Confirm Action Queries"), True 
    'penyelesaian
      rst.Close
      Set rst = Nothing
      Me.frmPostingSubForm.Requery
    End Sub
  13. Pada bagian form header dari frmPosting, sisipkan text box status login pengguna, tanggal, waktu, dan judul. Mengenai caranya, silakan lihat pada bab yang terdahulu.
  14. Aturlah properti form frmPosting:
    1. Record Selectors = No
    2. Navigation Buttons = No
    3. On Open=[Event Procedure]:
      Private Sub Form_Open(Cancel As Integer)
         Me.Caption = "Posting ke Buku Besar " & Nz(IdPerusahaan("Nama"), "")
         If Not IsNull(Me.LoginPgn) Then Me.logout.Visible = True
      End Sub
    4. On Close=[Event Procedure]:
      Private Sub Form_Close()
          Form_frmMenus.Visible = True
      End Sub
Gambar 3
Hasil akhir form frmPosting dalam Design view tampak pada Gambar 3, sedangkan Gambar 4 adalah  Form view. Pemrosesan jurnal secara batch, seperti telah dijelaskan dimuka, akan mengelompokkan jurnal berdasarkan urutan waktu tertentu dan tipe jurnal tertentu, seperti tampak pada Gambar 4.

Gambar 4
Pada saat menekan tombol Posting ke Buku Besar, Access akan melakukan pemeriksaan satu per satu, apakah jurnal yang masuk dalam daftar dapat diproses atau tidak. Pemeriksaan itu dilakukan melalui prosedur Private Sub Posting_Click(). Jika ada ketidakberesan, maka Access akan menampilkan pesan kesalahan, dan proses dibatalkan. Sebaliknya, jika pemeriksaan Jurnal Transaksi Temporer tidak menemukan ketidakberesan, maka jurnal akan diproses dan dipindahkan ke (tabel) Jurnal Transaksi Permanen, data Jurnal Transaksi Temporer yang sudah diposting kemudian dihapus. Di Jurnal Transaksi Permanen, jurnal sudah dikunci sehingga tidak dapat diedit dan dihapus. Jika ingin melakukan pembetulan, kita harus membuat jurnal baru.

Comments

Posting Terpopuler

Normalisasi, Denormalisasi, dan Anomali Database

Membuat Relasi Database

Menampilkan Data MySQL dalam Form di Access