Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.08.2010, 14:11
Аватар для kadnikov
kadnikov kadnikov вне форума
Прохожий
 
Регистрация: 26.07.2010
Сообщения: 20
Репутация: 10
По умолчанию MS access

в общем я чего то не догоняю... В бд есть поле, тип данных числовой, размер поля одинарный с плавающей точкой, число десятичных знаков 3.

вопрос, каким образом в поле хранятся такие записи
1111,111
111111,1
1,111111

и как тогда сделать нормально, чтоб хранились записи, в которых после запятой не больше трёх символов.
Ответить с цитированием
  #2  
Старый 02.08.2010, 14:42
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Если кратко, то вы путаете представление числа и количество памяти выделяемое под хранение числа. Нельзя заставить хранить Акцесс число с ограниченным количеством знаков после запятой. Хранится будет максимальное количество которое позволяет выбранный вами формат. А вот выводить на экран тоже самое число с нужным количеством знаков после запятой-сколько угодно. Но если надо позарез именно хранить т.к. вы описали, то можно хранить как строку, но у вас возникнет сразу масса проблем (скорость,размер,агрегатные функции, сортировка и т.д.)
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 02.08.2010, 15:20
Аватар для kadnikov
kadnikov kadnikov вне форума
Прохожий
 
Регистрация: 26.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

В том то и дело, что на экран выводится не 3 знака после запятой, как указано, а несколько иное количество, ведь если я ввёл значение 1,111111 то оно должно сохраниться, а в самом акссессе и при открытии из делфи отображаться как 1,111 верно?

но аксесс показывает так как показывает, а дэлфи, после третьего знака дописывает девятки и ещё что-то (в случае когда в аксесе три знака после запятой и введено и отображается), тогда при обращении к этим числам из делфи их округлять??? На точности математических операций это не скажется?
Ответить с цитированием
  #4  
Старый 02.08.2010, 18:42
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Верно, число при хранении в БД не округляется и формат на точность не влияет, это чисто визуальное средство, причем те настройки формата которые вы используете в акцесе в дельфи автоматом не подхватятся, поэтому в дельфи вы сами должны озаботится нужным количетвом знаков после запятой. Для этого в Дельфи есть куча функций, да и сами визуальные компоненты в большинстве случаев это умеют делать.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 02.08.2010, 19:49
Аватар для kadnikov
kadnikov kadnikov вне форума
Прохожий
 
Регистрация: 26.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

так ок...
в делфи значение возвращается в label
Код:
Form1.Label49.Caption:=Form1.ADOQuery.Fields[1].AsString;

просто отбросить всё что после третьего знака нельзя. Получается что нужно округлять? Или есть ещё функции, которые можно применить, если да то какие?

Код:
Form1.Label49.Caption:=FloatToStr(RoundTo(Form1.ADOQuery1.Fields[1].Value, -3));
Судя по всему при выводе на экран число должно выглядеть так...

Но всё таки вопрос:
Если число скажем 1,315 в бд записано как 1,314****, то при округлении возможна ли ситуация когда оно округлится до 1,314, не 1,315??????7

Последний раз редактировалось kadnikov, 02.08.2010 в 20:12.
Ответить с цитированием
  #6  
Старый 02.08.2010, 20:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,035
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Все не правильно.
Во первых, если ты хочешь ограничить кол-во знаков после запятой, то надо использовать соотв. тип данных - не с плавающей точкой, а с фиксированной. Тебе нужен тип NUMBER(18,3) - 18 -общая длинна числа, 3- кол-во знаков после точки (проверь, я не помню входит ти сама точка в это число или нет, вроде нет).
Во вторых. Формат вывода можно задать разными способами. Если хочешь автоматического преобразования, то надо в компоненте источника данных (TADOQuery, TADOTable и т.д.) создать соотв. поля и у нужного поля указать DisplayFormat. Если ты выводишь в какой-нить текстовый компонент (TLabel, TEdit и т.д.), то можно либо округлять руками (RoundTo() спасет отца русской демократии), либо просто преобразовывать при выводе (Format('%18.3n',[ADOQuery1.Fields[1].AsFloat]) тебе в руки).
Ответить с цитированием
  #7  
Старый 02.08.2010, 20:10
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Код:
Form1.Label49.Caption := Format('%9.999f',[Form1.ADOQuery.Fields[1].AsFloat]);
Так попробуйте.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 02.08.2010, 21:33
Аватар для kadnikov
kadnikov kadnikov вне форума
Прохожий
 
Регистрация: 26.07.2010
Сообщения: 20
Репутация: 10
По умолчанию

В принципе разобрался... изначально затупил с типом поля в access.
но в целом спасибо за информацию, думаю пригодится.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:05.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter