Страница 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().
Спасибо.