Проверка на 0 в запросе

1. user921876 11.01.19 09:08 Сейчас в теме
День добрый. Написал запрос на отбор остатков на складе, которых осталось меньше, чем указанное в регистре минимальное значение. Проблема в том, что если остаток на складе равен 0, номенклатура в отбор не попадает. Помогите, пожалуйста, разобраться(

ВЫБРАТЬ
ТоварныеОграничения.Склад КАК Склад,
ТоварныеОграничения.Номенклатура.Родитель КАК НоменклатураРодитель,
ТоварныеОграничения.Номенклатура КАК Номенклатура,
ТоварныеОграничения.МинимальноеКоличествоЗапаса КАК МинимальноеКоличествоЗапаса,
ТоварныеОграничения.МаксимальноеКоличествоЗапаса КАК МаксимальноеКоличествоЗапаса,
Выбор Когда СвободныеОстаткиОстатки.ВНаличииОстаток есть NULL Тогда 0
Иначе СвободныеОстаткиОстатки.ВНаличииОстаток
Конец КАК ВНаличииОстаток
ИЗ
РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток <= ТоварныеОграничения.МинимальноеКоличествоЗапаса

СГРУППИРОВАТЬ ПО
ТоварныеОграничения.Номенклатура.Родитель,
ТоварныеОграничения.МинимальноеКоличествоЗапаса,
ТоварныеОграничения.Склад,
ТоварныеОграничения.Номенклатура,
ТоварныеОграничения.МаксимальноеКоличествоЗапаса,
СвободныеОстаткиОстатки.ВНаличииОстаток

УПОРЯДОЧИТЬ ПО
НоменклатураРодитель
По теме из базы знаний
Найденные решения
6. starjevschik 11.01.19 09:38 Сейчас в теме
по-хорошему надо почитать что-нибудь осмысленное про базы данных и язык SQL. Причем всем участникам обсуждения, сдается мне.

ИЗ
РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток <= ТоварныеОграничения.МинимальноеКоличествоЗапаса 

в таком варианте в результат попадет только то, что есть в остатках. Во-первых, потому, что соединение внутреннее. Во-вторых, потому, что стоит условие на содержимое второй таблицы.
Для того, чтобы выбрать все из ТоварныеОграничения, надо убрать жесткую привязку к остаткам. А для этого нужно как минимум два исправления запроса.

ИЗ
РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ВНУТРЕННЕЕ ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток ЕстьNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) <= ТоварныеОграничения.МинимальноеКоличествоЗапаса
signum2009; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
7. Boneman 298 11.01.19 09:39 Сейчас в теме
(1) когда остаток 0, то выборки вообще никакой не будет.
Т.е. вы не получите записи номенклатура такая то остаток 0.
В выборку попадают только отличающиеся от нуля значения.

Если нужна такая запись в выборке, то нужно сделать виртуальную таблицу с исходным перечнем номенклатуры,
и уже к ней левым соединением подсоединять остатки из регистра.
А где ЕСТЬNULL - то ставим 0.
2. ZergKRSK 129 11.01.19 09:13 Сейчас в теме
Делай ЛЕВОЕ соединение
3. user921876 11.01.19 09:21 Сейчас в теме
ничего не изменилось(
5. ZergKRSK 129 11.01.19 09:29 Сейчас в теме
(3) потому что вот это
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток <= ТоварныеОграничения.МинимальноеКоличествоЗапаса

надо убрать и перенести в условие связей таблиц
4. kumi2012 103 11.01.19 09:27 Сейчас в теме
Надо - ПОЛНОЕ СОЕДИНЕНИЕ
6. starjevschik 11.01.19 09:38 Сейчас в теме
по-хорошему надо почитать что-нибудь осмысленное про базы данных и язык SQL. Причем всем участникам обсуждения, сдается мне.

ИЗ
РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток <= ТоварныеОграничения.МинимальноеКоличествоЗапаса 

в таком варианте в результат попадет только то, что есть в остатках. Во-первых, потому, что соединение внутреннее. Во-вторых, потому, что стоит условие на содержимое второй таблицы.
Для того, чтобы выбрать все из ТоварныеОграничения, надо убрать жесткую привязку к остаткам. А для этого нужно как минимум два исправления запроса.

ИЗ
РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ВНУТРЕННЕЕ ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
ГДЕ
СвободныеОстаткиОстатки.ВНаличииОстаток ЕстьNULL(СвободныеОстаткиОстатки.ВНаличииОстаток, 0) <= ТоварныеОграничения.МинимальноеКоличествоЗапаса
signum2009; +1 Ответить
9. user921876 11.01.19 09:45 Сейчас в теме
(6)
Спасибо большое. работает!
8. Vitaly1C8 11.01.19 09:40 Сейчас в теме
ВЫБРАТЬ ... ИЗ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот