Crystal Report基于数据透视查询结果动态添加列

时间:2014-11-16 06:09:23

标签: parameters crystal-reports report pivot add

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

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

以下是一个示例结果:

enter image description here

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

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

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

我的问题是:

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

MODIFICATION:
根据以下建议,我设计了一个水晶报告,该报告使用带有一个数据表“DataTable1”的数据集并添加了6列:一列用于已修复的Rank,其他列用于可能存在于员工数据表中的国籍如下图: enter image description here

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

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

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

  • gradeCode
  • 等级
  • currGrade
  • 序列
  • nationality1
  • nationalityDescription1
  • nationality2
  • nationalityDescription2
  • ...
  • nationalityN,其中N是最大列数。
  • nationalityDescriptionN

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

然后,我将使用XSD作为我的数据源并使用固定列设计报告并禁止显示空列标签。

如果你不能假设最多的国家/地区,那么你需要一个“更棘手”的解决方案:创建一个页面列。但是,只有当列数比页面宽时才打破页面,我才能工作。

告诉我你是否想要尝试并需要更多细节。

Here is a link for a full example in .NET