Расчет среднего кол-ва в отчете

Здравствуйте.

Подскажите как правильно решить такую задачу:
в отчет типа fastreport выводится информация о названии и дате регистрации инцидентов, сгруппированные по Продажам (поле Продажа не должно быть пустым), с которыми эти инциденты связаны.
При этом получается посчитать кол-во инцидентов по каждой продаже и итоговое кол-во инцидентов по всем продажам. Для этого я использую функцию Count.
Нужно посчитать еще и среднее кол-во инцидентов по этим продажам. Но функция AVG почему-то работает неверно.
У меня в отчете только 1 dataset - Название Инцидента, Дата регистрации, Название Продажи, ID инцидента и ID продажи.

Нравится

3 комментария

Думаю, без дополнительной обработки отображать среднее значение по продажам не получится.

Попробуйте поступить следующим образом:

1) В бэнде GroupFooter1 отображать текст "Итого:" в одном поле, а количество - в другом.
2) Убрать весь текст из поля в бэнде Footer1.
3) На закладке Code сервиса отчёта объявить 2 переменные: для общего количества инцидентов и общего количества групп (продаж):

var IncidentCount, OpportunityCount: integer;

4) Для объекта Page1 создать обработчик события OnBeforePrint, в котором обнулять эти переменные:

procedure Page1OnBeforePrint(Sender: TfrxComponent);
begin
  IncidentCount := 0;
  OpportunityCount := 0;                                                  
end;

5) Для поля, в котором вычисляется количество инцидентов в продаже (одно из полей бэнда GroupFooter1), создать обработчик события OnAfterPrint, в котором записывать значение поля в переменную IncidentCount, а количество групп (переменную OpportunityCount) увеличивать на 1:

procedure Memo4OnAfterPrint(Sender: TfrxComponent);
begin
  IncidentCount := IncidentCount + Memo4.Value;
  OpportunityCount := OpportunityCount + 1;
end;

6) Для поля из бэнда Footer1 создать обработчик события OnBeforePrint, в котором вычислять среднее значение количества инцидентов по продажам:

procedure Memo5OnBeforePrint(Sender: TfrxComponent);
begin
  Memo5.Text := 'Среднее количество: ' + FloatToStr(IncidentCount / OpportunityCount);
end;

Данная реализация должна решить Вашу задачу.

Спасибо, все так и получилось.
Я таким же способом вывела в отчет и общее кол-во инцидентов по всем продажам :smile:

Подскажите еще какое свойство в Memo отвечает за отражение текста (например названия инцидента) не одной срокой, а по размеру названия в несколько строк, а то названия у меня получились "обрезанные".

Необходимо установить ему свойство WordWrap равным true. И, конечно же, чтобы высоты контрола было достаточно, чтобы в нём помещался весь текст.

Показать все комментарии