Using CrystalReportPartsViewer Control In ASP.NET

Posted at : May/17/2008
13441 Views

CrystalReportPartsViewer Control (saya singkat saja menjadi CRPV), merupakan control lain selain CrystalReportViewer (CRV) yang digunakan sebagai container untuk Crystal Report file. Bila kita menggunakan CRV maka semua record yang terdapat di dalam data source akan ditampilkan semua. Lain halnya dengan CRPV, ia akan menampilkan record sesuai dengan kebutuhan. Artinya data tertentu dapat kita jadikan sebagai link yang apabila kita klik link nya maka ia akan menampilkan detail dari record tersebut, atau dengan kata lain CRPV akan menampilkan datanya dengan mode DrillDown.

CRPV ini berguna jika data report yang ditampilkan sangat banyak dan kita ingin melihat sesuai dengan kriteria yang diinginkan. Hasil web preview dari CRPV ini berbeda dengan CRV, artinya design report yang sudah dibuat tidak akan ditampilkan sesuai dengan aslinya, kita harus melakukan customisasi di page.

Pada posting kali ini saya akan memperlihatkan perbedaan hasil preview dan perbedaan langkah-langkah yang harus ditempuh dalam membuat CRPV dibandingkan dengan CRV. Report yang saya design menggunakan view Invoices yang terdapat di dalam database Northwind. Report tersebut datanya dikelompokkan ke dalam kelompok berdasarkan Country kolom sebagai outer group dan kelompok CustomerName sebagai inner group. Sehingga nanti diharapkan dalam web preview report tersebut pertama kali akan menampilkan list country sebagai link / DrillDown yang jika diklik akan menampilkan data CustomerName beserta total summary dari invoices yang sudah pernah dilakukan, dan juga pada akhirnya CustomerName tersebut juga berlaku sebagai link yang bila di klik akan menampilkan detail dari transaksi tersebut seperti misalnya OrderID, OrderDate, ProductName, TotalPrice.

Berikut tampilan design crystal report yang digunakan (Visual Studio yang digunakan yaitu VS 2008 dengan Crystal Reports 2008 yang sudah include didalamnya) :

Jika kita lihat Report Previewnya kalau menggunakan CRV maka hasilnya akan seperti ini :

Sekarang mari kita lihat bagaimana caranya merubah report menjadi report yang akan di consume oleh CRPV. Untuk membuat report yang akan digunakan oleh CRPV maka kita harus tentukan data yang mana yang akan dijadikan sebagai link untuk DrillDown report. Kita bisa gunakan data yang terdapat didalam section GroupHeader atau section GroupFooter untuk dijadikan target link, sedangkan data yang terdapat didalam section details dijadikan sebagai target terakhir untuk display data detail dari link tersebut. Berikut langkah-langkahnya :

1. Klik kanan Group1Name yang terdapat didalam GroupHeaderSection, pilih Copy :

2. Klik kanan pada area yang kosong di report tsb, pilih Report -> Report Options :

3. Klik tombol Paste Link, field Object Name akan diisi dengan nama yang sesuai dengan nama Group1Name yang ada di GroupHeader dengan sedikit modifkasi agar tidak bentrok (Leave it default).

4. Lakukan langkah-1, akan tetapi sekarang pilih Format Object :

5. Setelah muncul Format Editor form, pilih tab Hyperlink...check pilihan Report Part Drilldown radio button. Pada avalilable fields anda bebas memilih object-object apa saja yang akan dijadikan sebagai target link object yang telah dibuat. Pada report ini saya memilih object-object yang terdapat didalam GroupFooterSection CustomerID, sehingga apabila link Country di klik maka report akan menampilkan data CustomerName beserta Total Invoice.

6. Langkah berikutnya yaitu membuat target link apabila CustomerName link di klik. Klik kanan Group2Name yang terdapat didalam GroupFooterSection2.

7. Pada Format Editor, pilih tab Hyperlink...check opsi Report Part Drilldown. Pada available fields, pilih object-object yang akan ditampilkan apabila link CustomerName dipilih.

8. Buat sebuah page. Tambahkan control CRPV dan CrystalReportSource control. Set properti FileName report dari CrystalReportSource control tersebut ke file .rpt yang telah dibuat pada langkah sebelumnya diatas. Setelah itu rubah property ReportSourceID CRPV ke id dari control CrystalReportSource.

<CR:CrystalReportPartsViewer ID="CRPartsViewer1" runat="server" 
    AutoDataBind="True" ReportSourceID="CReportSource1" />
    
<CR:CrystalReportSource ID="CReportSource1" runat="server">
    <Report FileName="rptCustOrders.rpt">
        <Parameters>
            <CR:ControlParameter ControlID="ddlCountry" 
            ConvertEmptyStringToNull="False" 
                DefaultValue="" Name="Country" 
                PropertyName="SelectedValue" ReportName="" />
        </Parameters>
    </Report>
</CR:CrystalReportSource>

9. Web preview report menampilkan data Country berupa hyperlink.

10.  Bila salah satu link country tersebut di klik maka akan menampilkan data customer yang terdapat didalam country tsb yang juga merupakan hyperlink. Berikut data Customer untuk country Argentina.

11. Detail data dari salah satu link CustomerName diatas :

Bila kita lihat dari hasil web preview, maka tampilan reportnya berubah, tidak sesuai dengan design report yang telah dibuat sebelumnya, semua header text hilang. Memang begitu konsekuensinya :) ...akan tetapi kita dapat melakukan customisasi layout nya di page. Sekarang bagaimana caranya apabila kita hanya ingin menampilkan data country yang kita pilih sendiri, jadi ketika page di load pertama kali data country belum akan ditampilkan sampai user nantinya memilih country tertentu. Tentu...anda dapat melakukannya :D

Langkah yang harus dilakukan yaitu :

12. Buat Parameter Fields di Crystal Report. Beri nama Country, pilih opsi Discrete Value.

13. Drag and Drop field tersebut ke GroupHeaderSection1 yang digunakan sebagai pengelompok data customer berdasarkan country.

14. Klik kanan Group1Name yang terdapat di dalam GroupHeaderSection1 -> pilih Select Expert...atur Formula nya seperti ini : {Invoices.Country} = {?Country}

15. Tambahkan control DropDownList ke page. Atur control tersebut agar dapat menampilkan Distinct Country dari tabel Customer.

<asp:DropDownList ID="ddlCountry" runat="server" 
    DataSourceID="sdsCountry" AutoPostBack="True"
    DataTextField="Country" DataValueField="Country" 
    AppendDataBoundItems="true">
    <asp:ListItem Text="All Country" />
</asp:DropDownList> &nbsp;
    
<asp:Label ID="lblInfo" runat="server" ForeColor="Green" 
Font-Bold="True" Visible="False" Font-Italic="True" />
    
<asp:SqlDataSource ID="sdsCountry" runat="server" 
    ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
    SelectCommand="SELECT DISTINCT [Country] FROM [Customers]" />

16. Ada satu property yang berguna pada DropDownList diatas yaitu AppendDataBoundItems yang di set ke True. Properti tersebut digunakan jika kita ingin menyisipkan value kedalam control tersebut dimana control tersebut sebenarnya menggunakan data yang diambil dari database. Contohnya diatas saya menyisipkan value "All Country"

17. Lalu bagaimana caranya Record Selection Formula yang telah dibuat pada langkah 12-14 dapat di enable atau disable secara runtime? Langkah ini perlu dilakukan jika user memilih "All Country", maka Record Selection Formula tersebut harus di disable / di clear.

Protected Sub ClearSelectionFormula(ByVal Clear As Boolean)
    Dim report = CReportSource1.ReportDocument

    If Clear Then
        If report.DataDefinition.RecordSelectionFormula.ToLower = _
        "{invoices.country} = {?country}" Then
            report.DataDefinition.RecordSelectionFormula = _
            String.Empty
        End If
    Else
        report.DataDefinition.RecordSelectionFormula = _
        "{Invoices.Country} = {?Country}"
    End If
End Sub

Code VB diatas (C# codenya anda translate sendiri aja ya, males bikin dua versi :D ) memperlihatkan bagaimana caranya mendisable / enable Record Selection Formula,  yang penting anda perhatikan Formula nya yang harus sesuai dengan yang ada di Crystal Report.

18. Berikut code event Handler DropDownList :

Protected Sub ddlCountry_SelectedIndexChanged() _
Handles ddlCountry.SelectedIndexChanged
    lblInfo.Visible = False
    Dim clear = False
    If ddlCountry.Text.ToLower = "all country" Then clear = True
    ClearSelectionFormula(clear)
    CRPartsViewer1.DataBind()
End Sub

19. Bagaimana caranya saya mengambil informasi dari data yang di Drilldown? misalnya saya ingin menampilkan info mengenai link Country yang di klik dan link CustomerName yang di klik dan saya tampilkan di Label. Anda dapat menggunakan event FieldDrillDown dari CRPV nya. Berikut cuplikan codenya :

Protected Sub CRPartsViewer1_FieldDrillDown(ByVal source As Object, _
    ByVal e As CrystalDecisions.Web.DrillDownEventArgs) _
    Handles CRPartsViewer1.FieldDrillDown

    Dim custID = ""
    Dim dataContext = e.DataContext
    'DataContext isinya spt dibawah ini contohnya :
    'DataContext = /Country[Argentina]
    'DataContext = /Country[Argentina]/CustomerID[ALFKI]

    Dim objName = e.ObjectName
    Select Case objName.ToLower
        Case "groupnamecountry1"
            Dim firstIdx = dataContext.IndexOf("[")
            Dim lastIdx = dataContext.LastIndexOf("]")
            Dim intDiff = lastIdx - firstIdx

            ViewState("country") = dataContext.Substring( _
            firstIdx + 1, intDiff - 1)

        Case "groupnamecustomerid2"
            Dim lastIdx1 = dataContext.LastIndexOf("[")
            Dim lastIdx2 = dataContext.LastIndexOf("]")
            Dim intDiff = lastIdx2 - lastIdx1

            custID = dataContext.Substring( _
            lastIdx1 + 1, intDiff - 1)
    End Select

    Dim country = ViewState("country").ToString

    If custID <> "" Then
        lblInfo.Text = "==> " & custID & " / " & country
    Else
        lblInfo.Text = "==> " & country
    End If
    lblInfo.Visible = True
End Sub

20. Yang harus kita perhatikan yaitu penggunaan DataContext dan ObjectName. DataContext digunakan untuk mengambil info data dari link yang di klik, sedangkan ObjectName digunakan untuk mengambil info GroupName dimana link tersebut berada, selain itu hanya tricky code untuk menampilkan informasi Country beserta CustomerName pada label info yang saya tempatkan di sebelah DropDownList country.

21. Berikut web preview bila user memilih country tertentu, All Country, beserta detail info invoice dari CustomerName yang bersangkutan.

Ok...that's it...have a nice CrystalReportPartsViewer control day :D


ABOUT ME

Rully Yulian MF
Rully Yulian Muhammad Firmansyah | Co-Founder & IT Trainer at Native Enterprise | Microsoft Azure Data Scientist | IBM RAG & Agentic AI | IBM Data Science & Data Analyst | Python Certified (PCEP, PCAP) | MOS, MTA, Xamarin Certified, ex MCT | ex MVP

CERTIFICATIONS

Microsoft Certified Associate
IBM RAG and Agentic AI Professional
IBM Data Science Professional IBM Data Analyst Professional
PCAP Associate Python Programmer Certified PCEP Entry Level Python Programmer Certified
Xamarin Certified
MOS 2007
MCPD MCTS
MCAD.NET

NATIVE ENTERPRISE

Native Enterprise - IT Training

FOLLOW ME

Youtube  X Twitter Facebook  Instagram  LinkedIn

RSS


NATIVE ENTERPRISE NEWS

© Copyright 2006 - 2026   Rully Yulian MF   All rights reserved.