Форум: "Базы";
Текущий архив: 2007.04.29;
Скачать: [xml.tar.bz2];
ВнизПоле округляется до четырех знаков Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.05 c