powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема с разделителем дробной части в клиент-сервер приложении
23 сообщений из 23, страница 1 из 1
Проблема с разделителем дробной части в клиент-сервер приложении
    #33801445
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем проблема такая:

я использую VFP8SP1 и Oracle 8.1.7 (и оракловый /не MS/ ODBC драйвер)

есть у меня таблица на сервере. в одно дробное поле:
Код: plaintext
MyScheme.MyTable(f number( 6 , 3 ))
она содержит данные:
Код: plaintext
1.
2.
3.
123.456
123.456
123.456
123.456
(уточняю: сто двадцать три целых, четыреста пятьдесят шесть тысячных).
когда я делаю запрос
Код: plaintext
SQLEXEC(hConn, "select f from MyScheme.MyTable", "cur")
, то в фоксе появляется курсор, содержащий одно поле:
Код: plaintext
CUR (F N( 8 , 3 ))
и данные, которые отображаются в окне BROWSE так:
Код: plaintext
1.
2.
3.
_]123,456
_]123,456
_]123,456
_]123,456
(уточняю: сто двадцать три целых, запятая, четыреста пятьдесят шесть).

если я активирую какую-нибудь ячейку этого BROWSE-окна, то данные в этой ячейке отображаются так:
Код: plaintext
1.
2.
3.
_]123,456
>]123.000
_]123,456
_]123,456
(уточняю: символом ">" помечена активная запись)
как вы заметили, данные в активнной ячейке отображаются с нулевой дробной частью и через точку, в то время, как в остальных ячейках эта дробная часть отображается как надо, но через запятую.
хотя, в активной ячейке может быть и запятая, если установить
Код: plaintext
SET POINT TO ","
Код: plaintext
1.
2.
3.
_]123,456
>]123,000
_]123,456
_]123,456
но и в этом случае (с установкой SET POINT TO ",") в дробной части активной ячейки отображаются только ноли.
команда ?MyCur.F тоже отображает лишь ноли в дробной части.
даже этот код не помогает вытащить настоящую (ненулевую) дробную часть:
Код: plaintext
1.
2.
3.
4.
5.
m.a = MyCur.F
?m.a && - отображает  123 . 000 
m.b = m.a *  2 
?m.b && - тоже отображает  123 . 000 
m.c = MyCur.F *  2 
?m.c && - тоже отображает нулевую дробную часть ( 246 . 000 )
что же делать, люди ?
только без исправления системных региональных стандартов ! (поскольку я считаю это примером дурного тона - подстраивать систему под себя, а не наоборот)

я прикрепил картинку, если не верите
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33801553
Фотография Redrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уверен, что размерность (8.3) ?
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33801575
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уверен.
но это не суть важно
важно, что запятая, а не точка
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33801585
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Система не причем - думаю это в настройках ODBC драйвера - типа отключить Local Setting
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33801707
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33801712
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё

я нашел причину

нужно прописать строковый параметр в реестре в

HKLM\Software\Oracle\ALL_HOMES\HOMEX
(X в конце - это номер дома, в котором живет драйвер)

строковый параметр
NLS_NUMERIC_CHARACTERS = ".,"
(без ковычек)

и все заработает нормально со следующей коннекции !
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33801724
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не надо лезть в системный реестр, когда дело явно в настройках соединения (DSN). Попробуй получить с сервера значение больше 1000. Т.е. чтобы появился (если есть) разделитель троек цифр. Например

123456.78
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33804332
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМНе надо лезть в системный реестр, когда дело явно в настройках соединения (DSN)а если я не пользуюсь источниками данных, а соединяюсь по строке соединения через драйвер ?
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33804368
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в строке соединения параметр Regional уже отменили?
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33804475
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящийА в строке соединения параметр Regional уже отменили?кстати, где взять полное описание параметров строки подключения ?
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33804528
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--всё

я нашел причину

нужно прописать строковый параметр в реестре в

HKLM\Software\Oracle\ALL_HOMES\HOMEX
(X в конце - это номер дома, в котором живет драйвер)

строковый параметр
NLS_NUMERIC_CHARACTERS = ".,"
(без ковычек)

и все заработает нормально со следующей коннекции !

Вообще-то в Oracle есть команды ALTER SESSION SET..., позволяющие менять параметры сессии, в том числе и региональные параметры. В частности, для данного случая
Код: plaintext
1.
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ".,"
или через процедуру
Код: plaintext
1.
dbms_session.set_nls('NLS_NUMERIC_CHARACTERS', '''.,''');
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33804545
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но это же не выход
точнее выход, но через не то место
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33804609
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--но это же не выход
точнее выход, но через не то место

Не знаю, как в FoxPro, а в Oracle подобные вещи применяются достаточно часто. Например, формат даты в Oracle по умолчанию - dd-mon-yyyy, т.е. месяц тремя буквами. Путем подобной установки дату приводят к любимому виду dd.mm.yyyy (если не хочется в каждом sql писать to_date...) :))

PS Подчеркиваю, что установки изменяются только для текущего сеанса, а не для всей базы в целом
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33804879
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дак вотыменно, что только для текущей сессии, а не для всей базы

а если я отконнекчусь и заново ? - опять прописывать это дело ?

а по поводу даты всеравно же биндим переменные в SQLEXEC() с помощью знаков вопроса (?) - такшто дата без разницы
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33804984
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. А для всей базы - это неаккуратно. Что, если с ней работает не только это приложение и каждому нужны свои настройки?
2. Не думаю, что вызвать одну процедуру в начале сеанса - это напряг. Тем более, что обычно приложение коннектится 1 раз в начале работы и разрывает соединение в конце
3. Не помню, как в 8.1.7, но в 9 есть возможность в базе прописать триггер на logon и там делать эту установку
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33806686
Сергей А.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--нужно прописать строковый параметр в реестре в

HKLM\Software\Oracle\ALL_HOMES\HOMEX
(X в конце - это номер дома, в котором живет драйвер)

строковый параметр
NLS_NUMERIC_CHARACTERS = ".,"
(без ковычек)


Есть такая проблема, решения сам не нашел, попробовал выше указанное - не то...
На самом деле проблема с ODBC драйверами
Oracle-драйвер:
Код: plaintext
1.
SELECT value FROM table && есть проблема
SELECT value* 1  FROM table && нет проблемы
MS-драйвер
Код: plaintext
1.
SELECT value FROM table && нет проблемы
SELECT value* 1  FROM table && есть проблема
...или наоборот, не помню
Решалось это обходным путем
Код: plaintext
1.
SELECT value* 100  AS value FROM table && к Oracle
UPDATE cursor SET value=value/ 100  && в VFP
Ну или лучше освоить Oracle OLE for Object
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33807360
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей А.М. --Eugene--нужно прописать строковый параметр в реестре в...Есть такая проблема, решения сам не нашел, попробовал выше указанное - не то...
На самом деле проблема с ODBC драйверами
Oracle-драйвер:
Код: plaintext
1.
SELECT value FROM table && есть проблема
SELECT value* 1  FROM table && нет проблемы
Ну или лучше освоить Oracle OLE for Object тоесть как не то? странно, а почему у меня работает?
я серьезно, работает и
Код: plaintext
SELECT value
и
Код: plaintext
SELECT value*1
без проблем
я пользую Oracle 8.1.7, драйвер Oracle ODBC driver 8.01.07.810
а в VFP8SP1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SET SYSFORMATS OFF
SET FIXED OFF
SET DATE GERMAN
SET HOURS TO  24 
SET MARK TO "."
SET CENTURY ON
SET COLLATE TO "RUSSIAN"
SET POINT TO "."
SET SEPARATOR TO ""
SET DECIMALS TO  2 
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33807908
cbani1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пролема в том что в Oracle тип вашего поля N(n) тоесть не указано явно число цифр после дробной части я для себя решил следуюшим способом
в селекте использую функцию округления для таких полей поскольку знаю точно что клиентское приложение которое туда записывает данные (слиент на java) для нужных мне полей не пишет более двух знаков после запятой. Ну а если таблицы оракла используете только вы как для ввода так и для вывода информации тогда укажите явно в оракле количество знаков после запятой но учтите что в оракле в общую длину числогого поля не входит точка.
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33807921
Сергей А.М.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
--Eugene--HKLM\Software\Oracle\ALL_HOMES\HOMEX
(X в конце - это номер дома, в котором живет драйвер)
Тогда прошу уточнить
У меня есть
HKLM\Software\Oracle\ALL_HOMES\ID0
HKLM\Software\Oracle\HOME0
а Вашей ветки нет
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33808302
dmitryx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот не было печали... Решил на всякий случай проверить, как у меня фокс отображает дробные числа с 10го оракла... Оказалось, что проблема в точности, как у --Eugene-- . Почти решилось настройкой в ODBC драйвере на "Use Oracle NLS settings". Запятые теперь не показывает, но если в дробном числе нет целой части, то нолик в начале не рисуется, а когда становишься на него - он появляется. Даже не знаю что и делать...
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33810292
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cbani1Пролема в том что в Oracle тип вашего поля N(n) тоесть не указано явно число цифр после дробной частиэто точно. вот с этим точно косяк. ваша правда

Сергей А.М.Тогда прошу уточнить
У меня есть
HKLM\Software\Oracle\ALL_HOMES\ID0
HKLM\Software\Oracle\HOME0
а Вашей ветки нетой, блин, my bad, my bad
канешна HKLM\Software\Oracle\HOMEX (где X - номер дома)

dmitryxпроблема в точности, как у --Eugene--. ...если в дробном числе нет целой части, то нолик в начале не рисуется, а когда становишься на него - он появляется. Даже не знаю что и делать... - домножать поля ораклового селекта на 1 (select field*1 from table). тогда он отображает корректно, округляя , а не обрезая результат до стольких позиций после запятой, сколько указано в SET DECIMALS
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33810876
dmitryx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene-- , не помогает домножение. Собственно у меня обрезается не дробная часть, с ней то как раз все нормально, а вот 0 в начале не показывается пока не станешь в ячейку. И еще "забавный" эффект - если у числа дробная часть меньше чем описано в CursorSchema (у меня N(12, 4) ), то, когда становишься в ячейку с числом, она добивается нулями до 4х знаков.
...
Рейтинг: 0 / 0
Проблема с разделителем дробной части в клиент-сервер приложении
    #33813052
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Eugene!

AFAIR если в запросе используется функция, то через родной Oracle-вский ODBC
(по крайней мере те версии что я использовал) возвращается поле, имеющее тип
Double (в фоксе B) - при этом не возникает проблем с обработкой таких полей
(они содержат число с полной точностью допускаемой данным типом в фоксе), но
возможны проблемы с отображением, т.к. параметр типа B регулирует как раз
число отображаемых по умолчанию десятичных знаков - но видимо использование
чёткой маски должно помочь :)

А вот с MS драйвером возможны проблемы - он для "вычислимых" полей норовит
поставить неадекватный тип - Numeric(20,0) или что-то такое - напрочь
забывая про дробную часть (хотя реально в поле то может быть прописано число
с десятичной точкой - но фокс ограниченный таким типом не сможет правильно
обрабатывать да и отображать поля).

P.S. Интересный вариант - сменить параметр NLS_LANG на
AMERICAN_AMERICA.CL8MSWIN1251 - либо во всей клиентской системе (в реестре
или в глобальных настройках переменных окружения) либо только для "своего"
приложения, запуская его через батник, где прописана локальная переменная
окружения - SET NLS_LANG=...
Это кстати помогает иногда при некорректных файлах с локализованными
сообщениями об ошибках (когда русские сообщения об ошибках приходят в кривой
кодировке - или когда нужно получать именно английские сообщения об
ошибках).
Что важно - это будет работать и для других приложений использующих Oracle
Client (конечно если они внутри себя этот-же параметр не меняют) - например
для консольных утилит... Правда там возможно дополнительно потребуется не
1251 кодировка а 866-я...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема с разделителем дробной части в клиент-сервер приложении
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]