Форум: "Базы";
Текущий архив: 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