Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.11;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.075 c
2-1148390088
rra
2006-05-23 17:14
2006.06.11
Заполнение DBLookupComboBox a из поля таблицы...


4-1142617056
KALqYAN
2006-03-17 20:37
2006.06.11
Open -> My Computer, My Documents, Control Panel...


2-1148163498
Призрак
2006-05-21 02:18
2006.06.11
COM-порт. Если девайс отключить...


2-1148463740
Мурзилка
2006-05-24 13:42
2006.06.11
шрифты


3-1145125912
DevilDevil
2006-04-15 22:31
2006.06.11
Запись не удаляется