Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.30;
Скачать: CL | DM;

Вниз

ХП. В чем разница?   Найти похожие ветки 

 
TohaNik_   (2004-05-11 19:08) [0]

RETURNS (
      COURCE NUMERIC(10,6),
      SCALE NUMERIC(10,2),
........
AS
DECLARE VARIABLE PRICE NUMERIC(15,2);
DECLARE VARIABLE SUMAT_UAH NUMERIC(15,2);
DECLARE VARIABLE T_KOL NUMERIC(15,3);
.......
на момент выполнения выражения значения
COURCE = 7,4;
SCALE = 1;
PRICE = 4000;
T_KOL = 302,601;

так SUMAT_UAР = ((PRICE*COURCE)/SCALE)*T_KOL;
в результате: Integer overflow

так SUMAT_UAH = PRICE*COURCE*T_KOL;
   SUMAT_UAH = SUMAT_UAN/SCALE;
все нормально

А если PRICE = 3000; ошибки нет в обоих вариантах??


 
Курдль ©   (2004-05-12 00:20) [1]

А запятые в константах глаз не режут?


 
TohaNik_   (2004-05-12 10:31) [2]


> А запятые в константах глаз не режут?

Не придирайся.
Как оказалось Yaffil не Delphi


 
Johnmen ©   (2004-05-12 10:33) [3]

>TohaNik_   (12.05.04 10:31) [2]
>Как оказалось Yaffil не Delphi

А раньше думал иначе ?
:)))


 
sniknik ©   (2004-05-12 10:52) [4]

> Как оказалось Yaffil не Delphi
;о)))
класс... (без обид, но это действительно весело)
кстати в любом другом движке в SQL тоже не используются запятые для отделений дробной части, т.к. запятые зарезервированы для разделений полей в командах (select/...).
иногда на это напарываются когда запросы динамически составляют, (значения прям в запрос) а функции перевода чисел в строки зависят от национальных установок/desimalseparator а SQL нет. потом "у меня на машине работает, а у соседа васи винда/sql сервер глючит! мне что его переставлять?"
:о) тоже весело.


 
TohaNik_   (2004-05-12 13:21) [5]


> класс... (без обид, но это действительно весело)

Нет, про запятые и точки я знаю(ну опечатка была).
Оказалось еще веселей
CREATE PROCEDURE NEW_PROCEDURE
AS
DECLARE VARIABLE A numeric(15,3);
begin
A = 4010.00*7.400000*30.601/1.00; нет ошибки = 908054.078
A = 4100.00*7.400000*30.601/1.0;  нет ошибки = 928434.34
A = 4100.00*7.400000*30.601/1.00; ошибка
end


 
Курдль ©   (2004-05-12 13:27) [6]

Мож забить на numeric и прописать, как float (если Yaffil позволяет)?


 
TohaNik_   (2004-05-12 13:45) [7]


> Мож забить на numeric и прописать, как float (если Yaffil
> позволяет)?

Мож и забить -вообще)), только дело наверное в хранении результата до того
как он стал  - A


 
Johnmen ©   (2004-05-12 13:52) [8]

>TohaNik_

>A = 4100.00*7.400000*30.601/1.00; ошибка

Полный текст ошибки ?

Какой диалект ?

А так проходит ?
A = 4010.0*7.4*30.601/1.00;
A = 4100.0*7.4*30.601/1.0;  
A = 4100.0*7.4*30.601/1.00;


 
TohaNik_   (2004-05-12 14:10) [9]


> Полный текст ошибки ?

Arithmetic overflow or division by zero has occured
arithmetic exception, numeric overflow, or string truncation

> Какой диалект ?

третий

> А так проходит ?

проходит


 
Johnmen ©   (2004-05-12 14:17) [10]

Понятно...
Дело в том, что numeric больший (9,2) храниться как bigint.
При разборе выражения учитывается точность представления. Причем "суммарно" "приведённая" к bigint с учетом всех переменных/констант.

Поэтому следует указывать только один разряд после дес.тчк, если в большем нет необходимости.


 
TohaNik_   (2004-05-12 14:51) [11]


> Johnmen ©   (12.05.04 14:17) [10]

Спасибо.

CREATE PROCEDURE NEW_PROCEDURE
AS
DECLARE VARIABLE A numeric(15,2);
DECLARE VARIABLE B numeric(10,6);
DECLARE VARIABLE C numeric(15,3);
DECLARE VARIABLE D numeric(15,2);
DECLARE VARIABLE E numeric(15,2);

begin
B = 7.4;
C = 30.601;
D = 4100;
E = 1;
A = D*B*C/E; ошибка

A = D*B*C;
A = A/E; нет ошибки
end
Реальная процедура отлаживалась в IB Expert - у переменных нули
при отладке усекались, а реально вероятно было
>> "суммарно" "приведённая" ...
Насколько я понял - при построении выражений необходимо следить
за возможной "суммарно" "приведённой" к bigint точностью.


 
Johnmen ©   (2004-05-12 15:36) [12]

>TohaNik_   (12.05.04 14:51) [11]

Я думаю, что это всё-таки проблемы дятловского парсера, его фича...:)


 
Курдль ©   (2004-05-12 15:47) [13]


> Реальная процедура отлаживалась в IB Expert

Кстати, не вспомню, почему именно, но от применения IB Expert при подготовке БД Yaffil-а я отказался (все время лезли баги). Пришлось воспользоваться стандартным IB Console-м и его тулзами.



Страницы: 1 вся ветка

Текущий архив: 2004.05.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.06 c
9-1075106393
Oyster
2004-01-26 11:39
2004.05.30
Как сделать взрыв


1-1084939263
Cryon
2004-05-19 08:01
2004.05.30
Как завершить работу приложения


7-1082465885
e_Alex
2004-04-20 16:58
2004.05.30
Блокировка формы


3-1083821859
Mamed
2004-05-06 09:37
2004.05.30
get database name


1-1084515780
INTAARI
2004-05-14 10:23
2004.05.30
Закрытие приложения при перезагрузке или выкл. компа