Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Вниз

Функция Round в InterBase   Найти похожие ветки 

 
KIR   (2004-08-19 13:58) [0]

Народ, можно ли как-то округлить число средствами IB?

Ситуация след:

  SELECT
     SUM(DS1.VAL1 * DS1.VAL2)


В результате получается, например, 3.8974, а тебуется 3.90


 
jack128 ©   (2004-08-19 13:59) [1]

UDF подключить...


 
Карелин Артем ©   (2004-08-19 14:07) [2]

SELECT (cast (SUM(DS1.VAL1 * DS1.VAL2) as NUMERIC(10,2))) from rdb$database


 
KIR   (2004-08-19 16:05) [3]

Функция:

library bms_udfs;

uses
 SysUtils, Math;

function RoundVal(var Val: Extended; var Ost: Integer): Extended; cdecl; export;
begin
  Result := RoundTo(Val,Ost);
end;

exports
  RoundVal;

end.


Декларация UDF:

DECLARE EXTERNAL FUNCTION ROUND
   NUMERIC(15,15),
   INTEGER
RETURNS NUMERIC(15,15) BY VALUE
ENTRY_POINT "RoundVal" MODULE_NAME "my_udfs.dll"


Возвращает почему-то 0
Что делаю не так?


 
jack128 ©   (2004-08-19 16:15) [4]


> DECLARE EXTERNAL FUNCTION ROUND
>    NUMERIC(15,15),
>    INTEGER
> RETURNS NUMERIC(15,15) BY VALUE
> ENTRY_POINT "RoundVal" MODULE_NAME "my_udfs.dll"
Откуда нумерики на входе и на выходе взялись если у тя в удф - Extended ? Кстати IB такого типа вообще не знает

А вообще Артёма слушай - он дело говорит.


 
KIR   (2004-08-19 16:35) [5]

Вариант Артема не поможет. У меня след. ситуация:

SELECT
    SUM(DS1.VAL3 * ROUND(DS1.VAL1 * DS1.VAL2))


 
KIR   (2004-08-19 16:56) [6]

Функция:

library my_udfs;

uses
SysUtils, Math;

function RoundVal(var Val: Single; var Ost: Integer): Single; cdecl; export;
begin
 Result := RoundTo(Val,Ost);
end;

exports
 RoundVal;

end.

Декларация UDF:

DECLARE EXTERNAL FUNCTION ROUND
  FLOAT,
  INTEGER
RETURNS FLOAT BY VALUE
ENTRY_POINT "RoundVal" MODULE_NAME "my_udfs.dll"

Снова возвращает 0...
Что-то опять делаю не так...


 
Zacho ©   (2004-08-19 17:11) [7]


>KIR   (19.08.04 16:35) [5]
>Вариант Артема не поможет. У меня след. ситуация:
>
>SELECT
>     SUM(DS1.VAL3 * ROUND(DS1.VAL1 * DS1.VAL2))

Поможет, поможет. Ты попробуй


 
KIR   (2004-08-19 17:15) [8]

Если делать, как предлагает Артем, нужно писать так:

  SELECT
     SUM(VAL1 * CAST((VAL2 * VAL3) AS NUMERIC(10,2))

Не проходит...

Да и бог с ним. Я уже в UDF уперся... Не мойму, что не так?


 
Карелин Артем ©   (2004-08-20 13:24) [9]

KIR   (19.08.04 17:15) [8]
Преобразовать в NUMERIC надо после суммирования.


 
KIR   (2004-08-20 14:23) [10]

Карелин Артем ©   (20.08.04 13:24) [9]
Если преобразовать все произведение после суммирования результат будет не тот, например:

32,61 * 1,1 * 50 = 35,871 * 50 = 1793,55

а нужно так:

32,61 * 1,1 * 50 = 35,87 * 50 = 1793,50

Почувствуйте разницу


 
Карелин Артем ©   (2004-08-20 14:28) [11]

select (cast(cast(32.61 * 1.1 as numeric(15,2))*50 as numeric(15,2))) from rdb$database


 
KIR   (2004-08-20 14:56) [12]

Карелин Артем ©   (20.08.04 14:28) [11]

Сам-то пробовал сделать, то что предложил?

Результат будет - 1793,55, а надо 1793,5


 
Карелин Артем ©   (2004-08-20 15:01) [13]

http://samara.fromru.com/1.jpg


 
KIR   (2004-08-20 15:07) [14]

К сожалению, негде скриншот выложить, но могу на мэйл кинуть.

У меня 1793,55. Вот сейчас своими гдазами вижу...


 
KIR   (2004-08-20 15:11) [15]

Правда, у меня диалект 1, если это влияет...


 
Карелин Артем ©   (2004-08-20 15:13) [16]

Значит у нас разные версии IB...
Можно хранимую процедуру на округление писать, которая будет умножать на 100, преобразовывать в целое, вычислять разницу между преобразованным и непреобразованным.......
Короче классический алгоритм. Если надо тако - стучи в аську на следующей неделе.
А если идут такие странности с подсчетом, то надо действительно udf юзать.


 
Карелин Артем ©   (2004-08-20 15:14) [17]

KIR   (20.08.04 15:11) [15]
У меня 3. Влиять должен.


 
KIR   (2004-08-20 15:30) [18]

Попробовал на базе с 3-м диалектом - работает... блин... чтож диалект, чтоли менять... у меня таблиц по 150 шт....


 
KIR   (2004-08-20 19:13) [19]

Поменял на 3-й... вылезла др. проблема:

SELECT (1+Field1/100)
выдает все время 1, Field1 - тип NUMERIC(3,2)...


 
Карелин Артем ©   (2004-08-23 11:48) [20]

KIR   (20.08.04 19:13) [19]
100(да и 1) видимо интрерпретируется как integer. На sql.ru описывалось такое поведение FB. Кастуй как numeric или пиши 100.00 ........



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

Форум: "Базы";
Текущий архив: 2004.09.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.037 c
4-1091705285
анонимный
2004-08-05 15:28
2004.09.19
панель задач


3-1093265990
Kraj
2004-08-23 16:59
2004.09.19
Уменьшить базу


14-1092995027
Kerk
2004-08-20 13:43
2004.09.19
"Ночной дозор" купили американцы


1-1094123427
alex732
2004-09-02 15:10
2004.09.19
Всегда OnTOP


14-1094113857
Гость
2004-09-02 12:30
2004.09.19
Блин... запарился два дня уже не могу сделать





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский