none
請問有關將dataset 指定給 crystal report 的 錯誤訊息 RRS feed

  • 問題

  • 我想將一個 dataset 指定給一個 crystal report 當成 datasource , 可是出現錯誤訊息

    設計的過程如以下各圖

    圖1

    圖2

    圖3

    圖4

    圖5   上步驟選完 report  , 會於下圖中多出一個圖示

    圖6  -- 希望能當按下圖5 中的 button 後 , 將一個 datatable 指定給 report 的 datasource 

    但卻出現以上錯誤 ,

    我將 TA 改為 "TA" 又出現以下錯誤

    請問我應該如何做 , 才能達成需求 ?  謝謝

     

    2015年9月29日 上午 05:56

解答

  • 您好,

    就像上面設計REPORT這樣,在CR的設計畫面,連到資料庫後,進行 REPORT 的設計。

    所以REPORT就設計好了。

    一般來說,資料沒有要再處理過的話,直接給那個 REPORT 的連線資訊,讓它自行去資料庫讀取資料出來呈現,

    也就是您之前一直在用的方式。

    再來,如果資料需要透過AP處理的話,可以透過 ADO.NET 自行去取得相同的資料,

    例如原本 REPORT 用的是 SELECT * FROM TEACHE, 所以可以直接下 SELECT * FROM TEACHER 取回資料放到DATATABLE物件之中。

    有了相同欄位的 DATATABLE後,就可以在程式中,加入資料,或是刪除資料後,

    再將這個 DATATABLE 的物件,給REPORT 物件就可以了。


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 MIS110 2015年9月30日 上午 02:36
    2015年9月29日 上午 07:36

所有回覆

  • 您好,

    SetDataSource有說明,它只吃 DataSet or DataSet ...

    所以您可以直接透過 Ado.net 取得跟 CrystalReport1.rpt 所需要的 data 格式一樣的 DataTable 給它。

    我是習慣直接去下 SQL 取回資料,或是您可以先建立測試的DataTable 給 Rpt ,試看看,如下,

    Dim dtData As New DataTable
    dtData.Columns.Add("EndUser_Id", GetType(Integer))
    dtData.Columns.Add("EndUserClass_Id", GetType(Integer))
    dtData.Columns.Add("EndUser_Name", GetType(String))
    dtData.Columns.Add("Login_Name", GetType(String))
    dtData.Columns.Add("Login_Password", GetType(String))
    dtData.Columns.Add("Last_Modified", GetType(String))
    For i As Integer = 0 To 10
    	dtData.Rows.Add(New Object() {i, 1, "Name-" & i, "Name-" & i, "", ""})
    Next
    'Imports CrystalDecisions.CrystalReports.Engine
    Dim oRpt As New ReportDocument
    oRpt.Load("C:\Projects\Temp\DataGridTest\CrystalReport1.rpt")
    oRpt.SetDataSource(dtData)
    CrystalReportViewer1.ReportSource = oRpt


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2015年9月29日 上午 06:49
  • 您好,

    SetDataSource有說明,它只吃 DataSet or DataSet ...

    所以您可以直接透過 Ado.net 取得跟 CrystalReport1.rpt 所需要的 data 格式一樣的 DataTable 給它。

    我是習慣直接去下 SQL 取回資料,或是您可以先建立測試的DataTable 給 Rpt ,試看看,如下,

    Dim dtData As New DataTable
    dtData.Columns.Add("EndUser_Id", GetType(Integer))
    dtData.Columns.Add("EndUserClass_Id", GetType(Integer))
    dtData.Columns.Add("EndUser_Name", GetType(String))
    dtData.Columns.Add("Login_Name", GetType(String))
    dtData.Columns.Add("Login_Password", GetType(String))
    dtData.Columns.Add("Last_Modified", GetType(String))
    For i As Integer = 0 To 10
    	dtData.Rows.Add(New Object() {i, 1, "Name-" & i, "Name-" & i, "", ""})
    Next
    'Imports CrystalDecisions.CrystalReports.Engine
    Dim oRpt As New ReportDocument
    oRpt.Load("C:\Projects\Temp\DataGridTest\CrystalReport1.rpt")
    oRpt.SetDataSource(dtData)
    CrystalReportViewer1.ReportSource = oRpt


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    感謝您的回覆及提供的 code

    但我有個疑問 

    若用以上方式提供 report 的 datasource , 但是於 button 按下後才會產生 datatable ,

    要如何做 report 的 layout (欄位排版) , 因為我沒辦法在 rpt 內拉到 datatable 的欄位

    換個方式請教您 , 就是

    以上 code 您會放在什麼地方 , rpt 的 layout 又在何時做 ? 謝謝

    2015年9月29日 上午 07:28
  • 您好,

    就像上面設計REPORT這樣,在CR的設計畫面,連到資料庫後,進行 REPORT 的設計。

    所以REPORT就設計好了。

    一般來說,資料沒有要再處理過的話,直接給那個 REPORT 的連線資訊,讓它自行去資料庫讀取資料出來呈現,

    也就是您之前一直在用的方式。

    再來,如果資料需要透過AP處理的話,可以透過 ADO.NET 自行去取得相同的資料,

    例如原本 REPORT 用的是 SELECT * FROM TEACHE, 所以可以直接下 SELECT * FROM TEACHER 取回資料放到DATATABLE物件之中。

    有了相同欄位的 DATATABLE後,就可以在程式中,加入資料,或是刪除資料後,

    再將這個 DATATABLE 的物件,給REPORT 物件就可以了。


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 MIS110 2015年9月30日 上午 02:36
    2015年9月29日 上午 07:36
  • 感謝您的回覆 , 依您的作法 , 我寫了以下的 CODE , 但出現 ERR 

    Dim TAprt As New DataTable

    TAprt 塞值的部份 --> 略

    以下模仿您的方式 , 

    Dim oRpt As New ReportDocument
    oRpt.Load("D:\test\TEST-REPORT-DATASET\CrystalReport1.rpt")

    MessageBox.Show("TAprt : " + TAprt.Rows(0).Item(0).ToString() + "/ " + TAprt.Rows(0).Item(1).ToString())

     -->  用 message 去 show , 確定 TAprt 有資料 (如下圖)

    oRpt.SetDataSource(TAprt)

    CrystalReportViewer1.ReportSource = oRpt

    卻出現下圖的 err  , 想請教為何會這樣 ? 謝謝

    2015年9月29日 上午 09:02
  • 不好意思 , 就以上的 ERR , 我又去看了一下我的 crystalreport1.rpt , 發現可能是我不小心去刪到 , rtp 內已經沒有資料來源了

    所以依您的方式將資料來源再建成與 form 中的 dataset 同結構就好了 ,

    另外, 又遇到一些問題 , 但因為在網路上有找到解答 , 就沒再來問了 , 問題解答也提供大家參考

    http://fms-dot-net-notes.blogspot.tw/2011_09_01_archive.html

    非常謝謝各位一路的幫忙 , 終於試出來了  , 謝謝

    2015年9月30日 上午 02:35
  • 也感謝您的分享。

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2015年9月30日 上午 03:07