從 CrystalReport 欄位總管中可以看到幾種欄位,而其中「參數欄位」可以用來傳遞程式與報表間資料的欄位,程式執行時,就是利用這個欄位將值傳給報表,欄位的值有三種型態:
Discrete(離散值):就是一個欄位,只有一個值有作用,縱使存入多重值,例如:"a", "Z", "2",也只能擇一輸出。
Range(範圍值):可以為參數欄位選擇數值範圍
Discrete & Range:使用此種形態的欄位,必須設定為「允許多重數值」
要傳遞參數,首先在報表中(.rpt)要見建立參數欄位,例如:year, month
Discrete(離散值):就是一個欄位,只有一個值有作用,縱使存入多重值,例如:"a", "Z", "2",也只能擇一輸出。
Range(範圍值):可以為參數欄位選擇數值範圍
Discrete & Range:使用此種形態的欄位,必須設定為「允許多重數值」
要傳遞參數,首先在報表中(.rpt)要見建立參數欄位,例如:year, month
'建立 CrystalReportViewer 用以顯示及操作報表
Dim crpt As CrystalDecisions.Windows.Forms.CrystalReportViewer
'建立 ReportDocument 做為報表與程式間的媒介
Dim rpDoc As CrystalDecisions.CrystalReports.Engine.ReportDocument
crpt = New CrystalDecisions.Windows.Forms.CrystalReportViewer
rpDoc = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
rpDoc.Load("D:\myReports\Personal.rpt") '載入 .rpt 檔(繫結)
''下面這一段是用來重新設定各資料表的資料庫來源
Dim crConnInfo As New ConnectionInfo '建立資料庫連接資訊
With crConnInfo '資料庫連接可以直接寫在 .rpt 的報表中
.ServerName ="192.168.1.1" '但可以利用此方式動態變更資料來源
.DatabaseName = "myDatabase"
.UserID = "sa"
.Password = "1234"
End With
Dim crtbLogoninfo As New TableLogOnInfo()
Dim CrTables As Tables = rpDoc.Database.Tables '針對各資料表設定資料來源
For Each CrTable As Table In CrTables '對於 .rpt 報表中的每個資料表
crtbLogoninfo = CrTable.LogOnInfo
crtbLogoninfo.ConnectionInfo = crConnInfo '都重新指定資料來源
CrTable.ApplyLogOnInfo(crtbLogoninfo) '將變更結果更新到資料表
Next
''下面這一段是透過 ReportDocument 傳遞參數給 .rpt 報表
Dim curParValues As ParameterValues '用來暫存每個參數欄位的值
Dim myValue As ParameterDiscreteValue '要傳給參數的值
curParValues = New ParameterValues()
myValue=New ParameterDiscreteValue()
'先把要傳送的值放到 ParameterDiscreteValue (myValue)
myValue.Value = "100"
'再把 myValue 加入欄位中,如果此欄位允許多重值 ,就可以再加入其他值
curParValues.Add(myParameterDiscreteValue)
''rpDoc.DataDefinition.ParameterFields("Year").ApplyCurrentValues(curParValues)
crpt.ReportSource=rpDoc '最後將 報表指定給 Viewer
crpt.Refressh()
Dim crpt As CrystalDecisions.Windows.Forms.CrystalReportViewer
'建立 ReportDocument 做為報表與程式間的媒介
Dim rpDoc As CrystalDecisions.CrystalReports.Engine.ReportDocument
crpt = New CrystalDecisions.Windows.Forms.CrystalReportViewer
rpDoc = New CrystalDecisions.CrystalReports.Engine.ReportDocument()
rpDoc.Load("D:\myReports\Personal.rpt") '載入 .rpt 檔(繫結)
''下面這一段是用來重新設定各資料表的資料庫來源
Dim crConnInfo As New ConnectionInfo '建立資料庫連接資訊
With crConnInfo '資料庫連接可以直接寫在 .rpt 的報表中
.ServerName ="192.168.1.1" '但可以利用此方式動態變更資料來源
.DatabaseName = "myDatabase"
.UserID = "sa"
.Password = "1234"
End With
Dim crtbLogoninfo As New TableLogOnInfo()
Dim CrTables As Tables = rpDoc.Database.Tables '針對各資料表設定資料來源
For Each CrTable As Table In CrTables '對於 .rpt 報表中的每個資料表
crtbLogoninfo = CrTable.LogOnInfo
crtbLogoninfo.ConnectionInfo = crConnInfo '都重新指定資料來源
CrTable.ApplyLogOnInfo(crtbLogoninfo) '將變更結果更新到資料表
Next
''下面這一段是透過 ReportDocument 傳遞參數給 .rpt 報表
Dim curParValues As ParameterValues '用來暫存每個參數欄位的值
Dim myValue As ParameterDiscreteValue '要傳給參數的值
curParValues = New ParameterValues()
myValue=New ParameterDiscreteValue()
'先把要傳送的值放到 ParameterDiscreteValue (myValue)
myValue.Value = "100"
'再把 myValue 加入欄位中,如果此欄位允許多重值 ,就可以再加入其他值
curParValues.Add(myParameterDiscreteValue)
'指定 .rpt 報表中的參數欄位名稱
Dim paraDefinitions As ParameterFieldDefinitions
paraDefinitions = rpDoc.DataDefinition.ParameterFields
Dim paraDefinition As ParameterFieldDefinition = paraDefinitions("Year")
'把值指定給 .rtp 中的參數欄位
paraDefinition.ApplyCurrentValues(curParValues)
''''上面那四行程式,可以用下面這條簡化處理Dim paraDefinitions As ParameterFieldDefinitions
paraDefinitions = rpDoc.DataDefinition.ParameterFields
Dim paraDefinition As ParameterFieldDefinition = paraDefinitions("Year")
'把值指定給 .rtp 中的參數欄位
paraDefinition.ApplyCurrentValues(curParValues)
''rpDoc.DataDefinition.ParameterFields("Year").ApplyCurrentValues(curParValues)
crpt.ReportSource=rpDoc '最後將 報表指定給 Viewer
crpt.Refressh()
註:如果在 報表中看到 「@欄位名稱」是屬於公式欄位;「?欄位名稱」是屬於參數欄位
CrystalReportViewer:ReportSource 可以直接指定 .rpt 檔案來源,例如"D:\myReports\Personal.rpt" ,或者指定來源為 CrystalReportDocument
CrystalReportDocument:利用 FileName 指定 .rpt 檔案來源。
使用 CrystalReportDocument 可以有更多的程式操作彈性。
沒有留言:
張貼留言