1. user921876 11.01.19 09:08 Сейчас в теме

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

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

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

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

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

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

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

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

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

надо убрать и перенести в условие связей таблиц
4. kumi2012 1 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 Сейчас в теме
ВЫБРАТЬ ... ИЗ РегистрНакопления.СвободныеОстатки.Остатки КАК СвободныеОстаткиОстатки
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТоварныеОграничения КАК ТоварныеОграничения
ПО ТоварныеОграничения.Номенклатура = СвободныеОстаткиОстатки.Номенклатура
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Консультант-аналитик 1С
Москва
зарплата от 100 000 руб. до 170 000 руб.
Полный день

Программист 1С
Москва
Полный день

Программист 1С
Видное
Полный день

Программист 1С
Москва
зарплата до 120 000 руб.
Полный день