[CrystalReport] 利用 參數欄位,篩選要顯示的報表資訊(完成)

  • 36030
  • 0
  • 2010-10-12

摘要:[CrystalReport] 利用 參數欄位,篩選要顯示的報表資訊(未完)

開發環境 : VS2005 + 內建 CrystalReports + Widows Form

資料庫 : SQL Server 2005

適用需求 : Table 內以記錄所需明細,依照 CrystalReports 參數欄位篩選列出相關資訊。

例如 請假表,銷售紀錄,加班紀錄 . . . 

以下以 請假紀錄 為範例

1 . 需求設定 : 依照所選取的姓名,顯示請假紀錄於報表上。

2 . 範例 Table : 建立一請假紀錄資料表 [ Holiday ],建立一人員資料表(做為顯示在 ListBox 選取條件的人員清單 ) [ User ]

2-1 . 範例欄位 : (如圖一)

         (圖一)

2-2 . 範例資料 : (如圖二)

(圖二)

3 . 設計階段UI : (如圖三)

3-1 . 簡易說明 :  ListBox1 : 顯示姓名清單做為篩選條件,允許多選 ListBox1.SelectionMode = SelectionMode.MultiSimple

                               DataGridView : 顯示所有請假記錄,報表顯示在 Form1 內的 CrystalReportView 控制項。

(圖三)

4 . 建立 CrystalReports 報表 : 

4-1 . 在 CrystalReports 設計畫面中,欄位總管 --> 資料庫欄位(右鍵) --> 資料庫專家

         將資料表 [ Holiday ] 加入,並拉出所需欄位。(如圖四)

(圖四)

4-2 . 在 CrystalReports 設計畫面中,欄位總管 --> 參數欄位 (右鍵) --> 新增  設定(如圖五)

4-2-1 . 設定其 名稱,提示文字,數值類型

4-2-2 . 設定其 選項  --> 離散值 和 允許多重數值

(圖五)

 

4-2-3 . 設定其預設值 -->選取 瀏覽資料表 [ Hoilday ] 和其 瀏覽欄位 [ 姓名 ] (如圖六) 

(圖六)

 

4-2-4 .將參數欄位 ( Namefield ) 拉到報表上 設定其 [ 選擇專家 ] (如圖七) 

(圖七)

4-2-5 . [ 選擇專家 ],設定要做為條件的欄位 (如圖八)

(圖八)

4-2-6 . 設定條件(如圖九) 

 

(圖九)

以上為設計階段關於報表部分的建立,以下將開始說明 程式碼 如何動態傳遞參數變更顯示的資料。

5. 程式碼

5-1. 初始畫面 參考執行畫面(如圖十)

 


'加入 CrystalReports.Engine 參考
Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System.Collections
Public Class Form2
    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Try
            '將請假紀錄資料表載入,存在 DataSet11.Holiday 資料表內
            Me.HolidayTableAdapter1.Fill(Me.DataSet11.Holiday)

            '將相關人員資料表載入,存在 DataSet11.User 資料表內
            Me.UserTableAdapter1.Fill(Me.DataSet11.User)

            '將所有請假紀錄顯示在 DataGridView1 
            Me.DataGridView1.DataSource = DataSet11.Holiday

            '將人員名稱關連到 ListBox1,並顯示篩選的人員清單
            ListBox1.DataSource = Me.DataSet11.User
            ListBox1.DisplayMember = "姓名"
            ListBox1.SelectionMode = SelectionMode.MultiSimple '設定允許多選

        Catch ex As System.Exception
            System.Windows.Forms.MessageBox.Show(ex.Message)
        End Try
    End Sub

 (圖十) 5-2.

5-2 . 將參數傳遞給報表的副程式

 


    ''' <summary>
    ''' 將參數傳遞給報表的副程式
    ''' </summary>
    ''' <param name="myReportDocument">程式內報表的執行個體</param>
    ''' <param name="myArrayList">要傳遞的參數陣列</param>
    ''' <remarks></remarks>
    Private Sub SetValuesForParamet(ByVal myReportDocument As ReportDocument, ByVal myArrayList As ArrayList)
        '建立 ParameterValues 物件
        '存取報表執行個體內,所有參數欄位的 ParameterValues 物件集合
        Dim ParameterValues As ParameterValues = New ParameterValues

        For Each subValue As Object In myArrayList
            '設定離散值參數的屬性值
            Dim myValue As ParameterDiscreteValue = New ParameterDiscreteValue
            myValue.Value = subValue.ToString()
            ParameterValues.Add(myValue)
        Next

        '建立 ParameterFieldDefinitions 物件
        '存取報表執行個體內,所有參數欄位的 ParameterFieldDefinitions 物件集合
        Dim myParameterFieldDefinitions As ParameterFieldDefinitions = myReportDocument.DataDefinition.ParameterFields
        '利用參數欄位名稱,指定要存取的參數欄位
        myParameterFieldDefinitions("NameField").ApplyCurrentValues(ParameterValues)

    End Sub

 5-3.依條件顯示報表

 


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        '建立報表的執行個體
        Dim oRpt As New CrystalReport1
        '設定其資料來源
        oRpt.SetDataSource(DataSet11)

        If ListBox1.SelectedItems.Count > 0 Then
            '建立要篩選條件的資料陣列
            Dim myArrayList As ArrayList = New ArrayList()

            For Each str As Object In ListBox1.SelectedItems
                '將選取的姓名清單加入陣列
                myArrayList.Add(str.Item(1))
            Next

            '設定報表的參數欄位
            SetValuesForParamet(oRpt, myArrayList)
        Else
            MsgBox("未選取篩選條件")
        End If

        '重新載入報表
        Form1.CrystalReportViewer1.ReportSource = oRpt
        If Form1.Visible = True Then
            Form1.Focus()
            Form1.Select()
        Else
            Form1.Show()
            Form1.Select()
        End If
    End Sub

6 . 執行階段畫面

 

7 . 自我檢討

這篇文章,主要是在練習利用程式的方式去設定報表內的參數欄位值,並依照參數欄位的值,動態顯示其相關資料於報表上。

而在過程中,原本規劃只有一個資料表 [ Holiday ] ,但考慮到實際狀況下不管是 請假紀錄 銷售紀錄 等等,

都有一對應的 人員資料表 或是 產品的目錄表 ,作為關聯以顯示其相關資訊。

PS:程式方面也發現一容易犯的錯誤,在 5-3.依條件顯示報表  裡

        '建立報表的執行個體
        Dim oRpt As New CrystalReport1
        '設定其資料來源
        oRpt.SetDataSource(DataSet11)
 

此處在 Button_Click 事件裡 ,一開始就必須先設定其資料來源 oRpt.SetDataSource(DataSet11)

再設定報表的參數欄位 SetValuesForParamet(oRpt, myArrayList)

如在設定報表的參數欄位後再去設定其資料來源,將會造成參數欄位被 清空 將無法正常顯示。

8.以上謝謝各位的流覽 希望或多或少 能幫助到大家。

 

 

 


==================================================== 
有些事就該把它當作一種回憶...
一種放在記憶中任隨時間慢慢的侵蝕慢慢的隨風漂泊........
 ===================================================
~~~請支持 點部落 格,點點下方的廣告吧~~~