Форум: "Базы";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];
ВнизADO + MSSQL 2000, Precision и Scale Найти похожие ветки
← →
Max Zyuzin © (2006-04-19 16:20) [0]Граждане голова перестала работать...
Не могу подружить ADO с полем типа Decimal(20,8)
Что нужно присвоить значениям параметров, что бы считала с 8-ю знаками после запятой?
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").DataType := ftBCD;
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").Size := 13;
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").Precision := 20;
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").NumericScale := 8;
После задания параметров в запросе подобным способом пытаюсь заставить, что бы параметр был "правильный", но оно упорно не хочет присваивать более 4-х символов после запятой и соответственно до них округляет...
Я пробовал, и присваивать тип ftFloat не помогает...
← →
sniknik © (2006-04-19 17:03) [1]> Не могу подружить ADO с полем типа Decimal(20,8)
ну, ADO то как раз работает с ним, проблема в дельфи.
в дельфи BCD преобразовывается через тип currecy у которого как раз 4 знака (на самом деле ни одного... т.к. это целочисленное, только представление такое младшие 4 разряда под дробь)
т.е. для "правильной" работы надо передавать либо минуя дельфевскую обертку (но тогда нужно BCD и в программе поддерживать...), либо взять другой тип в дельфях и передавать в нем же.
> Я пробовал, и присваивать тип ftFloat не помогает...
ошибка в 17й строке.
← →
Max Zyuzin © (2006-04-19 17:12) [2]>sniknik © (19.04.06 17:03) [1]
Гм...
ок вот такой пример
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").DataType := ftFloat;
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").Size := 13;
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").Precision := 20;
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").NumericScale := 8;
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").Value := CarRentPDDBNumberEditEh.Value * TaxRateADODataSet.FieldByName("trValue").Value/(1+TaxRateADODataSet.FieldByName("trValue").Value);
Где собственно CarRentPDDBNumberEditEh типа TDBNumberEditEh
Получаемое число с 2-я знаками после запятой, поле trValue такого же типа Decimal(20,8)
Что я делаю не так что у меня значение параметра всегда округляется до 4 знаков после запятой?
либо взять другой тип в дельфях и передавать в нем же
Какой?
← →
sniknik © (2006-04-19 17:32) [3]> Получаемое число с 2-я знаками после запятой, поле trValue такого же типа Decimal(20,8)
которое в дельфях будет представлено через тот же currency... т.е. в исходных типах максимум 4 знака, преобразуется к тому же 4 знаковому (тип всего выражения тоже currency будет) а в результате 8 хочеш получить? ... оригинально.
> Какой?
реально с плавающей точкой... float... вернее в дельфи double к примеру.
только все твои ухищрения поставить тип и формат параметру смысла не имеют... т.к. после ты присваиваеш значение, через вариант, вариант имеет инфу о том какой тип он содержит, тот тип и параметр получит.
и вообще делай понятные примеры... а не куски глючного кода приводи, себя же обманываеш.
проверьvar
dob: double;
begin
dob:= 1.23456789;
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").Value:= dob;
....
← →
Max Zyuzin © (2006-04-19 17:35) [4]Гм... поэксперемнировал тут
Вот до чего докапался... если написать после первых четырех строк кода
что то вроде
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").Value := 1.12345678;
Все присваивается..... чувствую что надо преобразовывать типы... к чему бы их привести?
← →
Max Zyuzin © (2006-04-19 17:38) [5]>sniknik © (19.04.06 17:32) [3]
Проверил работает...
Но не работает например
var
dob: double;
begin
dob:= CarRentPDDBNumberEditEh.Value * TaxRateADODataSet.FieldByName("trValue").Value/(1+TaxRateADODataSet.FieldByName("trValue").Value);
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").Value:= dob;
....
← →
sniknik © (2006-04-19 17:42) [6]> Но не работает например
а с чего оно должен работать (как ты ожидаеш), если как ты сам же сказал trValue того же типа, который как я сказал будет преобразован к 4 знаковому типу currency?
посчитай все на бумажке с учетом того о чем говорили...
← →
Max Zyuzin © (2006-04-19 17:45) [7]В общем получилось если явно преобразовывать тип
UpdActCommand.Parameters.ParamByName("pacrcSumPDTax").Value := CarRentPDDBNumberEditEh.Value * TaxRateADODataSet.FieldByName("trValue").AsFloat/(1+TaxRateADODataSet.FieldByName("trValue").AsFloat);
← →
sniknik © (2006-04-19 17:56) [8]> В общем получилось если явно преобразовывать тип
теряеш точность, преобразование к Float все одно через currency, так у тебя только конечный тип выражения поменялся.
← →
Max Zyuzin © (2006-04-20 09:00) [9]>sniknik © (19.04.06 17:56) [8]
Ну вот... как этого избежать? Как объяснить Delphi что к полю в таблице нужно обращатся как к double? Значения вродеTaxRateADODataSet.FieldByName("trValue").DataType
Являются ReadOnly ...
← →
Ega23 © (2006-04-20 09:13) [10]А если к char преобразовать? Это так, мысль вслух...
← →
Max Zyuzin © (2006-04-20 10:16) [11]>Ega23 © (20.04.06 09:13) [10]
Это вроде как сначала в строкуStrToFloat(TaxRateADODataSet.FieldByName("trValue").AsString)
Так что ли?
← →
sniknik © (2006-04-20 10:25) [12]> Ну вот... как этого избежать? Как объяснить Delphi что к полю в таблице нужно обращатся как к double?
проще всего поменять тип поля в самой базе (точности BCD ты все одно не получиш, если работаеш с преобразованным в double значением), либо преобразовать в запросе, либо вставлять обработку BCD в программу (модуль FmBCD вроде...) и получать значение из обьектов ADO обходя дельфевскую обертку... впрочем я повторяюсь. см. [1]
еще один нерассматриваемый пока вариант, сделать все расчеты на сервере с запросе.
> А если к char преобразовать? Это так, мысль вслух...
если в запросе то получится, если у обьекта AsString то нет. но в запросе имхо проще в Float перевести.
← →
sniknik © (2006-04-20 10:26) [13]> StrToFloat(TaxRateADODataSet.FieldByName("trValue").AsString)
> Так что ли?
как знал ;о))
← →
Max Zyuzin © (2006-04-20 10:39) [14]Или надо было примерно так?
select cast(trValue as varchar(50)) from ...
А потом обращаться как к строке?
← →
sniknik © (2006-04-20 10:46) [15]не, ну прям какой то мазохист а не программист... читай топик еще раз, все уже было сказано...
> select cast(trValue as varchar(50)) from ...
select cast(trValue as float) from ...
не проще?
а не еще проще, само поле trValue в таблице типа float сделать? все одно не пользуешся ты точностью BCD, а вот его тормоза (по сравнению с числовыми типами) и д.р. минусы прилагаются бесплатно...
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c