我正在编辑其他人开发的Crystal Report。我对水晶不是很精通,所以我希望有人能在这里发现我出错的地方。
我们正在使用 Crystal Reports 2008 。
此报表在子报表中有一个查询,该查询获取符合特定条件的一组行,然后计算与特定公式匹配的返回行数。匹配的行将g_bIsMatching
设置为true。
行计数增加一个如下所示的公式:
// Counter Increment
WhilePrintingRecords;
shared NumberVar s_lMatchCount;
global BooleanVar g_bIsMatching;
if g_bIsMatching
then
s_lMatchCount := s_lMatchCount + 1;
"The count of matched rows is now " & totext(s_lMatchCount, "#") & "."
还有另一个公式在打印记录后返回共享计数器值。这用于将匹配的行数从子报表传递回父报表。这是它原始的,非常简单的定义(在我自己的改变之前):
// Total Count
shared NumberVar s_lMatchCount;
s_lMatchCount
但是,此报告必须回溯一整年,并且当前的数据库系统尚未安装那么长时间。因此,我必须合并遗留系统中的一些数据。我不是试图以某种方式将旧数据合并到数据库中,而是创建了一些参数,允许用户在运行报表时提供遗留系统数据。我将相应参数的值添加到总数中。这会将最终公式更改为:
// Total Count
shared NumberVar s_lMatchCount;
// Add legacy data, which is supplied in parameters, a different one for each month.
if {EPISODE.END_DATE} >= #1/1/2012# and {EPISODE.END_DATE} < #2/1/2012# then
s_lMatchCount := s_lMatchCount + {LegacyCount_2012_01};
if {EPISODE.END_DATE} >= #2/1/2012# and {EPISODE.END_DATE} < #3/1/2012# then
s_lMatchCount := s_lMatchCount + {LegacyCount_2012_02};
// and so on for a bunch of other months...
s_lMatchCount
当主数据库中有结果返回时,这对我有用。但是,当主数据库根本没有返回任何行时,那个应该显示s_lMatchCount
的框是空白的。
我的值的数据范围应该在这里触发if
子句,但它们不会;相反,我根本没有得到任何结果。
我在“总计数”公式上尝试了多种变体,让它至少显示某种默认值,但无论我做什么,我都得不到结果;这让我觉得它根本没有运行。
即使结果集的行数为零,如何获取s_lMatchCount的值?
我哪里错了?我可以在这里更改一些小东西,或者我是否遇到了Crystal Reports的一个基本限制,它与我用于获取此行数的方法发生冲突?
答案 0 :(得分:0)
在某种程度上我理解这个问题尝试下面的解决方案。
在所有If
语句的末尾写下linw。
否则
s_lMatchCount=0
OR
Else If ISNULL({LegacyCount_2012_02})
Then s_lMatchCount=0
答案 1 :(得分:0)
我最终弄清楚上面描述的报告中出了什么问题。
计算s_lMatchCount
的总计数公式使用一堆if语句:
if {EPISODE.END_DATE} >= #1/1/2012# and {EPISODE.END_DATE} < #2/1/2012# then
这些语句引用数据库中的列{EPISODE.END_DATE}
。如果没有数据从数据库返回,那么显然这是无用的。我对正在发生的事情的理解是,这个引用强制在处理行时计算公式,这意味着由于没有行,所以根本不会对它进行处理。
我能够通过用参数引用替换数据库中的日期来解决问题。