摘要:[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 . 將參數傳遞給報表的副程式
''' <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
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.以上謝謝各位的流覽 希望或多或少 能幫助到大家。
====================================================
有些事就該把它當作一種回憶...