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

Вниз

BCD, Float или что то ещё?   Найти похожие ветки 

 
RavenD   (2005-06-03 17:11) [0]

Привет, All!
В БД требуется хранить число с плавающей запятой, с большой целой и большой (как минимум 6 знаков) после запятой дробной частью.
Подскажите какие типы полей использовать.
BCD наносит ограничения 4 символа после запятой, а Float может округлить дробную часть, кто как выходит из положения.

Работаю с D5, D7
базы на Paradox, FireBird и MSSQL (место хранения можно изменить если есть надобность)

Спасибо


 
-=XP=- ©   (2005-06-03 17:35) [1]

...с большой целой и большой (как минимум 6 знаков) после запятой дробной частью...

Справка по Jet SQL:

DECIMAL
17 байтов
Тип данных для хранения точных числовых значений от -10^28 - 1 до 10^28 - 1. Точность (1 - 28) и фактор масштабирования (от 0 до заданной точности) определяются пользователем. По умолчанию точность и фактор масштабирования равны соответственно 18 и 0.


 
RavenD   (2005-06-06 08:57) [2]

уважаемый -=ХР=- вы пишете об возможности хранения, а я спрашивал об возможности получения и записи, Paradox как и FireBird и MSSQL поддерживают подобное хранение, а вот Delphi к сожалению при обращении через TField.AsFloat или TField.AsBCD ведёт себя описанным выше образом. Вот я и спрашивал как народ справляется?


 
msguns ©   (2005-06-06 09:58) [3]

"Делфи" ведет себя совершенно нормально, а точнее ничего не знает о представлении чисел в БД. За это отвечают соответствующие компоненты доступа. Поэтому не надо путать хранение чисел с их отображением.
Для хранения сумм с указанной в сабже точностью вполне подходит тип Numeric. Хотя можно юзать и флоат. Однако во втором случае при выполнениее матем.действий результат перед сохранением в БД рекомендуется округлять до известной точности.
При отображении же просто задавать формат в соотв. св-ве полевых объектов (класс TField и его потомки) DisplayFormat.

Типы БД, перечисленные в сабже, поддерживают хранение данных как в decimal (numeric), так и флоат форматах.


 
Danilka ©   (2005-06-06 10:07) [4]

[3] msguns ©   (06.06.05 09:58)
Нет, ты не понял вопроса. :)
Делаем поле в табилце: NUMERIC(18,6)
Если делаем это поле в описалове датасета как TBCDField, то получаем округление до 4 знаков, из хелпа по TBCDField: "Because TBCDField uses the Currency type to work with data from BCD fields, TBCDField limits the precision of the BCD values it can support to 4 decimal places and 20 significant digits."

Думаю, тут 3 варианта: использовать TFloatField (ограничен 15 знаками, если не ошибаюсь) с какой-то маской, написать своего наследника от TNumericField с необходимой функциональностью, или найти уже готового начследника.


 
msguns ©   (2005-06-06 10:20) [5]

>Danilka ©   (06.06.05 10:07) [4]

Прикол што ль ? Седня понедельнок, ты тово.. учитывай ;)


 
Anatoly Podgoretsky ©   (2005-06-06 10:27) [6]

Danilka ©   (06.06.05 10:07) [4]
Это ошибки/недостатки реализации поддержки BCD у Борланда. Не знаю как в последних версиях, но в более ранних версия для обработки использовался Double со всеми вытекаюищими от сюда последстиями.
В тоже время когда они купили dBase IV они получили в свое распоряжение профессиональную поддержку BCD, которую благополучно убили в dBase V


 
Anatoly Podgoretsky ©   (2005-06-06 10:31) [7]

В Д6 есть TFMTBCDField и тип TBCD, задача как то заставить их использовать.


 
RavenD   (2005-06-06 11:55) [8]

>Danilka ©
спасибо за правильное понимание вопроса, и всеже как например вы решаете этот вопрос более мение стандартными средствами?
>msguns ©
предлагаете подождать пятницы авось проблема сама рассосется? ;)
>Anatoly Podgoretsky ©
вопрос как?

народ может что ещё подскажете, вы же наверняка сталкиваетесь с этой проблемой, поделитесь реальным а не чисто филосовским опытом

Всем спасибо за ответы, но хочется ещё услышать ;)


 
Anatoly Podgoretsky ©   (2005-06-06 12:00) [9]

RavenD   (06.06.05 11:55) [8]
Не знаю, мне вопрос не был интересен, поэтому я им не занимался.


 
msguns ©   (2005-06-06 12:17) [10]

>RavenD   (06.06.05 11:55) [8]
>спасибо за правильное понимание вопроса, и всеже как например вы решаете этот вопрос более мение стандартными средствами?

В чем же состоит "правильное" понимание вопроса ? В том, что написать своего наследника от TField, который буде хранить указанное кол-во знаков дроби ? А зачем ?
Если нужна фиксированная точность, то вполне подходит ftFloat, которое не потеряет точность, а при записи в БД будет округлено сервером (в IB и MSSQL) либо BDE для парадокса.
Для отображения же использовать св-во TField.DisplayFormat, которое вполне может как округлять, так и обрезать незначащие младшие разряды дроби (если нужно).

Если же надо считать агрегаты (суммы по колонкам), то лучше всего это делать запросом, предоставив заботу о точности непосредственно серверу.



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

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

Наверх




Память: 0.47 MB
Время: 0.039 c
1-1119971983
Radgar
2005-06-28 19:19
2005.07.18
Свой Cursor


14-1118907275
Ega23
2005-06-16 11:34
2005.07.18
Приятель вчера прислал. Плакаль весь!!!


3-1117880359
java73
2005-06-04 14:19
2005.07.18
Отображение русских симоволов из mysql


1-1119854437
AlexG
2005-06-27 10:40
2005.07.18
Как создать экземпляр TOleStream?


1-1120131813
salexn
2005-06-30 15:43
2005.07.18
Не работает функция SaveKey или что не так делаю?





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