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

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

Переменная DecimalSeparator [D7]


Страницы:   1 2

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]


Страницы:   1 2

Наверх

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