none
關於建立本機報表的問題 RRS feed

  • 問題

  • 各位先進,小弟先說明一下情況:

    我寫了一支程式,程式會產生一個DataSet,DataSet底下有3個DataTable,資料是從另一台機器上(Windows Server 2003,SQL 2005 EXPRESS)上抓下來的,現在我想要建立幾個本機報表來將這3個DataTable印出來,我看了許多資料,資料上面都是說在專案中加入新的報表項目,然後就開始定義報表...問題卡在這裡,一旦開啟報表之後,都是要先設定資料來源才能再往下定義報表的版面,但我要列印出來的資料是程式Run了之後動態產生的,我該怎麼設定報表才能讓報表的資料來源是用程式動態產生出來的DataTable而不是SQL SERVER裡頭原本救存在的資料?

    請各位先進指導一下小弟,謝謝~
    2009年4月5日 上午 11:39

解答

  • Jeff:
          這可能用圖來說明會比較清楚
          1.先建立一個名為Rpt1DS.xsd的資料集<圖1>
          2.在報表設計工具中指定報表的設定來源<圖2>
          3.在報表設計畫面中使用工具箱拉一個資料表過來
          4.此時拉開資料來源會出現剛剛所設定的資料集,把要用的欄位拉到報表的資料表物件中,完成報表的設計<圖3>
          5.在Window Form畫面中拉一個ReportViewer物件,不用在畫面設計中給它什麼報表來源
          6.在這個Windows Form的重點程式如下:     
                '前面查詢資料庫,得到一個myTable的dataTable物件 
                ReportViewer1.ProcessingMode = ProcessingMode.Local    <--Local報表
                Dim rep As LocalReport = ReportViewer1.LocalReport 
                rep.ReportPath = "Rpt1.rdlc"   <--用哪個報表
                Dim rptDataSource As New Microsoft.Reporting.WinForms.ReportDataSource  <--宣告一個報表資料來源執行個體
                rptDataSource.Name = "Rpt1DS_DataTable1" <---報表資料來源名稱
                rptDataSource.Value = myTable <---設定資料
                rep.DataSources.Add(rptDataSource) <--加入到報表資料來源執行個體
                Me.ReportViewer1.RefreshReport() <---報表跑出來了

         圖做的不是挺美觀,就勉強看看吧..
    2009年4月5日 下午 02:58
    版主

所有回覆

  • :::你是否使用Crystal Report來產生報表的???
    假如是的話,可以在專案裡新增一個資料集(.xsd),然後透過伺服器總管將所要列印的Table拖曳至資料集(.xsd)
    裡,而此資料集裡面的欄位只是用來定義哪些欄位是要列印出來的
    接著在程式裡就可以把DataTable當做是報表的資料來源將資料列印出來!!!
    2009年4月5日 下午 12:17
  • 不是,我是加入報表(Report1.rdlc),不是加入Crystal Report(CrystalReport1.rpt)
    2009年4月5日 下午 12:50
  • 小弟補充一下,要列印的DataTable是程式跑了之後,程式碼動態產生的~
    2009年4月5日 下午 01:20
  • Jeff:
          提供一個簡易的方法, 先手動建立一個資料集(Xsd檔),這個資料集啥方法,adapter都沒有,只要建一個DataTable在裡面
          此資料集的DataTable欄位結構和你程式查詢出來的的DataTable一樣.
          然後把報表的資料來源指向這個Xsd的這個DataTable就好了.
    2009年4月5日 下午 01:23
    版主
  • 謝謝Bill Chung,

    我剛剛試了一下,手動在專案中新增資料集(改名為dsReport.xsd)後,我在報表中要指定DataSet name時,我輸入dsReport,但執行時會有
    「參考到無效的DataSet name 'dsReport'」....
    請問我哪裡做錯了嗎?
    2009年4月5日 下午 01:57
  • Jeff:
          這可能用圖來說明會比較清楚
          1.先建立一個名為Rpt1DS.xsd的資料集<圖1>
          2.在報表設計工具中指定報表的設定來源<圖2>
          3.在報表設計畫面中使用工具箱拉一個資料表過來
          4.此時拉開資料來源會出現剛剛所設定的資料集,把要用的欄位拉到報表的資料表物件中,完成報表的設計<圖3>
          5.在Window Form畫面中拉一個ReportViewer物件,不用在畫面設計中給它什麼報表來源
          6.在這個Windows Form的重點程式如下:     
                '前面查詢資料庫,得到一個myTable的dataTable物件 
                ReportViewer1.ProcessingMode = ProcessingMode.Local    <--Local報表
                Dim rep As LocalReport = ReportViewer1.LocalReport 
                rep.ReportPath = "Rpt1.rdlc"   <--用哪個報表
                Dim rptDataSource As New Microsoft.Reporting.WinForms.ReportDataSource  <--宣告一個報表資料來源執行個體
                rptDataSource.Name = "Rpt1DS_DataTable1" <---報表資料來源名稱
                rptDataSource.Value = myTable <---設定資料
                rep.DataSources.Add(rptDataSource) <--加入到報表資料來源執行個體
                Me.ReportViewer1.RefreshReport() <---報表跑出來了

         圖做的不是挺美觀,就勉強看看吧..
    2009年4月5日 下午 02:58
    版主
  • 謝謝 Bill 的指導,我先照著你的方式試試看再回覆情形...

    謝謝~
    2009年4月5日 下午 03:27
  • 剛才照著 Bill 的指導試了幾次終於成功了!
    這中間的運作原理小弟真的需要再加強一下,會找些ReportDataSource與ReportViewr的資料來瞭解。

    謝謝 Bill~

    連著二次都承蒙你的指教才解決了問題,謝謝~
    2009年4月5日 下午 05:34