Работа с переменными
Работа с переменными
Есть несколько вопросов по работе с параметрами отчета, которые может вводить пользователь. В терминах Stimulsoft- это переменные.
Предположим, я редактирую отчет в редакторе Stimulsoft Reports.Net, версия 2014.3
1) Как сделать у отчета строковый параметр (Variable), который пользователь должен обязательно ввести? Т.е. чтобы при нажатии Submit отчет не запускался на построение. Процедура, запрашивающая данные, падает, если параметр не введен.
2) Как сделать у отчета параметр "список целых чисел", в котором будет по умолчанию выделена только часть доступных параметров?
Пример: 3) Почему Designer.exe падает при попытке построить прилагаемый отчет? Это отчет из ваших примеров, ParametersDateRange.mrt у которого всего лишь убрано значение по умолчанию для переменной. Вообще, стабильностью работы этот дизайнер не блещет. У меня он постоянно падает. Реально ли мне будет на таком коде построить приложение, которое можно будет поставлять конечным пользователям, не понимаю.
Предположим, я редактирую отчет в редакторе Stimulsoft Reports.Net, версия 2014.3
1) Как сделать у отчета строковый параметр (Variable), который пользователь должен обязательно ввести? Т.е. чтобы при нажатии Submit отчет не запускался на построение. Процедура, запрашивающая данные, падает, если параметр не введен.
2) Как сделать у отчета параметр "список целых чисел", в котором будет по умолчанию выделена только часть доступных параметров?
Пример: 3) Почему Designer.exe падает при попытке построить прилагаемый отчет? Это отчет из ваших примеров, ParametersDateRange.mrt у которого всего лишь убрано значение по умолчанию для переменной. Вообще, стабильностью работы этот дизайнер не блещет. У меня он постоянно падает. Реально ли мне будет на таком коде построить приложение, которое можно будет поставлять конечным пользователям, не понимаю.
- Вложения
-
- ParametersDateRange.mrt
- (41.02 КБ) 408 скачиваний
Re: Работа с переменными
Здравствуйте,
Проблема исправлена. Фикс будет доступен в релизе в течении недели-двух.
Спасибо.
К сожалению, такой возможности нет. Как вариант, вы можете задать значение по умолчанию для такой переменной, чтобы процедура не "падала".1) Как сделать у отчета строковый параметр (Variable), который пользователь должен обязательно ввести? Т.е. чтобы при нажатии Submit отчет не запускался на построение. Процедура, запрашивающая данные, падает, если параметр не введен.
К сожалению, такой возможности нет.2) Как сделать у отчета параметр "список целых чисел", в котором будет по умолчанию выделена только часть доступных параметров?
Спасибо за сообщение об ошибке.3) Почему Designer.exe падает при попытке построить прилагаемый отчет? Это отчет из ваших примеров, ParametersDateRange.mrt у которого всего лишь убрано значение по умолчанию для переменной.
Проблема исправлена. Фикс будет доступен в релизе в течении недели-двух.
Спасибо.
Re: Работа с переменными
Проблема тут такая - окно для ввода параметров отчета мы будем создавать сами (штатное нам не подходит по многим причинам), по нажатию кнопки "построить отчет" будет открываться новое, максимизированное окно, которое будет содержать только отчет. Параметр, о котором идет речь, обязательный - без него пользователь увидит пустой отчет, и будет вынужден закрывать окно и идти назад. Пользователю было бы удобнее, если бы при нажатии кнопки "построить отчет" ему сразу обводили красным не введенные параметры.Aleksey писал(а):Здравствуйте,К сожалению, такой возможности нет. Как вариант, вы можете задать значение по умолчанию для такой переменной, чтобы процедура не "падала".1) Как сделать у отчета строковый параметр (Variable), который пользователь должен обязательно ввести? Т.е. чтобы при нажатии Submit отчет не запускался на построение. Процедура, запрашивающая данные, падает, если параметр не введен.
Для этого при редактировании шаблона отчета редактором, построенным на базе Stimulsoft, надо было бы помечать параметр как Required. Для int и Date я такую возможность в свойстве Type у класса StiVariable нашел, для string, к сожалению, нет.
Спасибо, но все-таки Designer.exe падает у меня по несколько раз на дню, в том числе при демонстрации возможностей продукта руководству. Для коммерческого продукта это не приемлемо, мне кажется, надо встроить в продукт хотя бы аварийное сохранение файла перед закрытиемAleksey писал(а):Спасибо за сообщение об ошибке.3) Почему Designer.exe падает при попытке построить прилагаемый отчет? Это отчет из ваших примеров, ParametersDateRange.mrt у которого всего лишь убрано значение по умолчанию для переменной.
Проблема исправлена. Фикс будет доступен в релизе в течении недели-двух.
Re: Работа с переменными
Здравствуйте,
Спасибо.
Не могли бы вы более подробно описать в каких ситуациях у вас падает дизайнер или прислать примеры отчетов, на которых это происходит.Спасибо, но все-таки Designer.exe падает у меня по несколько раз на дню, в том числе при демонстрации возможностей продукта руководству. Для коммерческого продукта это не приемлемо, мне кажется, надо встроить в продукт хотя бы аварийное сохранение файла перед закрытием
Спасибо.
Re: Работа с переменными
Вот еще пример.
Хочу вызвать хранимую процедуру, с обязательным параметром, но хочу в качестве параметра передать NULL.
Вот код хранимой процедуры:
Я полагал, что для передачи NULL в качестве параметра предназначен непонятный checkbox рядом с именем переменной. Очевидно, он делает что-то не то.
Т.е., вопросы:
1) Как, все-таки, передать null в качестве параметра процедуры?
2) Что это за неописанный чекбокс, обведен на картинке красным?
3) И повторюсь, для коммерческого продукта так падать - крайне не красиво. Пусть бы он выдал мне сообщение "что-то не так", но падать то зачем? надо хоть файл сохранить
Хочу вызвать хранимую процедуру, с обязательным параметром, но хочу в качестве параметра передать NULL.
Вот код хранимой процедуры:
Код: Выделить всё
CREATE PROCEDURE dbo.MyReport
@Parameter1 bigint
as
BEGIN
select 1 as col1, 2 as col2
END
GO
1) Как, все-таки, передать null в качестве параметра процедуры?
2) Что это за неописанный чекбокс, обведен на картинке красным?
3) И повторюсь, для коммерческого продукта так падать - крайне не красиво. Пусть бы он выдал мне сообщение "что-то не так", но падать то зачем? надо хоть файл сохранить
- Вложения
-
- Err2.mrt
- (6.41 КБ) 393 скачивания
Re: Работа с переменными
Здравствуйте.
Поэтому в качестве "null" надо использовать значение "DBNull.Value".
В вашем случае для этого необходимо в поле Expression параметра @Parameter1 вместо имени переменной Variable1 написать выражение
Т.е. используется значение типа по умолчанию, соответственно для nullable-типов это null.
При этом все возникающие exception будут просто "проглатываться", и ничего падать не будет.
Однако тут есть нюанс.
Все ошибки можно условно разделить на два типа:
1. Простые, которые не влияют глобально на процесс построения отчета; пример - ошибка при вычислении значения отдельного текстового поля. Эти ошибки всегда отлавливаются и выводятся в окошке ReportChecker как Rendering messages.
2. Сложные ошибки, которые влияют на всё построение отчета; пример - ошибка в адаптере данных при получении данных. При возникновении таких ошибок построение отчета чаще всего не может быть продолжено, так как нарушается логика построения отчета. Эти ошибки можно отловить с помощью свойства HideExceptions, но нормальное построение отчета в этом случае не гарантируется.
Спасибо.
Проблема в том, что SqlDataAdapter не понимает значение параметра null, он считает что параметр забыли задать и выдает exception "Procedure or function '...' expects parameter '...', which was not supplied.". Кстати, такое же сообщение выдаётся и в том случае, если значение параметра выходит за допустимые границы, или не соответствует тип.DmitryRu писал(а):Хочу вызвать хранимую процедуру, с обязательным параметром, но хочу в качестве параметра передать NULL.
Я полагал, что для передачи NULL в качестве параметра предназначен непонятный checkbox рядом с именем переменной. Очевидно, он делает что-то не то.
Т.е., вопросы:
1) Как, все-таки, передать null в качестве параметра процедуры?
Поэтому в качестве "null" надо использовать значение "DBNull.Value".
В вашем случае для этого необходимо в поле Expression параметра @Parameter1 вместо имени переменной Variable1 написать выражение
Код: Выделить всё
(object)Variable1 ?? DBNull.Value
Назначение checkbox вы определили правильно: если навести на него курсор, то через секунду всплывет подсказка "Not assigned".DmitryRu писал(а):2) Что это за неописанный чекбокс, обведен на картинке красным?
Т.е. используется значение типа по умолчанию, соответственно для nullable-типов это null.
Вы можете установить следующую статическую опцию:DmitryRu писал(а):3) И повторюсь, для коммерческого продукта так падать - крайне не красиво. Пусть бы он выдал мне сообщение "что-то не так", но падать то зачем? надо хоть файл сохранить
Код: Выделить всё
StiOptions.Engine.HideExceptions = true;
Однако тут есть нюанс.
Все ошибки можно условно разделить на два типа:
1. Простые, которые не влияют глобально на процесс построения отчета; пример - ошибка при вычислении значения отдельного текстового поля. Эти ошибки всегда отлавливаются и выводятся в окошке ReportChecker как Rendering messages.
2. Сложные ошибки, которые влияют на всё построение отчета; пример - ошибка в адаптере данных при получении данных. При возникновении таких ошибок построение отчета чаще всего не может быть продолжено, так как нарушается логика построения отчета. Эти ошибки можно отловить с помощью свойства HideExceptions, но нормальное построение отчета в этом случае не гарантируется.
Спасибо.
Re: Работа с переменными
Спасибо за разъяснения.
У меня есть предложение: может, чекбокс "Not assigned" как раз и будет содержать эту логику? По крайней мере, для SQL Server. Ведь этот чекбокс визуально ровно для этого предназначен.
И по поводу обработки "сложных" ошибок я с Вами согласен, как программист. Однако предлагаю встать на точку зрения пользователя: он воспользовался штатным контролом (чекбокс "Not assigned") и в результате этого весь его труд по рисованию отчета пошел в урну. А ведь автосохранение по умолчанию, насколько помню, не включено. Т.е. предлагаю в случае сложной ошибки дать хотя бы шанс на сохранение файла с шаблоном отчета. А вообще-то считаю, что надо не закрывать программу, а просто отказываться от построения отчета, и все.
У меня есть предложение: может, чекбокс "Not assigned" как раз и будет содержать эту логику?
Код: Выделить всё
(object)Variable1 ?? DBNull.Value
И по поводу обработки "сложных" ошибок я с Вами согласен, как программист. Однако предлагаю встать на точку зрения пользователя: он воспользовался штатным контролом (чекбокс "Not assigned") и в результате этого весь его труд по рисованию отчета пошел в урну. А ведь автосохранение по умолчанию, насколько помню, не включено. Т.е. предлагаю в случае сложной ошибки дать хотя бы шанс на сохранение файла с шаблоном отчета. А вообще-то считаю, что надо не закрывать программу, а просто отказываться от построения отчета, и все.
Re: Работа с переменными
Здравствуйте.
Как вариант решения проблемы, можно задать значение параметра по умолчанию в самой хранимой процедуре. В этом случае SqlDataAdapter не будет ругаться на отсутствие параметра:
Также мы сделали доработку для SqlSource: теперь при передаче значения параметра null заменяется на DBNull.Value
Надеемся, что эта доработка ничего не поломает у остальных наших пользователей.
В следующем билде мы добавим необходимые изменения, чтобы возникающие ошибки построения отчета не закрывали дизайнер.
Спасибо.
Чекбокс относится только к переменной. Вы можете использовать значение переменной при вычислении значения параметра, но к источникам данных переменные не имеют никакого отношения.DmitryRu писал(а):Спасибо за разъяснения.
У меня есть предложение: может, чекбокс "Not assigned" как раз и будет содержать эту логику? По крайней мере, для SQL Server. Ведь этот чекбокс визуально ровно для этого предназначен.
Как вариант решения проблемы, можно задать значение параметра по умолчанию в самой хранимой процедуре. В этом случае SqlDataAdapter не будет ругаться на отсутствие параметра:
Код: Выделить всё
CREATE PROCEDURE dbo.MyReport
@Parameter1 bigint = NULL
as
BEGIN
select 1 as col1, 2 as col2
END
GO
Надеемся, что эта доработка ничего не поломает у остальных наших пользователей.
Описанная вами проблема - это недоработка нашего продукта.DmitryRu писал(а):И по поводу обработки "сложных" ошибок я с Вами согласен, как программист. Однако предлагаю встать на точку зрения пользователя: он воспользовался штатным контролом (чекбокс "Not assigned") и в результате этого весь его труд по рисованию отчета пошел в урну. А ведь автосохранение по умолчанию, насколько помню, не включено. Т.е. предлагаю в случае сложной ошибки дать хотя бы шанс на сохранение файла с шаблоном отчета. А вообще-то считаю, что надо не закрывать программу, а просто отказываться от построения отчета, и все.
В следующем билде мы добавим необходимые изменения, чтобы возникающие ошибки построения отчета не закрывали дизайнер.
Спасибо.
Re: Работа с переменными
Спасибо, мне кажется, это правильный вариант.Ivan писал(а): Также мы сделали доработку для SqlSource: теперь при передаче значения параметра null заменяется на DBNull.Value
Подскажите, в какой релиз это попадет?
К слову, вариант с правкой всех хранимых процедур, для добавления параметров по умолчанию, встретил решительное осуждение DBA
Re: Работа с переменными
Здравствуйте,
Данный фикс будет доступен в первом предрелизном билде после текущего релиза 2015.1, на следующей неделе.
Спасибо.
Данный фикс будет доступен в первом предрелизном билде после текущего релиза 2015.1, на следующей неделе.
Спасибо.