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

Подскажите как правильно решить такую задачу:
в отчет типа 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. И, конечно же, чтобы высоты контрола было достаточно, чтобы в нём помещался весь текст.

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

Очень часто пользователи просят при печати отчетов Fast Report печатать отчет сразу на принтере по умолчанию без показа диалога выбора принтера. Для этого необходимо в отчете установить для frxReport в PrintOptions свойство ShowDialog в false. Работает в версии 3.3.1, в более ранних не проверял.

Нравится

Поделиться

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

Алексей, спасибо за ценный материал. Для полного счастья пользователя не хватает способа печати отчета без его показа. Автоматически, чтобы пользователь вообще не нажимал никаких кнопок. Например, наступил конец рабочего дня - система сама печатает отчет о достижениях за день :).

И тут же пересылает непосредственному руководителю :).

Олег Лабьяк,
разработчик,
3-я линия Службы поддержки Terrasoft.

>>Автоматически, чтобы пользователь вообще не нажимал никаких кнопок.

А в чем проблема? Вешаешь на Планировщик заданий окно со скриптом, в котором вызываешь формирование отчета и Print(). Так что и такая фантазия в принципе реализуема.

Чтобы совсем не показывать отчет не получилось. Но удалось используя ReportPreviewer.Close() закрыть окно.
Конечно, "моргание" заметно, но лучше, чем лишний клик, который так мешает клиентам.

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