报表处理模型

Crystal Reports 使用三次传递建立报表方法来生成报表。传递是 Crystal Reports 每次读取和操作数据时所使用的过程。根据报表的复杂性,Crystal Reports 可将数据传递 1 次、2 次或 3 次。这种功能使得可以处理复杂的报表和公式。

第 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 页”等特殊变量字段的报表。

请参见

设计新报表 | 执行报表计算