Crystal Report - 共享变量在报表页脚中添加最后一行数据两次
Posted
技术标签:
【中文标题】Crystal Report - 共享变量在报表页脚中添加最后一行数据两次【英文标题】:Crystal Report - Shared Variables adding last row of data twice in Report Footer 【发布时间】:2020-06-09 06:43:33 【问题描述】:我正在使用 Crystal Reports 2016。我没有用它做很多工作,我所做的大部分工作都在我的管理下,但遇到了一个我似乎无法找到解决方案的问题。
作为一个组织,我们有客户承诺每月捐赠一定金额。我需要写一份报告,其中显示有多少客户提供的金额高于、等于或低于他们的承诺金额。
通过使用共享变量创建运行总计,我设法解决了运行总计因“总和”或“不同计数”而无法工作的问题。但是现在我遇到了一个障碍,公式都可以按照我的意愿工作,除了变量在报表页脚中添加了最后一行数据两次。
我已经进行了各种 Google 搜索并尝试了一系列建议,包括将某些公式从“WhilePrintingRecords”切换到“EvaluateAfter”,但我所做的似乎没有改变最终计数。
以下是我的公式示例及其在报告中的位置。请注意,这些不会重置,以便我获得最终总数。
位于组页脚 1a)
@Pledge 与实际:
WhilePrintingRecords;
If (Shared CurrencyVar Amount) = Pledge.field then ToNumber ("1") // 1 is where pledge and payments are "Equal"
else if (Shared CurrencyVar Amount) > Pledge.field then ToNumber ("2") // 2 is where payments are "More" than pledge
else if (Shared CurrencyVar Amount) < Pledge.field then ToNumber ("3") // 3 is where payments are "Less" then pledge
这个公式只是为了确定某人是否提供了更多、等于或少于他们的承诺,以便我可以根据该标准评估数据。对于“更多”和“更少”标准,我有与以下示例中相同的公式。
@EqualAmount1:
WhilePrintingRecords;
Shared CurrencyVar EqualValue1;
EqualValue1 := If @Pledge vs Actual = 1 then Shared CurrencyVar Amount;
如果相关客户在给定时间段内捐赠的金额加起来等于该金额(使用客户记录的共享 CurrencyVar 金额公式求和,即为第 1 组)。
位于组页脚 1b)
@EqualAmount2:
WhilePrintingRecords;
Shared CurrencyVar EqualValue2;
EqualValue2 := EqualValue2 + @EqualValue1;
这给出了到目前为止给定的所有客户金额的总和,例如 50 英镑 100 英镑 100 英镑 100 英镑 150 英镑 150 英镑 200 英镑 250 英镑
位于报表页脚
@EqualAmount3:
Shared CurrencyVar EqualValue3;
EqualValue3 := @EqualValue2;
我认为这将简单地显示通过上述公式获得的最终金额,如果这是最后一行,则为 250 英镑,但它再次添加最后一行,例如赚 300 英镑。
这是我第一次使用变量,所以几乎肯定错过了一些非常非常简单的东西。因此,任何指导将不胜感激。
更新: 好的,所以按照赫林格的建议做了,一切都很好;我也可以使用相同的公式来生成承诺金额的运行总计,但我现在再次陷入困境,因为我无法为捐赠的总金额创建运行总计。
我的意思是,在报告的底部,我需要说明以下内容:
10 位客户的捐款超过了他们的承诺 - 他们承诺了 100 英镑,并且 总共给了200英镑。 50 位客户做出了他们的承诺——他们 承诺并捐赠了 500 英镑。 5 位客户的承诺低于他们的承诺 - 他们 认捐 200 英镑,捐出 100 英镑。
因此,我可以在这些句子的前两部分出色地使用 Running Totals,但最后一点 - 他们的捐款总和 - 不能使用相同的 Running Totals 公式完成,因为客户可能有多个订单行, 相加显示客户给出的总数。
这是我的报告到目前为止的样子:
因此,例如,如果客户 Sum of @Gross 是 100 英镑,它可能由 3 行组成,1 行是 50 英镑,2 行是 25 英镑。使用运行总计仅使用最高订单线。 对不起,我对Crystal的了解真的很有限,因为我不经常使用它,只知道如何做基础。 :(
【问题讨论】:
您能描述一下您的数据集并展示您的布局吗?这让我有点困惑。 你好 heringer,我的数据集基本上是客户表,链接到显示他们已承诺多少的表 - 链接针对客户 ID - 和销售订单表。报告的第 1 组按客户 ID,第 2 组按订单日期,将所有相关收入组合在一起。我不确定您希望我如何向您展示布局。屏幕截图会有所帮助吗,或者您认为最有帮助的是什么? 嘿。我仍在尝试了解业务以了解公式。请告诉我我是否理解正确。最终结果在报告页脚中,类似于:10 位客户给予更多,5 位客户给予更少,20 位客户给予相等。我理解正确吗? 【参考方案1】:我相信有一个“客户”在此期间两次捐款 50 美元,公式计算了两次。这是一个很长的镜头:)
但是,如果我理解正确的话,我可以建议另一种方法吗?
创建 3 个运行总计字段:CountWhenLess、CountWhenEqual、CountWhenMore。他们应该计算 CustomerId 并使用以下公式进行评估(根据 3 种情况中的每一种更改比较信号):
(onfirstrecord or Customer.CustomerId <> previous(Customer.CustomerId)) and Sum (Incoming.Amount, Customer.CustomerId) < Customer.Pledge
诀窍是评估组何时发生变化并同时使用比较公式。
我做了一个测试。 Download the rpt file here,如果你愿意的话。
我创建了这个架构来测试它:
create table Customer(CustomerId int, Pledge money)
create table Incoming(CustomerId int, Amount money)
insert Customer(CustomerId, Pledge) values (1, 100)
insert Customer(CustomerId, Pledge) values (2, 200)
insert Customer(CustomerId, Pledge) values (3, 300)
insert Customer(CustomerId, Pledge) values (4, 400)
insert Customer(CustomerId, Pledge) values (5, 500)
insert Incoming(CustomerId, Amount) values (1, 60)
insert Incoming(CustomerId, Amount) values (1, 40)
insert Incoming(CustomerId, Amount) values (2, 100)
insert Incoming(CustomerId, Amount) values (2, 110)
insert Incoming(CustomerId, Amount) values (3, 290)
insert Incoming(CustomerId, Amount) values (4, 410)
insert Incoming(CustomerId, Amount) values (5, 490)
这个数据集的结果是:less=2, equal=1, more=2(如果我理解正确的话)
编辑:
您可以使用相同的方法解决新问题(请参阅问题编辑)。
创建更多 6 个运行总计字段。
3 个运行总计字段对质押进行求和(与之前的运行总计字段类似,但将计数更改为质押值求和;使用相同的公式)。
3 个运行总计字段对给定的金额求和(与之前的运行总计字段一样,但将计数更改为对给定的金额求和并更改公式以删除检查组更改的子句)。
我已经更新了 rpt 文件。 Download the rpt file again,如果您需要更多详细信息。我只创建了 2 个新的运行总计字段。我相信你可以推断出其他 4 个。
【讨论】:
谢谢你,赫林格。这正是我所需要的!而且比我所做的要简单得多!再次感谢您。 我遇到了另一个绊脚石,我已将其添加到我原来的帖子底部,上面。你也能帮忙吗,赫林格? 你是个天才,赫林格。这确实做到了。非常感谢!以上是关于Crystal Report - 共享变量在报表页脚中添加最后一行数据两次的主要内容,如果未能解决你的问题,请参考以下文章
修改水晶报表(Crystal Report 2008)中子报表的宽度