Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
Добрый день! Есть соединение через 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, то при попадании курсора на поле копейки пропадают. Есть подозрение на региональные настройки. Похоже проблемы с разделителями. Причем на любой ОС С уважением, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 11:38 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
А что у нас в SET DECIMAL? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 11:54 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
SET DECIMAL по умолчанию - 2 В источнике тоже 2 знака после запятой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 11:57 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
есть два пути 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 12:04 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
Должен быть третий путь. Мне думается,что проблемы связаны с региональными настройками. Потому что с полями типа D тоже не все гладко. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 12:09 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
Если это были бы регионаальные настройки, то дробная часть пропала бы во всех полях, а она пропадаете только в 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]) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 12:38 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
Зайди в свой DSN и сними птичку с пункта: Use regional settings when outputting currency, numbers, dates, and times ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 13:16 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
Это я уже читал! Нету у меня такой строчки в ODBC. По крайней мере на ХР. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 13:26 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
Возможно, для ODBC-драйвера Oracle эта фраза звучит по другому (такая фраза в ODBC-дравере MS SQL), но у тебя именно проблемы с настройкой ODBC. Явно используются региональные настройки и явно в DSN. Вот этот симптом: miv32Если сделать BROWSE полученного tmprezult, то при попадании курсора на поле копейки пропадают. Говорит о том, что в поле типа Numeric записаны символы не являющиеся числами, знаком "минус" или точкой. А такое случается именно в ситуации использования региональных настроек в DSN-соединении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 13:38 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
Оно и понятно :( А рецепт? В DSN есть только одна галка - Использовать стандарт дня недели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 13:58 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
Я с Oracle не работал. Поэтому ничего посоветовать не могу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 14:26 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
может есть версия драйвера ODBC поновее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 14:30 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
Да ODBC вроде свежие. Надо,конечно, посмотреть. Будем искать,спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2004, 14:55 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 00:43 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
По поводу ораклвого драйвера, у нас не получилось вытаскивать значения переменных sd={..} retval=sqle(hndl,[begin select sysdate into ?@sd from dual;end;]) а микрософт тащит без проблем. а по поводу преобразования оракловых курсоров в фоксовые таблицы, как это делается!!!? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 06:46 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
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 я прочитал. Его надо прямо прописать в реестр. Вчера попробовал - не получилось. Щас поколдую Спасибо за помощь! С уважением. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 10:49 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
Еще раз добрый день! Вроде все заработало. Причем оказалось достаточным сменить ODBC драйвер с Microsoft ODBC driver на Oracle ODBC driver. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.11.2004, 11:53 |
|
||
|
SQLEXEC
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.11.2004, 01:53 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32789065&tid=1595372]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
| others: | 212ms |
| total: | 348ms |

| 0 / 0 |
