Crystal Reports v13.0.2000.0.:为啥“where”子句在子报表中不起作用?
Posted
技术标签:
【中文标题】Crystal Reports v13.0.2000.0.:为啥“where”子句在子报表中不起作用?【英文标题】:Crystal Reports v13.0.2000.0.: why is 'where' clause not working in subreport?Crystal Reports v13.0.2000.0.:为什么“where”子句在子报表中不起作用? 【发布时间】:2016-12-20 15:55:37 【问题描述】:几个小时以来,我一直在用头撞墙(仍然不是字面意思,但如果我找不到解决方案,我很快就会开始)。对我来说,我面临的问题实际上不是问题,不可能是问题,因为我在我正在处理的同一个 Silverlight 项目的另一个菜单中成功地使用了子报表。我什至无法定义它是什么——一个问题、一个问题、一个邪恶……Crystal Reports 有时可能……嗯,很有趣。包括这样一个事实,即我与 CR 合作仅 2 周(仍在工作中学习),情况非常好。无论如何。
首先,我试图基本上每个文档有两个报告副本。在报告的命令中(通过数据库专家)我只有select * from Documents where ?filter
。在调用 ExportToDisk() 方法之前,我给出了 C# 中的 where 子句。有一个<sdk:DataGrid></sdk:DataGrid>
,我从中获取所有标记的行(文档),它们的 RowID 是准确的,创建一个 'in ()' 子句,将其提供给报告的 ?filter 参数,它按我的预期工作.
我在网上搜索,我能找到的最好的方法是有一个“虚拟”主报告,其部分分为两部分,并将我的报告作为子报告插入这些部分。到现在为止还挺好。我做了“参数链接”(更改子报表链接...选项),就像我在另一个菜单中所做的那样......没有数据。仅显示标签。我检查了 3 个要报告的文档,总共有 3 * 2 = 6 页,但都是空字段。
经过一个多小时的测试最终得出结论:如果我有一个报告并通过数据库专家将它的命令设置为select * from Documents where RowID = '<someGuid>'
或select * from Documents where ?filter
,那么我总是得到文档的所有字段(如客户、代码等) - 在第一种情况下,特定文档只有一页,在第二种情况下 - 每个文档一页。
如果我尝试作为子报表并从网格中选择 2 个文档,我会得到四个“空”页面 - 每个文档两个。不用说,如果子报表的命令是:select * from Document where ?filter
并且我将过滤器链接到主报表,它就不起作用。
令我惊讶的是,它似乎工作了!...在一个特定的用例中:如果我将子报告的命令设置为select * from Documents where 1 = 1
。在这种情况下,我在表中的 1000 个文档中得到 2000 页 - 所有字段都填充了数据。
所以这是我的“问题”!?这太奇怪了,我什至不知道它应该被称为“问题”还是别的什么。任何帮助将不胜感激。
编辑:总结一下:我有一个主要的“虚拟”报告,其命令设置为select * from Documents where ?filter
。我将其详细信息部分分为两部分,并在每个部分中插入一个子报表。子报表的命令是select * from Documents where doc_RowID = '?filter'
,其中RowID 应该来自主报表通过链接。我在子报告中尝试过:select * from Documents where doc_RowID = '<someGuid>'
,我再次获得仅带有标签的页面。如果我在子报表中有 where 1 = 1,它“有效”。
在主报告中,我什至尝试按 doc_RowID 列对文档进行分组,并将子报告放在 GroupHeader 和 GroupFooter 部分。没有成功。
从今天(21.12.2016)开始编辑:我尝试将子报表的命令设置为通过左连接表 docItems 的某些字段过滤数据为 di,显示购买的项目:where di.Price > 5
。当我在 SQL Server Management Studio 中使用这个 where 子句运行查询时,我得到了 3 个文档中的 7 条记录的结果。在报告中,我得到 260 页,这意味着它在 CR 中返回 130 个文档。 WTF 正在这里进行... :O
edit3:客户的 SQL 服务器已关闭,因此我决定继续在我们的服务器上进行测试。问题消失了。这听起来像是个好消息,但最终,我将不得不将我的工作部署到他们的服务器上......
【问题讨论】:
【参考方案1】:我为此找到了魔法。我称它为“魔术”,因为我不知道它在这种情况下究竟有什么帮助,下次我遇到类似问题时它也无济于事。我希望它不会发生。
阅读this thread - 我找到了解决方案。以防万一它死了,我会在这里发布:
在 CR XI 设计器中打开报表。
选择数据库 -> 设置数据源位置。
将出现设置数据源位置窗口,并在替换为部分连接到数据库并通过单击更新按钮将这些表替换为当前数据源中的表。
更新后关闭“设置数据源位置”窗口。
转到“数据库菜单”并单击“验证数据库”并单击“确定”。
预览报告并保存报告。
【讨论】:
以上是关于Crystal Reports v13.0.2000.0.:为啥“where”子句在子报表中不起作用?的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2017和SAP Crystal Reports
使用Crystal Reports ReportDocument