这适用于Crystal Reports 2013支持包1
我有一个共享变量,它让我适合。特别是,它可以工作,而我的报告只有一页长,但如果报告超过一页长,我会重置自己,我不知道为什么。最终结果是它只显示它所在页面的数据,而不是它所在的分组数据,这是预期的行为。
这就是我所拥有的:
在一个名为InitTicketList
的公式中,它被“声明”如下:
WhilePrintingRecords;
Global StringVar TicketList := "";
此公式字段位于Group Header #2a
的报告中。
公式UpdateTicketList
的声明如下:
WhilePrintingRecords;
Global StringVar TicketList;
StringVar item := Split({Command.TicketNumber}, ".")[UBound (Split({Command.TicketNumber}, "."))];
if InStrRev(TicketList, item) <= 0 then
TicketList := TicketList +item + "; ";
我认为这里的逻辑是正确的有两个原因: 我用数据对它进行了测试,但它确实有效。它的作用是将格式为xxx.xxxxxxxxxxxxxxxxx的数字的第二部分的一个实例追加到TicketList中。我们的想法是显示所有这些部件的列表,只显示每个部件一次。此外,只要报告长达一页,此报告就可以正常运行。
UpdateTicketList
位于Details e
的报告中。
最后,ShowTicketList
看起来像这样:
WhilePrintingRecords;
Global StringVar TicketList;
它位于Group Footer #2b
的报告中。
还有一个ClearTicketList
公式,也在Group Footer #2b
中。它看起来像这样:
WhilePrintingRecords;
Global StringVar TicketList :="";
但是,我已将ClearTicketList
作为实验删除,报告行为仍然相同。
我正在寻找可以向我解释这种行为的事情或某人。我不知道我是否理解Crystal Report的三阶段报告引擎是否足以证明这一点。我很遗憾,我保留了Crystal Reports,我没有写,而且我的Crystal-Fu不是很深。
我的目标是让此公式适用于任意页数和任意数量分组的报告。
更新:
虽然看起来好像全局变量在每个页面之后重置,但这不是全部。细节部分被压制,很难看出会发生什么。它实际上是在{Command.TicketNumber}中具有空白值的每个详细记录之后重置,这恰好与新页面重合。当然,这有点放弃了UpdateTicketList
公式。我将其修改为:
WhilePrintingRecords;
Global StringVar TicketList;
StringVar item := Split({Command.TicketNumber}, ".")[UBound (Split({Command.TicketNumber}, "."))];
if InStrRev(TicketList, item) <= 0 then
TicketList := TicketList +item + "; "
else
TicketList := TicketList
现在每页只会重置一次。
答案 0 :(得分:2)
在重置变量的所有公式中,必须进行适当的检查,以确保重置仅发生在第一个记录上,而不是例如在每个页面上,如下所示:
If OnFirstRecord Then Global StringVar TicketList := "";
可能进行不同检查的其他功能例如:
GroupNumber
Next
Previous
RecordNumber