Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADO + MSSQL 2000, Precision и Scale [D7, MSSQL]


Max Zyuzin ©   (2006-04-19 16:20:00) 

Граждане голова перестала работать...
Не могу подружить 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-20 10:46:00) [1]

не, ну прям какой то мазохист а не программист... читай топик еще раз, все уже было сказано...  
> select cast(trValue as varchar(50)) from ...
select cast(trValue as float) from ...
не проще?

а не еще проще, само поле trValue в таблице типа float сделать? все одно не пользуешся ты точностью BCD, а вот его тормоза (по сравнению с числовыми типами) и д.р. минусы прилагаются бесплатно...


Max Zyuzin   (2006-04-20 10:39:00) [2]

Или надо было примерно так?

select cast(trValue as varchar(50)) from ...

А потом обращаться как к строке?


sniknik   (2006-04-20 10:26:00) [3]

> StrToFloat(TaxRateADODataSet.FieldByName('trValue').AsString)
> Так что ли?
как знал ;о))


sniknik   (2006-04-20 10:25:00) [4]

> Ну вот... как этого избежать? Как объяснить Delphi что к полю в таблице нужно обращатся как к double?
проще всего поменять тип поля в самой базе (точности BCD ты все одно не получиш, если работаеш с преобразованным в double значением), либо преобразовать в запросе, либо вставлять обработку BCD в программу (модуль FmBCD вроде...) и получать значение из обьектов ADO обходя дельфевскую обертку... впрочем я повторяюсь. см. [1]

еще один нерассматриваемый пока вариант, сделать все расчеты на сервере с запросе.

> А если к char преобразовать? Это так, мысль вслух...
если в запросе то получится, если у обьекта AsString то нет. но в запросе имхо проще в Float перевести.


Max Zyuzin   (2006-04-20 10:16:00) [5]

>Ega23 ©   (20.04.06 09:13) [10]
Это вроде как сначала в строку

StrToFloat(TaxRateADODataSet.FieldByName('trValue').AsString)

Так что ли?


Ega23   (2006-04-20 09:13:00) [6]

А если к char преобразовать? Это так, мысль вслух...


Max Zyuzin   (2006-04-20 09:00:00) [7]

>sniknik ©   (19.04.06 17:56) [8]
Ну вот... как этого избежать? Как объяснить Delphi что к полю в таблице нужно обращатся как к double? Значения вроде

TaxRateADODataSet.FieldByName('trValue').DataType

Являются ReadOnly ...


sniknik   (2006-04-19 17:56:00) [8]

> В общем получилось если явно преобразовывать тип
теряеш точность, преобразование к Float все одно через currency, так у тебя только конечный тип выражения поменялся.


Max Zyuzin   (2006-04-19 17:45:00) [9]

В общем получилось если явно преобразовывать тип


UpdActCommand.Parameters.ParamByName('pacrcSumPDTax').Value := CarRentPDDBNumberEditEh.Value * TaxRateADODataSet.FieldByName('trValue').AsFloat/(1+TaxRateADODataSet.FieldByName('trValue').AsFloat);


sniknik   (2006-04-19 17:42:00) [10]

> Но не работает например
а с чего оно должен работать (как ты ожидаеш), если как ты сам же сказал trValue того же типа, который  как я сказал будет преобразован к 4 знаковому типу currency?

посчитай все на бумажке с учетом того о чем говорили...


Max Zyuzin   (2006-04-19 17:38:00) [11]

>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;
....


Max Zyuzin   (2006-04-19 17:35:00) [12]

Гм... поэксперемнировал тут

Вот до чего докапался... если написать после первых четырех строк кода
что то вроде
UpdActCommand.Parameters.ParamByName('pacrcSumPDTax').Value := 1.12345678;
Все присваивается..... чувствую что надо преобразовывать типы... к чему бы их привести?


sniknik   (2006-04-19 17:32:00) [13]

> Получаемое число с 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:12:00) [14]

>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:03:00) [15]

> Не могу подружить ADO с полем типа Decimal(20,8)
ну, ADO то как раз работает с ним, проблема в дельфи.  

в дельфи BCD преобразовывается через тип currecy у которого как раз 4 знака (на самом деле ни одного... т.к. это целочисленное, только представление такое младшие 4 разряда под дробь)

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

> Я пробовал, и присваивать тип ftFloat не помогает...
ошибка в 17й строке.


Наверх

Титульная страница Поиск, карта сайта Написать письмо