Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SQLEXEC / 18 сообщений из 18, страница 1 из 1
18.11.2004, 11:38
    #32788675
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Добрый день!
Есть соединение через ODBC c ORACLE
(Microsoft ODBC for ORACLE)

Делаю,к примеру, выборку:

l_strquery="SELECT NVL(wp.price,0) price FROM ля-ля-ля"
SQLEXEC(gnconnhandle,l_strquery,"tmprezult")

Проблема в том, что значение price - цена товара с копейками.
Допустим 53.48

В результате же получается 53. Копейки пропадают.
Вернее они округляются.

Причем замена NVL(wp.price,0) на NVL(wp.price,0.00) ничего не дает.
Помогает только если убрать NVL.
Если сделать BROWSE полученного tmprezult, то при попадании курсора
на поле копейки пропадают.
Есть подозрение на региональные настройки.
Похоже проблемы с разделителями.

Причем на любой ОС
С уважением,
...
Рейтинг: 0 / 0
18.11.2004, 11:54
    #32788738
AleksMed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
А что у нас в SET DECIMAL?
...
Рейтинг: 0 / 0
18.11.2004, 11:57
    #32788751
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
SET DECIMAL по умолчанию - 2
В источнике тоже 2 знака после запятой
...
Рейтинг: 0 / 0
18.11.2004, 12:04
    #32788780
Stilet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
есть два пути
1. sqle(handl,[select to_char(nvl(fff,0))],[cur1])

2. sqle(handl,[select to_char(nvl(fff,0)) as nv],[cur1])
ALTER TABLE TableName1 ALTER COLUMN nv(10,2)
...
Рейтинг: 0 / 0
18.11.2004, 12:09
    #32788795
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Должен быть третий путь.
Мне думается,что проблемы связаны с региональными
настройками. Потому что с полями типа D тоже не все гладко.
...
Рейтинг: 0 / 0
18.11.2004, 12:38
    #32788898
Stilet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Если это были бы регионаальные настройки, то дробная часть пропала бы во всех полях, а она пропадаете только в

select nvl(p1,0) p1,(select max(p2) from t2 where t2.p1=t1.p1) p2 from p1

лично я сначала создаю таблицу нужной структуры

create cursor cur1 (p1(n(10,2),p2(n1,2)) )
retval=sqle(hndl,[select nvl(p1,0) p1,(select max(p2) from t2 where t2.p1=t1.p1) p2 from p1],[cur2])

sele cur1
append from dbf([cur2])
...
Рейтинг: 0 / 0
18.11.2004, 13:16
    #32789031
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Зайди в свой DSN и сними птичку с пункта:

Use regional settings when outputting currency, numbers, dates, and times
...
Рейтинг: 0 / 0
18.11.2004, 13:26
    #32789065
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Это я уже читал!
Нету у меня такой строчки в ODBC.
По крайней мере на ХР.
...
Рейтинг: 0 / 0
18.11.2004, 13:38
    #32789101
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Возможно, для ODBC-драйвера Oracle эта фраза звучит по другому (такая фраза в ODBC-дравере MS SQL), но у тебя именно проблемы с настройкой ODBC. Явно используются региональные настройки и явно в DSN.

Вот этот симптом:
miv32Если сделать BROWSE полученного tmprezult, то при попадании курсора на поле копейки пропадают.
Говорит о том, что в поле типа Numeric записаны символы не являющиеся числами, знаком "минус" или точкой. А такое случается именно в ситуации использования региональных настроек в DSN-соединении.
...
Рейтинг: 0 / 0
18.11.2004, 13:58
    #32789159
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Оно и понятно :(
А рецепт?
В DSN есть только одна галка - Использовать стандарт дня недели.
...
Рейтинг: 0 / 0
18.11.2004, 14:26
    #32789247
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Я с Oracle не работал. Поэтому ничего посоветовать не могу
...
Рейтинг: 0 / 0
18.11.2004, 14:30
    #32789266
LightWarrior
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
может есть версия драйвера ODBC поновее...
...
Рейтинг: 0 / 0
18.11.2004, 14:55
    #32789342
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Да ODBC вроде свежие.
Надо,конечно, посмотреть.
Будем искать,спасибо.
...
Рейтинг: 0 / 0
19.11.2004, 00:43
    #32790293
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Hi miv32!

Не судьба - кривой этот драйвер - он для всех функций, и вообще для любых
выражений, которые будут числовыми, выставялет тип поля в N(20,0) - даже для
банальнейшего SELECT 1/100 AS nTest FROM Dual - конечно физически там
хранится именно 0.01 - но достать это проблематично (тут только совет с
APPEND FROM поможет).
Можно использовать Oracle ODBC Driver - но с ним другие тараканы - обычно на
сервере установлены цифровые разделители в ",." - т.е. запятая отделяет
дробую часть, а точка - тысячи, миллионы и т.п. - это вызывает проблемы при
передаче просто поля с сервера в фокс - именно такие как у тебя с
функцией - зато эта проблема лечится через SQLEXEC(m.lnHandle,"ALTER SESSION
SET NLS_NUMERIC_CHARACTERS = '. '") - после этого простой доступ к полям
начинает работать корректно, ну а функции - для них этот драйвер выбирает
тип B (Double) с числом десятичных знаков соответствующим текущей установке
SET DECIMALS TO - но особенности типа Double в том, что даже если он не
показывает часть дробного числа, он его не теряет - т.е. при вычислениях
будет учтено полное значение (с возможно невидимой дробной частью).
Кстати в Oracle драйвере есть и другие полезные примочки - например он умеет
преобразовывать возвращаемый из ХП REF CURSOR в обычный курсор, умеет
конвертировать массивы в наборы данных (на фоксе это опять же курсором
будет).
Кстати ты не указал ни версию сервера, ни версию Oracle клиента, ни версию
MS драйвера, ни версию фокса :( А это всегда очень важная информация.

Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
19.11.2004, 06:46
    #32790359
Stilet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
По поводу ораклвого драйвера,
у нас не получилось вытаскивать значения переменных

sd={..}
retval=sqle(hndl,[begin select sysdate into ?@sd from dual;end;])

а микрософт тащит без проблем.

а по поводу преобразования оракловых курсоров в фоксовые таблицы, как это делается!!!?
...
Рейтинг: 0 / 0
19.11.2004, 10:49
    #32790710
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Hi Igor Korolyov
Версия Оракла:
Release 8.1.6.0.0 - Production on Fri Nov 19 10:30:58 2004

Версия фокса: - 8.0

Версия Windows XP SP1

Почитал я вчера доку по Ораклу.
И про параметер NLS_NUMERIC_CHARACTERS я прочитал.
Его надо прямо прописать в реестр.
Вчера попробовал - не получилось.
Щас поколдую
Спасибо за помощь!
С уважением.
...
Рейтинг: 0 / 0
19.11.2004, 11:53
    #32790899
miv32
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Еще раз добрый день!
Вроде все заработало.
Причем оказалось достаточным
сменить ODBC драйвер с Microsoft ODBC driver
на Oracle ODBC driver.
...
Рейтинг: 0 / 0
20.11.2004, 01:53
    #32792453
Igor Korolyov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQLEXEC
Hi miv32!

В "реестр прописать" - это значит глобально поменять парметры - так не
всегда возможно - обычно к базе много разных программ коннектится, и
некоторым может не понравится новый формат. ALTER SESSION же при абсолютно
аналогичном эффекте является сугубо локальной настройкой - т.е. влияет лишь
на твою коннекцию.

2 Stilet

Твой пример у меня не работает ни с одним драйвером - выдаёт "Type
conversion is not supported for output parameters (Error 1501)" - лчевидно
из-за пустой даты. А вот заменив декларацию переменной на sd=DATE() или
sd=DATETIME() - достигается желаемый результат - опять же и в MS и в Oracle
драйверах.
WinXPSP2 (локальная база)
Oracle 8.1.7.0.0
MS драйвер версии 2.575.1117.0
Oracle драйвер версии 8.01.07.00
VFP8 SP1 VFP9 Public Beta.

Насчёт возврата REF CURSOR-а, то вот примерчик:

На сервере:
[SRS]
CREATE OR REPLACE PACKAGE CustomerByID AS
Type RetCursor Is Ref Cursor;
Procedure ReturnCursor(
nKeyID IN number,
pCursor OUT RetCursor);
END;
/
CREATE OR REPLACE PACKAGE BODY CustomerByID AS
Procedure ReturnCursor(
nKeyID IN number,
pCursor OUT RetCursor) is
Begin
open pCursor for
select * FROM xxxx where yyyy > nKeyID;
End;
END;
/
[/SRS]
На клиенте:
[SRS]SQLEXEC(lnHandle, "{CALL CustomerByID.ReturnCursor(123)}")[/SRS]
В строке коннекта НЕОБХОДИМО разрешить конвертацию REF курсоров - это
параметр RST=T; Ну а найти в окне конфигурации (если не писать руками
ConnectionString) думаю труда не составит :)

Из документа RelNotes:

ODBC 8.1.5.3.0
Enhanced our implementation of returning result sets from procedure calls.
The refcursor parameters can be omitted from the procedure call. This was
done to be consistent and compatible with other ODBC implementations.
Как я понимаю БЕЗ этого в фоксе сделать запрос AFAIK невозможно - надо
указывать Out параметр с непонятно каким типом :( А вообще фишка судя по
документу появилась в
ODBC 8.0.5

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


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