Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Проблема с разделителем дробной части в клиент-сервер приложении  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Вобщем проблема такая:

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

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

если я активирую какую-нибудь ячейку этого BROWSE-окна, то данные в этой ячейке отображаются так:
_]123,456
>]123.000
_]123,456
_]123,456
(уточняю: символом ">" помечена активная запись)
как вы заметили, данные в активнной ячейке отображаются с нулевой дробной частью и через точку, в то время, как в остальных ячейках эта дробная часть отображается как надо, но через запятую.
хотя, в активной ячейке может быть и запятая, если установить
SET POINT TO ","
_]123,456
>]123,000
_]123,456
_]123,456
но и в этом случае (с установкой SET POINT TO ",") в дробной части активной ячейки отображаются только ноли.
команда ?MyCur.F тоже отображает лишь ноли в дробной части.
даже этот код не помогает вытащить настоящую (ненулевую) дробную часть:
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)
что же делать, люди ?
только без исправления системных региональных стандартов ! (поскольку я считаю это примером дурного тона - подстраивать систему под себя, а не наоборот)

я прикрепил картинку, если не верите

К сообщению приложен файл. Размер - 0Kb
20 июн 06, 07:29    [2790014]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
Redrik
Member

Откуда:
Сообщений: 808
Уверен, что размерность (8.3) ?
20 июн 06, 09:13    [2790163]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
уверен.
но это не суть важно
важно, что запятая, а не точка
20 июн 06, 09:26    [2790194]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
piva
Member

Откуда: Курган
Сообщений: 1096
Система не причем - думаю это в настройках ODBC драйвера - типа отключить Local Setting
20 июн 06, 09:32    [2790207]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
https://www.sql.ru/forum/actualthread.aspx?tid=227745#1991467
20 июн 06, 10:20    [2790412]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
всё

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

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

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

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

и все заработает нормально со следующей коннекции !
20 июн 06, 10:22    [2790420]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
ВладимирМ
Member

Откуда: г. Москва
Сообщений: 7864
Не надо лезть в системный реестр, когда дело явно в настройках соединения (DSN). Попробуй получить с сервера значение больше 1000. Т.е. чтобы появился (если есть) разделитель троек цифр. Например

123456.78
20 июн 06, 10:25    [2790440]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
ВладимирМ
Не надо лезть в системный реестр, когда дело явно в настройках соединения (DSN)
а если я не пользуюсь источниками данных, а соединяюсь по строке соединения через драйвер ?
21 июн 06, 09:11    [2794975]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
проходящий
Guest
А в строке соединения параметр Regional уже отменили?
21 июн 06, 09:27    [2795020]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
проходящий
А в строке соединения параметр Regional уже отменили?
кстати, где взять полное описание параметров строки подключения ?
21 июн 06, 10:13    [2795168]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
--Eugene--
всё

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

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

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

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

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


Вообще-то в Oracle есть команды ALTER SESSION SET..., позволяющие менять параметры сессии, в том числе и региональные параметры. В частности, для данного случая
ALTER SESSION SET NLS_NUMERIC_CHARACTERS = ".,"
или через процедуру
dbms_session.set_nls('NLS_NUMERIC_CHARACTERS', '''.,''');
21 июн 06, 10:26    [2795243]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
но это же не выход
точнее выход, но через не то место
21 июн 06, 10:32    [2795274]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
--Eugene--
но это же не выход
точнее выход, но через не то место


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

PS Подчеркиваю, что установки изменяются только для текущего сеанса, а не для всей базы в целом
21 июн 06, 10:48    [2795375]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
дак вотыменно, что только для текущей сессии, а не для всей базы

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

а по поводу даты всеравно же биндим переменные в SQLEXEC() с помощью знаков вопроса (?) - такшто дата без разницы
21 июн 06, 11:53    [2795841]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
1. А для всей базы - это неаккуратно. Что, если с ней работает не только это приложение и каждому нужны свои настройки?
2. Не думаю, что вызвать одну процедуру в начале сеанса - это напряг. Тем более, что обычно приложение коннектится 1 раз в начале работы и разрывает соединение в конце
3. Не помню, как в 8.1.7, но в 9 есть возможность в базе прописать триггер на logon и там делать эту установку
21 июн 06, 12:11    [2796036]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
Сергей А.М.
Member

Откуда: Сыктывкар
Сообщений: 24
--Eugene--
нужно прописать строковый параметр в реестре в

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

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


Есть такая проблема, решения сам не нашел, попробовал выше указанное - не то...
На самом деле проблема с ODBC драйверами
Oracle-драйвер:
SELECT value FROM table && есть проблема
SELECT value*1 FROM table && нет проблемы
MS-драйвер
SELECT value FROM table && нет проблемы
SELECT value*1 FROM table && есть проблема
...или наоборот, не помню
Решалось это обходным путем
SELECT value*100 AS value FROM table && к Oracle
UPDATE cursor SET value=value/100 && в VFP
Ну или лучше освоить Oracle OLE for Object
21 июн 06, 18:16    [2798754]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
Сергей А.М.
--Eugene--
нужно прописать строковый параметр в реестре в...
Есть такая проблема, решения сам не нашел, попробовал выше указанное - не то...
На самом деле проблема с ODBC драйверами
Oracle-драйвер:
SELECT value FROM table && есть проблема
SELECT value*1 FROM table && нет проблемы
Ну или лучше освоить Oracle OLE for Object
тоесть как не то? странно, а почему у меня работает?
я серьезно, работает и
SELECT value
и
SELECT value*1
без проблем
я пользую Oracle 8.1.7, драйвер Oracle ODBC driver 8.01.07.810
а в VFP8SP1:
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


К сообщению приложен файл. Размер - 0Kb
22 июн 06, 06:37    [2799997]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
cbani1
Member

Откуда:
Сообщений: 58
Пролема в том что в Oracle тип вашего поля N(n) тоесть не указано явно число цифр после дробной части я для себя решил следуюшим способом
в селекте использую функцию округления для таких полей поскольку знаю точно что клиентское приложение которое туда записывает данные (слиент на java) для нужных мне полей не пишет более двух знаков после запятой. Ну а если таблицы оракла используете только вы как для ввода так и для вывода информации тогда укажите явно в оракле количество знаков после запятой но учтите что в оракле в общую длину числогого поля не входит точка.
22 июн 06, 11:10    [2800889]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
Сергей А.М.
Member

Откуда: Сыктывкар
Сообщений: 24
--Eugene--
HKLM\Software\Oracle\ALL_HOMES\HOMEX
(X в конце - это номер дома, в котором живет драйвер)

Тогда прошу уточнить
У меня есть
HKLM\Software\Oracle\ALL_HOMES\ID0
HKLM\Software\Oracle\HOME0
а Вашей ветки нет
22 июн 06, 11:14    [2800908]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
dmitryx
Member

Откуда: Минск, Беларусь
Сообщений: 37
Вот не было печали... Решил на всякий случай проверить, как у меня фокс отображает дробные числа с 10го оракла... Оказалось, что проблема в точности, как у --Eugene--. Почти решилось настройкой в ODBC драйвере на "Use Oracle NLS settings". Запятые теперь не показывает, но если в дробном числе нет целой части, то нолик в начале не рисуется, а когда становишься на него - он появляется. Даже не знаю что и делать...
22 июн 06, 12:34    [2801559]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
--Eugene--
Member

Откуда: Боярышник
Сообщений: 2170
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
23 июн 06, 03:58    [2804554]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
dmitryx
Member

Откуда: Минск, Беларусь
Сообщений: 37
--Eugene--, не помогает домножение. Собственно у меня обрезается не дробная часть, с ней то как раз все нормально, а вот 0 в начале не показывается пока не станешь в ячейку. И еще "забавный" эффект - если у числа дробная часть меньше чем описано в CursorSchema (у меня N(12, 4) ), то, когда становишься в ячейку с числом, она добивается нулями до 4х знаков.

К сообщению приложен файл. Размер - 0Kb
23 июн 06, 11:42    [2805523]     Ответить | Цитировать Сообщить модератору
 Re: Проблема с разделителем дробной части в клиент-сервер приложении  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

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

24 июн 06, 18:24    [2809645]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить