Автор: bolobol 13.09.11, 17:40
Здравствуйте!
Часто в текстах с запросами в стандартных конфигураций встречаются похожие конструкции:
...ГДЕ ЗарплатаКВыплатеОрганизаций.Организация = &Организация...
Если Организация.Пустая() Тогда
Запрос.Текст= СтрЗаменить(Запрос.Текст, "ГДЕ ЗарплатаКВыплатеОрганизаций.Организация = &Организация", "");
т.е. Если Организация в отборе не указана, то убрать её и из текста условий.
Вопрос: Чем это может быть объяснено, т.к. небольшие изменения в условии запроса - выведут из строя весь запрос алгоритмом замены или не произойдёт сама замена, т.к. между "ГДЕ" и "Зарпла..." может появиться " И ".
Почему не целесообразней использовать следующую конструкцию или её аналог:
ГДЕ (&Организация = &ПустаяОрганизация ИЛИ ЗарплатаКВыплатеОрганизаций.Организация = &Организация)
Запрос.УстановитьПараметр("ПустаяОрганизация", Справочники.Организации.ПустаяСсылка());
Запрос.УстановитьПараметр("Организация", Организация);
Как убрать параметр ПустаяОрганизация и задать это прямо в тексте запроса?
А может есть ещё более изящные конструкции, типа:
ГДЕ 1=1
Если НЕ Организация.Пустая() Тогда
Запрос.Текст= СтрЗаменить(Запрос.Текст, "1=1", "ЗарплатаКВыплатеОрганизаций.Организация = &Организация");
Автор: Ardi 13.09.11, 19:31
ГДЕ (&ВсеОрганизации ИЛИ ЗарплатаКВыплатеОрганизаций.Организация = &Организация)
Запрос.УстановитьПараметр("ВсеОрганизации", Организация=Справочники.Организации.ПустаяСсылка());
Запрос.УстановитьПараметр("Организация", Организация);
Автор: kivals 17.09.11, 16:04
Цитата(bolobol @ 13.09.11, 18:40)
Как убрать параметр ПустаяОрганизация и задать это прямо в тексте запроса?
В запросе:
&Организация = ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
Автор: Zaval 17.09.11, 20:52
Господа, будьте проще
Достаточно в запросе использовать не "=", а "В" и в качестве параметра установить список значений для отбора.
Отбор не нужен - пустой список. В этом случае "В" дает истину для любого значения.
Автор: Ardi 17.09.11, 23:09
Цитата(Zaval @ 17.09.11, 21:52)
Отбор не нужен - пустой список. В этом случае "В" дает истину для любого значения.
Не, не работает.
Автор: Batchir 17.09.11, 23:27
Но насколько мне известно конструкции в запросе, типа:
ЗНАЧЕНИЕ(Справочник.Организации.ПустаяСсылка)
заметно увеличивают быстродействие запроса, чем это указывать через параметры, хотя Ardi в данном случае предложил на мой взгляд более корректный вариант. Зачем в запросе использовать логическую проверку, когда там можно использовать готовое ИСТИНА или ЛОЖЬ.
Вот написал ответ, и сразу же продолжил
, так вообще напрямую в запросе отображаем:
ПустаяОрганизация = Организация = Справочники.Организации.ПустаяСсылка();
"
...
ГДЕ ("+ПустаяОрганизация+" ИЛИ ЗарплатаКВыплатеОрганизаций.Организация = &Организация)
...
"
Запрос.УстановитьПараметр("Организация", Организация);
Автор: Ardi 17.09.11, 23:37
Цитата(Batchir @ 18.09.11, 0:27)
Вот написал ответ, и сразу же продолжил
, так вообще напрямую в запросе отображаем:
В таком случае нельзя нажать в конфигураторе правую кнопку мыши и "Конструктор запроса". А это неудобно
Автор: kivals 18.09.11, 13:56
Цитата(Ardi @ 18.09.11, 0:37) http://pro1c.org.ua/index.php?act=findpost&pid=32130
Господа, будьте проще
Достаточно в запросе использовать не "=", а "В" и в качестве параметра установить список значений для отбора.
Отбор не нужен - пустой список. В этом случае "В" дает истину для любого значения.
По-моему так было в запросах 7.7, и на мой взгляд это "баг, перекованный в фичу". 8 ИМХО отрабатывает это условие корректно - если список пустой - значит
В него ничего не может входить. Кроме того обработка списков происходит медленней, чем сравнение на равно.