Crystal reports 通过省略抑制的记录在报表页脚中创建摘要

Crystal reports 通过省略抑制的记录在报表页脚中创建摘要,crystal-reports,crystal-reports-2008,Crystal Reports,Crystal Reports 2008,我在报告中有一个组标题部分,其中显示了名为“个人”的公式字段中的汇总总数 if not IsNull({AirBilling.BillingCode}) and {AirBilling.BillingCode} = 'P' then {AirBilling.Gross} else 0 现在,在报告页脚的报告末尾,我显示了在“组标题”部分计算的所有个人总计的汇总。现在我有了一个子报表,它过滤某些记录,并且根据子报表返回的计数,我在主报表中禁止记录。我的问题是,我的主报告在页脚总数

我在报告中有一个组标题部分,其中显示了名为“个人”的公式字段中的汇总总数

if not IsNull({AirBilling.BillingCode}) and {AirBilling.BillingCode} = 'P' then
    {AirBilling.Gross}
else
    0

现在,在报告页脚的报告末尾,我显示了在“组标题”部分计算的所有个人总计的汇总。现在我有了一个子报表,它过滤某些记录,并且根据子报表返回的计数,我在主报表中禁止记录。我的问题是,我的主报告在页脚总数中也考虑了被抑制记录的计数。当我尝试在上面的公式字段逻辑中设置一个条件,表示如果RowCount>0,则..如果not IsNull….,但当我尝试运行报告时,它会给我一个错误,表示“已在非重复性字段上指定了摘要”。是否有一种方法可以省略要在页脚部分计算的抑制记录。RowCount是子报表返回的共享变量值,我正在使用该值筛选主报表中的记录。

据我所知,您正在尝试运行子报表,以确定是否应从显示和总计中排除主报表中的某些行。有两种方法可用于解决此问题:

在主报表的查询/存储过程中复制子报表中的逻辑,以便在相关记录到达Crystal之前将其排除。不需要子报告。 交换子报表和主报表,假设除用户输入的参数外,当前子报表中不需要来自当前主报表的数据,并将当前主报表的相关数据作为参数传递给已成为子报表的报表。
我建议使用前一种方法,因为Crystal作为格式化数据的工具比操作数据的工具更好—SQL通常是一种更好的数据操作工具。

是否可以让另一个字段保持隐藏,该字段运行公式来确定行是否被抑制。基于此,它显示为0或1。然后,您可以计算该字段的行数


或者,您可以使用一个存储过程来构建该子报表,该存储过程生成一个已经为您完成了准备工作的列。然后,您可以使用它返回的数据列来帮助解决此问题。

这听起来很可怕-您是否可以退后一步,解释一下子报表正在做什么,我们可以建议您如何在没有子报表的情况下实现相同的结果?为这类任务使用共享变量确实会使最琐碎的任务变得复杂。实际上,子报表正在比较数据库中的屏蔽数据和允许用户在报表中输入的参数。没有不使用子报表的解决方法,因为这就是如何创建用于取消屏蔽数据的存储过程。因此,如果除了不使用子报表之外,还有其他方法可以解决这个问题,那就太好了。在上面的表达式中,not IsNull{AirBilling.BillingCode}条件是多余的-如果{AirBilling.BillingCode}是“P”,在Crystal Reports中,他可能首先编写了'not IsNull',因为典型的C例程如果试图在{AirBilling.BillingCode}为null时求值,就会抛出'Object not set…'。即使Crystal在计算空值时没有失败,我也能理解他为什么这么做。