如果一条或多条记录包含特定数据,则显示 Object In Crystal 报告
Display Object In Crystal Report If One Or More Records Contains Specific Data
我有一份 Crystal 报告 (CR Developer v11.5.12.1838),我只想在 报告中显示某些总数Footer 如果一个或多个详细记录包含特定信息。为此,我在报告中创建了三个公式:
InitDisplayLIATotals
- 放置(并隐藏)在 报告 Header 部分
Global BooleanVar LIA := False;
SetDisplayLIATotals
- 放置在(隐藏的)组中 Header(报告中唯一的组 header)注意:我也试过将它放在 Detail 部分
Global BooleanVar LIA;
WhilePrintingRecords;
If LIA = False Then
If Not IsNull({mydata.liamp}) And Not (Trim({mydata.liamp}) = "") Then
LIA := True;
DisplayLIATotals
- 放置在 报表页脚 中并用于合计 "label" object.[=54= 的抑制公式]
Global BooleanVar LIA;
LIA;
目的是如果当前数据集中的一条或多条记录具有 non-NULL,则公式应 ONLY return True
mydata.liamp
字段中的值(无论记录位置如何)。如果数据集中的所有记录在该字段中都有NULL值,则应该return False
.
但是,我似乎无法让它正常工作。我将公式作为可打印字段放在 报表页脚 中进行确认,它总是打印 False
,即使我知道它应该 return True
.当我将公式放在 Detail 部分(并使其可见)时,我在第一条记录上看到它 return True
,但所有后续记录都显示它作为 False
,导致 报表页脚 中的值 False
。
我还没有掌握在 Crystal 报告中编写公式的艺术,所以我确定我只是 missing/overlooking 这里的一些东西,但我不确定那会是什么。有人能帮我弄清楚为什么我不能可靠地得到它 return 正确的值吗?
感谢问题评论中@heringer 的建议,我通过反复试验找到了解决方案。关键显然在 Crystal 报告公式编辑器使用的 WhilePrintingRecords;
指令中。为了使报告在整个报告中始终正确评估条件,使其 returns 报告页脚 部分的“正确”值, 所有三个 个公式需要此指令集。
我在 SAP Community forums 中找到了这个解释:
WhileReadingRecords
Forces the program to evaluate the formula while it is reading database record data.
If you try to include a group in this formula, you will get an error message.
WhilePrintingRecords
Forces the program to evaluate the formula while it is printing database record data.
那里的描述不是很清楚,但我的理解是 WhilePrintingRecords;
指令导致公式等待计算每个数据元素,直到报告 实际上 生成(打印机、显示、导出等),因此所有数据都已加载到报告的每个字段中。
如果更熟悉 Crystal 报告的人可以对这些指令和“multi-pass引擎”。
编辑 - 我发现一个问题可能有助于更好地解释这些指令的使用:
why use beforereadingrecords / whilereadingrecords / whileprintingrecords in crystal reports?
最终结果如下:
InitDisplayLIATotals
- 放置(隐藏)在 报告 Header 部分
WhilePrintingRecords;
Global BooleanVar LIA := False;
SetDisplayLIATotals
- 放置(隐藏)在组Header中(或详细信息 部分)
WhilePrintingRecords;
Global BooleanVar LIA;
If LIA = False Then
If Not IsNull({mydata.liamp}) And Not (Trim({mydata.liamp}) = "") Then
LIA := True;
DisplayLIATotals
- 放置在 报表页脚中 and/or 用于抑制公式。
WhilePrintingRecords;
Global BooleanVar LIA;
LIA;
我希望这对可能正在努力使这项技术发挥作用的其他人有所帮助。
边注
我实际上 能够通过使用 运行 总字段[=73] 在一定程度上“解决”这个问题=].我创建了 COUNT 个 mydata.liamp
字段的摘要,它显然只计算 non-NULL 个值。由于我的测试数据集中的数据,在抑制公式中使用此汇总字段 DID 有效,但它是一个不完美的解决方案。
“问题”是字段 可能 包含空字符串值,这些值(我假设)将包含在计数中。对于我的用例场景,我想确定只有 non-NULL 和 不为空的值才能切换此值。 “three-formula trick”(一篇供参考的 TechRepublic“QuickTip”文章)允许我测试这两种可能性。
我有一份 Crystal 报告 (CR Developer v11.5.12.1838),我只想在 报告中显示某些总数Footer 如果一个或多个详细记录包含特定信息。为此,我在报告中创建了三个公式:
InitDisplayLIATotals
- 放置(并隐藏)在 报告 Header 部分
Global BooleanVar LIA := False;
SetDisplayLIATotals
- 放置在(隐藏的)组中 Header(报告中唯一的组 header)注意:我也试过将它放在 Detail 部分
Global BooleanVar LIA;
WhilePrintingRecords;
If LIA = False Then
If Not IsNull({mydata.liamp}) And Not (Trim({mydata.liamp}) = "") Then
LIA := True;
DisplayLIATotals
- 放置在 报表页脚 中并用于合计 "label" object.[=54= 的抑制公式]
Global BooleanVar LIA;
LIA;
目的是如果当前数据集中的一条或多条记录具有 non-NULL,则公式应 ONLY return True
mydata.liamp
字段中的值(无论记录位置如何)。如果数据集中的所有记录在该字段中都有NULL值,则应该return False
.
但是,我似乎无法让它正常工作。我将公式作为可打印字段放在 报表页脚 中进行确认,它总是打印 False
,即使我知道它应该 return True
.当我将公式放在 Detail 部分(并使其可见)时,我在第一条记录上看到它 return True
,但所有后续记录都显示它作为 False
,导致 报表页脚 中的值 False
。
我还没有掌握在 Crystal 报告中编写公式的艺术,所以我确定我只是 missing/overlooking 这里的一些东西,但我不确定那会是什么。有人能帮我弄清楚为什么我不能可靠地得到它 return 正确的值吗?
感谢问题评论中@heringer 的建议,我通过反复试验找到了解决方案。关键显然在 Crystal 报告公式编辑器使用的 WhilePrintingRecords;
指令中。为了使报告在整个报告中始终正确评估条件,使其 returns 报告页脚 部分的“正确”值, 所有三个 个公式需要此指令集。
我在 SAP Community forums 中找到了这个解释:
WhileReadingRecords
Forces the program to evaluate the formula while it is reading database record data.
If you try to include a group in this formula, you will get an error message.
WhilePrintingRecords
Forces the program to evaluate the formula while it is printing database record data.
那里的描述不是很清楚,但我的理解是 WhilePrintingRecords;
指令导致公式等待计算每个数据元素,直到报告 实际上 生成(打印机、显示、导出等),因此所有数据都已加载到报告的每个字段中。
如果更熟悉 Crystal 报告的人可以对这些指令和“multi-pass引擎”。
编辑 - 我发现一个问题可能有助于更好地解释这些指令的使用:
why use beforereadingrecords / whilereadingrecords / whileprintingrecords in crystal reports?
最终结果如下:
InitDisplayLIATotals
- 放置(隐藏)在 报告 Header 部分
WhilePrintingRecords;
Global BooleanVar LIA := False;
SetDisplayLIATotals
- 放置(隐藏)在组Header中(或详细信息 部分)
WhilePrintingRecords;
Global BooleanVar LIA;
If LIA = False Then
If Not IsNull({mydata.liamp}) And Not (Trim({mydata.liamp}) = "") Then
LIA := True;
DisplayLIATotals
- 放置在 报表页脚中 and/or 用于抑制公式。
WhilePrintingRecords;
Global BooleanVar LIA;
LIA;
我希望这对可能正在努力使这项技术发挥作用的其他人有所帮助。
边注
我实际上 能够通过使用 运行 总字段[=73] 在一定程度上“解决”这个问题=].我创建了 COUNT 个 mydata.liamp
字段的摘要,它显然只计算 non-NULL 个值。由于我的测试数据集中的数据,在抑制公式中使用此汇总字段 DID 有效,但它是一个不完美的解决方案。
“问题”是字段 可能 包含空字符串值,这些值(我假设)将包含在计数中。对于我的用例场景,我想确定只有 non-NULL 和 不为空的值才能切换此值。 “three-formula trick”(一篇供参考的 TechRepublic“QuickTip”文章)允许我测试这两种可能性。