Условие в запросе+деление на ноль

1. BigBoss 2 14.07.17 06:33 Сейчас в теме
День добрый. Возникла такая ситуация: при заполнении документа появляется ошибка:

по причине:
Ошибка выполнения запроса
по причине:
Ошибка при выполнении операции над данными:
Microsoft SQL Server Native Client 10.0: Обнаружена ошибка: деление на ноль.
HRESULT=80004005, SQLSrvr: SQLSTATE=22012, state=1, Severity=10, native=8134, line=1


Вот текст запроса :
ВЫБРАТЬ
	ТоварыВЭксплуатацииОстатки.ФизЛицо,
	               	Товары.Номенклатура,
	               	Товары.Организация,
	               	Товары.СтруктурнаяЕдиница,
	               	Товары.КоличествоОстаток КАК КоличествоУчет,
	               	Товары.КоличествоОстаток КАК Количество,
	               	Товары.СтоимостьОстаток КАК СуммаУчет,
	               	Товары.СтоимостьОстаток КАК Сумма,
	               	Товары.СтоимостьОстаток / ЕСТЬNULL(Товары.КоличествоОстаток, 0) КАК Цена
	               
	               ИЗ
	               	РегистрНакопления.Товары.Остатки(&Дата, ФизЛицо = &Склад) КАК Товары
Показать


Думаю что в полях "СтоимостьОстаток" и "КоличествоОстаток" есть нули, но можно ли сделать с помощью условия в запросе так, что бы если в полях нули то запрос всё равно выполнился?
EvgeniyOlxovskiy; +1 Ответить
По теме из базы знаний
Найденные решения
4. nytlenc 14.07.17 06:54 Сейчас в теме
(3)
немного не правильно :)
Тогда уж вот так

ВЫБОР КОГДА ЕСТЬNULL(Товары.СтоимостьОстаток, 0) > 0 
ТОГДА Товары.СтоимостьОстаток / Товары.КоличествоОстаток 
ИНАЧЕ 0 
КОНЕЦ КАК Цена
whitecrow; ra9000; zloybot; +3 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nytlenc 14.07.17 06:47 Сейчас в теме
(1)
Товары.СтоимостьОстаток / ЕСТЬNULL(Товары.КоличествоОстаток, 0) КАК Цена

Ну очевидно же. Что ошибка тут

Товары.СтоимостьОстаток / ЕСТЬNULL(Товары.КоличествоОстаток, 0) КАК Цена


Нужно сделать так

ВЫБРАТЬ
                       ТоварыВЭксплуатацииОстатки.ФизЛицо,
                       Товары.Номенклатура,
                       Товары.Организация,
                       Товары.СтруктурнаяЕдиница,
                       Товары.КоличествоОстаток КАК КоличествоУчет,
                       Товары.КоличествоОстаток КАК Количество,
                       Товары.СтоимостьОстаток КАК СуммаУчет,
                       Товары.СтоимостьОстаток КАК Сумма,
                       ВЫБОР
                                  КОГДА ЕстьNULL(Товары.КоличествоОстаток, 0) = 0
                                  ТОГДА 0
                                  ИНАЧЕ Товары.СтоимостьОстаток / Товары.КоличествоОстаток
                       КОНЕЦ КАК Цена
                       РегистрНакопления.Товары.Остатки(&Дата, ФизЛицо = &Склад) КАК Товары
Показать
6. BigBoss 2 14.07.17 07:03 Сейчас в теме
(2)
(3) Всё равно та же ошибка
3. Denis_CFO 48 14.07.17 06:50 Сейчас в теме
(6)
(1)
ВЫБОР КОГДА Товары.СтоимостьОстаток > 0
ТОГДА Товары.СтоимостьОстаток / ЕСТЬNULL(Товары.КоличествоОстаток, 0)
ИНАЧЕ 0
КОНЕЦ КАК Цена
вот так сделай
EvgeniyOlxovskiy; +1 Ответить
4. nytlenc 14.07.17 06:54 Сейчас в теме
(3)
немного не правильно :)
Тогда уж вот так

ВЫБОР КОГДА ЕСТЬNULL(Товары.СтоимостьОстаток, 0) > 0 
ТОГДА Товары.СтоимостьОстаток / Товары.КоличествоОстаток 
ИНАЧЕ 0 
КОНЕЦ КАК Цена
whitecrow; ra9000; zloybot; +3 Ответить
7. BigBoss 2 14.07.17 07:03 Сейчас в теме
(4)
ВЫБОР КОГДА ЕСТЬNULL(Товары.СтоимостьОстаток, 0) > 0
ТОГДА Товары.СтоимостьОстаток / Товары.КоличествоОстаток
ИНАЧЕ 0
КОНЕЦ КАК Цена


Всё равно выдаёт ошибку
8. BigBoss 2 14.07.17 07:05 Сейчас в теме
(4) Переписал вот так:

ВЫБОР КОГДА ЕСТЬNULL(Товары.КоличествоОстаток , 0) > 0
ТОГДА Товары.КоличествоОстаток / Товары.СтоимостьОстаток
ИНАЧЕ 0
КОНЕЦ КАК Цена

И всё работает, спасибо
9. Denis_CFO 48 14.07.17 07:08 Сейчас в теме
(8)
Товары.КоличествоОстаток / Товары.СтоимостьОстаток
местами поменяй поля. Тебе нужно стоимость на количество делить.
EvgeniyOlxovskiy; BigBoss; +2 Ответить
10. BigBoss 2 14.07.17 07:15 Сейчас в теме
5. Denis_CFO 48 14.07.17 06:56 Сейчас в теме
11. user700035_6550355 29 14.07.17 07:53 Сейчас в теме
Товары.СтоимостьОстаток / ЕСТЬNULL(Товары.КоличествоОстаток, 0) вот ошибка, надо убрать ЕСТЬNULL и деление пройдет

вот так Товары.СтоимостьОстаток / Товары.КоличествоОстаток
12. Denis_CFO 48 14.07.17 08:02 Сейчас в теме
(11)
ЕСТЬNULL(Товары.КоличествоОстаток, 0)
это проверка на отсутствующее значение. Всё правильно.
13. zerdov 45 21.03.24 10:52 Сейчас в теме
Помимо математической проверки ошибки деления на ноль (ЕСЛИ Сумма(Знаменатель) <> 0 ТОГДА), в Вашей задаче нужно делать проверку на ошибки учета, где и количество и стоимость может быть <= 0.
Иными словами, если КоличествоУчет <0, то Количество = 0; если СуммаУчет <0, то Сумма =0.
В расчете цены нужно исключить не только НОЛЬ в знаменателе, но и отрицательное значение СтоимостьОстаток и КоличествоОстаток.
Я порекомендовала бы ставить два условия

ВЫБОР
КОГДА ЕСТЬNULL(Товары.КоличествоОстаток , 0) > 0
ТОГДА ВЫБОР КОГДА
            ЕСТЬNULL(Товары.СтоимостьОстаток , 0) > 0
            ТОГДА Товары.СтоимостьОстаток / Товары.КоличествоОстаток
            ИНАЧЕ 0
       Конец
ИНАЧЕ 0
КОНЕЦ КАК Цена
Показать
14. comptr 31 21.03.24 13:17 Сейчас в теме
(13) Мне кажется, достаточно проверить, что количество не равно нулю. Всё остальное - следствие проблем в учёте, и вместо того, чтобы вытащить ошибку на свет, вы будете её дальше хоронить. Ну выйдет там -10, а не 0, что изменится? И так и так косяк, но -10 вам хоть покажет, что где-то что-то у вас в учёте пошло явно не так.
15. zerdov 45 25.03.24 10:44 Сейчас в теме
(14) Автор выводит проверочные параметры учета (КоличествоУчет, СуммаУчет) в запросе, смотрите внимательно. И параллельно берет расчетные (Количество, Сумма) Какой смысл их дублировать? Расчетные помогают увидеть объективность расчета цены и физическую возможность работы с товаром, учетные показывают отклонение от норм (если минус). Вы предлагаете учетные не использовать, я же предлагаю учетные и расчетные наделить смыслом.
16. comptr 31 25.03.24 11:55 Сейчас в теме
(15) Я не предлагаю не использовать какие-то данные, я предлагаю не скрывать отрицательные числа, если они есть.
Расчетные помогают увидеть объективность расчета цены и физическую возможность работы с товаром

И -10 и 0 отражают физическую невозможность работы в позицией, только -10 может в большей степени стать толчком что-то проверить и исправить, на мой взгляд.
17. zerdov 45 25.03.24 13:39 Сейчас в теме
(16)
Было:
Товары.КоличествоОстаток КАК КоличествоУчет,
Товары.КоличествоОстаток КАК Количество,
Товары.СтоимостьОстаток КАК СуммаУчет,
 Товары.СтоимостьОстаток КАК Сумма,


Стало:

Товары.КоличествоОстаток КАК КоличествоУчет,
ВЫБОР КОГДА ЕСТЬNNULL (Товары.КоличествоОстаток,0) >0
ТОГДА Товары.КоличествоОстаток
Иначе 0
Конец КАК Количество,
Товары.СтоимостьОстаток КАК СуммаУчет,
ВЫБОР КОГДА ЕСТЬNULL (Товары.СтоимостьОстаток,0)>0
ТОГДА Товары.СтоимостьОстаток 
Иначе 0
Конец КАК Сумма,
Показать


Теперь Вам понятно?
Оставьте свое сообщение

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