Есть запрос:
Интересуют два поля. ПервоначальноеЗнач и ТекЗначение.
В итоге выводится ПервоначальноеЗнач всегда такое же какое и в документе. А ТекЗначение у какой то номенклатуры "null".
Как сделать так, чтобы если ТекЗначение = null, то не выводить в принципе все поля и номенклатуры у которой текущий остаток null.
Или я может неправильно запрос сделал? спасибо заранее.
ВЫБРАТЬ
ВЗ.Заказчик КАК Клиент,
ВЗ.Заказчик.ОсновнойМенеджерПокупателя.Родитель КАК Канал,
ВЗ.Ссылка,
ВнутреннийЗаказТовары.Номенклатура КАК Номенклатура,
ВЗ.ладГраницаРезерва КАК ДатаКонцаСрочногоРезерва,
ВЗ.Дата КАК ДатаНачалаСрочногоРезерва,
ВнутреннийЗаказТовары.Количество КАК ПервоначальноеЗначениеРезерва,
ВнутреннийЗаказТовары.СерияНоменклатуры,
ВнутреннийЗаказТовары.ХарактеристикаНоменклатуры
ПОМЕСТИТЬ ВЗаказ
ИЗ
Документ.ВнутреннийЗаказ.Товары КАК ВнутреннийЗаказТовары
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннийЗаказ КАК ВЗ
ПО ВнутреннийЗаказТовары.Ссылка = ВЗ.Ссылка
ГДЕ
ВЗ.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВЗ.Проведен = ИСТИНА
И ВЗ.ПометкаУдаления = ЛОЖЬ
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВЗаказ.Клиент,
ВЗаказ.Канал,
ВЗаказ.Ссылка КАК Заказ,
ВЗаказ.Номенклатура,
ВЗаказ.ДатаНачалаСрочногоРезерва КАК ДатаНачалаСрочногоРезерва,
ВЗаказ.ДатаКонцаСрочногоРезерва КАК ДатаКонцаСрочногоРезерва,
ВЗаказ.ПервоначальноеЗначениеРезерва КАК ПервоначальноеЗнач,
ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток КАК ТекЗначение
ИЗ
ВЗаказ КАК ВЗаказ
ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыВРезервеНаСкладах.Остатки(&НаДату, ) КАК ТоварыВРезервеНаСкладахОстатки
ПО ВЗаказ.Ссылка = ТоварыВРезервеНаСкладахОстатки.ДокументРезерва
И ВЗаказ.Номенклатура = ТоварыВРезервеНаСкладахОстатки.Номенклатура
УПОРЯДОЧИТЬ ПО
ДатаНачалаСрочногоРезерва,
ДатаКонцаСрочногоРезерва
ПоказатьИнтересуют два поля. ПервоначальноеЗнач и ТекЗначение.
В итоге выводится ПервоначальноеЗнач всегда такое же какое и в документе. А ТекЗначение у какой то номенклатуры "null".
Как сделать так, чтобы если ТекЗначение = null, то не выводить в принципе все поля и номенклатуры у которой текущий остаток null.
Или я может неправильно запрос сделал? спасибо заранее.
Найденные решения
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
Документ.ВнутреннийЗаказ.Товары КАК ВнутреннийЗаказТовары
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннийЗаказ КАК ВЗ
ПО ВнутреннийЗаказТовары.Ссылка = ВЗ.Ссылка
ГДЕ
ВЗ.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВЗ.Проведен = ИСТИНА
И ВЗ.ПометкаУдаления = ЛОЖЬ
Такая конструкция будет работать только при внутреннем соединении.
ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннийЗаказ КАК ВЗ
ПО ВнутреннийЗаказТовары.Ссылка = ВЗ.Ссылка
ГДЕ
ВЗ.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВЗ.Проведен = ИСТИНА
И ВЗ.ПометкаУдаления = ЛОЖЬ
(5) В обоих случаях заменил бы соединение на внутреннее. При этом в первом запросе на отбор по таблице товаров накладывались бы условия к внутреннему заказу, а во втором запросе уходили бы нулевые значения остатков, как отсутствующие в выборке остатков на дату.
(12)
и так вроде корректно отображает всё
Если всё корректно отображает, то к чему вопрос на форуме? Видимо, всё-таки не всё так, как хотелось бы. По пунктам: в первом запросе Вы выбираете таблицы товаров по ВСЕМ внутренним заказам, а потом к ним "прилепляете" данные из выбранных заказов. Как результат - часть записей из таблиц товаров не имеет соответствий в таблицах заказов и остаются с пустыми полями. Во втором запросе Вы производите выборку остатков на дату и опять же "прилепляете" эту выборку к результату предыдущего запроса. Таким образом, результирующая выборка содержит ВСЕ строки из первого запроса, включая неполные, НЕКОТОРЫЕ из которых содержат данные из второго запроса. В начальном условии было сказано, что отсутствующие в выборке остатков на дату строки не должны попадать в результирующую выборку.
Дописать во втором запросе условие:
"ГДЕ ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, ЛОЖЬ)"
Хотя если это остаток, то логичнее проверять на равенство нулю.
"ГДЕ ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток > 0"
"ГДЕ ЕСТЬNULL(ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток, ЛОЖЬ)"
Хотя если это остаток, то логичнее проверять на равенство нулю.
"ГДЕ ТоварыВРезервеНаСкладахОстатки.КоличествоОстаток > 0"
(11) В первом запросе я бы левое соединение заменил на внутреннее, т.к. сейчас условия из секции "ГДЕ" воздействуют только на таблицу "ВЗ", а в таблицу "ВнутреннийЗаказТовары" по прежнему попадают все данные.
Если копнуть глубже, то можно вообще не использовать соединение в первом запросе, а просто записать в условии:
"ГДЕ
ВнутреннийЗаказТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВнутреннийЗаказТовары.Ссылка.Проведен = ИСТИНА
И ВнутреннийЗаказТовары.Ссылка.ПометкаУдаления = ЛОЖЬ"
Соответственно, удалив:
" ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннийЗаказ КАК ВЗ
ПО ВнутреннийЗаказТовары.Ссылка = ВЗ.Ссылка"
Если копнуть глубже, то можно вообще не использовать соединение в первом запросе, а просто записать в условии:
"ГДЕ
ВнутреннийЗаказТовары.Ссылка.Дата МЕЖДУ &ДатаНач И &ДатаКон
И ВнутреннийЗаказТовары.Ссылка.Проведен = ИСТИНА
И ВнутреннийЗаказТовары.Ссылка.ПометкаУдаления = ЛОЖЬ"
Соответственно, удалив:
" ЛЕВОЕ СОЕДИНЕНИЕ Документ.ВнутреннийЗаказ КАК ВЗ
ПО ВнутреннийЗаказТовары.Ссылка = ВЗ.Ссылка"
(14) а до этого быстрее отрабатывал?
Похоже, он проверяет условие на каждой строке ТЧ, что является лишней работой.
В таком случае лучше использовать первую версию запроса (через соединение), просто заменив "левое" на "внутренее", чтобы вторая таблица ограничивала итоговую выборку.
Похоже, он проверяет условие на каждой строке ТЧ, что является лишней работой.
В таком случае лучше использовать первую версию запроса (через соединение), просто заменив "левое" на "внутренее", чтобы вторая таблица ограничивала итоговую выборку.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот