Имя: Пароль:
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) вам не подходит почему? Мало делений?
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан