2013年8月1日 星期四

如何將程式中的資料傳遞給 CrystalReport 報表使用(VS2008)

  從 CrystalReport  欄位總管中可以看到幾種欄位,而其中「參數欄位」可以用來傳遞程式與報表間資料的欄位,程式執行時,就是利用這個欄位將值傳給報表,欄位的值有三種型態:
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)


        '指定 .rpt 報表中的參數欄位名稱

        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 可以有更多的程式操作彈性。

沒有留言:

張貼留言