:: Архив конференции по VFP до 2005 года
Re: Совсем не понятно
Пашок
Автор

Сообщений: 706
Дата регистрации: 14.11.2001
Что значит поиграй ? Мне нужно четко понимать, как он считает. Я уже поиграл, через пол года работы программы обнаружал расхождения в расчетах, максимальное расхождение получилось, 0,24 цента, ничего приятного тут нет.
Я вообще в тупике. Сервар нормально считает, если работает со своими полями, а если с переменными переданными через фокс, то просто считает неправильно, это получается, что вся программа считается неверно.




------------------
Ratings: 0 negative/0 positive
Re: Совсем не понятно
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Похоже, это какой-то глюк второго округления или передачи параметров. Проверь так:

* Оставил значение по умолчанию до 2 знаков
SET DECIMALS TO
nl_aw = 1.9
nl_aw_rate = 2.675
nl_rate = 36.6843
* А вот здесь внешнее округление делаю до 4 знаков
cl_zapros = " select ROUND( ROUND(?nl_aw * ?nl_aw_rate * ?nl_rate,2) * 0.1 ,4) as sum1"
nl_error = SQLEXEC(np_connection, cl_zapros,"test" )
?test.sum1

Получаем ожидаемое значение 18,65. При этом количество десятичных знаков в результирующем запросе равно настройке SET DECIMALS. В данном случае 2

А вообще-то, тему можно продолжить. Если сделать явное указание значений примерно так:

SET DECIMALS TO 4
cl_zapros = " select ROUND( ROUND("+transform(nl_aw)+" * "+transform(nl_aw_rate)+" * "+transform(nl_rate)+",2) * 0.1 ,2) as sum1"
nl_error = SQLEXEC(np_connection, cl_zapros,"test" )
?test.sum1

То результат также будет корректным. Т.е. 18,65




------------------
Ratings: 0 negative/0 positive
Re: Совсем не понятно
Пашок
Автор

Сообщений: 706
Дата регистрации: 14.11.2001
Слушай, это какая важная штука получается.
Получается нельзя передавать на сервер параметры с помощью ? знака.
Совсем плохо дело. Первый вариант стремный, вообще не понятно, в каких случаях какое округление ставить, чтобы было похоже на законы математики.
Может на SQL.RU спросить ?
Или это может только на фоксе происходит такая лажа?
В любом случае, все рассчеты сейчас под сомнением.




------------------
Ratings: 0 negative/0 positive
А на сервер, все правильно получается
Пашок
Автор

Сообщений: 706
Дата регистрации: 14.11.2001

declare @nl_aw numeric(7,4), @nl_aw_rate numeric(7,4) ,@nl_rate numeric(7,4)
select @nl_aw = 1.9
select @nl_aw_rate = 2.675
select @nl_rate = 36.6843


select ROUND( ROUND(@nl_aw * @nl_aw_rate * @nl_rate ,2) * 0.1 ,2) as test from currency


Я так понимаю, это либо фокс, либо дрова ODBC, раз сервер считает нормально




------------------
Ratings: 0 negative/0 positive
Кое что проясняется
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Похоже дело в каких-то правилах округления. Что-то кажется было в этой конфе по поводу отличия в правилах округления.

SET DECIMALS TO 4
aa=18.6450
SQLEXEC(np_connection, 'select ROUND(?aa,2) as sum1','test')
?test.sum1
aa=18.6451
SQLEXEC(np_connection, 'select ROUND(?aa,2) as sum1','test')
?test.sum1

Понял в чем дело? Для округления недостаточно иметь 5 или больше следом за округляемым знаком. В случае, если за округляемым знаком стоит 5, то анализируется цифра стоящая следом за 5

Но вот как происходит анализ - в каких случаях какое правило применять - непонятно. И почему при явном указании значения вместо параметра правила округления другие - тоже неясно.



[i][small][color=Gray]Отредактировано (20.08.04 16:13)


------------------
Ratings: 0 negative/0 positive
А на сервер в SQL Query analyzer
Пашок
Автор

Сообщений: 706
Дата регистрации: 14.11.2001
все хорошо, всега 65 )))))))


declare @nl_aa numeric(6,4)

select @nl_aa = 18.6450


select ROUND(@nl_aa,2)



declare @nl_aa1 numeric(6,4)

select @nl_aa1 = 18.6451


select ROUND(@nl_aa1,2)




------------------
Ratings: 0 negative/0 positive
Re: А на сервер в SQL Query analyzer
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Да это-то понятно, в QA от MS SQL2000 тоже нормально работает. Если использовать не параметры а значение, тоже порядок. Проблема только при передаче как параметр. Где тут что клинит непонятно. Я задал этот вопрос в конфе по VFP9 (в нем то же самое - проверял), может кто из команды FoxPro ответит.




------------------
Ratings: 0 negative/0 positive
Re: А на сервер в SQL Query analyzer
Пашок
Автор

Сообщений: 706
Дата регистрации: 14.11.2001
Нужно, что-то делать, а то работа встала, непонятно как дальше делать программу.
Все так, как ты говоришь.


aa=18.6450
SQLEXEC(np_connection, 'select ROUND(?aa,2) as sum1','test')
?test.sum1


18,64



SQLEXEC(np_connection, "select ROUND( " + str(18.6450,10,4)+ " ,2) as sum1",'test')
?test.sum1

18,65



SQLEXEC(np_connection, "select ROUND( convert(numeric(6,4)," + str(18.6450,10,4)+ ") ,2) as sum1",'test')
?test.sum1
USE

18,65





------------------
Ratings: 0 negative/0 positive
Re: А на сервер в SQL Query analyzer
Владимир Максимов

Сообщений: 14100
Откуда: Москва
Дата регистрации: 02.09.2000
Следи за ответами к вопросу

forum.foxclub.ru

Явная проблема в способе передачи значения. При передаче по параметру - один способ округления, при передаче по значению - другой.

Если срочно надо, то используй передачу по значению.

SQLEXEC(np_connection, "select ROUND( " + TRANSFORM(18.6450)+ " ,2) as sum1",'test')
?test.sum1

PS: Функции TRANSFORM() в отличии от STR() не требуется указывать размерность. Она переведет "как надо" в символьную строку без лишних пробелов. Причем переведет абсолютно любое значение. И символьное в том числе:

?TRANSFORM(123)
?TRANSFORM("123")
?TRANSFORM(date())
?TRANSFORM(NTOM(123))

Аналогично можно использовать функции PADR(), PADL(), PADC()
?PADL(123.45,10)




------------------
Ratings: 0 negative/0 positive
Re: А на сервер в SQL Query analyzer
Пашок
Автор

Сообщений: 706
Дата регистрации: 14.11.2001
Трансформ хорошо, у меня с ним две проблемы.
1ая, что вся программа уже написана ))))))))))))))))) и очень много где передача через параметр

а 2ая, то, что его не очень удобно использовать
У меня основная формула в виде глобальной переменной создается в начале программе. Потом я только подставляю ее в запросы. А этот с трансформ, придется использовать макроподстановки, а это опять много где править, да и эти лошадиные селекты вообще потом без поллитры не прочитаешь. Я даже больше скланяюсь к созданию временной таблицы, куда запихивать параметры, но это конечно совсем крайний вариант. Гиморой еще тот.




------------------
Ratings: 0 negative/0 positive


Извините, но у вас нет прав для того, чтобы оставлять сообщения в этом форуме.

On-line: 9 (Гостей: 9)

© 2000-2024 Fox Club 
Яндекс.Метрика