|
Преобразовать запрос с двумя условиями в рабочий вариант | ☑ | ||
---|---|---|---|---|
0
saradip
21.03.23
✎
14:09
|
Добрый день, задача следующая:
Выбрать номенклатуру из документа, и связать ее с дополнительным реквизитом предприятия. ВЫБРАТЬ ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура, ЕСТЬNULL(НоменклатураДополнительныеРеквизиты.Значение, "") КАК Значение ИЗ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты ПО (ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка) ГДЕ ПеремещениеТоваровТовары.Ссылка = &Ссылка И НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита Суть какая, выше - неправильное решение, так как отрабатывают два условия "И", и выбираются только те строки, где первое и второе условие отработало. Если нет доп реквизита = нет строки. У меня решение в голове одно: 1) виртуальная таблица "ВТНоменклатура" выбирающая номенклатуру из документа, где указан параметр ССЫЛКА 2) виртуальная таблица "ВТЗначения" выборка доп. реквизитов, где ССЫЛКА В ссылках на номенклатуру из "ВТНоменклатура" 3) А после выбор полей из двух ВТ и связь по ссылке. Как наиболее просто оптимизировать запрос, чтобы получать все строки, даже те, где нет доп. реквизита? |
|||
1
lubitelxml
21.03.23
✎
14:12
|
ВЫБРАТЬ
ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура, ЕСТЬNULL(НоменклатураДополнительныеРеквизиты.Значение, "") КАК Значение ИЗ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты ПО (ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка) И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита) и вот здесь можно не писать ссылка: (ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка) а писать (ПеремещениеТоваровТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка) |
|||
2
Волшебник
21.03.23
✎
14:12
|
ВЫБРАТЬ Ссылка
ИЗ справочник.Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ Спр.Доп ПО Номенклатура И ИмяДопРекв ГДЕ ссылка В (ВЫБРАТЬ Номенклатура ИЗ документ.Перемещение.Товары ГДЕ Док = &Док) |
|||
3
saradip
21.03.23
✎
14:16
|
(1) Спасибо, но здесь нет условия на документ
|
|||
4
lubitelxml
21.03.23
✎
14:19
|
ВЫБРАТЬ
ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура, ЕСТЬNULL(НоменклатураДополнительныеРеквизиты.Значение, "") КАК Значение ИЗ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты ПО (ПеремещениеТоваровТовары.Номенклатура= НоменклатураДополнительныеРеквизиты.Ссылка) И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита) ГДЕ ПеремещениеТоваровТовары.Ссылка = &Ссылка Ну так сам бы добавил |
|||
5
Donkey_hot
21.03.23
✎
14:21
|
(0) Сначала выберите товары документа в таблицу (чтобы не связывать то, что потом будет отсечено), потом свяжите с доп.реквизитами по условиям ссылки и имени.
|
|||
6
saradip
21.03.23
✎
14:21
|
(4) Да, я добавил, проверял. Все отлично отрабатывает!
ВЫБРАТЬ ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура, ЕСТЬNULL(НоменклатураДополнительныеРеквизиты.Значение, "") КАК Значение ИЗ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты ПО (ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка) И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита) ГДЕ ПеремещениеТоваровТовары.Ссылка = &Ссылка |
|||
7
Donkey_hot
21.03.23
✎
14:22
|
(6) Да нет, не отлично. Связываете строки всех документов в базе (например, несколько сотен тысяч), чтобы потом выбрать строки одного документа.
|
|||
8
azernot
21.03.23
✎
14:23
|
(6) > ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка
кровь из глаз пошла. Перечитайте конец поста (1) |
|||
9
Fish
21.03.23
✎
14:24
|
(6) Только я бы ещё от двух точек избавился.
Вместо ПеремещениеТоваровТовары.Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка пойдёт ПеремещениеТоваровТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка Ну и НоменклатураДополнительныеРеквизиты.Свойство.Имя я бы заменил на НоменклатураДополнительныеРеквизиты.Свойство |
|||
10
lubitelxml
21.03.23
✎
14:26
|
(7) да, согласен, можно либо как в (2), либо сначала во временныую собрать товары с условием по документу, и потом уже левое с доп. реквизитами
|
|||
11
saradip
21.03.23
✎
14:27
|
(9) Во втором случае отбор идет именно по имени реквизита, если точку убрать, то будет сравниваться не имя, а ссылка свойства
|
|||
12
saradip
21.03.23
✎
14:28
|
(7) Понял
|
|||
13
Fish
21.03.23
✎
14:28
|
(11) Правильно. По ссылке сравнивать лучше, чем по имени, да ещё доставая его через 2 точки.
|
|||
14
Fish
21.03.23
✎
14:30
|
+(13) Ну и защита от того, что кто-нибудь поменяет имя допреквизита.
|
|||
15
saradip
21.03.23
✎
14:42
|
(13) Погоди, их может быть несколько, а мне нужен конкретный доп. реквизит с именем СерийныйНомер_85cc11c39f3f43a0986a190ba09130ec
|
|||
16
saradip
21.03.23
✎
14:44
|
(2) Или я не так понял, или разницы нет. В результат выводит строки, только когда указан доп. реквизит
ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка ИЗ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК Номенклатура ПО (Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка) И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита) ГДЕ Номенклатура.Ссылка В (ВЫБРАТЬ ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура ИЗ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары ГДЕ ПеремещениеТоваровТовары.Ссылка = &Док) |
|||
17
Волшебник
21.03.23
✎
14:47
|
(16) Вы не оттуда выбираете. Гляньте внимательно (2)
|
|||
18
Fish
21.03.23
✎
14:49
|
(16) Основную таблицу перепутал
|
|||
19
Fish
21.03.23
✎
14:51
|
(15) Ну так и передавай в запрос конкретное свойство с именем СерийныйНомер_85cc11c39f3f43a0986a190ba09130ec. Но передавай ссылкой.
|
|||
20
Donkey_hot
21.03.23
✎
14:56
|
(16) Чот вообще странное. Вам нужна уникальная номенклатура или состав строк как в документе (с возможными дублями)? Первым шагом в любом случае выбираете номенклатуру документа в ВТ (если нужна только уникальная - то ВЫБРАТЬ РАЗЛИЧНЫЕ), вторым шагом соединяете эту ВТ левым соединением с табличной частью ДополнительныеРеквизиты по двум условиям: Номенклатура = ДопРеквизиты.Ссылка и ДопРеквизиты.Свойство = &Свойство. В параметр "свойство" помещаете ПВХ.ДопРеквизитыИСведения.НайтиПоРеквизиту("Имя", "....")
|
|||
21
saradip
21.03.23
✎
15:16
|
(17) Извиняюсь, не проверил текст!
Спасибо, так отлично: ВЫБРАТЬ Номенклатура.Ссылка КАК Ссылка, НоменклатураДополнительныеРеквизиты.Значение КАК Значение ИЗ Справочник.Номенклатура КАК Номенклатура ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты ПО (Номенклатура.Ссылка = НоменклатураДополнительныеРеквизиты.Ссылка) И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита) ГДЕ Номенклатура.Ссылка В (ВЫБРАТЬ ПеремещениеТоваровТовары.Номенклатура КАК Номенклатура ИЗ Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары ГДЕ ПеремещениеТоваровТовары.Ссылка = &Док) |
|||
22
saradip
21.03.23
✎
15:16
|
(20) Нужно номенклатура из документа и рядом ее доп реквизит.
Мне в печатной форме нужен будет этот самый доп реквизит, вместо артикула |
|||
23
saradip
21.03.23
✎
15:18
|
(19) Мысль не уловил. Сперва найти ссылку по имени реквизита? Чтобы в запросе использовать ссылку?
|
|||
24
saradip
21.03.23
✎
15:47
|
Если подвести итоги и сделать выводы, то чтобы избежать ошибочной ситуации, при двойном условии, необходимо условие задавать в связи:
/////// - ошибка ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты ПО (ПеремещениеТоваровТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка) ГДЕ НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита /////// - верное действие ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура.ДополнительныеРеквизиты КАК НоменклатураДополнительныеРеквизиты ПО (ПеремещениеТоваровТовары.Номенклатура = НоменклатураДополнительныеРеквизиты.Ссылка) И (НоменклатураДополнительныеРеквизиты.Свойство.Имя = &ИмяРеквизита) /////// |
|||
25
Волшебник
21.03.23
✎
16:30
|
(24) молодец
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |