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

Вниз

Тип decimal.   Найти похожие ветки 

 
Тимохов ©   (2004-03-03 19:34) [0]

Вопрос будет длинным :(((

База данных ms sql сервер.

Есть бд, где для представления дробных чисел используется тип decimal(28,10).
Достоинств у типа много:
1. 18 знаков до запятой.
2. 10 (точных !) знаков после запятой.
3. Операции точные, т.е. нет проблем и глюков, свойственных числам с плавающей точкой.

Т.к. система финансовая, то выбор такого типа оправдан. Тип currency нам не подходит, т.к. обладает малым количеством знаков после запятой. А это часто важно, например для хранения цены на товар. В данном случае точность важна для корректной реализации методов ФИФО, ЛИФО и средней себестоимости.
Одним словом, с точки зрения БД выбор такого типа оправдан.

Недостатком типа decimal является тот факт, что в дельфи нет соответсвующего типа. 3 года назад, когда проект только начинался, сначала пользовались extended. В дальнейшем задолбали глюки с округлением и переползли на тип tagDEC, т.е. TDecimal, который описан в ActiveX.pas. Для арифметический операций с данным типом используется библиотека oleauto32.dll и функции из нее VarDecAdd, VarDecMul, VarDecRounc и т.д. Конечно, не совсем удобно пользоваться данными процедурами, но мы были готовы на это пойти, т.к. была надежда, на то, что использование native для БД типа снимет все проблемы.

Использование native типа для ms sql сервера тем не менее не снимает всех проблем. Есть подозрение на то, что при выборе указанного была совершенна ошибка - есть подозрение Tdecimal это не то же самое, что decimal(28,10) в ms sql сервер. Подозрение, правда, ничем не оправдано, а именно: поля в adodb.recordset, соответсвующие значениям типа decimal(28,10), имеют vartype = 14, что соответсвует типу decimal (тип описан где-то в msdn). Но!!! Тогда совершенно не понятно, как объяснить тот факт, что округление на сервере и в дельфи для типа decimal делается по-разному: а именно
declare @d decimal(28,10)
set @d = 2.5
select round(@d)

дает 3, тогда как VarDecRound из oleaut32.dll дает 2.
Т.е. на сервере в спортых случаях (когда число между целыми) округление делается away from zero (т.е. в сторону целого, которое дальше от нуля), а библиотека oleaut32.dll (замечу, стандартная майкровофтовская) в аналогичном случае округляет до ближайшего четного.

ВОПРОС:
Можно ли как-то заставить библиотеку oleaut32.dll делать округление, так же как делает сервер БД.

ЗЫ: Очень прошу, не предлагать перейти в дельфи на другой тип. С типа TDecimal мы все равно не слезем - есть реализация (не знаю кто писал) процедур VarDecAdd, VarDecMul и т.д., правда, на С, и если уж я не найду как заставить oleaut32.dll делать то, что мне нужно, то я перепишу этот сишный код на дельфи и все-таки останусь в рамках TDecimal. К тому же очень много уже написано, переписать будет не реально по времени (может быть в далеком будущем).


 
Anatoly Podgoretsky ©   (2004-03-03 19:41) [1]

Вообще то это похоже на Бейсик


 
Тимохов ©   (2004-03-03 19:44) [2]


> Вообще то это похоже на Бейсик

Что именно? :)))


 
Тимохов ©   (2004-03-03 19:46) [3]


> Anatoly Podgoretsky ©   (03.03.04 19:41) [1]

Наверное я понял о чем речь. В VB этот тип тоже есть, и работа с ним идет через variant. Это имелось в виду?


 
Anatoly Podgoretsky ©   (2004-03-03 19:49) [4]

Вот это
объяснить тот факт, что округление на сервере и в дельфи для типа decimal делается по-разному: а именно
declare @d decimal(28,10)
set @d = 2.5
select round(@d)
дает 3, тогда как VarDecRound из oleaut32.dll дает 2.


 
Тимохов ©   (2004-03-03 19:53) [5]


> Anatoly Podgoretsky ©   (03.03.04 19:49) [4]

Действительно в ВБ округление decimal работает точно также как в дельфи, т.е. до ближайшего четного. Вчера проверял.


 
Anatoly Podgoretsky ©   (2004-03-03 20:00) [6]

Чтоюы там не было одно работает неверно, я надеюсь что округление для этого типа документировано?


 
Тимохов ©   (2004-03-03 20:04) [7]


> Anatoly Podgoretsky ©   (03.03.04 20:00) [6]

Rounds a variant of type decimal to the specified number of decimal places.

Все что сказано
(Взято с http://msdn.microsoft.com/library/default.asp?url=/library/en-us/automat/htm/chap7_8ulg.asp).


 
Тимохов ©   (2004-03-03 20:07) [8]

Вот самое интересное, что я нашел сам по этой теме
http://dotnet.di.unipi.it/Content/sscli/docs/doxygen/pal/decarith_8cpp-source.html#l01643


 
Anatoly Podgoretsky ©   (2004-03-03 20:21) [9]

Хорошо сказано :-)


 
Тимохов ©   (2004-03-03 20:25) [10]


> Хорошо сказано :-)

Анатолий, вы меня всегда поражали краткостью (моя мечта - краткость сестра кого-то там, таланта, кажется). Но одно дело смотреть на бедных Л, чешуших затылок размышляя о сути ответов, другое дело я :))))

Что "хорошо сказано" то?
Полагаю, что фраза "Rounds a variant of type decimal to the specified number of decimal places." - так же краткость, но только, авторства MS, а не AP. :))))))

Сам поражаюсь немногословности MS :(((((


 
Anatoly Podgoretsky ©   (2004-03-03 20:35) [11]

Ну я даже смайлик поставил, ну как так можно говорить про Round ведь алгоритмов округления несколько и не указывать какой же использован, это все равно, что ничего не сказать.
А вот в реализации уже отражен факт.


 
wicked ©   (2004-03-03 21:32) [12]

может я буду неоригинален, но если реализовывать округление средствами СУБД?...
написать функцию, которая и будет круглить как надо...


 
Тимохов ©   (2004-03-04 10:06) [13]


> wicked ©   (03.03.04 21:32) [12]

Такая идея тоже была, правда, от нее вовремя отказались.
Т.е. хотели вообще все арифм. операции делать сервером. Но проблема в том, что клиент в настоящее время это не совсем клиент. Это некое объединение сервера приложений и собственно клиента. В дальнейшем будет переход на реальное среднее звено. Пока ждем кода с net будет все ясно и пока он не войдет в массы. По сему как-то глупо нагружать сервер такой ерундой, как арифм операции, когда одна из задач сервера приложений состоит в том, чтобы разгрузить сервер и оставить серверу роль тупого но быстрого хранилища.

Т.е. это не выход.



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

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

Наверх





Память: 0.49 MB
Время: 0.036 c
3-1078490558
Kein
2004-03-05 15:42
2004.04.04
блокировка таблица


3-1078201011
Алексей Петухов
2004-03-02 07:16
2004.04.04
Оптимизация БД


14-1078921256
io
2004-03-10 15:20
2004.04.04
Как передать указатели из JScript в ActiveX компонент


6-1074946940
ASTARD
2004-01-24 15:22
2004.04.04
По поводу ФТП!!!???


8-1070651618
News
2003-12-05 22:13
2004.04.04
Эффект для мыши





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский