Страница 1 из 1

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

Добавлено: 28 дек 2011, 10:51
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 присутствует в датабенде и отображается в отчёте, если это поле выводить.

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

Спасибо.

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

Добавлено: 28 дек 2011, 11:14
Eugene A. Bykov
Обнаружил, увидев всё на одном экране, что проблема в использовании класса Dictionary, не поддерживающего обращение по индексу элемента. За счёт того, что некоторые значения при выводе были null, их конкатенация давала null, т.е. отсутствие текста.

Вопрос остался в принципиальном подходе. Исправив найденную проблему, я, вероятно получу итоги, но есть ли рекомендации, в каких обработчиках лучше проводить указанные манипуляции - в beforePrint датабенда ли, или в событиях отдельных элементах. Полагаю, работать будет и так, и так.

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

Добавлено: 28 дек 2011, 11:43
Eugene A. Bykov
Да, действительно, исправив проблему, вызванную использованием Dictionary и попыткой обращаться к ним по порядку элементов, я получил нужные итоги.
Но заметил интересную особенность - если у TextBox данные null, то, похоже, не отрабатывает GetValueEvent.

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

Добавлено: 29 дек 2011, 10:16
HighAley
Здравствуйте.

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

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

Спасибо.

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

Добавлено: 29 дек 2011, 10:27
Eugene A. Bykov
Боюсь, группировка не подойдет, т.к. я описал в данном случае подсчёт итогов, сгруппированных по одному из критериев. Таких несколько в итогах, и придётся добавлять несколько групп, а они уже будут группироваться внутри первой группы, второй и так далее. Т.е. первая группа разобьется на подгруппы, а по ним итоги, затем вторая группа на подгруппы + итоги и т.д. А нужно по одному набору данных, и разным критериям.
Если любой код допустим до авто-региона, то буду использовать найденный подход.

Спасибо за ответ!

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

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

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

Спасибо.