【问题标题】:Crystal Report Add Columns Dynamically based on Pivot Query Result水晶报表根据透视查询结果动态添加列
【发布时间】:2014-11-16 06:09:23
【问题描述】:

我正在使用带有 Crystal Reports 的 VB.Net 2010。我设计了一个返回所需摘要信息的数据透视查询。

注意:我不想使用交叉表,因为我需要从右到左显示信息。

以下是示例结果:

我只是在总结每个国家每个级别的员工人数。也就是说,当我修改任何员工的国籍时,该国籍将在结果中显示为一列:PIVOT。

我设计了一个水晶报表,它使用相同的查询并显示相同的数据。

我将报表的数据源设置为一个命令,并在命令中添加了查询,但是问题来了:查询返回的列数只是设计时运行查询时检索到的列数!也就是说,如果将来自其他国籍的新员工添加到数据库中,则无法在报告中显示。甚至,根据列集的最大列数是3。

我的问题是:

如何根据数据透视查询返回的列数动态添加这些列?

修改:
根据下面的建议,我设计了一个水晶报表,它使用一个数据表“DataTable1”的数据集,并添加了 6 列:一列用于固定的等级,其他列用于可能存在于我的员工数据表中的国籍如下图:

现在的问题是如何在这些列中显示数据透视查询返回的数据? 以及如何隐藏其他没有放置数据的列?

【问题讨论】:

  • 我认为如果您将映射表添加到数据库中以获取三列国籍的映射表,可以轻松解决您的问题,例如NationalityId、NationalityName 和 NationalityArabicName 并在上表中添加一列而不是最后三列称为 FK_NationalityId 保存与填充报告的 SP 中的映射表链接的每个 Nationality 的值,在这种情况下,您不必添加一列每次到报告中
  • 谢谢Abdulrahman先生,但是上面的结果不是表格,是pivot query返回的数据。此外,我已经有了与您提到的具有相同列的国家名称的表。我也不明白如何根据您的建议显示所有国籍!
  • Al-Rajihi 至于显示你可以在表格之间使用内部连接,至于我似乎想念的主要问题理解问题,你需要根据等级代码显示国家的数量吗? ?或者您需要根据某些条件在报告中添加列??
  • 不是国家的数量。基本上,我有列国籍的员工表,它是国家主表的外键。我设计了一个查询来获取年级的详细摘要以及该年级每个国家有多少员工,上图显示了运行查询时的示例结果

标签: parameters crystal-reports report pivot add


【解决方案1】:

我认为不使用crosstab 的唯一解决方案是从右到左创建尽可能多的列,然后在从数据库添加新列时有条件地显示和隐藏。

【讨论】:

  • 很公平,但如何以编程方式做到这一点?我需要一些代码
  • 不幸的是..我无法提供任何代码,因为我在 Crystal 上作为一个独立的应用程序而不是通过 VB.. 我你需要水晶我可以帮助你
  • 好的,我在抑制公式中尝试了以下水晶中的代码:if isNull(columnName) true else false。但它不起作用
  • 你能解释一下吗...你想隐藏哪一列以及你正在使用哪一列
  • 假设我的员工数据表中有 3 个不同的国籍,而我的国家数据表中有 6 个国籍。然后我使用数据集作为数据源设计了水晶报表。我添加了所有可能的列。现在,在运行报告时,我将获得正确的详细信息,并且其他 3 个国家的列也会出现:DataColumn4、DataColumn5 和 DataColumn6。如何抑制这些列?
【解决方案2】:

Crystal Reports 在设计时使用静态定义。我知道的动态选项是交叉表。但它在任何情况下都没有参加过我,因为有很多设计限制。如果交叉表对您来说足够好,请坚持 Siva 的回答。否则,请尝试类似于 Abdulrahman_88 的解决方案。

当我需要创建动态列时,我会以 Abdulrahman_88 建议的类似方式模拟此行为。我将尝试按照我的习惯进行描述,我的意思是,数据源是一个 .NET 数据集。您可以根据自己的情况进行调整。

更简单的情况是假设您有最大列数。在您的情况下,最大国籍数。

首先,我将创建一个描述列的 XSD:

  • 等级代码
  • 排名
  • currGrade
  • 序列
  • 国籍1
  • 国籍描述1
  • 国籍2
  • 国籍描述2​​
  • ...
  • nationalityN,其中 N 是最大列数。
  • 国籍描述N

所以,我会在我的代码中创建一个类似的 DataSet 并填充它。请注意,您可以使用数据透视表查询和 DataAdapter 在 .NET 中执行此操作。

然后,我将使用 XSD 作为我的数据源,并使用固定列设计报表并抑制空列标签。

如果您无法假设国家/地区的最大数量,那么您需要一个“更复杂”的解决方案:创建一个页面列。但我只有在列数比页面宽时要分页时才有效。

如果您想尝试并需要更多详细信息,请告诉我。

Here is a link for a full example in .NET. (5年后不可用,抱歉)

【讨论】:

  • 是的,Heringer 先生,谢谢您的回答。我已根据建议修改了问题。请查看修改并需要您的更多详细信息
  • 你是在 .NET 中编程吗?
  • 您可以发布您的查询吗?
  • 是的,我是 VB.Net 开发人员
  • 那么,您是否检查了我在答案中添加的示例(链接)?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多