Jajaran manajemen perusahaan biasanya ingin mengetahui prestasi di divisi, departemen, atau bahkan pada level yang lebih rendah, seksi (misal seksi gudang, seksi dapur, dsb), yaitu dengan mengukur seberapa baiknya mereka mengendalikan biaya yang ada di bawah tanggung jawab masing-masing departemen. Dalam praktek, kemampuan suatu bagian untuk mengendalikan biaya ini disebut dengan cost responsibility, atau pertanggungjawaban biaya. Sedangkan laporan yang dipakai, tentu saja bernama cost responsibilty report. Laporan ini berisi rincian biaya yang telah dikeluarkan oleh setiap departemen dalam satu periode waktu. Umumnya, periode yang digunakan adalah bulan. Sebagai pembanding, perusahaan bisa menggunakan biaya yang disusun sesuai dengan anggaran periode yang berlaku, atau dengan membandingkan biaya bulan tertentu pada periode berjalan dengan biaya bulan tertentu pada periode yang lalu, dan sebagainya.
Kode Rek Utama | Nama Rekening | Bulan Ini (This Month) | Sampai Saat Ini (Year To Date) |
Budget | Aktual | Selisih | Budget | Aktual | Selisih |
Jumlah | Persen | Jumlah | Persen |
601 | Gaji | 7,823 | 7,800 | 23 | 0.29% | 54,556 | 52,812 | 1,744 | 3.20% |
610 | Biaya bensin/solar/olie | 2,781 | 2,900 | -119 | -4.28% | 19,468 | 19,921 | -453 | -2.33% |
611 | Biaya Perjalan Dinas | 9,132 | 9,120 | 12 | 0.13% | 63,923 | 65,212 | -1,289 | -2.02% |
617 | Electricity | 7,663 | 7,120 | 543 | 7.09% | 53,643 | 51,021 | 2,622 | 4.89% |
620 | Alat tulis/peralatan kantor | 2,092 | 1,987 | 105 | 5.02% | 14,641 | 12,012 | 2,629 | 17.96% |
623 | Benda-benda Pos | 3,047 | 3,123 | -76 | -2.49% | 21,332 | 23,013 | -1,681 | -7.88% |
640 | Commercial expense | 9,270 | 8,218 | 1,052 | 11.35% | 64,888 | 60,218 | 4,670 | 7.20% |
691 | Biaya entertainment | 6,523 | 5,621 | 902 | 13.83% | 45,663 | 46,212 | -549 | -1.20% |
Total | 48,331 | 45,889 | 2,442 | 5.05% | 338,114 | 330,421 | 7,693 | 2.28% |
Tabel di atas adalah contoh laporan pertanggungjawaban biaya di bagian Marketing yang berisi biaya-biaya apa saja yang telah dikeluarkan selama satu bulan (kolom “bulan ini”) dan satu periode sampai dengan bulan ini (kolom “sampai saat ini”) yang dihitung dari dimulainya periode akuntansi. Di situ terlihat perbandingan antara jumlah budget dan aktual pemakaian beserta varians atau selisih. Bila selisih bertanda negatif, berarti pemakaian biaya lebih besar dari pada yang dianggarkan, atau istilah keuangannya disebut overbudget. Overbudget ini bisa disebabkan banyak hal, mulai dari volume operasi aktual yang memang lebih besar dari yang dianggarkan, sampai dengan adanya pengaruh makro (kenaikan kurs, kenaikan bahan bakar minyak, dan sebagainya). Yang penting, penyebab overbudget bisa dijelaskan dan ada solusinya.
Pembuatan tabel di atas terlihat sederhana bila menggunakan aplikasi spreadsheet Excel, tetapi memerlukan banyak tahapan bila dikerjakan dengan menggunakan Access. Berikut ini adalah tahapan dalam membuat laporan pertanggungjawaban biaya.
Mengabungkan Data Aktual dengan Budget
Setelah data budget tersedia di tblBudget seperti telah dijelaskan di posting tentang budget, maka kita dapat membuat laporan perbandingan antara data aktual yang tersedia di tabel jurnal transaksi permanen dengan data budget. Data aktual kita ambil dari qryPermTransJurnal. Laporan perbandingan ini, yang merupakan laporan pertanggungjawaban biaya, dibuat dengan menggunakan query yang dilakukan secara bertahap dan bertingkat, dari level yang paling detail, kemudian diringkas menjadi laporan seperti yang tersaji pada Gambar 2. Untuk itu kita harus membuat form yang berisi kriteria yang diinginkan. Kriteria itu terdiri dari:
- Periode, seperti yang ada pada gambar Gambar 1.
- Combo box Deriv1, Row Source=tblRekDerivatif1
- Combo box Bulan, Row Source Type=Value List, Row Source dibiarkan kosong
- Combo box Tahun, Row Source Type=Value List, Row Source dibiarkan kosong.
- Tombol perintah Proses, untuk memproses pembuatan laporan serta menampilkannya di subform.
- Subform frmResponBiayaDetail, unbound (Source Object dibiarkan kosong).
|
Gambar 1 |
Tampilan form dalam Design view akan tampak seperti pada Gambar 1. Kotak di bagian form detail yang tertulis unbound merupakan subform yang akan kita buat selanjutnya. Simpanlah form ini dengan nama frmResponBiaya. Berikutnya, salinlah kode VBA di bawah ini ke dalam Frm_ frmResponBiaya.
Option Compare Database
Private Function HapusResponBudget()
Me.frmResponBiayaDetail.SourceObject = ""
HapusObjekYgTidakPerlu "tblPertanggungBiaya"
HapusObjekYgTidakPerlu "tblBudgetAktualYTD"
HapusObjekYgTidakPerlu "tblBudgetAktualBulan"
HapusObjekYgTidakPerlu "qry02BgtAktualBudget"
HapusObjekYgTidakPerlu "qry02BgtAktualAktual"
HapusObjekYgTidakPerlu "qry01BgtAktualBudgettbl1"
HapusObjekYgTidakPerlu "qry01BgtAktualBudgettbl"
HapusObjekYgTidakPerlu "qry01BgtAktualBudget"
HapusObjekYgTidakPerlu "qry01BgtAktualAktual"
End Function
Private Sub Form_Close()
Form_frmMenus.Visible = True
HapusResponBudget
End Sub
Private Sub Form_Open(Cancel As Integer)
Dim bulanMin, bulanMax, tahunMin, tahunMax, n As Integer
Dim namaBulan, strBulan As Variant
Dim strTahun As Variant
If IjinDitolak(Me.Name) Then
MsgBox TampilkanLogin & " tidak bisa mengakses menu/form ini"
Cancel = True
Exit Sub
End If
Me.Caption = "Laporan Pertanggungjawaban Biaya " & Nz(IdPerusahaan("Nama"), "")
If Not IsNull(Me.LoginPgn) Then Me.logout.Visible = True
namaBulan = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Des")
bulanMin = Month(CekPeriodeTanggal(TglAwalThn))
bulanMax = Month(CekPeriodeTanggal(TglAkhirThn))
If bulanMax < bulanMin Then bulanMax = 12
For n = bulanMin To bulanMax
If n > bulanMin And n <= bulanMax Then strBulan = strBulan & ";"
strBulan = strBulan & CVar(n) & ";" & namaBulan(n - 1)
Next n
If bulanMin <> 1 Then
For n = 1 To bulanMin - 1
If n < bulanMin Then strBulan = strBulan & ";"
strBulan = strBulan & CVar(n)& ";" & namaBulan(n - 1)
Next n
End If
Me.Bulan.DefaultValue = Month(CekPeriodeTanggal (TglAwalBulan))
Me.Bulan.RowSource = strBulan
Me.drTglTransaksi = CekPeriodeTanggal(TglAwalThn)
Me.sdTglTransaksi = CekPeriodeTanggal(TglAkhirThn)
Me.PeriodeAkuntansi = CekPeriodeTanggal(TglAwalThn)
sdTglTransaksi_AfterUpdate
End Sub
Private Sub Proses_Click()
If Format(Me.drTglTransaksi, "yyyy") & Format(Me.drTglTransaksi, "mm") > CStr(Me.Tahun) & Format(Me.Bulan, "00") Then
MsgBox "Bulan yang dimasukkan lebih kecil dari pada tgl transaksi"
Exit Sub
End If
Me.frmResponBiayaDetail.SourceObject = ""
DoCmd.SetWarnings False
strSqla = "SELECT KodeGabung, KodeRek, Deriv1, Deriv2, NamaRek, Sum(qryPermTransJurnal.Selisih) AS Jumlah " _
& "FROM qryPermTransJurnal WHERE Periode = '" & CStr(Me.Tahun) & Format(Me.Bulan, "00") _
& "' GROUP BY KodeGabung, KodeRek, Deriv1, Deriv2, NamaRek " _
& "HAVING qryPermTransJurnal.Deriv1= '" & Me.Deriv1 & "';"
BuatQuery "qry01BgtAktualAktual", strSqla
strSqla = "SELECT [Koderek] & [deriv1] & [deriv2] AS KodeGabung, KodeRek, Deriv1, Deriv2, Sum(tblBudget.JumlahBudget) AS JumlahBudget " _
& "FROM tblBudget WHERE (Format([Tahun], '0000') & Format([Bulan], '00')) = '" _
& Format(Me.Tahun, "0000") & Format(Me.Bulan, "00") _
& "' GROUP BY [Koderek] & [deriv1] & [deriv2], KodeRek, Deriv1, Deriv2 " _
& "HAVING Deriv1='" & Me.Deriv1 & "';"
BuatQuery "qry01BgtAktualBudget", strSqla
strSqla = "SELECT KodeGabung, qry01BgtAktualBudget.KodeRek, qry01BgtAktualBudget.Deriv1, qry01BgtAktualBudget.Deriv2, Sum(IIf([JumlahBudget] Is Null,0,[JumlahBudget])) AS Budget, " _
& "Sum(IIf([Jumlah] Is Null,0,[Jumlah])) AS Aktual INTO tblBudgetAktualBulan FROM qry01BgtAktualBudget " _
& "LEFT JOIN qry01BgtAktualAktual ON qry01BgtAktualBudget.KodeGabung = qry01BgtAktualAktual.KodeGabung " _
& "GROUP BY qry01BgtAktualBudget.KodeGabung, qry01BgtAktualBudget.KodeRek, qry01BgtAktualBudget.Deriv1, " _
& "qry01BgtAktualBudget.Deriv2 ORDER BY qry01BgtAktualBudget.KodeGabung;"
BuatQuery "qry01BgtAktualBudgettbl", strSqla
DoCmd.RunSQL strSqla
strSqla = "INSERT INTO tblBudgetAktualBulan ( KodeGabung, KodeRek, Deriv1, Deriv2, Budget, Aktual ) " _
& "SELECT qry01BgtAktualAktual.KodeGabung, qry01BgtAktualAktual.KodeRek, qry01BgtAktualAktual.Deriv1, qry01BgtAktualAktual.Deriv2, Sum(IIf([JumlahBudget] Is Null,0,[JumlahBudget])) AS Budget, " _
& "Sum(IIf([Jumlah] Is Null,0,[Jumlah])) AS Aktual FROM qry01BgtAktualBudget RIGHT JOIN qry01BgtAktualAktual " _
& "ON qry01BgtAktualBudget.KodeGabung = qry01BgtAktualAktual.KodeGabung " _
& "WHERE qry01BgtAktualBudget.JumlahBudget Is Null GROUP BY qry01BgtAktualAktual.KodeGabung, " _
& "qry01BgtAktualAktual.KodeRek, qry01BgtAktualAktual.Deriv1, qry01BgtAktualAktual.Deriv2 " _
& "ORDER BY qry01BgtAktualAktual.KodeGabung;"
BuatQuery "qry01BgtAktualBudgettbl1", strSqla
DoCmd.RunSQL strSqla
strSqla = "SELECT KodeGabung, KodeRek, Deriv1, Deriv2, NamaRek, Sum(qryPermTransJurnal.Selisih) AS Jumlah " _
& "FROM qryPermTransJurnal WHERE Periode Between " & Format(Me.drTglTransaksi, "yyyy") & Format(Me.drTglTransaksi, "mm") _
& " And " & CStr(Me.Tahun) & Format(Me.Bulan, "00") & " GROUP BY KodeGabung, KodeRek, Deriv1, Deriv2, NamaRek " _
& " HAVING qryPermTransJurnal.Deriv1= '" & Me.Deriv1 & "';"
BuatQuery "qry02BgtAktualAktual", strSqla
strSqla = "SELECT KodeGabung, KodeRek, Deriv1, Deriv2, Sum(qryBudget.JumlahBudget) AS Jumlah " _
& "FROM qryBudget WHERE Format([tahun],'0000') & Format([bulan],'00') Between " _
& Format(Me.drTglTransaksi, "yyyy") & Format(Me.drTglTransaksi, "mm") & " And " & CStr(Me.Tahun) & Format(Me.Bulan, "00") _
& " GROUP BY KodeGabung, KodeRek, Deriv1, Deriv2 HAVING Deriv1= '" & Me.Deriv1 & "';"
BuatQuery "qry02BgtAktualBudget", strSqla
strSqla = "SELECT qry02BgtAktualBudget.KodeGabung, qry02BgtAktualBudget.KodeRek, qry02BgtAktualBudget.Deriv1, qry02BgtAktualBudget.Deriv2, Sum(IIf([qry02BgtAktualBudget].[Jumlah] Is Null,0,[qry02BgtAktualBudget].[Jumlah])) AS Budget, " _
& "Sum(IIf([qry02BgtAktualAktual].[Jumlah] Is Null,0,[qry02BgtAktualAktual].[Jumlah])) AS Aktual INTO tblBudgetAktualYTD FROM qry02BgtAktualBudget " _
& "LEFT JOIN qry02BgtAktualAktual ON qry02BgtAktualBudget.KodeGabung = qry02BgtAktualAktual.KodeGabung " _
& "GROUP BY qry02BgtAktualBudget.KodeGabung, qry02BgtAktualBudget.KodeRek, qry02BgtAktualBudget.Deriv1, " _
& "qry02BgtAktualBudget.Deriv2;"
DoCmd.RunSQL strSqla
strSqla = "INSERT INTO tblBudgetAktualYTD ( KodeGabung, KodeRek, Deriv1, Deriv2, Budget, Aktual ) " _
& "SELECT qry02BgtAktualAktual.KodeGabung, qry02BgtAktualAktual.KodeRek, qry02BgtAktualAktual.Deriv1, qry02BgtAktualAktual.Deriv2, Sum(IIf([qry02BgtAktualBudget].[Jumlah] Is Null,0,[qry02BgtAktualBudget].[Jumlah])) AS Budget, " _
& "Sum(IIf([qry02BgtAktualAktual].[Jumlah] Is Null,0,[qry02BgtAktualAktual].[Jumlah])) AS Aktual FROM qry02BgtAktualBudget RIGHT JOIN qry02BgtAktualAktual " _
& "ON qry02BgtAktualBudget.KodeGabung = qry02BgtAktualAktual.KodeGabung " _
& "WHERE (((qry02BgtAktualBudget.Jumlah) Is Null)) GROUP BY qry02BgtAktualAktual.KodeGabung, " _
& "qry02BgtAktualAktual.KodeRek, qry02BgtAktualAktual.Deriv1, qry02BgtAktualAktual.Deriv2;"
DoCmd.RunSQL strSqla
DoCmd.RunSQL "SELECT tblBudgetAktualBulan.KodeGabung, tblBudgetAktualBulan.KodeRek, tblBudgetAktualBulan.Deriv1, " _
& "tblBudgetAktualBulan.Deriv2, Sum(tblBudgetAktualBulan.Budget) AS BudgetBlnIni, " _
& "Sum(tblBudgetAktualBulan.Aktual) AS AktualBlnIni, Sum(IIf([tblBudgetAktualYTD].[budget] Is Null, " _
& "0,[tblBudgetAktualYTD].[budget])) AS BudgetSSini, Sum(IIf([tblBudgetAktualYTD].[aktual] Is Null, " _
& "0,[tblBudgetAktualYTD].[aktual])) AS AktualSSIni, " & Val(Me.Bulan) & " AS Bulan, " _
& Val(Me.Tahun) & " AS Tahun INTO tblPertanggungBiaya FROM tblBudgetAktualBulan" _
& " LEFT JOIN tblBudgetAktualYTD ON tblBudgetAktualBulan.KodeGabung = tblBudgetAktualYTD.KodeGabung " _
& "GROUP BY tblBudgetAktualBulan.KodeGabung, tblBudgetAktualBulan.KodeRek, tblBudgetAktualBulan.Deriv1, " _
& "tblBudgetAktualBulan.Deriv2, " & Val(Me.Bulan) & ", " & Val(Me.Tahun) _
& " ORDER BY tblBudgetAktualBulan.KodeGabung;"
DoCmd.RunSQL "INSERT INTO tblPertanggungBiaya ( KodeGabung, KodeRek, Deriv1, Deriv2, BudgetBlnIni, AktualBlnIni, " _
& "BudgetSSIni, AktualSSIni, Bulan, Tahun ) SELECT tblBudgetAktualYTD.KodeGabung, tblBudgetAktualYTD.KodeRek, " _
& "tblBudgetAktualYTD.Deriv1, tblBudgetAktualYTD.Deriv2, Sum(IIf([tblBudgetAktualBulan].[Budget] Is Null, " _
& "0,[tblBudgetAktualBulan].[budget])) AS BudgetBlnIni, Sum(IIf([tblBudgetAktualBulan].[Aktual] Is Null, " _
& "0,[tblBudgetAktualBulan].[aktual])) AS AktualBlnIni, Sum(tblBudgetAktualYTD.Budget) AS BudgetSSIni, " _
& "Sum(tblBudgetAktualYTD.Aktual) AS AktualSSIni, " & Val(Me.Bulan) & " AS Bulan, " _
& Val(Me.Tahun) & " AS Tahun FROM tblBudgetAktualBulan RIGHT JOIN tblBudgetAktualYTD " _
& "ON tblBudgetAktualBulan.KodeGabung = tblBudgetAktualYTD.KodeGabung " _
& "WHERE (((tblBudgetAktualBulan.Budget) Is Null) And ((tblBudgetAktualBulan.Aktual) Is Null)) " _
& "GROUP BY tblBudgetAktualYTD.KodeGabung, tblBudgetAktualYTD.KodeRek, tblBudgetAktualYTD.Deriv1, " _
& "tblBudgetAktualYTD.Deriv2, " & Val(Me.Bulan) & ", " & Val(Me.Tahun) _
& " ORDER BY tblBudgetAktualYTD.KodeGabung;"
DoCmd.SetWarnings True
Me.frmResponBiayaDetail.SourceObject = "frmResponBiayaDetail"
Me.frmResponBiayaDetail.Requery
End Sub
Private Sub sdTglTransaksi_AfterUpdate()
tahunMin = Year(Me.drTglTransaksi)
tahunMax = Year(Me.sdTglTransaksi)
For n = tahunMin To tahunMax
Jumlah = DCount("[TglTransaksi]", "tblPermTransJournal_Parent", "Year([TglTransaksi])=" & n)
If Jumlah > 0 Then 'strTahun = strTahun & ";"
If n > tahunMin And n <= tahunMax Then strTahun = strTahun & ";"
strTahun = strTahun & CVar(n)
End If
Next n
Me.Tahun.DefaultValue = Year(CekPeriodeTanggal(TglAwalBulan))
Me.Tahun.RowSource = strTahun
End Sub
Private Sub txtPeriodeAkuntansi_Click()
Me.drTglTransaksi = Format(Me.PeriodeAkuntansi.[Column](0), Me.drTglTransaksi.Format)
Me.sdTglTransaksi = Format(Me.PeriodeAkuntansi.[Column](1), Me.sdTglTransaksi.Format)
sdTglTransaksi_AfterUpdate
End Sub
Membuat Subform untuk frmResponBiaya
Untuk menampilkan detail laporan pertanggungjawaban, kita harus membuat subform dengan nama frmResponBiayaDetail. Kita dapat membuat form ini dengan menggunakan Blank Form atau Form Design. Adapun properti untuk form frmResponBiaya ini adalah sebagai berikut:
- Record Source, isikan query ini:
SELECT tblPertanggungBiaya.KodeRek, Sum(tblPertanggungBiaya.BudgetBlnIni) AS BudgetBlnIni, Sum(tblPertanggungBiaya.AktualBlnIni) AS AktualBlnIni, Sum(tblPertanggungBiaya.BudgetSSini) AS BudgetSSini, Sum(tblPertanggungBiaya.AktualSSIni) AS AktualSSIni, [BudgetBlnIni]-[AktualBlnIni] AS SelisihBlnIni, IIf([SelisihBlnIni]=0,0,IIf([budgetblnini]=0,-1,[SelisihBlnIni]/[BudgetBlnIni])) AS SelisihBlnIniPct, [BudgetSSIni]-[AktualSSIni] AS SelisihSSIni, IIf([BudgetSSIni]=0,IIf([AktualSSIni]=0,0,-1),[SelisihSSIni]/[BudgetSSIni]) AS SelisihSSIniPcts, IIf([SelisihSSIni]=0,0,IIf([BudgetSSIni]=0,-1,[SelisihSSIni]/[BudgetSSIni])) AS SelisihSSIniPct FROM tblPertanggungBiaya GROUP BY tblPertanggungBiaya.KodeRek;
- Default View=Continous Form
- Record Selectors=No
- Record Navigations=No
- Allow Additions=No
- Allow Deletions=No
Selanjutnya, dengan menggunakan record source yang ada di atas, kita akan menyisipkan form control berikut ini pada bagian form detail:
- Combo box KodeRek, dengan properti Row Source=tblRekUtama
- Text box NamaRekening (untuk menampilkan nama rekening pada combo box KodeRek), BudgetBlnIni, AktualBlnIni, SelisihBlnIni, SelisihBlnIniPct, BudgetSSIni, AktualSSIni, SelisihSSIni, SelisihSSIniPct
Sedangkan pada bagian footer, buatlah text box berikut ini yang merupakan penjumlahan:
- TotalBudgetBlnIni=sum(BudgetBlnIni),
- TotalAktualBlnIni=sum(AktualBlnIni)
- TotalSelisihBlnIni=[TotalBudgetBlnIni]-[TotalAktualBlnIni]
- TotalSelisihBlnIniPct= IIf([TotalSelisihBlnIni]=0,0,IIf([TotalBudgetBlnIni]=0,-1,[TotalSelisihBlnIni]/[TotalBudgetBlnIni]))
- TotalBudgetSSIni=sumBudgetSSIni)
- TotalAktualSSIni=sum(AktualSSIni).
- TotalSelisihSSIni =[TotalBudgetSSini]-[TotalAktualSSini]
- TotalSelisihSSIniPct=IIf([TotalSelisihSSIni]=0,0,IIf([TotalBudgetSSIni]=0,-1,[TotalSelisihSSIni]/[TotalBudgetSSIni]))
|
Gambar 2 |
|
Gambar 3 |
Design view lengkap dari subform ini dapat dilihat pada Gambar 2. Pada kolom selisih, baik selisih bulan ini maupun sampai saat ini, untuk memberikan informasi yang lebih fokus, kita dapat mengaplikasikan
conditional formatting. Conditional formatting yang diinginkan adalah apabila selisih yang muncul berangka negatif atau lebih kecil dari nol, yang berarti item pada laporan itu memerlukan perhatian. Untuk mengaplikasikan conditional formatting ini cukup mudah, pilihlah tab Design grup Font dan klik Conditional. Setelah itu aturlah sesuai dengan Gambar 4, yaitu
Condition 1,
Field Value Is less than 0, pilihlah Font Color warna merah. Setelah itu klik OK. Terakhir, jangan lupa untuk menyimpan form frmResponBiayaDetail.
|
Gambar 4 |
Menampilkan Laporan Pertanggungjawaban Biaya dalam Bentuk Report
Salah satu keuntungan tampilan Continous Form pada properti Default View sebuah form adalah mudahnya menyalin form control yang ada di form itu ke dalam sebuah report. Contohnya adalah form frmResponBiayaDetail di mana kita bisa menyalin form header ke report page header, form detail ke report detail, dan form footer ke report footer. Untuk record source, kita juga bisa mengkopi record source yang ada pada frmResponBiayaDetail. Demikian juga untuk kriteria, kita bisa mengkopi kriteria yang ada di form header dari frmResponBiaya ke page header. Tampilan report dalam Report view dapat dilihat pada Gambar 3. Simpanlah report ini dengan nama rptResponBiaya.
Comments
Post a Comment