Skip to main content

Membuat Laporan Pertanggungjawaban Biaya

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:
  1. Periode, seperti yang ada pada gambar Gambar 1.
  2. Combo box Deriv1, Row Source=tblRekDerivatif1
  3. Combo box Bulan, Row Source Type=Value List, Row Source dibiarkan kosong
  4. Combo box Tahun, Row Source Type=Value List, Row Source dibiarkan kosong.
  5. Tombol perintah Proses, untuk memproses pembuatan laporan serta menampilkannya di subform.
  6. 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:
  1. 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;
  2. Default View=Continous Form
  3. Record Selectors=No
  4. Record Navigations=No
  5. Allow Additions=No
  6. Allow Deletions=No
Selanjutnya, dengan menggunakan record source yang ada di atas, kita akan menyisipkan form control berikut ini pada bagian form detail:
  1. Combo box KodeRek, dengan properti Row Source=tblRekUtama
  2. 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:
  1. TotalBudgetBlnIni=sum(BudgetBlnIni),
  2. TotalAktualBlnIni=sum(AktualBlnIni)
  3. TotalSelisihBlnIni=[TotalBudgetBlnIni]-[TotalAktualBlnIni]
  4. TotalSelisihBlnIniPct= IIf([TotalSelisihBlnIni]=0,0,IIf([TotalBudgetBlnIni]=0,-1,[TotalSelisihBlnIni]/[TotalBudgetBlnIni]))
  5. TotalBudgetSSIni=sumBudgetSSIni)
  6. TotalAktualSSIni=sum(AktualSSIni).
  7. TotalSelisihSSIni =[TotalBudgetSSini]-[TotalAktualSSini]
  8. 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

Posting Terpopuler

Normalisasi, Denormalisasi, dan Anomali Database

Membuat Relasi Database

Menampilkan Data MySQL dalam Form di Access