Crystal 报表 - 共享变量在报表页脚中添加最后一行数据两次
Crystal Report - Shared Variables adding last row of data twice in Report Footer
我正在使用 Crystal Reports 2016。我没有用它做很多工作,我所做的大部分工作都是我管理的,但是 运行 我遇到了一个问题似乎无法找到解决方案。
作为一个组织,我们有客户承诺每月捐赠一定数额。我有一份我需要写的报告,其中显示了这些客户中有多少人捐赠的金额多于、等于或少于他们的认捐金额。
通过使用共享变量创建 运行ning 总计,我设法解决了 运行 由于“Sum of”或“Distinct Counts”导致总计无效的问题。然而,现在我遇到了一个障碍,公式都按我希望的方式工作,除了变量在报表页脚中两次添加最后一行数据。
我进行了各种 Google 搜索并尝试了一系列建议,包括将某些公式从“WhilePrintingRecords”切换到“EvaluateAfter”,但我所做的似乎都没有改变最终计数。
以下是我的公式示例及其在报告中的位置。请注意,这些不会重置,以便我得到最终总数。
位于组页脚 1a)
@承诺与实际:
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;
如果相关客户在给定时间段内捐赠的金额加起来等于该金额(客户使用 Shared CurrencyVar Amount 公式求和),则此公式将得出 50 英镑的价值记录,即第 1 组)。
位于组页脚 1b)
@EqualAmount2:
WhilePrintingRecords;
Shared CurrencyVar EqualValue2;
EqualValue2 := EqualValue2 + {@EqualValue1};
这给出了迄今为止所有客户金额的 运行ning 总数,例如
50英镑
100英镑
100英镑
100英镑
150 英镑
150 英镑
200英镑
250 英镑
位于报表页脚
@EqualAmount3:
Shared CurrencyVar EqualValue3;
EqualValue3 := {@EqualValue2};
我认为这会简单地显示通过上述公式得出的最终金额,如果那是最后一行,则为 250 英镑,但它会再次添加最后一行,例如 300 英镑。
这是我第一次使用变量,所以几乎肯定遗漏了一些非常非常简单的东西。因此,我们将不胜感激任何指导。
更新:
好的,所以按照 heringer 的建议做了,一切都很好;我也能够使用相同的公式为认捐金额生成 运行ning 总计,但我现在再次陷入困境,因为我无法为捐赠的总金额创建 运行 总计。
我的意思是,在报告的底部,我需要说明以下内容:
10 customers have given more than their pledge - they pledged £100 and
gave a total of £200. 50 customers gave exactly their pledge - they
pledged and gave £500. 5 customers gave less than their pledge - they
pledged £200 and gave £100.
所以,我可以在这些句子的前两部分出色地使用 运行 总计,但最后一点 - 他们捐款的总和 - 不能使用相同的 运行 总计来完成公式,因为客户可能有多个订单行,将这些订单行相加显示客户给出的总数。
到目前为止我的报告是这样的:
因此,例如,如果客户 {@Gross 的总和} 为 100 英镑,它可能由 3 行组成,1 行 50 英镑,2 行 25 英镑 each.Using 运行 Total 只使用最上面的订单行。
对不起,我对if Crystal的了解真的很有限,因为我不经常使用它,只知道如何做基础。 :(
我相信有一个 "customer" 期间有两笔 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 运行 total fields to sum the employment(与之前的 运行 total fields 相同,但更改 count 以求和质押值;使用相同的公式)。
3 运行 total fieds to sum to sum the given amount(与之前的 运行 total fields 一样,但更改计数以求和给定金额并更改公式,删除检查更改的子句组)。
我更新了rpt文件。 Download the rpt file again,如果您需要更多详细信息。我只创建了 2 个新的 运行 总字段。我相信你可以推断出其他 4.
我正在使用 Crystal Reports 2016。我没有用它做很多工作,我所做的大部分工作都是我管理的,但是 运行 我遇到了一个问题似乎无法找到解决方案。
作为一个组织,我们有客户承诺每月捐赠一定数额。我有一份我需要写的报告,其中显示了这些客户中有多少人捐赠的金额多于、等于或少于他们的认捐金额。
通过使用共享变量创建 运行ning 总计,我设法解决了 运行 由于“Sum of”或“Distinct Counts”导致总计无效的问题。然而,现在我遇到了一个障碍,公式都按我希望的方式工作,除了变量在报表页脚中两次添加最后一行数据。
我进行了各种 Google 搜索并尝试了一系列建议,包括将某些公式从“WhilePrintingRecords”切换到“EvaluateAfter”,但我所做的似乎都没有改变最终计数。
以下是我的公式示例及其在报告中的位置。请注意,这些不会重置,以便我得到最终总数。
位于组页脚 1a)
@承诺与实际:
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;
如果相关客户在给定时间段内捐赠的金额加起来等于该金额(客户使用 Shared CurrencyVar Amount 公式求和),则此公式将得出 50 英镑的价值记录,即第 1 组)。
位于组页脚 1b)
@EqualAmount2:
WhilePrintingRecords;
Shared CurrencyVar EqualValue2;
EqualValue2 := EqualValue2 + {@EqualValue1};
这给出了迄今为止所有客户金额的 运行ning 总数,例如 50英镑 100英镑 100英镑 100英镑 150 英镑 150 英镑 200英镑 250 英镑
位于报表页脚
@EqualAmount3:
Shared CurrencyVar EqualValue3;
EqualValue3 := {@EqualValue2};
我认为这会简单地显示通过上述公式得出的最终金额,如果那是最后一行,则为 250 英镑,但它会再次添加最后一行,例如 300 英镑。
这是我第一次使用变量,所以几乎肯定遗漏了一些非常非常简单的东西。因此,我们将不胜感激任何指导。
更新: 好的,所以按照 heringer 的建议做了,一切都很好;我也能够使用相同的公式为认捐金额生成 运行ning 总计,但我现在再次陷入困境,因为我无法为捐赠的总金额创建 运行 总计。
我的意思是,在报告的底部,我需要说明以下内容:
10 customers have given more than their pledge - they pledged £100 and gave a total of £200. 50 customers gave exactly their pledge - they pledged and gave £500. 5 customers gave less than their pledge - they pledged £200 and gave £100.
所以,我可以在这些句子的前两部分出色地使用 运行 总计,但最后一点 - 他们捐款的总和 - 不能使用相同的 运行 总计来完成公式,因为客户可能有多个订单行,将这些订单行相加显示客户给出的总数。
到目前为止我的报告是这样的:
因此,例如,如果客户 {@Gross 的总和} 为 100 英镑,它可能由 3 行组成,1 行 50 英镑,2 行 25 英镑 each.Using 运行 Total 只使用最上面的订单行。 对不起,我对if Crystal的了解真的很有限,因为我不经常使用它,只知道如何做基础。 :(
我相信有一个 "customer" 期间有两笔 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 运行 total fields to sum the employment(与之前的 运行 total fields 相同,但更改 count 以求和质押值;使用相同的公式)。
3 运行 total fieds to sum to sum the given amount(与之前的 运行 total fields 一样,但更改计数以求和给定金额并更改公式,删除检查更改的子句组)。
我更新了rpt文件。 Download the rpt file again,如果您需要更多详细信息。我只创建了 2 个新的 运行 总字段。我相信你可以推断出其他 4.