Имя: Пароль:
1C
1С v8
Запрос . деление на ноль
,
0 Domanoff26
 
27.05.13
10:50
скулы выдают в запросе деление на ноль. виновато вот это выражение

ВЫБОР    КОГДА ВлЗапрос.ФактическийПрофит - (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН) = 0
           
           ТОГДА 0
       ИНАЧЕ ВЫРАЗИТЬ((ВлЗапрос.ФактическийПрофит - (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)) /  (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)  * 100 КАК ЧИСЛО(10, 2))
КОНЕЦ КАК ПроцентОтклонения
1 Domanoff26
 
27.05.13
10:50
поменял на вот такое, но все равно ругается

/ВЫБОР
   //    КОГДА ВлЗапрос.ФактическийПрофит - (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН) = 0
   //            //ИЛИ (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)  = 0
       //    ТОГДА 0
       //ИНАЧЕ ВЫРАЗИТЬ((ВлЗапрос.ФактическийПрофит - (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)) / (Выбор когда  не (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)  = 0 Тогда ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН иначе 1 конец) * 100 КАК ЧИСЛО(10, 2))
//КОНЕЦ КАК ПроцентОтклонения
2 acsent
 
27.05.13
10:50
Эта грустная история о прекрасной восточной девушке Наноль, которая любит двух прекрасных и мужественных юношей и не может выбрать. Юноши тоже любят ее. Казалось бы, в нынешние–то времена, зажить бы им простой и дружной семьей. Но трагедия в том, что Наноль делить нельзя.
3 zak555
 
27.05.13
10:51
и сделай проверку
4 zak555
 
27.05.13
10:51
(2) бу га га
5 Domanoff26
 
27.05.13
10:51
ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН в полях равно нулю, тогда почему моя проверка не работает?
6 salvator
 
27.05.13
10:52
(5) Где млять у тебя эта проверка?
7 Domanoff26
 
27.05.13
10:53
arithmetic overflow error converting numeric to data type numeric
8 Domanoff26
 
27.05.13
10:53
(6) Выбор когда  не (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)  = 0 Тогда ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН иначе 1 конец)
9 zak555
 
27.05.13
10:54
ВлЗапрос.ФактическийПрофит - (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН) =0

это не то же самое, что и


ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН = 0

отличаются на ВлЗапрос.ФактическийПрофит
10 Domanoff26
 
27.05.13
10:54
(7) это сообщение в консоли, (9) нет конечно
11 salvator
 
27.05.13
10:56
ВЫБОР
  КОГДА (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН) = 0
     ТОГДА 0
   ИНАЧЕ ВЫРАЗИТЬ((ВлЗапрос.ФактическийПрофит - (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)) /  (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)  * 100 КАК ЧИСЛО(10, 2))
КОНЕЦ КАК ПроцентОтклонения
12 PR
 
27.05.13
10:56
Мне кажется, ТС просто тупо троллит
13 Domanoff26
 
27.05.13
10:57
(11) это по логике не верно, это же отклонение, отклонение в случае ноль должно быть 100 процентов
14 Domanoff26
 
27.05.13
10:58
короче тут что то хитрее смотрите какое сообщение странное  arithmetic overflow error converting numeric to data type numeric...может не только в нуле дело
15 hhhh
 
27.05.13
10:59
(14) нет, это не хитрее, это тупо. Потому что ВЫРАЗИТЬ.
16 Domanoff26
 
27.05.13
11:00
(15) вот я тоже дмаю об этом, а что конкретно?
17 zak555
 
27.05.13
11:02
ты лучше весь запрос покажи

может проще внутренне соединение использовать ( тогда нули исключаться )
18 Domanoff26
 
27.05.13
11:02
(17) да но строчку то надо выводить, запрос большой. смотреть никто не будет, без этого поля все норм отрабатывает
19 PR
 
27.05.13
11:04
ЕСТЬ NULL
20 Domanoff26
 
27.05.13
11:05
(19)  см (5)
21 PR
 
27.05.13
11:10
(20) см (19)
22 hhhh
 
27.05.13
11:11
(20) ты так и не показал, где у тебя эта проверка на ноль?
23 Domanoff26
 
27.05.13
11:15
(22)  в (1) (Выбор когда  не (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)  = 0 Тогда ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН иначе 1 конец)
24 Domanoff26
 
27.05.13
11:16
(22) так что с выразить то?
25 Domanoff26
 
27.05.13
11:19
(21) что на нул я должен проверять то, если я написал что делитель равен нулю в выборке этого запроса
26 PR
 
27.05.13
11:20
(23) За "не (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)  = 0" вообще руки отрывать нужно.
27 PR
 
27.05.13
11:20
Все, что в формуле числовое.
28 НЕА123
 
27.05.13
11:22
ошибка арифметического переполнения, преобразовывающая числовой в числовой тип данных
29 Domanoff26
 
27.05.13
11:24
(28) не понял, что значит ичсловой в числовой
30 Domanoff26
 
27.05.13
11:25
(26) ну <> не спасает так же
31 НЕА123
 
27.05.13
11:28
(28)
в (15) все сказано.
32 PR
 
27.05.13
11:36
(30) Логично. Потому что выражение <> 0.
33 azernot
 
27.05.13
11:39
(29) Вырази 100000000000 как число (10,2). Просто попробуй написать на бумажке.
34 Domanoff26
 
27.05.13
11:40
(33) ну там нет такого числа, там 44000 делитс\я на 1000 (32) посмотри внимательно на проверку еще раз!
35 PR
 
27.05.13
11:41
(34) Что мешает проверить?
36 Михаил 1С
 
27.05.13
11:44
(0) Блин, зачем ты проверяешь на ноль Числитель? Если он ноль, то и все выражение будет ноль по правилам арифмитики! Все само получится!
В условии надо поставить проверку на ноль знаменателью! И если он ноль, то тогда... пусть ответ тогда = бесконечность! Ну или сто сикстилионов!
37 azernot
 
27.05.13
11:44
(34) ты можешь убрать своё вычисление и просто выполнить запрос с тремя полями в результате (ну кроме прочих): ФактическийПрофит, РеализацияПлан, ССПЛАН и запостить сюда результаты этих трёх колонок?
38 alextom81
 
27.05.13
11:45
ВЫБОР
  КОГДА (ЕстьNULL(ВлЗапрос.РеализацияПлан,0) - ЕстьNULL(ВлЗапрос.ССПЛАН,0)) = 0
     ТОГДА 0
   ИНАЧЕ ВЫРАЗИТЬ((ВлЗапрос.ФактическийПрофит - (ЕстьNULL(ВлЗапрос.РеализацияПлан,0) - ЕстьNULL(ВлЗапрос.ССПЛАН,0))) /  (ЕстьNULL(ВлЗапрос.РеализацияПлан,0) - ЕстьNULL(ВлЗапрос.ССПЛАН,0))  * 100 КАК ЧИСЛО(10, 2))
КОНЕЦ КАК ПроцентОтклонения
39 azernot
 
27.05.13
11:45
(36) Где у него ошибка в проверке?

КОГДА ВлЗапрос.ФактическийПрофит - (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН) = 0 ИЛИ (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)  = 0

Почему-то все игнорируют часть после "ИЛИ"..
40 alextom81
 
27.05.13
11:45
Сдаётся мне, где-то раньше (во вложенном запросе) нет проверки на null
41 mistеr
 
27.05.13
11:50
(0) Сначала ВЫРАЗИТЬ, потом делить.
42 1Сергей
 
27.05.13
11:53
(39) у него там вообще не понятно что куда, куча закоменчего кода в хаотическом порядке
43 Domanoff26
 
27.05.13
12:03
все что вы тут кричите про проверку - чушь, в выразить и правда большое число!   hhhh спасибо!
44 PR
 
27.05.13
12:09
(43) Смешно.
А ты ведь так спорил, помнится :))
45 Михаил 1С
 
27.05.13
12:11
(43) Блин, сам ты чушь, я тебе дело говорил. Проверку на ноль знаменателю ставить необходимо!
46 Михаил 1С
 
27.05.13
12:12
(45) А если у тебя на работало по другой причине, то значит у тебя на глюк больше.
47 Domanoff26
 
27.05.13
12:21
(45) не гони она стоит там знаменателю, посмотри внимательнее
48 Domanoff26
 
27.05.13
12:21
(44) я как раз и говорил что дело не в проверке не фига
49 Domanoff26
 
27.05.13
12:22
НАЧЕ ВЫРАЗИТЬ((ВлЗапрос.ФактическийПрофит - (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)) / (Выбор когда  не (ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН)  = 0 Тогда ВлЗапрос.РеализацияПлан - ВлЗапрос.ССПЛАН иначе 1 конец) * 100 КАК ЧИСЛО(10, 2)) - вот и деление и проверка на знаменатель!!!!
50 alextom81
 
27.05.13
13:26
(49) У тебя просто выразить Null значение откидывает из построения результатов :)
Здесь можно обсудить любую тему при этом оставаясь на форуме для 1Сников, который нужен для работы. Ymryn