Программный подсчёт итогов по отчёту

Обсуждение Stimulsoft Reports.NET
Ответить
Eugene A. Bykov
Сообщения: 52
Зарегистрирован: 28 июн 2006, 05:34
Откуда: Ekaterinburg, Russia

Программный подсчёт итогов по отчёту

Сообщение Eugene A. Bykov »

Добрый день,
Прошу помочь со следующей задачей.

Есть отчёт с одним Databand и одной Datatable, передаваемой в качестве источника данных. Записи этой таблицы в качестве одной из характеристик содержат ссылку на справочник (таблица - список договоров, поле - тип договора). Нужно подсчитать количество договоров каждого типа, при этом типы договоров - справочник, редактируемый пользователями, т.е. нет фиксированного списка типов.

Таблица передаётся уже сджойненная со справочником, всё это происходит ещё на этапе подготовки данных, до выдачи отчёта, т.е. грубо говоря, список полей выглядит как "номер договора", "код типа договора" (byte), "расшифровка типа договора" (string), и др., неважные поля.

Как можно, например, подсчитать число договоров каждого типа (по образу сделаю другие итоги).

Сейчас я объявил в коде отчёта две переменных типа Dictionary, и добавил using System.Collections.Generic:

Код: Выделить всё

    public class Report : Stimulsoft.Report.StiReport
    {
		Dictionary statuses;
		Dictionary totals;
Кстати, насколько правомочно редактировать код c# отчёта. В коде есть регион "автосгенеренный код" - он пустой - его я не трогаю.

Далее в ReportTitleBar я инициализирую эти переменные:

Код: Выделить всё

statuses = new Dictionary();
totals = new Dictionary();
в BeforePrintEvent.

Затем в DataBand эти переменные модифицируются, в зависимости от данных:

Код: Выделить всё

if (totals.ContainsKey(Contract_USP_ContractList.ContractStatusId))  
{
	totals[Contract_USP_ContractList.ContractStatusId]++;
}

if (!statuses.ContainsKey(Contract_USP_ContractList.ContractStatusId))  
{
	statuses.Add(Contract_USP_ContractList.ContractStatusId, Contract_USP_ContractList.ContractStatusName);  
	totals.Add(Contract_USP_ContractList.ContractStatusId, 0);  	
}
Этот код я пытался добавить в BeforePrintEvent Датабенда либо в GetValueEvent любого поля. Пусть я в нём и не присваиваю Value этого поля, но, насколько я понимаю, данные уже должны быть доступны. У Датабенда основная таблица - Contract_USP_ContractList, поле ContractStatusId - это и есть код типа договора.

В Footerband я планировал получить статистику, в частности вот так:

Код: Выделить всё

e.Value="";
for (byte i=0; i<statuses.Count; i++)
{  
  e.Value+=statuses[i]+" - "+totals[i].ToString();
  if (i<statuses.Count)
    e.Value+="\n";
}
Однако, текстбокс пуст.

Тогда я решил проверить, что у меня в statuses. Вывел statuses.Count - выводится ноль. Это говорит о том, что всё таки statuses инициализировался в ReportTitle, но не модифицировался в дальнейшем. Хотя, ContractTypeId присутствует в датабенде и отображается в отчёте, если это поле выводить.

Просьба навести на путь истинный - корректен ли такой путь, и если нет, то что я делаю не так. Группировать записи не нужно, нужно лишь подсчитать итоги (и не только по этому полю, что в свою очередь делает группировку неприменимой - по десяти полям не сгруппируешь).

Спасибо.
Eugene A. Bykov
Сообщения: 52
Зарегистрирован: 28 июн 2006, 05:34
Откуда: Ekaterinburg, Russia

Программный подсчёт итогов по отчёту

Сообщение Eugene A. Bykov »

Обнаружил, увидев всё на одном экране, что проблема в использовании класса Dictionary, не поддерживающего обращение по индексу элемента. За счёт того, что некоторые значения при выводе были null, их конкатенация давала null, т.е. отсутствие текста.

Вопрос остался в принципиальном подходе. Исправив найденную проблему, я, вероятно получу итоги, но есть ли рекомендации, в каких обработчиках лучше проводить указанные манипуляции - в beforePrint датабенда ли, или в событиях отдельных элементах. Полагаю, работать будет и так, и так.
Eugene A. Bykov
Сообщения: 52
Зарегистрирован: 28 июн 2006, 05:34
Откуда: Ekaterinburg, Russia

Программный подсчёт итогов по отчёту

Сообщение Eugene A. Bykov »

Да, действительно, исправив проблему, вызванную использованием Dictionary и попыткой обращаться к ним по порядку элементов, я получил нужные итоги.
Но заметил интересную особенность - если у TextBox данные null, то, похоже, не отрабатывает GetValueEvent.
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Программный подсчёт итогов по отчёту

Сообщение HighAley »

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

Как мы поняли, вы получили нужный результат.
Кстати, насколько правомочно редактировать код c# отчёта.
Вы можете добавлять любой код до автоматически сгенерированного кода.

Возможно вам подойдёт следующий способ. Пожалуйста, посмотрите приложенный файл шаблона отчёта.

Спасибо.
Вложения
Report.mrt
(17.18 КБ) 319 скачиваний
Eugene A. Bykov
Сообщения: 52
Зарегистрирован: 28 июн 2006, 05:34
Откуда: Ekaterinburg, Russia

Программный подсчёт итогов по отчёту

Сообщение Eugene A. Bykov »

Боюсь, группировка не подойдет, т.к. я описал в данном случае подсчёт итогов, сгруппированных по одному из критериев. Таких несколько в итогах, и придётся добавлять несколько групп, а они уже будут группироваться внутри первой группы, второй и так далее. Т.е. первая группа разобьется на подгруппы, а по ним итоги, затем вторая группа на подгруппы + итоги и т.д. А нужно по одному набору данных, и разным критериям.
Если любой код допустим до авто-региона, то буду использовать найденный подход.

Спасибо за ответ!
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Программный подсчёт итогов по отчёту

Сообщение HighAley »

Здравствуйте.
SpeedMaster писал(а):Боюсь, группировка не подойдет, т.к. я описал в данном случае подсчёт итогов, сгруппированных по одному из критериев. Таких несколько в итогах, и придётся добавлять несколько групп, а они уже будут группироваться внутри первой группы, второй и так далее. Т.е. первая группа разобьется на подгруппы, а по ним итоги, затем вторая группа на подгруппы + итоги и т.д. А нужно по одному набору данных, и разным критериям.
Если любой код допустим до авто-региона, то буду использовать найденный подход.

Спасибо за ответ!
Вероятно, в данном случае возможно будет использовать панели. См. приложенный шаблон отчёта.

Спасибо.
Вложения
Report2.mrt
(21.24 КБ) 364 скачивания
Ответить