Crystal Reports 使用三个处理环节生成报表的方法来生成报表。下图部分描述在此过程中的每一步所发生的情况。
注意: 尽管子报表在流程图的处理环节2 中出现,但可以使用按需显示子报表,以确保主报表仍然是单处理环节报表。对于按需显示子报表,Crystal Reports 仍然需要对数据再次应用处理环节;但是,这一处理环节到向下钻取子报表时才会开始。因此,您可以使用“按需显示子报表”来改善包含子报表的报表的性能
名词解释
常量公式Constant formulas:对整个报表来说是常量值的公式重复性公式recurring formulas:包含数据库字段、但不包含引用小计或摘要信息的公式。
已保存数据选择公式Saved data selection formulas:记录返回到报表后对数据进行过虑,与record selection formulas不同,对已保存数据选择公式的更改不会重新刷新数据库。相反,只是报表已保存的数据进行过滤。已保存数据选择公式常与可选参数配合完成报表交互。
打印时公式PrintTime formulas:包含对小计或汇总信息的引用的公式
组选择公式
预处理环节1
处理常量公式。它们对每个记录都一样。如100*30是常量公式。常量公式在报表处理开始时求值,以后不再求值。该过程称为“BeforeReadingRecords”。如果将常量公式字段(如 100*30)放入“详细资料”部分,则结果是对于每个记录均显示 3000。
处理环节1
“BeforeReadingRecords”过程发生后,Crystal Reports 开始读取数据库记录。在记录读取过程中做以下动作:• 将可能的记录筛选和排序动作下推到数据库去完成。
• 重复性公式求值,该求值时间称为“WhileReadingRecords。
• 执行不能下推到数据库去完成的记录筛选
• 应用已保存数据记录选择公式。当记录返回到报表时,则通过任何现有的已保存数据选择公式对记录进行进一步过滤。
• 将记录进行排序、分组,然后计算每组所需的小计和汇总。
• 交叉表、图表和地图生成。只生成完全基于数据库字段和重复性公式的交叉表、图表和地图。如果这些对象包含运行总计和/或 打印时公式,它们将在处理环节2 中生成。
• 存储保存的数据。完成总计过程后,所有记录和总计都作为临时文件存储在内存中。在所有后续处理过程中,Crystal Reports 不会再次读取数据库,而是使用这些保存的数据。
预处理环节2
将报表中的组按“最前 N 个/最后 N 个”或按“层次分组”排序。该过程中不读取记录,而只是查看来自处理环节1的组实例,并取“最前 N 个”作为适当的顺序,或者根据指定的“层次分组”设置对组排序。处理环节2
进入处理环节2,所进行的处理从数据处理变为页面格式设置。设置页面格式是按需进行的即直到用户发出请求,或为满足处理环节3 的总页数要求时,Crystal Reports 才会重新设置页面格式。 在页面格式设置过程中,Crystal Reports 进行下列工作:• 组选择公式
• 运行时总计。
• 打印时公式。该求值时间称为“WhilePrinting Records”。
• 交叉表、图表和地图。 包含运行时总计和/或 打印时公式的交叉表、图表和地图以及基于在处理环节2 中生成的交叉表的图表。
• OLAP 网格。
• 子报表。
• 按需生成页。
注意:
• 如果报表有组选择公式,小计、累计和汇总可能会显得不正确。之所以会出现这种情况,是因为累计和汇总在处理环节1 中计算,但组选择公式会在处理环节2 中再次对数据进行过滤。在包含组选择公式的报表中,可以用运行时总计字段代替汇总来计算报表数据的总计。
• 可以使用按需显示子报表(on-demand subreports)确保主报表仍然是单次刷新报表。对于按需显示子报表,Crystal Reports 仍然需要对数据再次应用处理环节;但是,这一处理环节到向下钻取子报表时才会开始。因此,您可以使用“按需显示子报表”来改善包含子报表的报表的性能。