Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема с разделителем дробной части в клиент-сервер приложении / 23 сообщений из 23, страница 1 из 1
20.06.2006, 07:29
    #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
20.06.2006, 09:13
    #33801553
Redrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
Уверен, что размерность (8.3) ?
...
Рейтинг: 0 / 0
20.06.2006, 09:26
    #33801575
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
уверен.
но это не суть важно
важно, что запятая, а не точка
...
Рейтинг: 0 / 0
20.06.2006, 09:32
    #33801585
piva
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
Система не причем - думаю это в настройках ODBC драйвера - типа отключить Local Setting
...
Рейтинг: 0 / 0
20.06.2006, 10:20
    #33801707
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
...
Рейтинг: 0 / 0
20.06.2006, 10:22
    #33801712
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
всё

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

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

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

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

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

123456.78
...
Рейтинг: 0 / 0
21.06.2006, 09:11
    #33804332
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
ВладимирМНе надо лезть в системный реестр, когда дело явно в настройках соединения (DSN)а если я не пользуюсь источниками данных, а соединяюсь по строке соединения через драйвер ?
...
Рейтинг: 0 / 0
21.06.2006, 09:27
    #33804368
Проходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
А в строке соединения параметр Regional уже отменили?
...
Рейтинг: 0 / 0
21.06.2006, 10:13
    #33804475
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
проходящийА в строке соединения параметр Regional уже отменили?кстати, где взять полное описание параметров строки подключения ?
...
Рейтинг: 0 / 0
21.06.2006, 10:26
    #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
21.06.2006, 10:32
    #33804545
--Eugene--
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
но это же не выход
точнее выход, но через не то место
...
Рейтинг: 0 / 0
21.06.2006, 10:48
    #33804609
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
--Eugene--но это же не выход
точнее выход, но через не то место

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

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

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

а по поводу даты всеравно же биндим переменные в SQLEXEC() с помощью знаков вопроса (?) - такшто дата без разницы
...
Рейтинг: 0 / 0
21.06.2006, 12:11
    #33804984
tru55
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
1. А для всей базы - это неаккуратно. Что, если с ней работает не только это приложение и каждому нужны свои настройки?
2. Не думаю, что вызвать одну процедуру в начале сеанса - это напряг. Тем более, что обычно приложение коннектится 1 раз в начале работы и разрывает соединение в конце
3. Не помню, как в 8.1.7, но в 9 есть возможность в базе прописать триггер на logon и там делать эту установку
...
Рейтинг: 0 / 0
21.06.2006, 18:16
    #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
22.06.2006, 06:37
    #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
22.06.2006, 11:10
    #33807908
cbani1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
Пролема в том что в Oracle тип вашего поля N(n) тоесть не указано явно число цифр после дробной части я для себя решил следуюшим способом
в селекте использую функцию округления для таких полей поскольку знаю точно что клиентское приложение которое туда записывает данные (слиент на java) для нужных мне полей не пишет более двух знаков после запятой. Ну а если таблицы оракла используете только вы как для ввода так и для вывода информации тогда укажите явно в оракле количество знаков после запятой но учтите что в оракле в общую длину числогого поля не входит точка.
...
Рейтинг: 0 / 0
22.06.2006, 11:14
    #33807921
Сергей А.М.
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
--Eugene--HKLM\Software\Oracle\ALL_HOMES\HOMEX
(X в конце - это номер дома, в котором живет драйвер)
Тогда прошу уточнить
У меня есть
HKLM\Software\Oracle\ALL_HOMES\ID0
HKLM\Software\Oracle\HOME0
а Вашей ветки нет
...
Рейтинг: 0 / 0
22.06.2006, 12:34
    #33808302
dmitryx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
Вот не было печали... Решил на всякий случай проверить, как у меня фокс отображает дробные числа с 10го оракла... Оказалось, что проблема в точности, как у --Eugene-- . Почти решилось настройкой в ODBC драйвере на "Use Oracle NLS settings". Запятые теперь не показывает, но если в дробном числе нет целой части, то нолик в начале не рисуется, а когда становишься на него - он появляется. Даже не знаю что и делать...
...
Рейтинг: 0 / 0
23.06.2006, 03:58
    #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
23.06.2006, 11:42
    #33810876
dmitryx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с разделителем дробной части в клиент-сервер приложении
--Eugene-- , не помогает домножение. Собственно у меня обрезается не дробная часть, с ней то как раз все нормально, а вот 0 в начале не показывается пока не станешь в ячейку. И еще "забавный" эффект - если у числа дробная часть меньше чем описано в CursorSchema (у меня N(12, 4) ), то, когда становишься в ячейку с числом, она добивается нулями до 4х знаков.
...
Рейтинг: 0 / 0
24.06.2006, 18:24
    #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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема с разделителем дробной части в клиент-сервер приложении / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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