Имя: Пароль:
1C
1С v8
1С. Проверка на ошибку округления "22003" в запросе.
,
0 1СобакаИли2
 
12.12.23
12:16
Добрый день.

ВЫРАЗИТЬ((Цена - БазоваяЦена) / БазоваяЦенаСрав * 100 КАК ЧИСЛО(5, 2))

Возникает ситуация, когда число не вмещается в (5,2).
Расширение знаком не нужно.
Ошибка возникает в момент, когда при установке цен была допущена ошибка.

Можно ли проверить получается ли системе выразить число, если да выводить: ВЫРАЗИТЬ((Цена - БазоваяЦена) / БазоваяЦенаСрав * 100 КАК ЧИСЛО(5, 2))

Если нет, указывать на проблемную номенклатуру
1 Лиза777
 
12.12.23
12:24
а как вы хотите прям в запросе проверить в прям в запросе вывести сообщение об ошибке что ли?
Можно же проверить цену ДО запроса и вывести соответствующее сообщение. Или цены проверить в другом запросе тоже можно ДО этого
2 shuhard
 
12.12.23
12:25
(0) что-то мешает проверить вхождение в интервал ?
3 Timon1405
 
12.12.23
12:43
выбор когда (Цена - БазоваяЦена) / БазоваяЦенаСрав * 100 > 999 тогда "ругаемся"
иначе
ВЫРАЗИТЬ((Цена - БазоваяЦена) / БазоваяЦенаСрав * 100 КАК ЧИСЛО(5, 2))
конец
4 bolobol
 
12.12.23
12:47
(3) >=999.995
5 1СобакаИли2
 
12.12.23
13:04
(1) В запросе. Номенклатуры много, цен много, также присутствуют доработки с наценками. Жертвовать производительностью, чтобы данные выбирать ДО и проверять нет необходимости.
6 1СобакаИли2
 
12.12.23
13:05
(2) Так ведь задача в этом, мешает отсутствие опыта
7 1СобакаИли2
 
12.12.23
13:06
(3) Спасибо, логика понятна, проверю
8 1СобакаИли2
 
12.12.23
13:06
(4) Почему .995, а не .9, или .999?
9 vde69
 
12.12.23
13:13
когда ВЫРАЗИТЬ((Цена - БазоваяЦена) / БазоваяЦенаСрав * 100 КАК ЧИСЛО(5, 2)) <> ВЫРАЗИТЬ((Цена - БазоваяЦена) / БазоваяЦенаСрав * 100 КАК ЧИСЛО(10, 2)) Тогда
"хрень"
иначе
ВЫРАЗИТЬ((Цена - БазоваяЦена) / БазоваяЦенаСрав * 100 КАК ЧИСЛО(5, 2))
10 1СобакаИли2
 
12.12.23
13:14
(4) Понял, из-за выражения 5.2, два знака после запятой.
Тогда почему > .995, а не >.994.
Ведь > .994 это и есть .995, которое округляется
11 1СобакаИли2
 
12.12.23
13:16
(9) А разве, если выражение ВЫРАЗИТЬ((Цена - БазоваяЦена) / БазоваяЦенаСрав * 100 КАК ЧИСЛО(5, 2)) не выполниться ошибки не будет при сравнении?
12 vde69
 
12.12.23
13:19
не будет, выразить это каст в скуле, каст числа просто отбросит лишние разряды и все, никакой ошибки не должно быть (разумеется если кастуем число а не что-то другое)
13 vde69
 
12.12.23
13:21
вот если у тебя БазоваяЦенаСрав = 0 тогда будет ошибка....

или если любая из других переменных будет например = "неопределено" или "null" тогда то-же ошибка
14 1СобакаИли2
 
12.12.23
13:58
(12) Вы не правы, ошибка 22003 при данном сравнении
15 1СобакаИли2
 
12.12.23
14:25
(12) Ведь ошибка возникает в СУБД, в момент преобразования к типу число, а для сравнения необходимо преобразовать.
Тогда, рабочим вариантом остается сравнение с числом до преобразования, аля:

выбор когда (Цена - БазоваяЦена) / БазоваяЦенаСрав * 100 > 999.994 тогда "ругаемся"
иначе
ВЫРАЗИТЬ((Цена - БазоваяЦена) / БазоваяЦенаСрав * 100 КАК ЧИСЛО(5, 2))
конец
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.