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

Не отображается датабэнд если нет данных в источнике данных

Добавлено: 10 янв 2017, 10:06
aquilax
Подскажите, есть ли простой стандартный способ показать, что данных нет в источнике данных?
У меня отчет состоит из databend, у которого указан источник данных - выборка значений из базы. Если данных нет, то весь датабэнд не отображается, а мне нужно вывести хотя бы сообщение о том, что данных нет
Спасибо!

Re: Не отображается датабэнд если нет данных в источнике дан

Добавлено: 11 янв 2017, 15:51
Леонид
Добрый день!

Есть много способов это сделать. На практике, мы, например это не используем, т.к. отчётов более около 400-сот и пользователю совершенно ясно, что пустой лист == нет данных.

Тем не менее.

Предположим у нас есть такой select (Oracle):

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

SELECT 777 as Id,
	   'Peter' as Name
  FROM DUAL
Тогда в коде события BeginRender() отчёта вам нужно написать примерно следующее:

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

DataSource1.Connect(); // эта строка нужна, если у вас в DataSource1 флажок ConnectOnStart = False

if (DataSource1.Rows.Count == 0 || (DataSource1.ID == null && string.IsNullOrEmpty(DataSource1.NAME)))
  MessageBox.Show("Нет данных");
Или (2-й вариант) если хотите показать это в отчёте, то тогда, можно, создать второй DataBand (DataBand2 например), ниже первого, у которого установить (Double Click) Count data = 1, на нём создать StiText со строкой "Нет данных" по центру (или растянуть и поставить выравнивание по центру, что корректнее), поставив у него свойство Enabled = False.
Затем в коде события BeginRender() меняем код на такой:

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

if (DataSource1.Rows.Count == 0 || (DataSource1.ID == null && string.IsNullOrEmpty(DataSource1.NAME)))
  DataBand2.Enabled = true;
Вариантов, на самом деле масса. Пробуйте.

Re: Не отображается датабэнд если нет данных в источнике дан

Добавлено: 11 янв 2017, 17:17
aquilax
Спасибо за ответ!
На самом деле пробуем по типу варианта 2, только второй датабэнд устанавливаем сверху. Привязываем к нему новый источник данных, который состоит из простого запроса - считает количество строк при таких же условиях запроса, как в первом источнике данных. То есть содержимое этого источника данных есть всегда, может быть 0, может быть другое число. Добавляем объект "Текст" в новый датабэнд с содержимым:
{IIF(count.C==0,"В базе нет данных за указанный период времени!","")}
И у нас всё работает в версии .Net. Но мы запускаем этот отчет в версии .PHP в веб-браузере, и это не работает! Абсолютно пустой отчет, не показывает ни одного бэнда. Интересно почему так? Уже поразному пробовали крутить "вариант 2".

А события у нас не поддерживаются, поэтому мы не можем использовать вариант 1.

Re: Не отображается датабэнд если нет данных в источнике дан

Добавлено: 11 янв 2017, 17:25
Леонид
Здесь сложно сказать, это нужен простой пример, чтобы разработчики посмотрели.

Могу предложить две идеи. Попробовать использовать тернарную операцию вместо IIF, т.е. меняете

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

{IIF(count.C==0,"В базе нет данных за указанный период времени!","")}
на

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

{count.C == 0 ? "В базе нет данных за указанный период времени!" : string.Empty}
Если это не поможет, то попробуйте вместо DataBand2 использовать что-то другое, например, второй ReportTitle, т.к. DataBand всё-таки требует какой-нибудь Data count отличный от нуля.

P.S. Забыл спросить, а почему вы используете второй запрос, DataSource1.Rows.Count == 0 не работает?

Re: Не отображается датабэнд если нет данных в источнике дан

Добавлено: 11 янв 2017, 17:43
aquilax
Title использовали как раз - тоже самое, не отображается.
В Net - отображается, в PHP нет...
следующим шагом попробуем тернарную операцию - спасибо за подсказку.

На счет вопроса, почему мы используем второй запрос - что-то не поняла смысл вопроса, сорри... (DataSource1.Rows.Count == 0 -?)

Re: Не отображается датабэнд если нет данных в источнике дан

Добавлено: 11 янв 2017, 17:55
Леонид
На счет вопроса, почему мы используем второй запрос - что-то не поняла смысл вопроса, сорри... (DataSource1.Rows.Count == 0 -?)
Это я к тому, что почему бы вместо запроса не узнавать Count у источника данных просто так DataSource1.Rows.Count == 0, а не дёргать вторым запросом сервер лишний раз, тем более, если запрос "тяжеловесный".

Re: Не отображается датабэнд если нет данных в источнике дан

Добавлено: 12 янв 2017, 17:00
aquilax
А где в отчете можно это выражение написать: "DataSource1.Rows.Count == 0" ? - Мы просто сначала пишем в версии .Net, но проект должен быть совместим c PHP версией. А там не поддерживаются события...

Re: Не отображается датабэнд если нет данных в источнике дан

Добавлено: 15 янв 2017, 13:01
Aleksey
Здравствуйте,

Как вариант, попробуйте задать данное условие в Condition для дополнительного бэнда, и выключить опцию "Component Is Enabled".

Спасибо.