|
v8: Дополнить условие в текст запроса, исходя из условия. | ☑ | ||
---|---|---|---|---|
0
IBTM
24.01.12
✎
23:42
|
Простая ситуация. Есть два условия (отбора) подразделение и должность, Например отбираю Сотрудников по подразделению соответствоенно:
ВЫБРАТЬ
но например если указанно ещё и должность то нужно в этот запрос добавить условие СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн
Нашел тупое решение - двумя запросами... Как это мне сделать используя один запрос? |
|||
1
zak555
24.01.12
✎
23:44
|
ВЫБРАТЬ
СотрудникиОрганизаций.Ссылка ИЗ Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций ГДЕ СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр И СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн |
|||
2
IBTM
24.01.12
✎
23:46
|
(1) Нееее... а если мне в данный момент не нужно отбор и по должности?
|
|||
3
1с-кин
24.01.12
✎
23:48
|
(2) используйте построитель запросов
|
|||
4
1с-кин
24.01.12
✎
23:50
|
Там можно задать - если некое условие (ТекущаяДолжность пустая) выполняется, то
СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн отбор по ТекДолжность не делается. |
|||
5
IBTM
25.01.12
✎
00:07
|
намек понел попробуем
|
|||
6
guitar_player
25.01.12
✎
04:59
|
вот так например (0)
ПостроительЗапроса = Новый ПостроительЗапроса; ПостроительЗапроса.Текст = "ВЫБРАТЬ | СотрудникиОрганизаций.Ссылка |ИЗ | Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций |{ГДЕ | СотрудникиОрганизаций.ПодразделениеОрганизации.* КАК Подразделение, | СотрудникиОрганизаций.Должность.*}"; // Установка отборов Если ОтборПодразделение Тогда Отбор = ПостроительЗапроса.Отбор.Добавить("Подразделение"); Отбор.Использование = Истина; Отбор.ВидСравнения = ЭтотОбъект.ВидСравненияПодразделение; Отбор.Значение = ЭтотОбъект.Подразделение; КонецЕсли; Если ОтборДолжность Тогда Отбор = ПостроительЗапроса.Отбор.Добавить("Должность"); Отбор.Использование = Истина; Отбор.ВидСравнения = ЭтотОбъект.ВидСравненияДолжность; Отбор.Значение = ЭтотОбъект.Должность; КонецЕсли; ////////////////////////////////////// // Получение и выполнение запроса Запрос = ПостроительЗапроса.ПолучитьЗапрос(); Результат = Запрос.Выполнить(); Если Результат.Пустой() Тогда Возврат; КонецЕсли; |
|||
7
xarann
25.01.12
✎
07:20
|
Или
ТекстЗапроса = " |ВЫБРАТЬ | СотрудникиОрганизаций.Ссылка |ИЗ | Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций |ГДЕ | СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр | %ПроверкаДолжности%"; Если ПроверятьДолжность Тогда ПроверкаДолжности = "И СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн"; Иначе ПроверкаДолжности = ""; КонецЕсли СтрЗаменить(ТекстЗапроса, "%ПроверкаДолжности%", ПроверкаДолжности); Понятно, что в данном случа можно было использовать простое добавление к тексту запроса, но предложенный вариант работает и при необходимости изменения середины запроса, например динамическое изменение полей выборки... |
|||
8
xarann
25.01.12
✎
07:22
|
||||
9
guitar_player
25.01.12
✎
08:11
|
(7) а нахрена изобретать лесопед с квадратными колесами? Ты еще предлагаешь 10 условий написать по типу?
Если ВидСравненияРаботника = ВидСравнения.Равно Тогда ВидСравненияРаботник = "=" ИначеЕсли ВидСравненияРаботника = ВидСравнения.НеРавно Тогда ВидСравненияРаботник = "<>" ИначеЕсли ВидСравненияРаботника = ВидСравнения.ВСписке Тогда ВидСравненияРаботник = "В" ИначеЕсли ВидСравненияРаботника = ВидСравнения.НеВСписке Тогда ВидСравненияРаботник = "НЕ В" ИначеЕсли ВидСравненияРаботника = ВидСравнения.ВСпискеПоИерархии ИЛИ ВидСравненияРаботника = ВидСравнения.ВИерархии Тогда ВидСравненияРаботник = "В ИЕРАРХИИ" ИначеЕсли ВидСравненияРаботника = ВидСравнения.НеВСпискеПоИерархии ИЛИ ВидСравненияРаботника = ВидСравнения.НеВИерархии Тогда ВидСравненияРаботник = "НЕ В ИЕРАРХИИ" КонецЕсли; Если ВидСравненияРаботник = "=" ИЛИ ВидСравненияРаботник = "<>" Тогда УсловиеПоРаботникам = " Сотрудник " + ВидСравненияРаботник + " &РаботникиОрганизации"; Иначе УсловиеПоРаботникам = " Сотрудник " + ВидСравненияРаботник + "(&РаботникиОрганизации)"; КонецЕсли; как когда то давно было в табеле? убытсо можно... |
|||
10
Defender aka LINN
25.01.12
✎
08:22
|
(9) Еще можно отбор СКД воткнуть, с группами условий... Это ж сразу сколько говнокода можно выдать!
|
|||
11
xarann
25.01.12
✎
08:25
|
(9) Первым словом моего сообщения было "Или", целью служило осветить альтернативный вариант решения задачи, а на каких велосипедах кататься каждый вылысыпыдыст решает сам :)
Тема определения "ЭтотОбъект.ВидСравненияПодразделение;" тобой тоже не раскрыта... |
|||
12
guitar_player
25.01.12
✎
08:37
|
(11) это было для примера выдрано из шаблона и чтобы не показывать что там было, написал так... А вообще можно отбор на форму закинуть или еще что-нибудь
|
|||
13
Ненавижу 1С
гуру
25.01.12
✎
08:47
|
ТекстЗапроса = "
|ВЫБРАТЬ | СотрудникиОрганизаций.Ссылка |ИЗ | Справочник.СотрудникиОрганизаций КАК СотрудникиОрганизаций |ГДЕ | СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр | И &ПроверкаДолжности"; Если ПроверятьДолжность Тогда ПроверкаДолжности = "СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн"; Иначе ПроверкаДолжности = "ИСТИНА"; КонецЕсли СтрЗаменить(ТекстЗапроса, "&ПроверкаДолжности", ПроверкаДолжности); |
|||
14
xarann
25.01.12
✎
08:48
|
(12) Я все это прекрасно понимаю ;)
Разное оружие для разных ситуаций, два языка - два крыла и т.д. В общем, Пусть ТС смотрит и решает, мы вариантов решений набросали. |
|||
15
Defender aka LINN
25.01.12
✎
08:59
|
(13) Месье знает толк в извращениях...
|
|||
16
Ненавижу 1С
гуру
25.01.12
✎
09:00
|
(15) да я такой!
|
|||
17
Maxus43
25.01.12
✎
09:01
|
ГДЕ
(СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр ИЛИ СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = Значение(Справочник.ПодразделенияОрганизаций.ПустаяСсылка)) И (СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн ИЛИ СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = Значение(Справочник.ДолжностиОрганизаций.ПустаяСсылка)) |
|||
18
Ненавижу 1С
гуру
25.01.12
✎
09:03
|
(17) а вот это может сказаться на том, что индексы будут не использованными
|
|||
19
Maxus43
25.01.12
✎
09:11
|
хотя не так...
ГДЕ (СотрудникиОрганизаций.ТекущееПодразделениеОрганизации = &ТекПодр ИЛИ &НеОтбиратьПоПодразделению) И (СотрудникиОрганизаций.ТекущаяДолжностьОрганизации = &ТекДолжн ИЛИ &НеОтбиратьПоДолжности) Ну а в коде Запрос.УстановитьПараметр("НеОтбиратьПоПодразделению", ?(ЗначениеЗаполнено(ТекПодр), Ложь, Истина)) |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |