2016-08-19 224 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点以上。