0

我正在使用 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 组)求和),则此公式将给出一个值,例如 50 英镑。

位于组页脚 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的了解真的很有限,因为我不经常使用它,只知道如何做基础知识。:(

4

1 回答 1

0

我相信有一个“客户”在此期间两次捐款 50 美元,公式计算了两次。这是一个长镜头:)

但是,如果我理解正确,我可以建议另一种方法吗?

创建 3 个运行总计字段:CountWhenLess、CountWhenEqual、CountWhenMore。他们应该计算 CustomerId 并使用以下公式进行评估(根据 3 种情况中的每一种更改比较信号):

(onfirstrecord or {Customer.CustomerId} <> previous({Customer.CustomerId})) and
Sum ({Incoming.Amount}, {Customer.CustomerId}) < {Customer.Pledge}

诀窍是评估组何时更改并同时使用比较公式。

我做了一个测试。如果您愿意,请在此处下载 rpt 文件。

我创建了这个模式来测试它:

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 文件。如果您需要更多详细信息,请再次下载 rpt 文件。我只创建了 2 个新的运行总计字段。我相信你可以推断出其他 4 个。

于 2020-02-27T20:07:04.450 回答