Crystal Report - общие переменные, добавляющие последнюю строку данных дважды в нижний колонтитул отчета - PullRequest
0 голосов
/ 25 февраля 2020

Я использую Crystal Reports 2016. Я не много работаю с ним, и большую часть того, чем я занимаюсь, я справляюсь, но столкнулся с проблемой, которую, похоже, не могу найти решение.

Как организация, у нас есть клиенты, которые обязуются жертвовать определенную сумму каждый месяц. У меня есть отчет, который мне нужно написать, который показывает, сколько из этих клиентов дают больше, равно или меньше их объявленной суммы.

Мне удалось обойти проблемы с неработающими промежуточными итогами из-за «Суммы »Или« Отдельные значения »с помощью общих переменных для создания промежуточных итогов. Однако теперь я обнаружил, что все формулы работают так, как я хочу, за исключением того, что переменная добавляет последнюю строку данных дважды в нижний колонтитул отчета.

Я провел различные поиски в 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;

Эта формула даст значение, скажем, 50 фунтов стерлингов, если сумма, пожертвованная соответствующим клиентом за указанный период времени, суммируется с этой суммой (суммируется по формуле Сумма общей валюты в сумме по записи клиента, которой является Группа 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 фунтов стерлингов.

Итак, я могу блестяще использовать промежуточные итоги для первых двух частей этих предложений, но последний бит - сумма их пожертвований - не может быть выполнена с использованием одной и той же формулы промежуточных итогов, поскольку у клиента может быть несколько строк заказа, которые суммируются, чтобы показать общую сумму, указанную клиентом.

Так выглядит мой отчет far:

enter image description here

Так, например, если клиент {Sum of @Gross} равен £ 100, он может состоять из 3 строк, 1 из 50 фунтов стерлингов и 2 из 25 фунтов стерлингов каждый. При использовании промежуточного итога используется только верхняя строка заказа. Извините, мои знания о том, действительно ли Crystal весьма ограничен, поскольку я использую его не очень часто, а знаю только, как сделать основы. (

1 Ответ

0 голосов
/ 27 февраля 2020

Я полагаю, что есть «клиент» с двумя пожертвованиями в размере $ 50 за период, и формула учитывает его дважды. Это длинный путь:)

Но, если я правильно понял, могу ли я предложить другой подход?

Создать 3 полных итоговых поля: CountWhenLess, CountWhenEqual, CountWhenMore. Они должны посчитать CustomerId и выполнить оценку с помощью следующей формулы (изменить сигнал сравнения в соответствии с каждым из 3 случаев):

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

Хитрость заключается в том, чтобы оценить, когда группа изменит И использует формула сравнения в то же время.

Я сделал тест. Загрузите файл rpt здесь , если вы sh.

Я создал эту схему для ее проверки:

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)

Результат для этого набора данных: меньше = 2, равно = 1, больше = 2 (если я правильно понял)

РЕДАКТИРОВАТЬ:

Вы можете решить новую проблему (см. Редактирование вопроса) с помощью того же подхода.

Создайте еще 6 полей с промежуточной суммой.

3 числа с промежуточной суммой для суммирования залога (как и в предыдущих полях с промежуточной суммой, но измените счет для суммирования значения залога; используйте ту же формулу).

3 числа промежуточных сумм для суммирования заданной суммы (как и в предыдущих полях промежуточных сумм, но измените счетчик для суммирования заданной суммы и измените формулу, удалив пункт, проверяющий изменение группы).

Я обновил файл rpt. Загрузите файл rpt снова , если вам нужна дополнительная информация. Я создал только 2 новых полных итоговых поля. Я уверен, что вы можете сделать вывод о другом 4.

...