Skip to main content

Form Dialog Cetak Buatan Sendiri ini Lebih Canggih Daripada Buatan Access

Judul posting kali ini cukup menantang dan provokatif. Apa iya ada form dialog cetak yang lebih canggih dari buatan Microsoft Access? Jawabannya, iya bisa. Kita bisa membuat sendiri form dialog untuk mencetak report yang ada di Access.
Form View dari form cetak yang diaplikasikan untuk mencetak Voucher.
Keunggulan form dialog cetak yang dibuat sendiri ini antara lain:
  1. Bisa mencetak report sesuai dengan record yang diinginkan. Bila selama ini kita, misalnya menggunakan perintah dari record 1-7 (nomor 1 sampai nomor 7), maka dengan form ini kita bisa mencetak record sembarang, misalnya 1-7 (nomor 1 sampai nomor 7), 9 (nomor 9), 13 (nomor 13), dst.
  2. Bisa mencetak report sesuai dengan halaman yang diinginkan. Sama seperti di atas, bila selama ini kita, misalnya menggunakan perintah dari halaman 1-7 (halaman 1 sampai halaman 7), maka dengan form ini kita bisa mencetak halaman sembarang, misalnya 1-7 (halaman 1 sampai halaman 7), 9 (halaman 9), 13 (halaman 13), dst. Mirip seperti menuliskan halaman di Word.
  3. Ada keunggulan lain yang bisa ditambahkan sesuai dengan keinginan kita, misalnya dengan menambahkan properti margin.
Lalu bagaimana cara membuatnya? Well, jawabannya, ikuti petunjuk berikut ini.

Terlebih dahulu, ikuti petunjuk yang ada di posting berikut ini:
  1. Fungsi Untuk Membuat Daftar Printer di Access VBA
  2. Fungsi Untuk Membuat Daftar Ukuran Kertas di Access VBA
  3. Membuat Fungsi Untuk Daftar Paper Tray/Bin (Tempat Kertas Printer)
Setelah itu, untuk memulai, kita menggunakan form Form1 yang ada di posting Membuat Fungsi Untuk Daftar Paper Tray/Bin (Tempat Kertas Printer). Untuk memudahkan pemahaman, kita rename dulu nama form Form1 menjadi frmCetak. Setelah itu, sisipkan sejumlah kontrol berikut ini ke dalam form frmCetak.
Design View form frmCetak secara keseluruhan
  1. Option group, lihat gambar bawah, dengan properti Name= fraPilihRecord (1), dengan dua option button dan satu text box sebagai berikut:
    1. Properti option button 1: Name= optRecordYgAktif (2), Option Value= 0. Properti untuk label yang melekat pada option optRecordYgAktif: Name= lblRecordYgAktif (3), Caption= Record Yang Aktif.
    2. Properti option button 2: Name= optRecordDlmRange (4), Option Value= 1. Properti untuk label yang melekat pada option optRecordDlmRange: Caption= Record Sebagai Berikut.
    3. Di dalam Option Group frmPilihRecord, sisipkan sebuah text box di samping label yang mempunyai Caption= Record Sebagai Berikut. Properti text box adalah sebagai berikut: Name= txtRange (5).
      Bagian-bagian dari option group fraPilihRecord
  2. Pada bagian kanan form frmCetak, kita sisipkan option group lainnya dengan properti Name= fraOrientasi, dengan dua option button sebagai berikut:
    1. Properti option button 1: Name= optPotrait, Option Value= 1. Properti untuk label yang melekat pada option optPotrait: Name= lblPotrait, Caption= Potrait.
    2. Properti option button 2: Name= optLandscape, Option Value= 2. Properti untuk label yang melekat pada option optLandscape: Name= lblLandscape, Caption= Landscape.
  3. Di bawah option group fraOrientasi, sisipkan sebuah check box dengan properti Name= cbxCetakDatanyaSaja. Properti label yang melekat check box ini, Caption= Cetak Datanya Saja (abaikan format, label, dan sejenisnya).
  4. Di bawah combo box cbbPaperBin, sisipkan sebuah text box dengan properti: Name= txtSalinan. Properti label yang melekat text box ini, Caption= Jumlah Salinan.
  5. Di bawah text box txtSalinan, sisipkan sebuah text box dengan properti: Name= txtHalamanDlmRange. Properti label yang melekat text box ini, Caption= Halaman Sebagai Berikut.
  6. Sisipkan empat buah tombol perintah atau command button dengan rincian properti sebagai berikut:
    1. Tombol perintah 1: Name= cmdPrintPreview, Caption= Print Preview
    2. Tombol perintah 2: Name= cmdReportView, Caption= Report View
    3. Tombol perintah 3: Name= cmdCetak, Caption= Cetak
    4. Tombol perintah 4: Name= cmdBatal, Caption= Batal/Tutup
Berikut ini adalah kode yang harus ditambahkan di modul mdlPrinter:
  1. Function aturPrintPreview(strRptName As StringOptional intModeWindow As AcWindowMode = acWindowNormal, _  
  2.                           Optional boolCetakLaporan As Boolean = False)  
  3.   Dim lngHalaman As Variant  
  4.   Dim strSelectedPage As String  
  5.   Dim strNamaPrinter As String  
  6.   Dim n As Integer  
  7.   Dim prtApp As Printer  
  8.   Dim strPrinter As String, strPaperSize As String, strPaperBin As String, _  
  9.               intCopies As Integer, intOrientation As Integer, boolDataOnly As Boolean  
  10.   Dim intNomorUkuranKertas, intNomorPaperBin As Integer  
  11.   
  12. On Error GoTo Err_Msg  
  13.   DoCmd.OpenReport strRptName, acPreview, , , intModeWindow  
  14.   With Form_frmCetak  
  15.     strNamaPrinter = .cbbPrinter  
  16.     strPrinter = IIf(IsNull(.cbbPrinter), .cbbPrinter.ItemData(1), .cbbPrinter)  
  17.     strPaperSize = IIf(IsNull(.cbbUkuranKertas), .cbbUkuranKertas.ItemData(1), .cbbUkuranKertas)  
  18.     If IsNull(.cbbUkuranKertas) Then  
  19.       .cbbUkuranKertas = .cbbUkuranKertas.ItemData(1)  
  20.     End If  
  21.     intNomorUkuranKertas = .cbbUkuranKertas.Column(0)  
  22.     If Not IsNull(.cbbPaperBin.Column(0)) Then  
  23.       intNomorPaperBin = .cbbPaperBin.Column(0)  
  24.       strPaperBin = .cbbPaperBin.ItemData(1)  
  25.     End If  
  26.     intCopies = IIf(IsNull(.txtSalinan), 1, .txtSalinan)  
  27.     intOrientation = .fraOrientasi  
  28.     boolDataOnly = .cbxCetakDatanyaSaja  
  29.   End With  
  30.     ' Get selected printer and set user-specified settings  
  31.   Set prtApp = Application.Printers(menghitungUrutanPrinter(strPrinter))  
  32.   With prtApp  
  33.     .PaperSize = intNomorUkuranKertas  
  34.     .PaperBin = intNomorPaperBin  
  35.     .Copies = intCopies  
  36.     .Orientation = intOrientation  
  37.     .DataOnly = boolDataOnly  
  38.   End With  
  39.   ' Set report's printer to selected printer.  
  40.   Reports(strRptName).Printer = prtApp  
  41.   'Exit Function  
  42.   If boolCetakLaporan Then  
  43.     cetakLaporan strRptName  
  44.     DoCmd.Close acReport, strRptName  
  45.   End If  
  46.       
  47. Exit_Function:  
  48.     Exit Function  
  49.       
  50. Err_Msg:  
  51.     MsgBox Err.description, vbCritical & vbOKOnly, _  
  52.         "Error Number " & Err.Number & " Occurred"  
  53.     Resume Exit_Function  
  54. End Function  
  55.   
  56. Function cetakLaporan(strRptName As String)  
  57.   Dim lngHalaman As Variant  
  58.   Dim i, n As Integer  
  59.   Dim strItem As Variant  
  60.   Dim strPrinterPengecualian() As Variant  
  61. On Error GoTo Err_Msg  
  62.   With Form_frmCetak  
  63. 'dua pernyataan di bawah ini saling berkaitan,  
  64.     ReDim Preserve strPrinterPengecualian(2) 'Bila nilai strPrinterPengecualian ada sejumlah X item, maka item Array() di bawah ini juga harus ada sejumlah X.  
  65.     strPrinterPengecualian = Array("PDF""XPS"'Isikan nilai item Array() sejumlah nilai strPrinterPengecualian di atas.  
  66.       
  67.     For i = LBound(strPrinterPengecualian) To UBound(strPrinterPengecualian)  
  68.       If InStr(1, .cbbPrinter, CStr(strPrinterPengecualian(i))) <> 0 Then  
  69.         If Not IsNull(.txtHalamanDlmRange) Then  
  70.           strMsg = "Format " & strPrinterPengecualian(i) & " hanya bisa digunakan untuk menyimpan semua halaman dalam satu file"  
  71.           strMsg = strMsg & vbCrLf & "Simpan semua halaman dalam satu file?"  
  72.           If MsgBox(strMsg, vbYesNo) = vbNo Then Exit Function  
  73.         End If  
  74.         DoCmd.PrintOut  
  75.         Exit Function  
  76.       End If  
  77.     Next i  
  78.     If IsNull(.txtHalamanDlmRange) Then  
  79.       lngHalaman = Array(1)  
  80.       DoCmd.PrintOut  
  81.       Exit Function  
  82.     Else  
  83.       lngHalaman = Split(mengaturKriteriaHalaman, ",")  
  84.     End If  
  85.     
  86.     For n = LBound(lngHalaman) To UBound(lngHalaman)  
  87.       If InStr(1, lngHalaman(n), "-") <> 0 Then  
  88.         strItem = Split(lngHalaman(n), "-")  
  89. Debug.Print CLng(strItem(0))  
  90.         If Not IsNumeric(Trim(strItem(0))) And Not IsNumeric(Trim(strItem(1))) Then  
  91.           MsgBox "Nilai yang dimasukkan bukan angka", vbExclamation  
  92.           Cancel = True  
  93.           Exit Function  
  94.         End If  
  95.         If CInt(Trim(strItem(0))) > CInt(Trim(strItem(1))) Then  
  96.           MsgBox Trim(strItem(0)) & " harus lebih kecil dari " & (Trim(strItem(1))), vbExclamation  
  97.           Cancel = True  
  98.           Exit Function  
  99.         End If  
  100.         For i = CInt(Trim(strItem(0))) To CInt(Trim(strItem(1)))  
  101. 'Debug.Print CLng(strItem(n))  
  102.           DoCmd.PrintOut acPages, i, i, acDraft  
  103.         Next i  
  104.       Else  
  105. Debug.Print CLng(lngHalaman(n))  
  106.         DoCmd.PrintOut acPages, CLng(lngHalaman(n)), CLng(lngHalaman(n)), acDraft  
  107.       End If  
  108.     Next n  
  109.   End With  
  110. Exit_Function:  
  111.   Exit Function  
  112. Err_Msg:  
  113.   MsgBox "Function cetakLaporan, Error # " & str(Err.Number) & ", source: " & Err.Source & _  
  114.   Chr(13) & Err.description  
  115.   Resume Exit_Function  
  116. End Function  
  117.   
  118. Function membukaFormCetak(strsql As String, strNamaReport As String, _  
  119.                           Optional strNamaTabel As String = vbNullString, _  
  120.                           Optional strNamaField As String = vbNullString, _  
  121.                           Optional varNilaiField As Variant = vbNullString, _  
  122.                           Optional boolRecordYgAktif As Boolean = True, _  
  123.                           Optional boolSelectedRecord As Boolean = True, _  
  124.                           Optional intOrientasi As AcPrintOrientation = acPRORPortrait, _  
  125.                           Optional boolCetakDatanyaSaja As Boolean = False)  
  126.   Dim varNilaiField2 As Variant  
  127.   Dim strCaption As String  
  128. On Error GoTo Err_Msg  
  129.   varNilaiField2 = konversiNilaiField(strNamaField, strNamaTabel, varNilaiField)  
  130.   If varNilaiField <> vbNullString Then  
  131.     strCaption = arrayTampilkanPropertiField(strNamaField, strNamaTabel, prpCaption)  
  132.   End If  
  133.   TempVars.Add "rptRecordSource", strsql  
  134.   TempVars.Add "rptNamaReport", strNamaReport  
  135.   TempVars.Add "tmpNamaTabel", strNamaTabel  
  136.   TempVars.Add "tmpNamaField", strNamaField  
  137.   TempVars.Add "tmpNilaiField2"CStr(varNilaiField)  
  138.     
  139.   DoCmd.OpenForm "frmCetak"  
  140.   With Form_frmCetak  
  141.     If strNamaField <> vbNullString Then  
  142.     .fraPilihRecord = 0  
  143.     If boolRecordYgAktif Then  
  144.       .lblRecordYgAktif.Caption = .lblRecordYgAktif.Caption & " (" & strCaption & "=" & varNilaiField2 & ")"  
  145.     End If  
  146.     End If  
  147.     .fraOrientasi = intOrientasi  
  148.     .cbxCetakDatanyaSaja = boolCetakDatanyaSaja  
  149.     .cbbPrinter.SeparatorCharacters = 2  
  150.     .cbbPrinter.RowSource = Join(membuatDaftarPrinter, ";")  
  151.     .cbbPrinter = Application.Printer.DeviceName  
  152.     membuatDaftarUkuranKertas Forms(.Name), .cbbUkuranKertas, menghitungUrutanPrinter(.cbbPrinter)  
  153.     .cbbUkuranKertas = .cbbUkuranKertas.ItemData(1)  
  154.     membuatDaftarPaperBin Forms(.Name), .cbbPaperBin, .cbbPrinter  
  155.   End With  
  156.   strNamaReport1 = strNamaReport  
  157.   strSQLStatement1 = strsql  
  158.   If strNamaField <> vbNullString Then  
  159.     strSQLStatement1 = strSQLStatement1 & " WHERE " & strNamaField & "=" & varNilaiField2  
  160.   End If  
  161. Exit_Function:  
  162.   Exit Function  
  163. Err_Msg:  
  164.   MsgBox "Function membukaFormCetak, Error # " & str(Err.Number) & ", source: " & Err.Source & _  
  165.   Chr(13) & Err.description  
  166.   Resume Exit_Function  
  167. End Function  
  168.   
  169. Function mengaturKriteriaHalaman() As Variant  
  170.   Dim strWhere As String, strItem As Variant  
  171.   Dim strItem2 As Variant  
  172.   Dim i, j, m, n As Integer  
  173.   Dim strOItem() As Variant  
  174.   Dim globalCriteria As String  
  175. On Error GoTo Err_Msg  
  176.   strResult = vbNullString  
  177.   
  178.   With Form_frmCetak  
  179.     strItem = Split(.txtHalamanDlmRange, ",")  
  180.     i = 0  
  181.     For n = LBound(strItem) To UBound(strItem)  
  182.       
  183.       If CStr(strItem(n)) = vbNullString Then  
  184.         strResult = "Ada nilai yang tidak sesuai di " & .txtHalamanDlmRange  
  185.         MsgBox strResult  
  186.         Exit Function  
  187.       End If  
  188.       If InStr(1, strItem(n), "-") <> 0 Then  
  189.         strItem2 = Split(strItem(n), "-")  
  190.         If Not IsNumeric(strItem2(0)) Then  
  191.           MsgBox strItem2(0) & " bukan angka!", vbCritical  
  192.           Exit Function  
  193.         End If  
  194.         If Not IsNumeric(strItem2(1)) Then  
  195.           MsgBox strItem2(1) & " bukan angka!", vbCritical  
  196.           Exit Function  
  197.         End If  
  198.         If CLng(strItem2(0)) > CLng(strItem2(1)) Then  
  199.           MsgBox strItem2(1) & " harus lebih besar atau sama dengan " & CLng(strItem2(0)) & "!", vbCritical  
  200.           Exit Function  
  201.         End If  
  202.         For m = CLng(strItem2(0)) To CLng(strItem2(1))  
  203.           ReDim Preserve strOItem(i + 1)  
  204.           strOItem(i) = m  
  205.           i = i + 1  
  206.         Next m  
  207.       Else  
  208.         If Not IsNumeric(strItem(n)) Then  
  209.           MsgBox strItem(n) & " bukan angka!", vbCritical  
  210.           Exit Function  
  211.         End If  
  212.         ReDim Preserve strOItem(i + 1)  
  213.         strOItem(i) = Trim(strItem(n))  
  214.         i = i + 1  
  215.       End If  
  216.     Next n  
  217.   ReDim Preserve strOItem(i - 1)  
  218.   globalCriteria = Join(strOItem, ",")  
  219.   End With  
  220.   mengaturKriteriaHalaman = globalCriteria  
  221. Exit_Function:  
  222.   Exit Function  
  223. Err_Msg:  
  224.   MsgBox "Function mengaturKriteriaHalaman, Error # " & str(Err.Number) & ", source: " & Err.Source & _  
  225.   Chr(13) & Err.description  
  226.   Resume Exit_Function  
  227. End Function  
  228.   
  229. Function mengaturKriteriaRange(strNamaField As String, strNamaTabel As StringAs String  
  230.   Dim strWhere As String, strItem As Variant  
  231.   Dim strItem2 As Variant  
  232.   Dim i, n As Integer  
  233.   Dim strOItem() As String  
  234.   Dim strOItem2() As String  
  235.   Dim globalCriteria As String  
  236. On Error GoTo Err_Msg  
  237.   strResult = vbNullString  
  238.   
  239.   With Form_frmCetak  
  240.     If .fraPilihRecord = 0 Then  
  241.       strItem = Split([TempVars]![tmpNilaiField2], ",")  
  242.     Else  
  243.       strItem = Split(.txtRange, ",")  
  244.     End If  
  245.     i = 0  
  246.       
  247.     ReDim Preserve strOItem2(UBound(strItem))  
  248.     For n = LBound(strItem) To UBound(strItem)  
  249.       strOItem2(n) = Trim(strItem(n))  
  250.     Next n  
  251.     strItem = strOItem2  
  252.   
  253.     For n = LBound(strItem) To UBound(strItem)  
  254.       If strItem(n) = "" Then  
  255.         strResult = "Ada nilai yang kosong di: " & .txtRange  
  256.         MsgBox strResult  
  257.         mengaturKriteriaRange = vbNullString  
  258.         Exit Function  
  259.       End If  
  260.         
  261.       If InStr(1, strItem(n), "-") <> 0 Then  
  262.         strItem2 = Split(strItem(n), "-")  
  263.         If arrayTampilkanPropertiField(strNamaField, strNamaTabel, prpTypeGlobal) = "Text" Then  
  264.           If Not (adaNilaiField(strNamaField, strNamaTabel, CStr(Trim(strItem2(0)))) Or _  
  265.           adaNilaiField(strNamaField, strNamaTabel, CStr(Trim(strItem2(1))))) Then  
  266.             ReDim Preserve strOItem(i + 1)  
  267.             strOItem(i) = "in " & strItem(n)  
  268.             i = i + 1  
  269.           End If  
  270.           strItem(n) = strNamaField & " BETWEEN '" & Trim(strItem2(0)) & "'" & " AND '" & Trim(strItem2(1)) & "'"  
  271.         ElseIf arrayTampilkanPropertiField(strNamaField, strNamaTabel, prpTypeGlobal) = "Date" Then  
  272.           If Not IsDate(strItem2(0)) Or Not IsDate(strItem2(1)) Then  
  273.             strResult = "Tipe data tidak tepat di " & strItem(n)  
  274.             globalCriteria = vbNullString  
  275.             Exit Function  
  276.           End If  
  277.           If Not (adaNilaiField(strNamaField, strNamaTabel, CStr(Trim(strItem2(0)))) Or _  
  278.           adaNilaiField(strNamaField, strNamaTabel, CStr(Trim(strItem2(1))))) Then  
  279.             ReDim Preserve strOItem(i + 1)  
  280.             strOItem(i) = "in " & strItem(n)  
  281.             i = i + 1  
  282.           End If  
  283.           strItem(n) = strNamaField & " BETWEEN #" & Trim(strItem2(0)) & "#" & " AND #" & Trim(strItem2(1)) & "#"  
  284.         Else  
  285.           If Not IsNumeric(strItem2(0)) Or Not IsNumeric(strItem2(1)) Then  
  286.             strResult = "Tipe data tidak tepat di " & strItem(n)  
  287.             globalCriteria = vbNullString  
  288.             Exit Function  
  289.           End If  
  290.           If Not (adaNilaiField(strNamaField, strNamaTabel, CStr(Trim(strItem2(0)))) Or _  
  291.           adaNilaiField(strNamaField, strNamaTabel, CStr(Trim(strItem2(1))))) Then  
  292.             ReDim Preserve strOItem(i + 1)  
  293.             strOItem(i) = "in " & strItem(n)  
  294.             i = i + 1  
  295.           End If  
  296.           strItem(n) = strNamaField & " BETWEEN " & Trim(strItem2(0)) & " AND " & Trim(strItem2(1))  
  297.         End If  
  298.       Else  
  299.         If arrayTampilkanPropertiField(strNamaField, strNamaTabel, prpTypeGlobal) = "Text" Then  
  300.           If Not adaNilaiField(strNamaField, strNamaTabel, CStr(strItem(n))) Then  
  301.             ReDim Preserve strOItem(i + 1)  
  302.             strOItem(i) = strItem(n)  
  303.             i = i + 1  
  304.           End If  
  305.           strItem(n) = strNamaField & "='" & strItem(n) & "'"  
  306.         ElseIf arrayTampilkanPropertiField(strNamaField, strNamaTabel, prpTypeGlobal) = "Date" Then  
  307.           If Not IsDate(strItem(n)) Then  
  308.             strResult = "Tipe data tidak tepat di " & strItem(n)  
  309.             globalCriteria = vbNullString  
  310.             Exit Function  
  311.           End If  
  312.           If Not adaNilaiField(strNamaField, strNamaTabel, CStr(strItem(n))) Then  
  313.             ReDim Preserve strOItem(i + 1)  
  314.             strOItem(i) = strItem(n)  
  315.             i = i + 1  
  316.           End If  
  317.           strItem(n) = strNamaField & "=#" & strItem(n) & "#"  
  318.         Else  
  319.           If Not IsNumeric(strItem(n)) Then  
  320.             strResult = "Tipe data tidak tepat di " & strItem(n)  
  321.             globalCriteria = vbNullString  
  322.             Exit Function  
  323.           End If  
  324.           If Not adaNilaiField(strNamaField, strNamaTabel, CStr(strItem(n))) Then  
  325.             ReDim Preserve strOItem(i + 1)  
  326.             strOItem(i) = strItem(n)  
  327.             i = i + 1  
  328.           End If  
  329.           strItem(n) = strNamaField & "=" & strItem(n)  
  330.         End If  
  331.       End If  
  332.     Next n  
  333.     If i > 0 Then  
  334.       strResult = "Nilai data tak dikenal:" & vbCrLf & vbCrLf & Join(strOItem, vbCrLf)  
  335.       MsgBox strResult  
  336.       globalCriteria = vbNullString  
  337.     Else  
  338.       globalCriteria = Join(strItem, " Or ")  
  339.     End If  
  340.   mengaturKriteriaRange = globalCriteria  
  341.   End With  
  342. Exit_Function:  
  343.   Exit Function  
  344. Err_Msg:  
  345.   MsgBox "Function mengaturKriteriaRange, Error # " & str(Err.Number) & ", source: " & Err.Source & _  
  346.   Chr(13) & Err.description  
  347.   Resume Exit_Function  
  348. End Function  
Langkah berikutnya, ganti kode VBA di modul form frmCetak dengan kode VBA di bawah ini:
  1. Option Compare Database  
  2.   
  3. Private Sub cbbPrinter_Change()  
  4.   membuatDaftarUkuranKertas Forms(Me.Name), Controls(Me.cbbUkuranKertas.Name), menghitungUrutanPrinter(Me.cbbPrinter)  
  5.   membuatDaftarPaperBin Forms(Me.Name), Controls(Me.cbbPaperBin.Name), Me.cbbPrinter  
  6. End Sub  
  7. Private Sub cmdCetak_Click()  
  8.   If Not validasi Then Exit Sub  
  9.   If seleksi Then aturPrintPreview [TempVars]![rptNamaReport], , True  
  10. End Sub  
  11.   
  12. Private Sub cmdPrintView_Click()  
  13.   If Not validasi Then Exit Sub  
  14.   If seleksi Then aturPrintPreview [TempVars]![rptNamaReport]  
  15.   
  16. End Sub  
  17. Private Function validasi() As Boolean  
  18.   Dim blnIsValidPrinter As Boolean  
  19.   Dim ukuranKertas() As String  
  20.   ' Jika printer tidak ada lakukan prosedur di bawah ini  
  21.   If IsNull(Me.cbbPrinter.Value) Then  
  22.       MsgBox Prompt:="Pilih nama printer yang sesuai."  
  23.       Me.cbbPrinter = Application.Printer.DeviceName  
  24.       validasi = False  
  25.       Exit Function  
  26.   End If  
  27.   blnIsValidPrinter = False  
  28.     
  29.   ' Periksa apakah printer sudah valid  
  30.   For Each prt In Application.Printers  
  31.       If prt.DeviceName = Me.cbbPrinter.Value Then  
  32.           blnIsValidPrinter = True  
  33.       End If  
  34.   Next  
  35.     
  36.   ' Jika printer tidak valid lakukan prosedur di bawah ini.  
  37.   If Not blnIsValidPrinter Then  
  38.       MsgBox "Pilih printer yang sesuai"  
  39.       Me.cbbPrinter = Application.Printer.DeviceName  
  40.       validasi = False  
  41.       Exit Function  
  42.   End If  
  43.     
  44.   blnIsValidPrinter = False  
  45.   ReDim Preserve ukuranKertas(Me.cbbUkuranKertas.ListCount - 1)  
  46.   For n = 0 To Me.cbbUkuranKertas.ListCount - 1  
  47.     ukuranKertas(n) = Me.cbbUkuranKertas.ItemData(n)  
  48.     If Me.cbbUkuranKertas = ukuranKertas(n) Then  
  49.       blnIsValidPrinter = True  
  50.     End If  
  51.   Next n  
  52.   If Not blnIsValidPrinter Then  
  53.     MsgBox "Pilih ukuran kertas yang sesuai"  
  54.     validasi = False  
  55.     Exit Function  
  56.   End If  
  57.   validasi = True  
  58. End Function  
  59. Private Function seleksi() As Boolean  
  60.   If Me.fraPilihRecord = 0 Then  
  61.     TempVars.Add "rptRecordSource1", [TempVars]![rptRecordSource] & " WHERE " & _  
  62.       mengaturKriteriaRange([TempVars]![tmpNamaField], [TempVars]![tmpNamaTabel])  
  63.   Else  
  64.     If IsNull(Me.txtRange) Then  
  65.       TempVars.Remove "rptRecordSource2"  
  66.       TempVars.Remove "rptRecordSource1"  
  67.       TempVars.Add "rptRecordSource1"CStr([TempVars]![rptRecordSource])  
  68.       seleksi = True  
  69.       Exit Function  
  70.     Else  
  71.       If mengaturKriteriaRange([TempVars]![tmpNamaField], [TempVars]![tmpNamaTabel]) = vbNullString Then  
  72.         seleksi = False  
  73.         Exit Function  
  74.       Else  
  75.         TempVars.Add "rptRecordSource1", [TempVars]![rptRecordSource] & " WHERE " & _  
  76.           mengaturKriteriaRange([TempVars]![tmpNamaField], [TempVars]![tmpNamaTabel])  
  77.       End If  
  78.     End If  
  79.   End If  
  80.   seleksi = True  
  81. End Function  
  82. Private Sub cmdReportView_Click()  
  83.   If seleksi Then DoCmd.OpenReport [TempVars]![rptNamaReport], acViewReport  
  84. End Sub  
  85.   
  86. Private Sub Form_Close()  
  87.   TempVars.Remove "rptRecordSource"  
  88.   TempVars.Remove "rptNamaReport"  
  89.   TempVars.Remove "tmpNamaTabel"  
  90.   TempVars.Remove "tmpNamaField"  
  91.   TempVars.Remove "tmpNilaiField2"  
  92.   TempVars.Remove "rptRecordSource1"  
  93. End Sub  
  94.   
  95. Private Sub txtRange_GotFocus()  
  96.   Me.fraPilihRecord = 1  
  97. End Sub  
Untuk dapat menjalankan kode VBA di atas, ada fungsi-fungsi tertentu yang harus dibuat terlebih dahulu. Jadi, fungsi-fungsi di atas tidak berdiri sendiri, mereka tergantung pada fungsi lain yang ada di halaman Database Front-end dan Back-end terutama fungsi yang ada di modul mdlCore, nomor 1 s/d 27. Ke-27 fungsi itu harus ada.

Terakhir, pada report yang ingin di printview, report view, atau dicetak, sisipkan event procedure on Open sebagai berikut:
  1. Private Sub Report_Open(Cancel As Integer)  
  2.   If Not IsNull([TempVars]![rptRecordSource1]) Then Me.RecordSource = [TempVars]![rptRecordSource1]  
  3. End Sub  
Untuk membuka form frmCetak, kita harus menyisipkan sebuah tombol perintah yang digunakan untuk membuka form itu, melalui event procedure On Click. Contohnya pada gambar di bawah ini.


Pada tombol, misalnya ber-caption Open Print Report (properti Name=cmdPrintReport) event On Click, sisipkan kode VBA berikut ini:
  1. Private Sub cmdPrintReport_Click()  
  2.   If IsNull(Me.vouchId) Then  
  3.     membukaFormCetak "SELECT tblVoucherTemp.*, tblVoucherTempEntries.*, tblPrimaryAccountsFin.primaryaccountName, " _  
  4.     & "tblTipeDokumen.docDeskripsi FROM ((tblVoucherTemp INNER JOIN tblPrimaryAccountsFin ON " _  
  5.     & "tblVoucherTemp.vouchPrimaryAccountCode = tblPrimaryAccountsFin.documentCoding) LEFT JOIN " _  
  6.     & "tblVoucherTempEntries ON tblVoucherTemp.vouchId = tblVoucherTempEntries.vouchId) INNER JOIN " _  
  7.     & "tblTipeDokumen ON tblVoucherTemp.vouchType = tblTipeDokumen.dokTipe""rptVoucherTemp"False, , acPRORPortrait, True  
  8.   Else  
  9.     membukaFormCetak "SELECT tblVoucherTemp.*, tblVoucherTempEntries.*, tblPrimaryAccountsFin.primaryaccountName, tblTipeDokumen.docDeskripsi FROM ((tblVoucherTemp INNER JOIN tblPrimaryAccountsFin ON tblVoucherTemp.vouchPrimaryAccountCode = tblPrimaryAccountsFin.documentCoding) LEFT JOIN tblVoucherTempEntries ON tblVoucherTemp.vouchId = tblVoucherTempEntries.vouchId) INNER JOIN tblTipeDokumen ON tblVoucherTemp.vouchType = tblTipeDokumen.dokTipe""rptVoucherTemp""tblVoucherTemp", _  
  10.     "tblVoucherTemp.vouchId"Me.vouchId, , , acPRORPortrait, True  
  11.   End If  
  12. End Sub  
Dengan demikian, saat tombol Open Print Report diklik, form frmCetak akan terbuka dengan isi form yang sudah diatur terlebih dahulu melalui fungsi membukaFormCetak.

Untuk memahami penerapan form cetak dan fungsi VBA yang mendukung didalamnya, kita dapat melihat video demonya di bawah ini

Pada video itu kita bisa mencetak record sesuai dengan keinginan, baik melalui primary key, maupun melalui halaman tertentu. Sangat fleksibel. Contohnya, 1,5 menit terakhir dari video demo itu berisi halaman tertentu yang dicetak sesuai dengan pengaturan nomor halaman di form cetak.

Khusus untuk primary key, ada tiga tipe data yang bisa dibaca, Number, Text, dan Date/Time. Jadi misalnya primary key untuk Number: 1,2,3,5-9, 21-34, dst., untuk Text misalnya AMB, BDG-JKT, MRK, dst., untuk Date misalnya, 1/21/2018, 1/23/2018-1/24/2018, dst. Jadi, kita tidak perlu menggunakan tanda "'"  (tanda petik tunggal) untuk menyatakan tipe datanya berupa Text atau "#" (tanda pagar) untuk menyatakan tipe datanya berupa Date/Time.

SILAKAN DICOBA!!!😎. .

Comments

  1. gan mau tanya, kalo semisal saya buat form dialog cetak tapi isinya cuman list printer yang ada di control panel dan bisa langsung nyambung dengan report dan printernya yang di pilih itu diambil kodingnya yg mana aja ya ?? terima kasih

    ReplyDelete
    Replies
    1. Kalau seperti itu nggak perlu pakai koding. Pakai saja standard umum yang biasa dipakai Access.

      Delete
  2. standart yg dipakai acces tidak terdapat pilihan printernya, sempet coba DoCmd.RunCommand acCmdPrint tp ketika sudah dipilih printernya settingan printernya tidak mau mengikuti settingan printer di control panel. tujuan saya bikin form dialog cetak sendiri agar bisa mengganti pilihan printer agar tidak bingung" mengubah default printer di control panel,dan ketika printer yg dipilih di form dialog sendiri, bisa langsung otomatis conect printer sekaligus settingan seperti kertas dll di control panel

    ReplyDelete
    Replies
    1. Yang saya buat di atas sebenarnya sudah mewakili apa yang kamu inginkan. Hanya, koding yang aku buat di situ termasuk koding untuk menjalankan Access di backend dan frontend, jadi terlihat kompleks.

      Coba saja mulai dari fungsi "Function aturPrintPreview", siapa tahu bisa ditemukan apa yang kamu mau.

      Delete
  3. satu lagi mas, koding ini bisa dibuat di access xp kah ?? soalnya yang saya pakai office xp (access xp)

    ReplyDelete
    Replies
    1. Sebagian besar koding itu untuk Access 2007. Kamu punya Access edisi berapa?

      Delete

Post a Comment

Posting Terpopuler

Membuat Fungsi Terbilang Dalam Bahasa Inggris di MS Access VBA

Format Untuk Field Dengan Tipe Data Date/Time di MS Access

Menampilkan Menu Autoformat Di Access 2010 ke atas