Событие после выборки данных из БД

Обсуждение Stimulsoft Reports.Net
Аватара пользователя
Андрей Сорокин
Сообщения: 102
Зарегистрирован: 02 июл 2009, 07:31

Событие после выборки данных из БД

Сообщение Андрей Сорокин » 02 фев 2018, 13:11

Добрый день,
имеется отчёт с несколькими DataSources, которые выполняют коннект к MS SQL Server и получают данные для отчёта. Мне необходимо обработать событие после выполнения всех запросов к базе для анализа отсутствующих данных чтобы уведомить пользователя и не выводить пустой отчёт на экран. Каким образом лучше всего это реализовать?
Спасибо.
Aleksey
Сообщения: 2017
Зарегистрирован: 22 апр 2010, 02:57

Re: Событие после выборки данных из БД

Сообщение Aleksey » 02 фев 2018, 14:31

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

Учтоните, пожалуйста, вы хотите это реализовать непосредственно в отчете, дизайнере или в коде своего приложения?

Спасибо.
Аватара пользователя
Андрей Сорокин
Сообщения: 102
Зарегистрирован: 02 июл 2009, 07:31

Re: Событие после выборки данных из БД

Сообщение Андрей Сорокин » 02 фев 2018, 19:30

В коде приложения, т.к. оно универсально и работает со всеми отчётами.
Спасибо.
Aleksey
Сообщения: 2017
Зарегистрирован: 22 апр 2010, 02:57

Re: Событие после выборки данных из БД

Сообщение Aleksey » 05 фев 2018, 22:37

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

Как вариант, вы можете использовать событие EndRender отчета:
StiOptions.Engine.GlobalEvents.ReportEndRender += GlobalEvents_ReportEndRender;

в котором проверить, используемые в самом отчете источники данных StiDataSourceHelper.GetUsedDataSourcesNames() и проверить наличие записей в данных источниках

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

foreach (StiDataSource datasource in ((StiReport)sender).DataSources)
{
    if (datasource.Count == 0)
}
Спасибо.
Аватара пользователя
Андрей Сорокин
Сообщения: 102
Зарегистрирован: 02 июл 2009, 07:31

Re: Событие после выборки данных из БД

Сообщение Андрей Сорокин » 06 фев 2018, 08:11

Событие EndRender вызывается после подготовки всех страниц отчёта? Нет события, которое происходит именно после выполнения запросов к базе до генерации страниц чтобы исключить ненужные операции?
Кроме того, хотелось бы не отображать/не печатать пустой отчёт если в нём нет данных, просто выводить пользователю сообщение. Можно ли это как-то реализовать?
Спасибо.
Леонид
Сообщения: 326
Зарегистрирован: 23 июл 2009, 05:53

Re: Событие после выборки данных из БД

Сообщение Леонид » 06 фев 2018, 08:47

Добрый день!
Событие EndRender вызывается после подготовки всех страниц отчёта? Нет события, которое происходит именно после выполнения запросов к базе до генерации страниц чтобы исключить ненужные операции?
Кроме того, хотелось бы не отображать/не печатать пустой отчёт если в нём нет данных, просто выводить пользователю сообщение. Можно ли это как-то реализовать?
Можно, в событии самого отчёта BeginRender(), например так:

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

qrMain.Parameters["DOC_CODE"].ParameterValue = decimal.Parse(AVar_0); // передаём параметр для отчёта
qrMain.Connect(); // коннект к Oracle

// суммируем все позиции по полю "Сумма"
decimal nTotalSum = 0;
foreach (System.Data.DataRow row in qrMain.DataTable.Rows)
  nTotalSum += (decimal)row["N_TOTAL_SUM"];

bool isDemandVoucher = (nTotalSum == 0); // создаём флаг
Page1.Enabled = !isDemandVoucher; // отображаем необходимые страницы в зависимости от флага
DemandVoucherPage.Enabled = isDemandVoucher;
Аватара пользователя
Андрей Сорокин
Сообщения: 102
Зарегистрирован: 02 июл 2009, 07:31

Re: Событие после выборки данных из БД

Сообщение Андрей Сорокин » 06 фев 2018, 08:59

Спасибо, есть несколько вопросов:
1. Что за объект qrMain и как его получить?
2. Можно ли как-то прервать выполнение методов StiReport Render, Show, Print в случае отсутствия данных? Реализовывать через throw new Exception() не хочется...

Обработчик такого типа не работает

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

report.BeginRender += ReportOnBeginRender;

private static void ReportOnBeginRender(object sender, EventArgs eventArgs)
{
     StiReport report = sender as StiReport;
     bool isNoData = true;
     foreach (StiDataSource datasource in report.DataSources)
     {
          datasource.Connect();
          if (datasource.Rows.Count > 0) { isNoData = false; break; }
     }
     if (isNoData)
     {
         MessageBox.Show("No data");
         throw new Exception();
     }
}
Последний раз редактировалось Андрей Сорокин 06 фев 2018, 09:26, всего редактировалось 1 раз.
Леонид
Сообщения: 326
Зарегистрирован: 23 июл 2009, 05:53

Re: Событие после выборки данных из БД

Сообщение Леонид » 06 фев 2018, 09:24

1. Что за объект qrMain и как его получить?
Ах, да, забыл написать, в нашем случае это DataTable типа Stimulsoft.Report.Dictionary.StiOracleSource (которая у коннекта Stimulsoft.Report.Dictionary.StiOracleDatabase), приложил скриншот (обвёл на нём красным), как это выглядит.
2. Можно ли как-то прервать выполнение методов StiReport Render, Show, Print в случае отсутствия данных?
Здесь не подскажу, т.к. мы делаем немного по-другому, - создаём поток (BackgroundWorker, не Task потому что так было исторически, и пока на .Net 4.5 не перешли полностью), в нём в DoWork() выполняем все нужные SQL-запросы к Oracle, а затем в том же потоке происходит .Render(false) от Stimul уже с нашими данными, после чего (в событии Completed), если нет данных, то выводим туже страницу, но т.к. там ничего нет, то выводится только ReportTitle.
Вложения
Clipboard01.png
Clipboard01.png (55.81 КБ) 1414 просмотров
Аватара пользователя
Андрей Сорокин
Сообщения: 102
Зарегистрирован: 02 июл 2009, 07:31

Re: Событие после выборки данных из БД

Сообщение Андрей Сорокин » 08 фев 2018, 15:44

Жаль от разработчиков нет ответа...
Ivan
Сообщения: 610
Зарегистрирован: 10 авг 2006, 01:40

Re: Событие после выборки данных из БД

Сообщение Ivan » 09 фев 2018, 00:26

Здравствуйте.
Нет события, которое происходит именно после выполнения запросов к базе до генерации страниц чтобы исключить ненужные операции?
Подключение к данным в движке производится уже после вызова события BeginRender отчёта.
После этого следующим событием идёт BeforePrint первой страницы отчёта.
В этом событии уже можно на основании всех данных включать/выключать все компоненты отчёта, и саму первую страницу, т.к. проверка свойства Enabled страницы производится после события BeforePrint страницы.
Можно ли как-то прервать выполнение методов StiReport Render, Show, Print в случае отсутствия данных? Реализовывать через throw new Exception() не хочется...
Прерывание рендеринга отчёта (при нажатии кнопки Cancel прогресс-бара) у нас в движке производится с помощью StiReportRenderingStopException, который отлавливается в конце метода Render.
Есть также свойство отчёта IsStopped, при установке которого в true прерывается построение отчёта (вызывается StiReportRenderingStopException), а также прерывается выполнение метода Show().

Спасибо.
Ответить