将查询插入主报表的子报表

时间:2010-02-04 18:48:49

标签: .net vb.net crystal-reports

我有一个水晶报告,其中包含一堆参数化字段,这些字段由代码填充并通过CRViewer显示。我需要在这里添加几个部分来执行查询以返回数据集并在同一报表中显示。我不确定使用子报表执行此操作的最佳方法。我正在尝试添加子报表,然后将子报表的数据源设置为我的数据集,但我无法使其工作。

这是否是正确的方法,或者我只是做错了什么?

任何帮助都将不胜感激。

编辑:

我想要做的例子。

让我们说有一个客户表。我有FirstName LastName作为表格上显示的参数化字段以及地址和基本客户信息。

我想放置一个子报表,显示该客户在SAME报表上所做的所有订单。这是一个可能有多个订单的关联表。

该报告被放置在一个可由VB.NET应用程序调用的类中。因此,我无法在UI中为子报表创建dataconnection(或者我可以在以后传递params)。

我通过执行以下操作成功填充参数化字段:

Dim myRpt As New RunReport.RunReport

myRpt.Load("myReport.rpt")

'Set Labels
 myRpt.SetParameterValue("@FirstName", strFirstName)

 CrystalReportViewer1.ReportSource = myRpt

如果需要,还可以将customerID用于绑定到关联行。

这将是一个报告,我只需要显示子报告部分来处理所有可能的订单。这是我遇到问题的部分。

3 个答案:

答案 0 :(得分:1)

您是否正在设置主报告的数据源?

Dim ds as new Dataset
sqlAdapter.Fill(ds, "Whatever");
oRpt.SetDataSource (ds)

如果是这样,在子报表上设置它可能如下所示:

Dim oSubReport As ReportDocument
For Each oReportObject As SubreportObject In oRpt.ReportDefinition.ReportObjects  
  If oReportObject.Kind = ReportObjectKind.SubreportObject Then  
    oSubReportObject = CType(oReportObject, SubreportObject)  
    oSubReport = oRpt.OpenSubreport(oSubReportObject.SubreportName)  
    oSubReport.SetDataSource (ds)
  End If  
Next

我已阅读上述更新,并认为我了解您的目标。看看这是否适合你:

1)创建主报告。给出您想要的任何选择标准(例如CustName或CustID)
2)创建子报告。给它你想要的选择标准(例如CustID)
3)将子报表插入主报表后,右键单击设计器中的子报表对象/框,然后选择“更改子报表链接”
4)在“要链接到的字段”框中,从主报表中选择将驱动子报表的值。 (例如CustID)
5)在“要使用的子报表参数字段”下拉列表中,选择要链接到主报表的子报表参数字段(例如,CustID)

运行报表时,子报表应仅显示主报表中显示的记录的数据。

如果这些步骤无法满足您的需求,请说明缺少哪些功能。

P.S。:如果你试图只提取一次数据(而不是一次为主数据,再为sub),我的问题是:为什么?

答案 1 :(得分:1)

我希望我能正确理解这一点。

基本上我认为您正在尝试创建发票报表,其中标题显示客户信息,详细信息显示发票的详细信息。如果是这种情况,那么我认为最简单的方法就是将客户字段添加到包含发票详细信息的数据集中,如下所示:

数据

Name           Address        City    State  InvSeq  Item   Amt
Peter Griffin  36 Spooner St  Quahog  RI     1       Item1  40.00
Peter Griffin  36 Spooner St  Quahog  RI     2       Item2  30.00
Peter Griffin  36 Spooner St  Quahog  RI     3       Item3  20.00
Peter Griffin  36 Spooner St  Quahog  RI     4       Item4  10.00

然后,您只需将客户信息字段添加到报告标题(如果此报告针对多个客户,则为客户组头标题),以便第一条记录中的数据是唯一显示的客户信息。然后将发票明细字段添加到详细信息部分,以便为每行重复这些字段,如下所示:

报告布局

*RH*:      Sold To:
           Peter Griffin
           36 Spooner St
           Quahog, RI

*Details*:   InvSeq   Item     Amt.
                1     Item1    $40.00
                2     Item2    $30.00
                3     Item3    $20.00
                4     Item4    $10.00

希望我能正确理解这个问题,如果是的话,我希望这会有所帮助。

答案 2 :(得分:0)

您需要创建2个数据集并将它们作为参数传递。 1将包含基本客户信息及其密钥。另一个将包含第一个数据集中具有相应客户密钥的所有客户的订单。从那里,您将主报告绑定到第一个数据集。您的子报表将绑定到第二个数据集。然后,您将使用父报表中的客户键作为子报表的参数,并按该参数进行过滤。这将限制子报表仅显示该客户键的订单。这可以通过报告中的极少甚至没有代码来完成。所有代码都在调用报告的.Net对象中完成。

这是一个很棒的网站,如果您还没有看到它,它将帮助您入门。它帮助了我很多:http://www.emoreau.com/Entries/Articles/2006/09/Feeding-Crystal-Reports-from-your-application.aspx