Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.49 MB
Время: 0.012 c
15-1148048657
vidiv
2006-05-19 18:24
2006.06.11
sin(x) = sqrt(2)/2


4-1142686335
Вовка
2006-03-18 15:52
2006.06.11
FindResource не находит ресурс


2-1148734729
NewerWinterNight
2006-05-27 16:58
2006.06.11
Помогите!!! Не могу запустить проект.


15-1147845114
Knight
2006-05-17 09:51
2006.06.11
Как в винде после конвертации диска С в нтфс...


2-1148557809
tvv
2006-05-25 15:50
2006.06.11
Работа с DLL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский