【问题标题】:crystal report - linking subreport parameters水晶报表 - 链接子报表参数
【发布时间】:2014-01-04 08:15:00
【问题描述】:

我正在尝试添加子报表并将参数从我的主报表传递到子报表。当我将所有内容链接起来时,子报告会遍历数千条记录,以查找有关我的测试对象的保险信息,但没有记录。

如果我使用查询工具并使用我希望在 Crystal 报表查询中添加的 WHERE 子句运行查询,则需要几毫秒才能返回任何行。

当我在 Crystal 报表中运行预览时,需要几分钟才能浏览所有记录。为什么查询不返回应有的记录?或者只是我正在寻找的一个特定的,如果有记录的话?我不希望所有 10,000 多条记录都返回给水晶,只是我应该根据我从主报告传递的参数得到的 ONE 或 ZERO!

感谢您的指导, 莱斯利

编辑:我对需要 PatID 和 Episode_Number 的主报告进行了查询。我对我的子报表有一个查询,我想根据 SAME PatID 和 Episode_Number 进行过滤。子报表查询为:

select b.patid, b.episode_number, b.guarantor_name, Trim(b.guar_address_line1|| ' ' || ifNull(b.guar_address_line2, '')) address, b.guar_address_city || ', ' || b.guar_address_state || ' ' || b.guar_address_zip location, b.guar_phone_number from billing_guar_data b

我没有在这个命令中添加任何“额外”参数。 我有通过此链接添加的这些参数: Pm-Command.PATID and Pm-Command.Episode_Number

我在创建子报告时从链接页面中选择的

【问题讨论】:

  • 子报表中有参数吗?您是否将它们链接到主要报告?子报表的“where子句”中是否实际使用了参数?
  • 我尝试过这样做...我在子报告中有参数,但我没有将它们放在那里...它们在我进行链接后出现。
  • 不应该这么难。我想对报告中的所有查询使用相同的参数。我想选择一个人和一集,并拥有我需要的所有数据。我希望将所选/输入的 PatID 和 Episode_Number 传递给我拥有的每个查询。

标签: crystal-reports


【解决方案1】:

我以前做过。我花了一段时间才弄清楚如何将参数输入到子报表中的 SQL 命令中。确实,您拥有的 SQL 将获取所有记录,因为没有 where 子句。如果您传递参数以在 Select Expert 中获取它,则您在检索到 10,000 多条记录后进行过滤。从主报表中,参数必须进入子报表的 SQL 命令才能检索特定记录。以下是操作方法。

您可以从主报告传递原始参数或字段(如果可用)。由于您编写了“Pm-Command.PATID 和 Pm-Command.Episode_Number”,因此您正在传递该字段。首先,在 SQL 命令中添加 where 子句

select 
   b.patid, b.episode_number, b.guarantor_name, Trim(b.guar_address_line1|| ' ' || ifNull(b.guar_address_line2, '')) address, b.guar_address_city || ', ' || b.guar_address_state || ' ' || b.guar_address_zip location, b.guar_phone_number 
from
   billing_guar_data b
where
   b.patid = {?Pm-Command.PATID}
   and b.episode_number = {?Pm-Command.Episode_Number}

接下来,在侧面参数列表的同一窗口中,创建2个参数

  • Pm-Command.PATID
  • Pm-Command.Episode_Number

然后在主报告中显示更改子报告链接...您发送的 2 个参数应该仍然存在。确保在两个参数上都未选中“根据字段选择子报表中的数据”。如果选中此项,它会将参数发送到 Select Expert。因为它将在 SQL 命令中,所以应该取消选中它。

【讨论】:

  • 子报表的选择公式或“选择专家”不一定以这种方式工作。 Crystal 会自动将选择公式中的逻辑添加到子报表的 where 子句中,因此通常不需要添加 SQL 命令。这包括您示例中的逻辑。唯一需要创建 SQL 命令的情况是,如果您正在对列进行一些处理作为记录选择的一部分,例如使用字符串处理函数。
  • 真;如果使用 Crystal 构建 SQL 查询,则 select Expert 将充当 Where 子句。但是,如果使用 SQL 命令,Crystal 将按原样运行查询,并在检索记录时查找 Select Expert 中所述的记录。没有什么能阻止任何人使用带有 SQL 命令的 select 专家。当查询检索数千行并且只需要 1 行时,这会成为性能问题。当需要在服务器端完成作业时,SQL 命令很有用。我可能是错的,因为这个问题从来没有说它是一个 SQL 命令。
  • 是的,我正在使用 SQL 命令并编写自己的查询。今天我会在这方面做更多的工作,因为我很新鲜,没有沮丧,看看我是否能完成它。我使用 Pm-Command 字段只是因为那些是我选择的……如果选择其他链接是有意义的,我可以这样做。我注意到的另一件事是,如果我重新运行报表并选择新参数提示,我必须从子报表中输入参数。这仅仅是因为我在 Crystal Reports 中运行它,并且一旦我将它移动到调用程序就不会成为问题吗?
  • 我想通了!!!万岁!在链接部分,我从主查询中选择了参数并将其移动到右侧的框,然后在左侧的下拉列表中我选择了子报告参数......现在当我被提示输入参数时,我只得到主要报告和我的报告运行速度超快!谢谢!
【解决方案2】:

Crystal 可能没有对您认为的子报表使用 WHERE 子句。这可能是因为您在子报表的记录选择公式中使用了 Crystal 语法或 Crystal 函数,它无法转换为 SQL。发生这种情况时,它将从数据库中获取所有记录并在本地执行记录选择,这听起来就像您的情况一样。

要检查子报表的查询,首先预览整个报表,然后在 Crystal 中自己的选项卡中打开子报表(这将像在 Crystal 中打开它自己的报表一样打开它)然后转到“数据库”->“显示 SQL 查询'。

如果您发布选择标准,那也会有所帮助。

【讨论】:

  • 好的,我可以在子报告“显示查询”中看到没有 where 子句。我已经将子报告链接到主报告,主报告有一个生成报告的人......我想我做错了链接......
  • 这从不显示实际使用的参数,只是我输入的“pre”查询文本。
  • @Leslie 请张贴子报表的记录选择公式。听起来这就是它崩溃的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多