Crystal Reports 使用三次传递建立报表方法来生成报表。传递是 Crystal Reports 每次读取和操作数据时所使用的过程。根据报表的复杂性,Crystal Reports 可将数据传递 1 次、2 次或 3 次。这种功能使得可以处理复杂的报表和公式。
.gif)
第 1 次预传递
预览报表时,被求值的第一批元素为“常量”公式。常量公式是含有整个报表的常量值的公式。它们对每个记录都是一样的。例如,100* 30 是常量公式。常量公式在打印生成过程开始时求值,以后不再求值。该过程称为“BeforeReadingRecords”。如果将常量公式字段(如 100*30)放入“详细资料”部分,则结果是对于每个记录均显示 3000。
第 1 次传递
在“BeforeReadingRecords”过程发生后,Crystal Reports 开始读取数据库记录。在记录读取过程中,将发生下列事项:
- 检索记录。在这一步中,将可能的记录选定和排序下推到数据库。
- 对重复性公式求值。这些公式是那些包含数据库字段、但不包含引用小计或摘要信息的公式。此求值时间称为“WhileReadingRecords”。在第二次传递中处理包含引用小计或摘要信息的公式。
- 在本地应用记录选定。如果记录选定太复杂以致不能下推到数据库,Crystal Reports 将在这一步中应用该记录选定。
- 排序、分组和总计。在这一步中,Crystal Reports 将记录进行排序、分组,然后计算每组所需的小计和摘要。
- 生成交叉表。
- 存储保存的数据。完成总计过程后,所有记录和总计都存储在内存和临时文件中。Crystal Reports 不再读取数据库,而是在所有随后的处理中都使用这些保存的数据。
第 2 次预传递
在第 2 次预传递过程中,Crystal Reports 将报表中的组按“最前 N 个/最后 N 个”或按“层次分组”排序。Crystal Reports 在该过程中不读取记录,而是只查看来自第 1 次传递的组实例,并取“最前 N 个”作为适当的顺序,或者根据指定的“层次分组”设置对组排序。
第 2 次传递
Crystal Reports 从数据到格式化页面开始进入第 2 次传递。根据要求格式化页面。这表示直到用户请求,或为满足第 3 次传递的总页数要求时,Crystal Reports 才格式化页面。
在页面格式化过程中,Crystal Reports 做下列工作:
组选定公式
运行总计
计算标记为“WhilePrintingRecords”的公式。
这些是包含对小计或摘要信息的引用的公式,也称为“PrintTime”公式。该求值时间称为“WhilePrintingRecords”。
图表和映射
子报表
根据要求生成页
注意 如果报表有组选定公式,小计、总计和摘要可能会不正确。之所以会出现这种情况,是因为总计和汇总在第 1 次传递期间计算,但组选定公式会在第 2 次传递中再次过滤数据。在包含组选定公式的报表中,可以用运行总计字段代替汇总来计算报表数据的总计。
第 3 次传递
在第 3 次、也是最后一次传递中决定总页数。这一步适用于使用总页数或“第 N 页,共 M 页”等特殊变量字段的报表。