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

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

Добавлено: 02 фев 2018, 16:11
Андрей Сорокин
Добрый день,
имеется отчёт с несколькими DataSources, которые выполняют коннект к MS SQL Server и получают данные для отчёта. Мне необходимо обработать событие после выполнения всех запросов к базе для анализа отсутствующих данных чтобы уведомить пользователя и не выводить пустой отчёт на экран. Каким образом лучше всего это реализовать?
Спасибо.

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

Добавлено: 02 фев 2018, 17:31
Aleksey
Здравствуйте,

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

Спасибо.

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

Добавлено: 02 фев 2018, 22:30
Андрей Сорокин
В коде приложения, т.к. оно универсально и работает со всеми отчётами.
Спасибо.

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

Добавлено: 06 фев 2018, 01:37
Aleksey
Здравствуйте,

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

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

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

foreach (StiDataSource datasource in ((StiReport)sender).DataSources)
{
    if (datasource.Count == 0)
}
Спасибо.

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

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

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

Добавлено: 06 фев 2018, 11: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;

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

Добавлено: 06 фев 2018, 11: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();
     }
}

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

Добавлено: 06 фев 2018, 12: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.

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

Добавлено: 08 фев 2018, 18:44
Андрей Сорокин
Жаль от разработчиков нет ответа...

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

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

Спасибо.