Главная страница
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.034 c
15-1175089468
Иксик
2007-03-28 17:44
2007.04.29
Снова об Автошеме


2-1175940604
Officeman
2007-04-07 14:10
2007.04.29
CheckListBox для тех кто в танке


3-1171224124
Maestro
2007-02-11 23:02
2007.04.29
файл для хранения настроек подключения


8-1155490917
h8394E
2006-08-13 21:41
2007.04.29
меню в игре (чужой)


2-1175788232
likenoother
2007-04-05 19:50
2007.04.29
опять несколько вопросов :)