Crystal 报告:共享变量在页面而不是组后重置
Crystal Reports: Shared variable resets after page instead of group
这适用于 Crystal Reports 2013 支持包 1
我有一个适合我的共享变量。特别是,它在我的报告只有一页长时有效,但如果报告超过一页长并且我不知道为什么,它会自行重置。最终结果是它只显示它所在页面的数据,而不是它所在的分组的数据,这是预期的行为。
这是我的:
在一个名为 InitTicketList
的公式中,它是 "declared" 这样的:
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 报告的三阶段报告引擎的理解是否足以解释这一点。不幸的是,我维护的 Crystal 报告不是我写的,而且我的 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
现在它真的每页只重置一次。
在重置变量的所有公式中,必须进行充分的检查,以确保重置仅发生在第一条记录上,而不是发生在每一页上,例如:
If OnFirstRecord Then Global StringVar TicketList := "";
可能用于不同检查的其他功能例如:
GroupNumber
Next
Previous
RecordNumber
这适用于 Crystal Reports 2013 支持包 1
我有一个适合我的共享变量。特别是,它在我的报告只有一页长时有效,但如果报告超过一页长并且我不知道为什么,它会自行重置。最终结果是它只显示它所在页面的数据,而不是它所在的分组的数据,这是预期的行为。
这是我的:
在一个名为 InitTicketList
的公式中,它是 "declared" 这样的:
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 报告的三阶段报告引擎的理解是否足以解释这一点。不幸的是,我维护的 Crystal 报告不是我写的,而且我的 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
现在它真的每页只重置一次。
在重置变量的所有公式中,必须进行充分的检查,以确保重置仅发生在第一条记录上,而不是发生在每一页上,例如:
If OnFirstRecord Then Global StringVar TicketList := "";
可能用于不同检查的其他功能例如:
GroupNumber
Next
Previous
RecordNumber