Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Условия в запросе  (Прочитано 24703 раз)
0 Пользователей и 1 Гость смотрят эту тему.
jonik_joker
Участник

ru
Offline Offline

« : 25-09-2013 07:04 » 

Всем привет.Вопрос:в запросе установлено 2 условия-отбор по клиенту и отбор по дате.Если в форме не заполнить хотя бы один из этих параметров,то сортировка не происходит.Можно ли в самом конструкторе запроса прописать чтобы при незаполнении хотя бы одного  параметра отбор по второму происходил?
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 25-09-2013 11:42 » new

Используй закладку конструктора запроса "Построитель" или "Компоновка данных" (смотря откуда вызываешь)
Тогда такие условия будут в запросе записаны в фигурных скобках и подставляться только при наличии нужного параметра:
Код: (1C v8)
"ВЫБРАТЬ
|       АвансовыйОтчет.Ссылка
|ИЗ
|       Документ.АвансовыйОтчет КАК АвансовыйОтчет
|{ГДЕ
|       АвансовыйОтчет.Проведен = &Проведен}"
Параметр "Проведен" не установлен - отобраны все документы
Параметр "Проведен" = Истина - отобраны только проведенные
Параметр "Проведен" = Ложь - отобраны только НЕ проведенные
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #2 : 26-09-2013 06:42 » 

я создаю Отчет. В ФормеОтчета прописан запрос

Код: (1C v8)
Запрос.Текст="ВЫБРАТЬ
                     |  ЗаявкаНаПоставку.Дата,
                     |  НАЧАЛОПЕРИОДА(ЗаявкаНаПоставку.Дата, ДЕНЬ) КАК Поле1,
                     |  ОборотыДенежныхСредствОстаткиИОбороты.Клиент,
                     |  ОборотыДенежныхСредствОстаткиИОбороты.Заявка,
                     |  ОборотыДенежныхСредствОстаткиИОбороты.Инвойс,
                     |  ОборотыДенежныхСредствОстаткиИОбороты.СуммаПриход
                     |ИЗ
                     |  Документ.ЗаявкаНаПоставку КАК ЗаявкаНаПоставку
                     |          ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОборотыДенежныхСредств.ОстаткиИОбороты КАК ОборотыДенежныхСредствОстаткиИОбороты
                     |          ПО ОборотыДенежныхСредствОстаткиИОбороты.Заявка = ЗаявкаНаПоставку.Ссылка
                     |ГДЕ
                     |  НАЧАЛОПЕРИОДА(ЗаявкаНаПоставку.Дата, ДЕНЬ) МЕЖДУ &ДатаНачала И &ДатаКонца
                     |  И ЗаявкаНаПоставку.Клиент = &Клиент"
;

Как в нем прописать фигурные скобки?
« Последнее редактирование: 26-09-2013 11:36 от Kivals » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 26-09-2013 11:43 » 

По правой кнопке на запросе вызываешь "конструктор запроса", идешь в "Построитель - Условия" и добавляешь 2 своих условия:
"НАЧАЛОПЕРИОДА(ЗаявкаНаПоставку.Дата, ДЕНЬ) МЕЖДУ &ДатаНачала И &ДатаКонца"
и "ЗаявкаНаПоставку.Клиент = &Клиент"
(а просто с закладки "условия" их удаляешь)
После этого жмешь Ок и получаешь:
Код: (1C v8)
Запрос.Текст="ВЫБРАТЬ
                     |  ЗаявкаНаПоставку.Дата,
                     |  НАЧАЛОПЕРИОДА(ЗаявкаНаПоставку.Дата, ДЕНЬ) КАК Поле1,
                     |  ОборотыДенежныхСредствОстаткиИОбороты.Клиент,
                     |  ОборотыДенежныхСредствОстаткиИОбороты.Заявка,
                     |  ОборотыДенежныхСредствОстаткиИОбороты.Инвойс,
                     |  ОборотыДенежныхСредствОстаткиИОбороты.СуммаПриход
                     |ИЗ
                     |  Документ.ЗаявкаНаПоставку КАК ЗаявкаНаПоставку
                     |          ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОборотыДенежныхСредств.ОстаткиИОбороты КАК ОборотыДенежныхСредствОстаткиИОбороты
                     |          ПО ОборотыДенежныхСредствОстаткиИОбороты.Заявка = ЗаявкаНаПоставку.Ссылка
                     |{ГДЕ
                     |  НАЧАЛОПЕРИОДА(ЗаявкаНаПоставку.Дата, ДЕНЬ) МЕЖДУ &ДатаНачала И &ДатаКонца,
                     |  ЗаявкаНаПоставку.Клиент = &Клиент}"
;
Обрати внимание: вместо "И" в условиях - просто запятая

P.S. Для выделения кода используй [code=e1cv8]...[/code]
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #4 : 27-09-2013 12:39 » 

прописал, получилось вот так

Код: (1C v8)
|{ГДЕ
                     |  (НАЧАЛОПЕРИОДА(ЗаявкаНаПоставку.Дата, ДЕНЬ) МЕЖДУ &ДатаНачала И &ДатаКонца),
                     |  (ЗаявкаНаПоставку.Клиент = &Клиент)}";

теперь выборка совсем не происходит,выводится все.
« Последнее редактирование: 27-09-2013 12:55 от jonik_joker » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 27-09-2013 16:11 » 

Если у тебя нет строк типа
Код: (1C v8)
Запрос.Параметры.Вставить("ИмяПараметра", ЗначениеПараметра);
То все верно - будет выводиться все, т.е. условия не будут накладываться
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #6 : 27-09-2013 21:07 » 

Kivals, перед запросом прописано

 
Код: (1C v8)
Запрос.УстановитьПараметр("Клиент",Клиент);
                Запрос.УстановитьПараметр("ДатаНачала",НачалоДня(ДатаНачала));
        Запрос.УстановитьПараметр("ДатаКонца",КонецДня(ДатаКонца));
« Последнее редактирование: 27-09-2013 21:12 от jonik_joker » Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 02-10-2013 10:29 » 

Перечитал внимательно про построитель - оказалось что (несмотря на схожесть синтаксиса с "Компоновкой данных") это устаревшая вещь и работать с ней неудобно.
Т.е. так, как я описывал выше, будут работать параметры на закладке "Компоновка данных" - это подходит для динамических списков на форме.

В случае программного использования запроса проще либо
а) сравнивать на пустое значение параметра:
Код: (1C v8)
Запрос.Текст="ВЫБРАТЬ
                     |  ...
                     |ИЗ
                     |  Документ.ЗаявкаНаПоставку КАК ЗаявкаНаПоставку
                     |          ...
                     |ГДЕ
                     |  ((&ДатаНачала = '0001.01.01') ИЛИ (НАЧАЛОПЕРИОДА(ЗаявкаНаПоставку.Дата, ДЕНЬ) МЕЖДУ &ДатаНачала И &ДатаКонца))
                     |  И ((&Клиент = ЗНАЧЕНИЕ(Справочник.Клиенты.ПустаяСсылка)) ИЛИ (ЗаявкаНаПоставку.Клиент = &Клиент))"
;
б) добавить еще один параметр использования параметра Улыбаюсь :
Код: (1C v8)
Запрос.Текст="ВЫБРАТЬ
                     |  ...
                     |ИЗ
                     |  Документ.ЗаявкаНаПоставку КАК ЗаявкаНаПоставку
                     |          ...
                     |ГДЕ
                     |  (&ИспользоватьПериод ИЛИ (НАЧАЛОПЕРИОДА(ЗаявкаНаПоставку.Дата, ДЕНЬ) МЕЖДУ &ДатаНачала И &ДатаКонца))
                     |  И (&ИспользоватьКлиент ИЛИ (ЗаявкаНаПоставку.Клиент = &Клиент))"
;
Запрос.Параметры.Вставить("ИспользоватьПериод", Истина);
Запрос.Параметры.Вставить("ИспользоватьКлиент", Ложь);

P.S. С точки зрения опитимизации времени выполнения лучше вместо
Код: (1C v8)
"НАЧАЛОПЕРИОДА(ЗаявкаНаПоставку.Дата, ДЕНЬ) МЕЖДУ &ДатаНачала И &ДатаКонца"
использовать
Код: (1C v8)
"ЗаявкаНаПоставку.Дата МЕЖДУ &ДатаНачала И &ДатаКонца"
и передавать параметры так:
Код: (1C v8)
Запрос.Параметры.Вставить("ДатаНачала", НачалоДня(ДатаНачала));
Запрос.Параметры.Вставить("ДатаКонца", КонецДня(ДатаКонца));
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #8 : 03-10-2013 19:29 » 

Ха , интересно , реально логическая лозейка ) спасибо , завтра испробую .
По поводу периода: ЗаявкаНаПоставку.Дата не получится использовать, т.к. дата выводится со временем и сравнения с&ДатаНачала И &ДатаКонца  не происходит.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 04-10-2013 13:37 » 

По поводу периода: ЗаявкаНаПоставку.Дата не получится использовать, т.к. дата выводится со временем и сравнения с&ДатаНачала И &ДатаКонца  не происходит.
Я же написал как правильно передать параметры в запрос, чтобы время не влияло на отбор - читай внимательней
Записан
jonik_joker
Участник

ru
Offline Offline

« Ответ #10 : 05-10-2013 19:03 » 

да, спасибо все получилось. Правда я до конца не понял почему не происходит сравнение по времени.
Записан
Kivals
Модератор

ca
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 07-10-2013 12:23 » 

да, спасибо все получилось. Правда я до конца не понял почему не происходит сравнение по времени.
Потому что в параметрах тоже данные передаются со времнем, только даже в случае, когда мы передаем одну и ту же дату (например: 01.01.2014) параметр "ДатаНачала" будет равен "01.01.2014 00:00:00", а "ДатаКонца" - "01.01.2014 23:59:59".
Потому что при передаче параметров мы предварительно вызываем функции НачалоДня() и КонецДня()
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines