代码之家  ›  专栏  ›  技术社区  ›  Ryan Taylor

如何使用Crystal Reports动态修改报表?

  •  1
  • Ryan Taylor  · 技术社区  · 16 年前

    我想知道我可以动态地修改现有的Crystal Report (使用C和Crystal Reports 2008) 这样它就可以使用相同的布局报告根本不同的数据(来自同一个数据库)。原因是我们正在构建一个允许用户指定的应用程序:

    1. 一种过滤器,只显示他们感兴趣的数据(即WHERECLASER)。
      • [例如,仅在纽约展示建筑物]
    2. 指定要显示的表
      • [例如,展示建筑物和楼层,但不展示房间]
    3. 指定要显示的字段
      • [例如,显示建筑物ID、编号、名称、地址和楼层编号]
    4. 更改节的分组方式
      • [例如,按建筑用途分组、建造年份等]
    5. 更改图表中使用的字段
      • [例如,按建筑用途划分的面积、按建筑用途划分的占用率、按建筑ID划分的面积]

    由于UI的灵活性,用户可以尝试报告许多不同类型的“问题”,我不想为每个可能的组合创建报告。有关我正在尝试完成的操作的示例,请参见下图。左边的报告描述了按区域分组的建筑物。右边的报告描述了按地点分组的建筑物。

    Report Comparison http://img119.imageshack.us/img119/9052/performancereportcomparbt7.png

    编辑:

    我将尝试使用报告参数修改Philippe Grondier建议的报告。我通过压制团体成功地做到了这一点。当一个组被抑制时,组向上滑动以填充空白区域,使得所有的行都没有空格。但是,对于单个文本对象,同样的行为并不正确。当文本对象被抑制时,该字段的输出为空白。我要做的是抑制一个文本对象,这样整行就被抑制了,这将导致它下面的所有条目“隆起”一行。我怎样才能做到这一点?

    1 回复  |  直到 16 年前
        1
  •  3
  •   Community kfsone    7 年前

    根据更新的类型(以及与更新相关的对象),可以使用free craxdrt.dll(设计器运行时库)或not free craxdrt.dll(设计器设计和运行时库)。我忘了细节,但你一定会在网上找到的。

    你的问题:

    1. 筛选器:可以在运行时更新报表对象的sqlquerystring,也可以更新预先声明的参数,以便将它们添加到“where”子句中。我认为添加参数仅限于craxddrt dll,但可以使用craxdrt dll更新现有参数。您可以使用CR接口来更新这些参数,或者通过代码来实现:一个想法是在客户机接口中更新这些值(例如,从活动表单),然后以编程方式更新它们。请检查 here 举个例子。
    2. 隐藏表:我认为“隐藏表”没有任何意义,因为您需要您的表具有所有可用关系来计算汇总值。因此,您可以向用户建议查看/隐藏详细信息或查看/隐藏不同分组级别的可能性。这可以通过使用免费的craxdrt库和报表对象的“areas”collection/“suppress”方法轻松完成。
    3. 再一次,在报告的不同方面进行尝试似乎是最好的解决方案
    4. 我劝你不要想它!更改数据顺序可能导致不可预测的结果,特别是在组级别计算中间摘要时。根据您的请求,您可以坚持建议(2),通过在报表上显示非特定组,或者对于简单表单(仅1个组),在运行时以编程方式更新将在组定义公式中使用的参数。
    5. 返回建议(2):生成完整的报告将显示所有预期数据,然后隐藏/显示报告的不同部分。

    还有另一个可用的代码示例 here ,向您展示如何在运行时更改到不同数据库/不同表的报表连接。