Home > Active Report, Visual Basic > Tutorial Active Report bagian 2 – Grouping

Tutorial Active Report bagian 2 – Grouping

July 24, 2011

Setelah cukup lama tertunda akhirnya tutorial kedua dari yang pertama ini rilis juga.

Fokus pada tutorial kali ini adalah pembuatan format laporan yang sering digunakan yaitu grouping.

Contoh laporan yang akan kita buat adalah seperti berikut :

Masih menggunakan database yang sama pada tutorial pertama, kita akan tambahkan 2 buah tabel lagi yaitu kelas dan kelas_siswa

Sebelum membuat laporannya, kita liat dulu query yang digunakan untuk menampilkan data siswa berikutnya kelasnya

SELECT kelas.id AS kelas_id, kelas.keterangan AS kelas, siswa.nomor_induk, siswa.nama
FROM siswa INNER JOIN (kelas INNER JOIN kelas_siswa ON kelas.id = kelas_siswa.kelas_id) ON siswa.nomor_induk = kelas_siswa.nomor_induk

Oke sampai disini persiapan sudah cukup, saatnya kita membuka project pada tutorial pertama klik kanan di nama project -> Add -> Data Dynamics ActiveReport 2.0

jika berhasil akan ditambahkan sub node baru dengan nama ActiveReport1

kemudian ganti properties namenya menjadi arLapSiswaPerKelas dan caption menjadi Laporan Data Siswa Per Kelas

Selanjutnya kita akan menambahkan section Group dengan cara mengklik kanan salah satu section (PageHeader atau Detail) -> Insert -> Group Header/Footer

jika berhasil akan ditambahkan 2 section baru yaitu GroupHeader1 dan GroupFooter1

kemudian ganti properties namenya menjadi grpKelasID

field kelas_id mengacu pada query diatas

untuk format laporannya sesuai dengan contoh diatas

bagaimana cara mendesainnya sudah saya bahas tuntas disini.

Setelah desain reportnya jadi, kita akan menambahkan beberapa baris kode di event Detail_Format

kemudian ketik kode berikut :

Private Sub Detail_Format()
    With adoSiswaPerKelas.Recordset
        If Not .EOF Then
            txtNo.Text = Val(txtNo.Text) + 1
            txtNoInduk.Text = .Fields("nomor_induk").Value
            txtNama.Text = .Fields("nama").Value
        End If
    End With
End Sub

selanjutnya kita akan menambahkan kode di event Detail_BeforePrint

Private Sub Detail_BeforePrint()
    txtNo.Height = Detail.Height
    txtNoInduk.Height = Detail.Height
    txtNama.Height = Detail.Height
End Sub

terakhir event grpKelasID_Format

Private Sub grpKelasID_Format()
    With adoSiswaPerKelas.Recordset
        If Not .EOF Then
            txtKelas.Text = .Fields("kelas").Value
        End If
    End With
End Sub

kemudian aktifkan form yang sudah ada setelah itu tambahkan 1 buah tombol untuk menampilkan laporan siswa per kelas

adapun untuk kodenya seperti berikut :

Private Sub cmdPreviewSiswaPerKelas_Click()
    Dim strCon  As String
    Dim strSql  As String

    strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\sampleDb.mdb"
    strSql = "SELECT kelas.id AS kelas_id, kelas.keterangan AS kelas, siswa.nomor_induk, siswa.nama " & _
             "FROM siswa INNER JOIN (kelas INNER JOIN kelas_siswa ON kelas.id = kelas_siswa.kelas_id) ON siswa.nomor_induk = kelas_siswa.nomor_induk"

    With arLapSiswaPerkelas
        .adoSiswaPerKelas.ConnectionString = strCon
        .adoSiswaPerKelas.Source = strSql

        .lblHeader1.Caption = "SEKOLAH MENGENGAH ..."
        .lblHeader2.Caption = "Laporan Data Siswa Per Kelas"

        .Show
    End With
End Sub

Jalankan program kemudian klik tombol “Tampilkan Report Siswa Per Kelas”

Ada yang aneh pada laporan diatas, nomor urut untuk kelas VII B (UNGGULAN) harusnya dimulai dari 1 bukan 12 (melanjutkan nomor urut kelas sebelumnya).

Untuk menyelesaikan masalah ini kita harus kembali ke desain reportnya kemudian aktifkan event grpKelasID_Format setelah itu tambahkan kode berikut :

txtNo.text = "0"

untuk kode lengkapnya seperti berikut :

Private Sub grpKelasID_Format()
    With adoSiswaPerKelas.Recordset
        If Not .EOF Then
            txtNo.Text = "0" ' reset nomor urut kelas
            txtKelas.Text = .Fields("kelas").Value
        End If
    End With
End Sub

coba dijalankan lagi programnya kemudian klik tombol “Tampilkan Report Siswa Per Kelas”

Yuph nomor urut untuk kelas berikutnya sudah dimulai dari 1🙂

Untuk postingan kali ini rasanya cukup sampai disini, postingan berikutnya insya Allah kita masih akan membahas kasus yang sama (menampilkan daftar siswa per kelas) tetapi dengan memanfaatkan Sub Report.

Selamat MENCOBA🙂

  1. July 24, 2011 at 10:00 pm

    mantaf om…oiya om misal saya pake kertas yg panjang kyk printerx kasir itu,, gmn set sintax agar pada saat datax sudah berakhir printer berhenti sendiri..???

    • July 24, 2011 at 11:28 pm

      Untuk mencetak nota struk sy biasanya full coding om, ini basic printahnya :

          Private Sub cmdTesCetak_Click()
              Dim nFeed As Integer
             
              Open "LPT1:" For Output As #1
              Print #1, "tesss cetak"
              Print #1, Tab(10); "tesss cetak"
             
              Print #1, Chr$(&H1B); "a"; Chr$(1); 'rata tengah
             
              Print #1, "tesss cetak"
              Print #1, Tab(10); "tesss cetak"
             
              Print #1, Chr$(&H1B); "3"; Chr$(20); ' mengatur jarak baris
              Print #1, Chr$(&H1B); "a"; Chr$(0); 'balik ke rata kiri
             
              Print #1, "tesss cetak"
              Print #1, Tab(10); "tesss cetak"
             
              'gulung kertas
              For nFeed = 1 To 6
                  Print #1, Chr$(&HA);
              Next nFeed
             
              Close #1
          End Sub
      

      Kode diatas dg asumsi menggunkan port LPT 1

      Untuk referensi lebih lanjut langsung kesini aja om.

  2. July 25, 2011 at 5:22 am

    wah g pake active report dong om…(: cos kmrn tmnq ada yg bisa atur lewat reportx, tapi pake fast report n delphi..:)

  3. July 28, 2011 at 10:59 pm

    Coba link ini om.

  4. agung
    August 1, 2011 at 2:06 am

    makasih om,,semoga barokah ilmux.

    • August 1, 2011 at 4:13 am

      Amin🙂

  5. hanif
    August 7, 2011 at 12:16 am

    Asslamualikum.

    Mas, klo VB6 6 pemakaian tanda bermasalah apa ya?.
    saya coba begini
    Private Sub Command1_Click()
    If Text1.Text < Text2.Text Then
    MsgBox " ”
    End If
    End Sub

    hasil untuk percobaan

    text1 tanda text2 keterangan
    2 < 4 Benar
    22 < 4 Salah
    11 < 5 salah
    22 < 44 benar

    tanda adalah yang ditampilakn di msgbix. apa mungkin pada textboxnya ada setingan formatnya?. saya pake number, general sama saja. tapi klo di codenya saya tambah jadi begini
    Private Sub Command1_Click()
    If Text1.Text + 100000 < Text2.Text + 100000 Then
    MsgBox " ”
    End If
    End Sub

    hasilnya bener.
    text1 tanda text2 keterangan
    2 4 benar
    11 > 5 benar
    22 < 44 benar.

    satu lagi, untk nyimpen data decimal pada mysql gimana ya, haslnya diblatkan mulu
    saya dah nyoba dengan format Format(Text2.Text, "#,##") dan Format(Text2.Text, "#.##")
    tapi ketika masuk ke mysql klo 5.5 jadi 6, kalo 5.4 jadi 5. kolom tabel juga sudah saya ganti pake desimal. int ga bisa.

    mohon pencerahannya.
    terimakasih

    • August 8, 2011 at 1:51 am

      coba dikonversi dulu nilainya, contoh menggunakan fungsi Val :

      If Val(Text1.Text) < Val(Text2.Text) Then
      
      • hanif
        August 10, 2011 at 12:45 am

        uya mas, ternyata cm kurang val, terus yang mysql itu, kmrn donlot buku manualnya disitus resminya, ternya kl decimal harus ditulis juga berapa angka dibelakang koma.
        syukron mas.

        • August 10, 2011 at 4:58 am

          Oke om berarti case closed ya

  6. mahmud 83
    August 7, 2011 at 5:30 pm

    om kapan tutuor ke tiganya nich tentang sub report

    • August 8, 2011 at 1:44 am

      tunggu aja om😀

  7. Tampil Data cuma satu
    August 19, 2011 at 4:14 am

    Mohon pencerahan saya membuat laporan absensi berdasar sebuah kreteria tanggal, dan kebetulan udh banyak karyawan yg absen pd hari tersebut tapi koq yang tampil cuma satu data, yaitu data yng paling atas gimana solusinya
    Private Sub Detail_Format()
    If cont.State = adStateOpen Then cont.Close
    cont.ConnectionString = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=” & App.Path & “\PANIN.mdb;Persist Security Info=False”
    cont.Open
    Rec1.CursorLocation = adUseClient
    Rec1.CursorType = adOpenStatic
    Rec1.LockType = adLockPessimistic
    Rec1.ActiveConnection = cont
    sql = “SELECT ABSEN_MSK.NIK, Karyawan.Nm_karyawan, DEVISI.nama, Jabatan.nama_jabatan, ABSEN_MSK.TGL_ABSEN ,ABSEN_MSK.TGL_ABSEN, ABSEN_MSK.JAM_MASUK, ABSEN_MSK.KET, ABSEN_MSK.terlambat, ABSEN_MSK.ijin, ABSEN_MSK.masuk, ABSEN_MSK.alfa, ABSEN_MSK.lambat, ABSEN_MSK.tgs_kantor, ABSEN_MSK.sakit” & _
    ” FROM DEVISI INNER JOIN (Jabatan INNER JOIN (ABSEN_MSK INNER JOIN Karyawan ON ABSEN_MSK.NIK = Karyawan.nik) ON Jabatan.Kd_jabatan = Karyawan.Kd_jabatan) ON DEVISI.Kode = Karyawan.kode” & _
    ” Where ABSEN_MSK.TGL_ABSEN ='” & FLapHarian.cb.Text & “‘”
    Rec1.Open (sql)
    If Not Rec1.EOF Then
    Field2.Text = Val(Field2.Text) + 1
    Field3.Text = Rec1!NIK
    Field5.Text = Rec1!tgl_absen
    Field4.Text = Rec1!nM_KARYAWAN
    Field6.Text = Rec1!masuk
    Field7.Text = Rec1!LAMBAT
    Field8.Text = Rec1!sakit
    Field9.Text = Rec1!ijin
    Field10.Text = Rec1!Alfa
    Else
    MsgBox “Pilih tanggal yang akan di cetak”
    Unload Me
    End If
    End Sub

    Mohon Pencerahan

    • August 19, 2011 at 5:57 am

      Kenapa enggak dicoba seperti contoh diatas om, jadi ngirim querynya dari aplikasi jangan langsung di event Detail_Format

  8. azmi
    December 10, 2011 at 11:28 am

    om minta tlng ,kalo caranya cetak data dari data grid ke active report gmana? mhon bantuannya.,🙂

    • December 10, 2011 at 11:32 am

      Udah mencoba artikel sy yg disini belum.

  9. Yhoxs
    December 21, 2011 at 11:24 am

    Mas kalo membuat Total di baris paling bawah gmn caranya ya?

  10. December 23, 2011 at 2:45 pm

    Coba link ini om.

  11. rickz
    March 7, 2012 at 11:09 am

    mas, klo bikin laporan tahunan gmana ya??
    mksudnya mau di tampilin jumlah total tiap bulannya selama setahun

    • March 9, 2012 at 3:33 pm

      langsung di querynya aja om, gunakan fungsi aggregate SUM

  12. rickz
    March 13, 2012 at 9:27 am

    iya mas udah saya coba, tapi tampilnya cuma per satu bulan, saya pengenya menampilkan semua report tiap bulannya dalam setahun:
    Misal tahun 2010, ditampilkan jumlah dari tiap bulannya ada

    • March 14, 2012 at 9:01 am

      Coba mana querynya ?

      • rickz
        March 16, 2012 at 4:10 pm

        nie untuk yang perbulan,,klo misalkan untuk pertahun gimana ya??
        SELECT Sum(IIf([kode]='” & 1 & “‘and [cos]='” & Label1.Caption & “‘,[qty],0))as jumtotrec,Sum(IIf([kode]='” & 2 & “‘and [cos]='” & Label1.Caption & “‘,[qty],0))as jumtotlod,Sum(IIf([kode]='” & 4 & “‘and [cos]='” & Label1.Caption & “‘,[qty],0))as jumtotdel from det_trans where cos='” & Label1.Caption & “‘ and((kode)='” & 1 & “‘ Or (kode)='” & 2 & “‘ Or (kode)='” & 3 & “‘ Or (kode)='” & 4 & “‘) AND tgl between #” & Format(tglawal.Value, “yyyy-mm-dd”) & “# and #” & Format(tglakhir.Value, “yyyy-mm-dd”) & “# group by cos”

        • March 17, 2012 at 10:55 am

          Coba ditampilkan bulannya om :

          strSql = "SELECT month(tgl) AS bulan, Sum(IIf([kode]='" & 1 & "'and [cos]='" & Label1.Caption & "',[qty],0))as jumtotrec, " & _
                       "Sum(IIf([kode]='" & 2 & "'and [cos]='" & Label1.Caption & "',[qty],0))as jumtotlod, " & _
                       "Sum(IIf([kode]='" & 4 & "'and [cos]='" & Label1.Caption & "',[qty],0))as jumtotdel " & _
                       "from det_trans where cos='" & Label1.Caption & "' and((kode)='" & 1 & "' Or (kode)='" & 2 & "' Or (kode)='" & 3 & "' Or (kode)='" & 4 & "') AND " & _
                       "tgl between #" & Format(tglawal.Value, "yyyy-mm-dd") & "# and #" & Format(tglakhir.Value, "yyyy-mm-dd") & "# group by month(tgl), cos"
          
          • rickz
            March 19, 2012 at 1:58 pm

            OK om, maksieh ya,,,
            tpi mksudnya ntar penempatan di active report pengen kaya gni:
            januari pebruari maret dst
            barang1 10 15 1
            barang 2 11 0 5

            tu kira2 gmana ya ngakalinnya??
            hehe maaf masih belajar nieh,,,,

            • March 23, 2012 at 10:33 am

              Pertama dibenahin dulu querynya, ada pertanyaan yg mirip nih disini, coba cek komentar #7 – #10

              Trus karena jumlah bulan itu udah fix dari januari-desember berarti untuk menampilkan di ActiveReportnya tinggal disediakan aja field textbox sebanyak 12 + 1 utk no urut😀.

  13. cde
    March 14, 2012 at 7:52 am

    om mau tanya, klo bikin report dalam bentuk grafik gamana ya?? atau da ga tutorial nya buat newbie,,,,
    mkasih ya om ….

    • March 14, 2012 at 9:05 am

      Klo untuk grafiknya bisa menggunakan komponen yg disini om.

  14. santoso
    May 24, 2012 at 9:54 am

    kalo ada 3 group header berbeda dijadikan satu laporan gmana om?(semisal yang atas laporan detil, yang kedua laporan per transaksinya, dan yang ketiga laporan Total)

  15. June 9, 2012 at 3:43 pm

    om mau nanya nich klo mau buat laporan pake active report, laporan bulanan, harian, mingguan, dan tahun gimana yah.. mohon pencerahannya -_-,

    thank’s

    • June 10, 2012 at 8:46 am

      Oke biar cerah main2x dulu kesini😀.

  16. munawar
    June 12, 2012 at 1:57 pm

    pak, mau tanya, kalau ingin membuat penjumlahan masing-masing per/group gimana caranya, terima kasih

    • June 12, 2012 at 2:14 pm

      Ini untuk keperluan menampilkan grand total ya ? Klo iya biar enggak menjumlahkan secara manual mendingan ditambahkan section Report Header/Footer.
      Trus tambahkan objek TextBox di section ini, kemudian atur beberapa properties seperti berikut :

      DataField = diisi field yang ingin dijumlahkan
      SummaryGroup = dikosongkan
      SummaryRunning = 2 - ddsRAll
      SummaryType = 1 - ddSMGrandTotal
      
      • munawar
        June 12, 2012 at 10:14 pm

        Alhamdulillah telah berhasil Pak Admin, tq… lain kali saya tanya lagi ya pak…😀

        • June 13, 2012 at 9:03 am

          Oke om sama2x

      • edogawa
        July 21, 2012 at 10:54 am

        Om kalau misalnya menjumlah Total per-Group misalnya dalam 1 hari di groupkan berdasar No nota kemudian di footer ada total penjualan per-nota begitu caranya gmana om? soalnya dengan cara diatas kok tidak berhasil ya ..trims

        • July 21, 2012 at 2:01 pm

          Klo dibayangin kayaxnya susah om, mendingan kasih capturean desain reportnya seperti apa.

  17. June 16, 2012 at 4:15 pm

    om saya mau laporan saya mau saya tampilin sesuai dentgan tanggal yg saya minta saya pake scrip ini

    ActiveReport1.dccoba.Source = “Select * from table1 where Tanggal BETWEEN ‘Combo1.Text’ and ‘Combo2.Text'”
    ActiveReport1.Show

    tapi koq nggak muncul yah??

    mohon pencerahannya

    • June 16, 2012 at 5:21 pm

      Klo nyopas kode jgn setengah2x om :

      ' buka dulu koneksinya
      ActiveReport1.dccoba.ConnectionString = "diisi string koneksi"
      
      ' untuk query coba dulu tanpa ngambil nilainya dari combobox
      ' klo databasenya ms access tanda petik tunggal di ganti tanda #
      ActiveReport1.dccoba.Source = "Select * from table1 where Tanggal BETWEEN '2012/06/1' AND '2012/06/16'"
      ActiveReport1.Show
      
  18. wan
    July 5, 2012 at 11:04 am

    Bos, klo misalnya dari 1 tabel aja, dibuat group seperti tampilan di atas, bisa ga ya. Misal di tabel Agama, ada field Kecamatan, Desa, Islam, Kristen, katholik, Hindu, Budha.

    Kalo di group berdasarkan Kecamatan, gimana bos?
    Apakah harus musti pake inner join seperti contoh diatas?

    Trima kasih

    • July 7, 2012 at 1:15 pm

      Kok di tabel agama ada kecamatan om, enggak salah nih ???

      Klo satu tabel yg enggak perlu pake JOIN jadi tinggal diset aja properties DataField dari section GroupHeader dan untuk kasus om ya nilai DataFieldnya diset “kecamatan”.

      • Karyono
        March 5, 2013 at 7:47 am

        Mas, saya mau nanya, tolong dibalas (urgent).

        1. Buatin form berdasarkan kriteria dulu (ex: nama, kelas, alamat dengan combo box dan text box). Setelah diketik pada text box atau pada combo box kriterianya apa baru dipreview gitu.

        2. Gimana biar kriteria yang kita preview tadi hanya ditampilkan satu halaman saja, yang tidak kita cari jangan ditampilkan (ditampilkan pada halaman berikutnya)

        3. Gimana agar memberikan nomor halaman (masih berkaitan dengan nomor 2) pda halaman/data yang ingin kita cetak saja.

        Terima kasih…………..

        • March 5, 2013 at 10:48 am

          Gimana biar kriteria yang kita preview tadi hanya ditampilkan satu halaman saja, yang tidak kita cari jangan ditampilkan (ditampilkan pada halaman berikutnya)

          Untuk filternya langsung di perintah SELECTnya aja kok om, di bawah ini sy tampilkan cuplikannya saja, selengkapnya bisa om pelajari di postingan sy di atas.

          strSql = "SELECT * " & _
                   "FROM siswa " & _
                   "WHERE field_kriteria LIKE '%" & cmbKriteria.Text & "%'"
          

          Gimana agar memberikan nomor halaman (masih berkaitan dengan nomor 2) pda halaman/data yang ingin kita cetak saja

          Tambahkan 2 objek (Field dan Label) di section PageFooter, lihat gambar

          Kemudian atur nilai propertiesnya seperti berikut :
          1. Objek Field

          Name = txtPageNumber
          SummaryRunning = 2 - ddSRAll
          SummaryType = 4 - ddSMPageCount
          Text = txtPageNumber
          Visible = False
          

          2. Objek Label

          Name = lblHalaman
          Caption = lblHalaman
          

          Terakhir tambahkan kode di event PageFooter_BeforePrint

          Private Sub PageFooter_BeforePrint()
              lblHalaman.Caption = "Halaman ke : " & txtPageNumber.Text
          End Sub
          
  19. September 3, 2012 at 7:50 am

    om field kelasnya kan sy taruh di detail jg..
    jd jika di detail kolomnya ad 10 baris otomatis kelasnya jg akn kecetak 10 baris kan..

    pertanyaan sy..
    bagaimana caranya dengan kondisi itu,, walaupun kolomnya ad 10 baris tapi field(txtkelas_id) hanya tercetak 1 kali pada baris pertama saja..??

    smoga pertanyaanya cukup jelas,,
    tolong di bantu om jika ad yang bisa,,
    sebelumnya terimakasih..

  20. Syaoran
    September 8, 2012 at 8:31 pm

    Om,, saya mau tanya,, ketika saya membuat data dengan active report seperti Kartu Keluarga.. yang nama, alamat, tanggal lahir pada kolom yang diatas dan pekerjaan, status di kolom di bawah koq ga urut ya om,,,

    NAMA | ALAMAT | Tanggal Lahir
    BUDI | JAKARTA | 05/05/1990

    PEKERJAAN | STATUS
    PEGAWAI | bELUM MENIKAH

    BADU | BANDUNG | 04/04/1990

    TIDAK BEKERJA | SUDAH MENIKAH

    Mohon bantuannya agar namanya berurut dulu,, dan pekerjaan baru menyusul dibawahnya Om…
    Terimakasih

  21. maddais
    September 25, 2012 at 3:30 pm

    mas mau tanya bgmn buat tulisan rata kiri rata kanan pada AR

  22. arief
    November 14, 2012 at 8:57 am

    om mau tanya, SQLite ODBC saya tidak bisa jalan ya di windows 64 bit.?
    ketika mencoba koneksi selalu muncul error seperti ini “ODBC error : [Microsoft][ODBC Driver Manager] The specified DSN
    contains an architecture mismatch between the Driver and Application”, kira-kira apa yang salah ya om?

  23. Felark
    January 12, 2013 at 8:35 pm

    Thank you for the beneficial information.
    Can I get the examples, please? for both threads (AR1 + AR2)

  24. Junadi
    October 25, 2013 at 10:56 am

    Aslm.. om mau nanya coding untuk mencetak Id Card yang Hasil Cetaknya seperti Label Undangan (10 record per kertas). di Active Report?. sebelumnya trim’s semoga panjang umur dan sehat slalu. Aminn

    • October 25, 2013 at 11:05 am

      Waalaikumussalam

      Coba bermain dengan property ColumnCount, nilainya di set menjadi 2

  1. April 16, 2014 at 9:14 am
Comments are closed.
%d bloggers like this: