![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переменная DecimalSeparator [D7]
Inna © (2005-12-23 09:10:00)Здравствуйте, подскажите пожалуйста:
в dll использую переменную DecimalSeparator (указывает на десятичный разделитель: точка или запятая), при различных настройках системы всегда возвращает запятую, если эту переменную использую в проекте, то все работает нормально.
Почему она не работает в Dll?
Fay (2005-12-23 11:59:00) [1]2 ЮЮ © (23.12.05 11:58) [29]
Тогда без процедур получится. Не круто 8)
ЮЮ (2005-12-23 11:58:00) [2]>Создала хранимую процедуру, кторая преобразует это значение
в рубли
а не проще было разделить на 100 и успокоиться?
Digitman (2005-12-23 11:52:00) [3]
> Inna © (23.12.05 11:41) [27]
не самое простое (и потенциально опасное) решение, смею заметить.
к серверу в общем случае коннектятся многие клиенты, каждый из которых вправе иметь собственные (нужные именно ему) установки сепаратора.
это означает, что для каждой активной кл.сессии сервер должен где-то "на своей территории" хранить предпочтения данного клиента.
полагаясь на thread per connect можно в UDF использовать threadvar , но это весьма рискованное решение, ибо оно версионно-зависимо
Inna (2005-12-23 11:41:00) [4]Спасибо ВСЕМ за помощь.
> Digitman © (23.12.05 11:30) [24]
> либо передавай с клиента на сервер нужное значение сепаратора,
> с тем чтобы сервер формировал стр.представление с учетом
> именно его
Именно так и сделаю
Fay (2005-12-23 11:41:00) [5]2 Inna © (23.12.05 11:34) [25]
Послушай уже Digitman-а, честное слово. Ну нафиг тебе на клиенте настройки некой учётной записи сервера?!
Inna (2005-12-23 11:34:00) [6]
> Reindeer Moss Eater © (23.12.05 11:10) [21]
>
Что посоветуете делать?
Digitman (2005-12-23 11:30:00) [7]либо передавай с клиента на сервер нужное значение сепаратора, с тем чтобы сервер формировал стр.представление с учетом именно его
Digitman (2005-12-23 11:27:00) [8]
> Inna © (23.12.05 11:04) [20]
ну и к чему лепить горбатого, позволь поинтересоваться ?
мы ж здесь не китайская разведка, которую обязательно нужно запутать)
сначала ты в [17] заявляешь про процесс клиента, а теперь в [20] вдруг обнаруживается, что речь-то оказавается о процессе сервера идет !
> Храниму процедуру создавала, для того чтобы сразу в запросе
> можно было выводить цену в рублях
ну и нкой ляд тебе этот сепаратор понадобился ?
просто верни приложению-клиенту из ХП набор данных во float-формате, а в приложении-клиенте ф-ции FloatToStr или FormatFloat преобразуют полученное в строковое представление с учетом актуального для тек.клиентской сессии сепаратора
Fay (2005-12-23 11:11:00) [9]2 Inna © (23.12.05 11:04) [20]
> Создала хранимую процедуру, кторая преобразует это значение
> в рубли (результат string).
Как это "string"?
> которая возвращает строку (PChar) содержащую DecimalSeparator
На сервере?!
Reindeer Moss Eater (2005-12-23 11:10:00) [10]Хранимая процедура всегда возвращает строку с запятой
Потому что в настройках учетной записи под которой работает сервер установлена запятая.
Inna (2005-12-23 11:04:00) [11]Все с самого начала:
В базе данных цена хранится как integer в копейках.
Создала хранимую процедуру, кторая преобразует это значение в рубли (результат string).
Храниму процедуру создавала, для того чтобы сразу в запросе можно было выводить цену в рублях.
Но точку или запятую надо ставить в зависимости от настроек системы (это используется и в приложении)
Как сделала я:
Создала Dlll, в которой используется DecimalSeparator :
в dll есть функция, которая возвращает строку (PChar) содержащую DecimalSeparator
есть UDF, которая ссылается на dll на эту фукцию
Udf используется в хранимой процедуре
Хранимая процедура всегда возвращает строку с запятой
Может быть есть какой нибудь другой способ?
Digitman (2005-12-23 10:45:00) [12]
> Inna © (23.12.05 10:39) [17]
> Процесс клиента
Так, уже ближе к телу.
И ты утверждаешь, что всякий раз при старте клиентского приложения , использующего эту ДЛЛ) от имени тек.юзера, в теле некоей ф-ции в составе этой ДЛЛ ты считываешь значение DecimalSeparator и оно отличается от текущего установленного сепаратора в рег.настройках ОС для тек.юзера ?
Reindeer Moss Eater (2005-12-23 10:42:00) [13]если эту переменную использую в проекте, то все работает нормально.
Процесс клиента
Кто-то пытается нас запутать
Inna (2005-12-23 10:39:00) [14]
> Digitman © (23.12.05 10:00) [14]
> но о КАКОМ процессе ты ведешь речь - о процессе сервера
> или о процессе клиента ? ДЛЛ твоя КАКИМ конкретно процессом
> используется ?
Процесс клиента
КиТаЯц (2005-12-23 10:07:00) [15]Сам на эти грабли наступал...
DecimalSeparator на машине клиента может быть любым. У InterBase всегда точка.
В общем случае использование DecimalSeparator - хороший тон, но...
Если передаеш серверу Float число сформированное с использованием системной переменной DecimalSeparator, а она НЕ точка, то...
> Digitman © (23.12.05 09:54) [11]
Именно!
Digitman (2005-12-23 10:01:00) [16]
> DecimalSeparator используется для визуализации чисел
в том числе, но не только для этого
Digitman (2005-12-23 10:00:00) [17]
> Inna © (23.12.05 09:57) [12]
> Я понимаю, процесс стартует от имени конкретного пользователя
понимаешь правильно.
но о КАКОМ процессе ты ведешь речь - о процессе сервера или о процессе клиента ? ДЛЛ твоя КАКИМ конкретно процессом используется ?
ЮЮ (2005-12-23 09:58:00) [18]DecimalSeparator используется для визуализации чисел, серверу оно надо?
Inna (2005-12-23 09:57:00) [19]Я понимаю, процесс стартует от имени конкретного пользователя
Digitman (2005-12-23 09:54:00) [20]
> что делать?
для начала все-таки ответить на вопрос в [2]