【发布时间】: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 服务器已关闭,因此我决定继续在我们的服务器上进行测试。问题消失了。这听起来像是个好消息,但最终,我将不得不将我的工作部署到他们的服务器上......
【问题讨论】:
标签: crystal-reports where-clause subreport