【问题标题】:Subreport with query inserted into main report将查询插入主报表的子报表
【发布时间】:2011-03-07 18:09:22
【问题描述】:

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

这是正确的方法还是我做错了什么?

任何帮助将不胜感激。

编辑:

我想要做的示例。

假设有一个客户表。我将 FirstName LastName 作为参数化字段显示在表单上,​​以及地址和基本客户信息。

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

报表被放置在一个可由 VB.NET 应用程序调用的类中。因此我无法在 UI 中为子报表创建数据连接(或者我可以稍后传递参数)。

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

Dim myRpt As New RunReport.RunReport

myRpt.Load("myReport.rpt")

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

 CrystalReportViewer1.ReportSource = myRpt

如果需要,客户 ID 也可用于绑定到关联行。

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

【问题讨论】:

  • 在我的 CR 报告中,我经常制作几个小节并在每个小节中放置一个子报告。当您需要在同一个报告中显示多个不同的数据集时,这是我所知道的最佳方法。你能给我们更多的细节吗?怎么了?
  • 只是在寻找一些指导或说明,我在谷歌上搜索并查看使用向导创建子报表的示例。我将通过数据集传递数据。因此,我正在寻找以某种方式将此数据集传递到子报表中需要做的事情。当我尝试设置子报表的数据源属性时,它会抛出一条消息,指出:“报表没有表格”
  • 我几乎不知所措,然后一个灯泡在我脑海里亮了起来。您是否试图使子报表独立于主报表?试试这个:在主报表的设计菜单中,转到插入-> 子报表,选择您的数据表,然后将其中一个或两个字段放在子报表的可见部分(作为占位符)。不要忘记将必要的参数从主报表传递到子报表。然后去预览。祝你好运。
  • 我正在尝试一些建议的事情。让我看看我是否可以更好地描述这一点,我将更新原始帖子。
  • 你能让它工作吗?几个月前我经历了这个,了解你正在经历的事情。事实证明这很简单。

标签: .net vb.net crystal-reports


【解决方案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) 创建主报告。 Give 是您想要的任何选择标准(例如 CustName 或 CustID)
2) 创建子报表。给它你想要的选择标准(例如 CustID)
3) 将子报表插入主报表后,右键单击设计器中的子报表对象/框,然后选择“更改子报表链接”
4) 在“要链接到的字段”框中,从主报表中选择驱动子报表的值。 (例如客户 ID)
5) 在“要使用的子报表参数字段”下拉列表中,选择要链接到主报表的子报表参数字段(例如 CustID)

当您运行报表时,子报表应该只显示主报表中显示的记录的数据。

如果这些步骤不能满足您的需求,请描述缺少的功能。

P.S.:如果您只尝试提取一次数据(而不是一次提取主要数据,一次提取次数据),我的问题是:为什么?

【讨论】:

  • 嘿,你让我找到了正确的答案。我插入了子报表并放置了我创建的数据集中的字段。然后,我将数据集从代码绑定到报表中创建的数据表。它现在按要求工作。感谢您的帮助。
【解决方案2】:

我希望我理解正确。

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

数据

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多