我有一个Crystal报表(CR Developer v11.5.12.1838),如果其中一个或多个明细记录包含特定的部分,则我只想在Report Footer中显示某些总计。信息。为此,我在报告中创建了三个公式:
InitDisplayLIATotals
-放置(并隐藏)在Report Header部分Global BooleanVar LIA := False;
SetDisplayLIATotals
-放置在(禁止显示的)Group Header中(报告中唯一的组标题)注意:我也尝试将其放置在Detail部分Global BooleanVar LIA;
WhilePrintingRecords;
If LIA = False Then
If Not IsNull({mydata.liamp}) And Not (Trim({mydata.liamp}) = "") Then
LIA := True;
DisplayLIATotals
-放置在Report Footer中,并在总计“标签”对象的抑制公式中使用。Global BooleanVar LIA;
LIA;
意图是,如果当前数据集中的一个或多个记录在True
字段中具有非NULL值(无论记录位置如何),则公式应ONLY返回mydata.liamp
。如果数据集中的所有记录在此字段中都为NULL值,则应返回False
。
但是,我似乎无法正常工作。我将公式放在Report Footer中作为可打印字段进行确认,即使我知道它应该返回False
,它也始终打印True
。当我将公式放在Detail部分中(并使它可见)时,我看到它在第一条记录上返回True
,但是所有后续记录都将其显示为False
,从而得出False
值在报告页脚。
我还没有掌握Crystal Reports中编写公式的技巧,所以我确定我只是在这里漏掉/忽略了一些东西,但是我不确定那会是什么。有人可以帮我弄清楚为什么我不能可靠地使它返回正确的值吗?
感谢@heringer在问题评论中的建议,我能够通过反复试验找到解决方案。该键显然在Crystal Reports公式编辑器使用的WhilePrintingRecords;
指令中。为了使报表在整个报表中始终正确地评估条件,以使其返回Report Footer部分的“正确”值,<的公式都需要此伪指令集。
WhileReadingRecordsWhilePrintingRecords强制程序在读取数据库记录数据时对公式求值。
如果尝试在此公式中包含组,则会收到错误消息。
不是非常描述性的,但是我的理解是WhilePrintingRecords;
指令使公式等待评估每个数据元素,直到生成报告[[actually
如果更熟悉Crystal Reports的人可以对这些指令和“多通道引擎”提供更好或更详细的解释,我认为这不会错。 最终结果如下:InitDisplayLIATotals
-放置(抑制)在Report Header
WhilePrintingRecords;
Global BooleanVar LIA := False;
SetDisplayLIATotals
-放置(抑制)在
WhilePrintingRecords;
Global BooleanVar LIA;
If LIA = False Then
If Not IsNull({mydata.liamp}) And Not (Trim({mydata.liamp}) = "") Then
LIA := True;
DisplayLIATotals
-放在
WhilePrintingRecords;
Global BooleanVar LIA;
LIA;
注意事项
Running Total Field在一定程度上“解决”该问题。我创建了mydata.liamp
字段的COUNT摘要,该摘要显然只计算非NULL值。由于我的测试数据集中的数据,在抑制公式DID中使用此摘要字段起作用,但这是不完善的解决方案。
和
不为空的值才能转换为该值。 “ three-formula trick”(供参考的TechRepublic“ QuickTip”文章)允许我测试两种可能性。