2016-08-19 173 views
0

我在這裏有點傻眼。我所見過的大多數教程都使用嚮導或內置(或現成)數據集創建報告。我在運行時使用查詢構建我的數據集,所以我不太確定如何採用迄今爲止所見的數據集。程序RDLC報告

通常,當我創建報告時,它是一個記錄報告,可以使用參數輕鬆填充RDLC文件中的字段。然而,我正在嘗試做的下面的工作類似於製作SELECT查詢。因此,這裏是我想要做的,我試圖做一個報告,顯示了像這樣:

Status: Approved 
PID | Name | Address 
1 | Name 1 | Address 1 
2 | Name 2 | Address 2 
=========================== 
Status: Denied 
PID | Name | Address 
3 | Name 3 | Address 3 
4 | Name 4 | Address 4 

我有這樣幾個問題:

  1. 我RDLC報告存儲在帶有.vb/.resx文件的文件夾內的「\ Reports」文件夾中。當我提到它使用Application.StartupPath &「\ Reports \ myReport.rdlc」時,它在那裏找不到(顯然)。有沒有辦法將報告文件嵌入到程序中(即:使用相對文件夾名稱,我應該在哪裏放置RDLC文件夾/文件)?我不認爲我應該將RDLC文件傳輸到Debug文件夾中,以使其工作(因此完整的目錄列表)。

  2. 在嘗試使用上面的代碼創建報告時採取什麼樣的方法?我在想,如果我要循環使用我的數據集並將其中的值作爲參數傳遞給RDLC文件,它將填充報告(與之前的單記錄報告一樣),但似乎並非如此。

  3. 刷新報表觀衆也給了我

    的數據源實例數據源「數據集1」尚未提供。

    我創造了RDLC文件虛擬數據集只是爲了能夠使用的Tablix在多個線程我讀周圍建議。我真的更喜歡如果我可以使用我從頭開始製作的數據集,而不是使用嚮導。

    Private Sub btnGenerateReport_Click(sender As Object, e As EventArgs) Handles btnGenerateReport.Click 
        Dim query As String 
    
        query = BuildQuery() 
        SQLControl = New SQLControl 
    
        Try 
         If Not query = String.Empty Then 
          SQLControl.QueryParams(query) 
          If SQLControl.SQLDS.Tables(0).Rows.Count > 0 Then 
           FetchData() 
    
          End If 
         End If 
        Catch ex As Exception 
         MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Report Maker") 
        End Try 
    End Sub 
    
    Private Sub FetchData() 
        Dim dataSource As ReportDataSource 
        Dim PID As Integer 
        Dim Name As String 
        Dim ApplicationStatus As String 
        Dim Address As String 
    
        rvPreview.Reset() 
        rvPreview.LocalReport.ReportPath = "C:\Users\xxx\Documents\Visual Studio 2015\Projects\My Project 1\My Project 1\Reports\myReport.rdlc" 
        rvPreview.LocalReport.DataSources.Clear() 
        dataSource = New ReportDataSource() 
        _rparams = New List(Of ReportParameter) 
    
        With SQLControl.SQLDS.Tables(0) 
         For x As Integer = 0 To .Rows.Count - 1 
          PID = .Rows(x).Item("PID") 
          Name = .Rows(x).Item("LName") & ", " & .Rows(x).Item("FName") 
          ApplicationStatus = .Rows(x).Item("ApplicationStatus") 
          Address = .Rows(x).Item("StreetAddress") & ", " & .Rows(x).Item("City") 
    
          _rparams.Add(New ReportParameter("PID", PID)) 
          _rparams.Add(New ReportParameter("Name", Name)) 
          _rparams.Add(New ReportParameter("ApplicationStatus", ApplicationStatus)) 
          _rparams.Add(New ReportParameter("Address", Address)) 
    
          For Each param As ReportParameter In _rparams 
           rvPreview.LocalReport.SetParameters(_rparams) 
          Next 
         Next x 
    
         rvPreview.RefreshReport() 
        End With 
    End Sub 
    

回答

0

在開始時我不得不提,我使用RDLC用C#的報道,但解決方案應該是在vb.net非常相似。

  1. 我usualy準備每一份報告作爲單獨的項目(所以我對每一個申報分別DLL),並使用一個單獨的類在這個項目中來處理一切,我需要報告的事情。我添加項目下的每個RDLC文件(主報告文件和子報告文件)。就我而言,我可以讀到這樣一個流的每個RDLC文件只是用項目命名空間和RDLC文件名,如下面

    Assembly assembly = Assembly.GetExecutingAssembly(); 
    Stream stream = assembly.GetManifestResourceStream("[Some project namespace].[Some report filename].rdlc"); 
    

    然後我用這樣的代碼,該代碼示例是流與報表查看器(該stream在連接這個代碼是相同的對象上面,但是這個代碼是在訪問報告查看器對象另一個類)

    ReportViewerControl.LocalReport.LoadReportDefinition(new StreamReader(stream)); 
    
  2. 你可以很簡單的方式爲您提供報告的數據集。您可以使用System.Data.DataTable類的對象作爲表(我在下面的代碼中將該對象稱爲yourTableObject)和System.Data.DataRow類。當你把所有的數據表中,那麼你可以使用像這樣

    //I use DataSet1 as dataset name because you use this name in your report definition 
    ReportDataSource rds = new ReportDataSource("DataSet1", yourTableObject); 
    ReportViewerControl.LocalReport.DataSources.Add(rds); 
    

    Ofcourse提供表的代碼應該像在報告中定義的數據集相同的字段提供給報告。

  3. 您必須爲報表提供有效的DataSet。解決方案在第2點以上。