如果一条或多条记录包含特定数据,则显示 Object In Crystal 报告

Display Object In Crystal Report If One Or More Records Contains Specific Data

我有一份 Crystal 报告 (CR Developer v11.5.12.1838),我只想在 报告中显示某些总数Footer 如果一个或多个详细记录包含特定信息。为此,我在报告中创建了三个公式:

Global BooleanVar LIA := False;
Global BooleanVar LIA;

WhilePrintingRecords;

If LIA = False Then
    If Not IsNull({mydata.liamp}) And Not (Trim({mydata.liamp}) = "") Then
        LIA := True;
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] 在一定程度上“解决”这个问题=].我创建了 COUNTmydata.liamp 字段的摘要,它显然只计算 non-NULL 个值。由于我的测试数据集中的数据,在抑制公式中使用此汇总字段 DID 有效,但它是一个不完美的解决方案。

“问题”是字段 可能 包含空字符串值,这些值(我假设)将包含在计数中。对于我的用例场景,我想确定只有 non-NULL 不为空的值才能切换此值。 “three-formula trick”(一篇供参考的 TechRepublic“QuickTip”文章)允许我测试这两种可能性。