具有多个表的 Crystal 报表 - 空乘积或笛卡尔积

Posted

技术标签:

【中文标题】具有多个表的 Crystal 报表 - 空乘积或笛卡尔积【英文标题】:Crystal Report with Multiple Tables - Empty or Cartesian Product 【发布时间】:2012-12-04 21:01:45 【问题描述】:

我知道以前有人问过这个问题……有点。这就是我发帖的原因。基本上,我在 Crystal 中构建一个报表,它依赖于保持这个简单,至少 3 个表。

表 A 通过唯一 ID 与表 B 内部连接。表 B 有一个子表,可能有也可能没有与此唯一 ID 相关的数据。

作为一般示例,表 A 是客户表,表 B 是产品表,子表包含产品编号。所有客户都有产品,但并非所有客户在子表中都有产品编号。我希望我已经解释得足够简单了。

我的问题是在 Crytal 和 Access 之间以及如何查询它。当我在 VB 中编写某些内容时,编写和执行查询并以所需的方式显示结果很容易。但是,我似乎无法直接查询...我要么最终得到一个以笛卡尔积作为结果集的报告,结果显示正常...除了即使只有少数记录,我最终也只有大约 30k 页。 .或者我最终得到一个空白数据集,因为子表没有与 B 对应的数据。

使用外部联接,我设法在一定程度上得到了我的结果,但在现实世界的报告中是不可接受的。我确定这个问题已经出现,但我似乎找不到任何合适的答案,老实说,我什至不确定作为 Crystal n00b 应该问什么问题。

我真正想要的是表 A 中的数据、表 B 和子表中的数据。虽然它们在逻辑上是链接的,并且可以与 ID 字段链接,但我认为没有必要,因为我正在为 ID 字段的报告获取参数值。一旦表格被过滤,除了将它们转储到报告中之外,不需要采取其他任何操作。

那么有人能指出我正确的方向吗?我可以在单独的部分中设置单个数据源(不相关)吗?我应该在我的数据库中构建一个查询和逻辑树来获得我需要的东西吗?我一直在绞尽脑汁,似乎找不到正确的解决方案,任何和所有的建议都非常感谢,如果我能澄清任何事情或回答任何问题,我会的。

提前致谢。

根据以下要求:

Section1

ID fname lname 
01 john smith 
Section2

ID notifiedDate notifiedTime 
01 10/10/2012   12:35PM 

S2childAdmin 
ID noteName 
01 jane doe 

此数据在逻辑上是相关的,可以在 DB 中关联。但是,只要将 ID 参数传递给每个表,就没有必要。查询与 Section2 连接的 Section1 内部工作正常。但是任何其他安排都会导致比要求的行数更多,并且我最终会得到一份重复多次的报告。我真正需要的是像 Section1 与 Section2 和 S2childAdmin 一起作为免费可用的表加入的东西。否则它会乘以我的数据或导致空记录集(因为它可以返回 0 行)

【问题讨论】:

不,我在这方面也没有成功。我只是想不出一种链接表格的方法,这样我就没有得到笛卡尔积并且仍然可以独立访问表格数据。子表实际上将在报告中填充其相关字段 在这种情况下,让我们看看能否为您提供在 Access 中正常工作的查询。暂时将水晶排除在等式之外。向我们展示您的表格中相关列的简要示例以及基于该示例数据的您想要的结果集。 @HansUp 让我解决问题。我的数据库非常广泛。我会尽快回复你 我会尽量同意这一点。我的 DB Section1、Section2 和 S2childAdmin 中有。 Section1 是 Section2 在其上构建的基本起始位置(表单中的下一步),S2childAdmin 包含基于 Section2 的多选列表框的选择。它与 Section2 可以有 0 到 N 个关系。我将在下面添加一个示例。 感谢您的澄清,泰勒。我误解了你问题的性质;这不是关于修复 Access 查询以返回您想要的结果。您想要的在 Access 查询中是不可能的。如果这是一个 Access 应用程序,您可以在主窗体中显示前 2 个表的连接,并在子窗体中显示“免费可用表”。或报告和子报告。我不知道 Crystal 提供了哪些功能。 【参考方案1】:

我认为这应该有助于为您指明正确的方向,尽管我从事 Crystal Reports 的繁重工作已有 5 年左右的时间了。

一种选择可能是像您所说的那样使用外部联接加入所有内容,然后在表 A ID 上使用 Crystal Report“组”,其中包含基于表 B ID 的组。因此,您可以在实际的“详细信息”区域中放置表 C 的详细信息(如果有),然后使用表 A 和表 B 的组页眉/页脚来显示特定于这些对象的数据。

另一个可能无法满足您的要求但可能会让您以另一种方式思考的解决方案是创建您的主报告并在其中显示表 A 中的字段。然后在这些字段下方包含一个子报告并通过在表 A 的唯一 ID 中。然后,您将在子报表中进行查询,以查找具有该表 A.ID 值的所有表 B 记录并显示它们的详细信息。

此时您遇到了 Crystal Reports 的一个弱点(至少在我使用的上一个版本中),您不能在子报表中包含子报表。

【讨论】:

我所读到的关于组的内容很少,一个类似的想法确实闪过我的脑海,但我不确定它是否能很好地适应表单的流程。我还需要拆分的部分将包含使用多选列表框输入的大约 10 个组。如果这让您对事物的布局有所了解。子报表向我尖叫着要再次执行报表的布局以及对这么多报表的需求。我确实喜欢你带我去的地方 如果你的结构更扁平/2层......就像你有一个***对象并且它有1到n个不同类型的子对象......但是那些孩子没有孩子,你'肯定会想看看子报表。这些组可以非常灵活,但我想你现在可能已经失去了我的报告布局。如果您有任何类型的屏幕截图,可以手绘您认为想要的东西并拍照,如果有任何帮助,我很乐意继续讨论。 结构很基本但是有点大。我有Section1>Section2>Section3>Section4。每个表都建立在前一个数据的基础上以获得完整的表格。这工作得很好。问题是我的字段谁的数据包含在子表中,我似乎无法以任何方式包含它而不会导致不正确的结果或完全重新设计表单以允许子报表。我会试着给你一个屏幕,我怎么能在这里上传?我对这个发帖系统不太熟悉。 您必须原谅我,对子报告性质的基本误解导致我这么说。我不知道为什么,但我的印象是这将是一个更线性的对象设计。但经过一些实验,事实证明并非如此。但是,我确实需要找到一种方法来通过报告/子报告结构向下传递所需的参数。你有什么建议吗?当然没有水晶提示..

以上是关于具有多个表的 Crystal 报表 - 空乘积或笛卡尔积的主要内容,如果未能解决你的问题,请参考以下文章

vb中怎么用crystalreport

会用水晶报表crystal reports的请进

开发“crystal report”报表要用啥语言?

如何中止 Crystal 报表

Crystal报表无法使用Azure Web应用程序

修改水晶报表(Crystal Report 2008)中子报表的宽度