Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.29;
Скачать: CL | DM;

Вниз

Поле округляется до четырех знаков   Найти похожие ветки 

 
Juice ©   (2007-02-07 12:35) [0]

Как правильно установить значение numeric-поля с точностью до пяти знаков после запятой?  Вот например есть таблица:

CREATE TABLE TEST (
   YIELD  SUMMA /* SUMMA = NUMERIC(15,5) default 0 */
);

Выполняем код:

sdsTest.Edit;
 sdsTest.FieldByName("yield").Value := 0.11223;
 sdsTest.Post;

В результате sdsTest.FieldByName("yield").Value = 0.1122.  
Но если руками через грид то пожалуйста, любое число с точностью до пяти знаков вносится в поле.


 
Juice ©   (2007-02-07 12:42) [1]

Тип поля при добавлении по умолчанию определяется как TFMTBCDField,

object sdsTestYIELD: TFMTBCDField
 FieldName = "YIELD"
 Precision = 15
 Size = 5
end



 
sniknik ©   (2007-02-07 12:55) [2]

> как TFMTBCDField
BCD в дельфе не реальный BCD, заменяется currency у которого только 4 знака под дробь...

замени тип поля на тип с плавающей запятой, TFloatField например. (у некоторых датасетов  есть параметр EnableBCD можно его выключить тогда автоматом будет заменен на с плавающей)


 
Juice ©   (2007-02-07 13:40) [3]

Как тогда понимать: The IDE uses two different field types for representing BCD fields: TFMTBCDField and TBCDField. TFMTBCDField uses a true BCD value (TBCD) to store and manipulate BCD values. This gives greater precision and accuracy than the Currency type used by TBCDField objects ...
Врут получается?


 
Juice ©   (2007-02-07 13:46) [4]

При открытии н.д. вываливает ошибку:Type mismatch for field "yield", expecting:Float actual :FMTBcdField
Поле заменил на такое:

object sdsTestyield: TFloatField
 FieldName = "yield"
end


 
sniknik ©   (2007-02-07 14:12) [5]

> Врут получается?
ну почему? для конкретного класса/поля может все и верно... но одним полем программа не ограничивается, а преобразования в разных местах идут через currency.
ты же тоже не явно данные в конкретном типе передаешь, имеют место неявные замены... а в замене вполне может встретится  
procedure TField.SetAsBCD(const Value: TBcd);
var
 Curr: Currency;
begin
 BcdToCurr(Value,Curr);
 SetAsCurrency(Curr);
end;
(TField это то что используется в твоем ([0]) примере)

по идее ты должен был написать, вместо
sdsTest.FieldByName("yield").Value := 0.11223;
это,  
sdsTestYIELD.AsBCD:= StrToBcd("0.11223"); //sdsTestYIELD это поле, что у тебя определилось типом TFMTBCDField, и перевод со строки т.к. вроде бы с float-а нету... есть со строк и с currency. (попробуй поискать)
вот тогда будет явное присвоение.


 
Anatoly Podgoretsky ©   (2007-02-08 19:19) [6]

> Juice  (07.02.2007 13:40:03)  [3]

> Врут получается?

Врут, а что именно?


 
Desdechado ©   (2007-02-08 20:57) [7]

Если мне не изменяет память:
1. BCD - binary compressed decimal, причем без указания точности, типа NUMERIC
2. FMTBCD - это formatted BCD, т.е. с указанием точности, типа NUMERIC(5,1)



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

Текущий архив: 2007.04.29;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.051 c
2-1175976749
Officeman
2007-04-08 00:12
2007.04.29
Работа со строками (как удалить из строки рус.буквы)


15-1175757696
Yanis
2007-04-05 11:21
2007.04.29
Что за чудо?


3-1170483255
WebSqlNeederr
2007-02-03 09:14
2007.04.29
Как работать из Делфи с Microsoft Access ?


3-1170750979
MZ
2007-02-06 11:36
2007.04.29
формат даты в InterBase


15-1175743774
iZEN
2007-04-05 07:29
2007.04.29
Квас Никола.