Имя: Пароль:
1C
1С v8
Деление на ноль в запросе.
, , ,
0 dimaxx
 
09.08.17
11:48
Ребята выручайте)) есть такой кусок кода. Вызывает деление на ноль. Что не так делаю?
ВЫБОР
        КОГДА ВложенныйЗапрос.ДнейПросрочкиВсего = 0
            ТОГДА 0
        ИНАЧЕ ВЫБОР
                КОГДА ВложенныйЗапрос.СуммаВзаиморасчетовОстаток = 0
                    ТОГДА 0
                ИНАЧЕ ВЫБОР
                        КОГДА ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток = 0
                            ТОГДА 0
                        ИНАЧЕ ВЫБОР
                                КОГДА ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток = 0
                                    ТОГДА 0
                                ИНАЧЕ ВЫБОР
                                        КОГДА ВложенныйЗапрос.ДнейПросрочкиВсего = 0
                                            ТОГДА 0
                                        ИНАЧЕ ВложенныйЗапрос.ДнейПросрочкиВсего / (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток) / (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток)
                                    КОНЕЦ
                            КОНЕЦ
                    КОНЕЦ
            КОНЕЦ
    КОНЕЦ КАК ПрКонтрактная
1 mistеr
 
09.08.17
11:52
(0) Напиши один ВЫБОР через ИЛИ, без вложенности. Хоть понятней будет...
2 ajax_new
 
09.08.17
11:52
А почему не

Если ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток = 0 или ВложенныйЗапрос.СуммаВзаиморасчетовОстаток = 0....
тогда 0
Иначе
//Твое выражение
Конец
3 dimaxx
 
09.08.17
11:54
(1) (2) Так было изначально, это уже вариация. Не помогло
4 Lexey_
 
09.08.17
11:55
(0) "Что не так делаю?"
Делишь на ноль, написано же
5 Timon1405
 
09.08.17
11:57
(0)последовательно поместите каждое выражение которое стоит в знаменателе в отдельное поле выборки
ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток,
потом
(ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток)
итд
найдете где именно 0
6 dezss
 
09.08.17
11:58
А ты уверен что косяк именно в этом куске запроса, а не в каком-то другом?
7 dezss
 
09.08.17
12:28
(0) Да и вообще, у тебя чета не так с формулой...все вроде приводится к вот такой
ВложенныйЗапрос.ДнейПросрочкиВсего/ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток/ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток
8 dezss
 
09.08.17
12:28
(7) а не...брешу...со скобками не досчитался...
9 mistеr
 
09.08.17
12:48
(6) +1


P.S. Недавно я с удивлением узнал, что SQL Server может иногда выражение в ВЫБРАТЬ вычислить раньше, чем отбор в ГДЕ. То есть запрос

ВЫБРАТЬ А / Б
ИЗ Таблица
ГДЕ Б <> 0

таки поделит на ноль.

Но здесь не тот случай (надеюсь :)
10 mehfk
 
09.08.17
12:50
(0) Убери многоэтажные "выбор когда", хер поймешь что там у тебя происходит.
11 igork1966
 
09.08.17
12:51
(9) Чего-то слабо верится
12 Михаил Козлов
 
09.08.17
12:54
Получить результат без деления и просмотреть числитель и знаменатель. Может там NULL.
13 trooba
 
09.08.17
13:02
(12) +1 Неявное приведение ull к 0
14 h-sp
 
09.08.17
13:06
(13) если там NULL то и результат будет NULL

A / NULL = NULL
15 igork1966
 
09.08.17
13:06
(11) + наверняка у тебя там не такой простой запрос был... и например, группировка а условие до группировки выполнялось
16 zvial
 
09.08.17
13:26
А че бы так не написать

ВЫБОР
    КОГДА ВложенныйЗапрос.СуммаВзаиморасчетовОстаток = 0
            ИЛИ ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток = 0
            ИЛИ ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток = 0
        ТОГДА 0
        ИНАЧЕ ВложенныйЗапрос.ДнейПросрочкиВсего / (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток) / (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток)
КОНЕЦ КАК ПрКонтрактная
17 SSSSS_AAAAA
 
09.08.17
13:32
(11) И тем не менее это именно так. Порядок вычисления выражений и условий выбирает сервер.
18 rudnitskij
 
09.08.17
13:51
А делить на (Б делить на Ц) делить на (Д делить на Е) =
(А умножить на Ц делить на Б) делить на (Д делить на Е) =
(А умножить на Ц умножить на Е делить на Б) делить на Д =
(А умножить на Ц умножить на Е) делить на (Б умножить на Д)
-------------------------------------------------------
попробуйте в таком духе переписать ваше выражение с делениями. Чем меньше вы делите - тем меньше шансов поделить на ноль
19 PiterPrg
 
09.08.17
13:54
Возможно в одной из операций делений результат получается маленький.
Например 0.0034 Результат приводится к типу операндов (например число 15.2). Получается 0.
Упрости выражение. Я честно говоря, не совсем понимаю что за коэффициент ты вычисляешь. Дни делишь на отношение сумм, а потом еще раз на отношение сумм)
20 rudnitskij
 
09.08.17
14:00
(18) в результате будет следующее:
ВложенныйЗапрос.ДнейПросрочкиВсего * ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток / (ВложенныйЗапрос.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос.СуммаВзаиморасчетовОстаток)
21 rudnitskij
 
09.08.17
14:00
(20) и проверять на ноль нужно лишь два значения
22 rudnitskij
 
09.08.17
14:07
(19) формула преобразования времени в деньги)))
23 dezss
 
09.08.17
14:08
(21) одно значение
24 dezss
 
09.08.17
14:08
можно знаменатель просто умножить на 2, а не брать одно и то же 2 раза
25 rudnitskij
 
09.08.17
14:41
(24) не умножить на два, а возвести в квадрат. Садитесь, два)
26 dezss
 
09.08.17
14:47
(25) блин...во я туплю))))
а вроде еще не пятница...это все жара виновата)
27 vde69
 
09.08.17
14:49
ВЫБОР
   КОГДА ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос.СуммаВзаиморасчетовОстаток  * ВложенныйЗапрос.СуммаВзаиморасчетовОстаток
= 0
   ТОГДА 0
   ИНАЧЕ ВложенныйЗапрос.ДнейПросрочкиВсего * ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос.СуммаВзаиморасчетовОстаток  / ВложенныйЗапрос.СуммаВзаиморасчетовОстаток
КОНЕЦ КАК ПрКонтрактная
28 AsadRoman
 
09.08.17
14:57
Материться здесь можно?
29 AsadRoman
 
09.08.17
14:59
ПИ*дец математики собрались:
у одних Х*Х = 2*Х,
другие проверяют на ноль А*В*В.
Вот как так? Вы программисты или где?
30 novichok79
 
09.08.17
15:04
(29) мы 1серы...
(0) ВЫБОР КОГДА заменить на ИЛИ, да и вообще как можно меньше ВЫБОР КОГДА. Зачем вообще такой адъ понадобилось писать?
31 novichok79
 
09.08.17
15:04
(27) элегантненько.
32 lodger
 
09.08.17
15:14
(0)  как ты думаешь запрос, 1с и субд раскроют деление деления на деление деления на деление?
упрости формулу то.
33 igork1966
 
09.08.17
15:37
(17) Ты прав.
https://technet.microsoft.com/ru-ru/library/ms188295(v=sql.105).aspx

Операции фильтрации (включая соединения) не обязательно применяются до вычисления столбцов результатов.
34 dimaxx
 
09.08.17
15:41
(33) Интересно, почитал.
35 dimaxx
 
09.08.17
15:43
(27) Интересное решение. В будущем применю)
36 dimaxx
 
09.08.17
15:43
(16) Писал, не проходит
37 dimaxx
 
09.08.17
15:44
Вообще опять всем спасибо) Переписал запрос немного уменьшил делений)))
38 h-sp
 
09.08.17
15:45
(27) если одно из них NULL, то не прокатит такой вариант
39 vde69
 
09.08.17
15:47
(38)

ВЫБОР
   КОГДА ЕстьNULL(ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос.СуммаВзаиморасчетовОстаток  * ВложенныйЗапрос.СуммаВзаиморасчетовОстаток,0)
= 0
   ТОГДА 0
   ИНАЧЕ ВложенныйЗапрос.ДнейПросрочкиВсего * ВложенныйЗапрос2.СуммаВзаиморасчетовОстаток * ВложенныйЗапрос1.СуммаВзаиморасчетовОстаток / ВложенныйЗапрос.СуммаВзаиморасчетовОстаток  / ВложенныйЗапрос.СуммаВзаиморасчетовОстаток
КОНЕЦ КАК ПрКонтрактная
40 Я_в_каске
 
09.08.17
16:53
(39) интересное решение
41 mistеr
 
09.08.17
17:02
(39) Если одно из них NULL, то и результат должен быть NULL. ИМХО.
42 Бубр
 
09.08.17
17:04
(9) если план запроса посмотреть можно  ужаснуться)
43 dezss
 
09.08.17
17:10
(39) блин, ну писали же в (29)...зачем еще раз перемножать на одно и то же при проверке?)))
44 rudnitskij
 
10.08.17
11:01
В решении этой задачи помог бы школьный учебник математики) его бы хватило
(0) Решение из (20) вам не подходит почему? Мало делений?
Программист всегда исправляет последнюю ошибку.