Главная страница
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.062 c
15-1175703936
Ringo
2007-04-04 20:25
2007.04.29
Альтернативная служба в армии


15-1175578687
Prohodil Mimo
2007-04-03 09:38
2007.04.29
Можно ли на этапе компиляции оцистить Properties компонента?


15-1175650845
SerJaNT
2007-04-04 05:40
2007.04.29
Еще один вопрос


15-1171999140
Иксик
2007-02-20 22:19
2007.04.29
Дорогие друзья я снова с вами! :):):)


1-1173084133
lyudmila
2007-03-05 11:42
2007.04.29
FixedRows в StringGrid