powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / использование COPY TO
11 сообщений из 11, страница 1 из 1
использование COPY TO
    #33128557
KTN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
KTN
Гость
Есть результат выполнения SQL запроса в созданном курсоре.
При использовании "Copy to" равно как и export изменяется значение точности поля типа Numeric в результирующем файле, т.е. в результирующем файле получается поле типа Numeric с нулевой точностью - N(20)
Привожу кусок текста:

create CURSOR c_Kart_saldo(user_id N(10),;
billing_id N(10),;
saldo N(15,2);
)

cod=sqlexec(nora,sql_saldo_ab,'c_Kart_saldo')

IF cod>0
COPY TO saldo_nas FOX2X as 866
endif
Вопрос: как сделать так, чтобы точность сохранялась?
...
Рейтинг: 0 / 0
использование COPY TO
    #33128590
w3d
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
CREATE TABLE qwert (ii numeric ( 10 , 3 ))
INSERT INTO qwert (ii) VALUES ( 200 . 35 )
INSERT INTO qwert (ii) VALUES ( 100 )
INSERT INTO qwert (ii) VALUES ( 500 . 00 )
INSERT INTO qwert (ii) VALUES ( 33 . 33 )
SELECT * FROM qwert
COPY TO c:\temp\ 1234 .dbf TYPE FOX2X
Точность сохраняется.
Может, 15 разрядов ( saldo N(15,2);) не хватает?
...
Рейтинг: 0 / 0
использование COPY TO
    #33128616
leaf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а к чему это создание курсора ?
разве sqlexec(nora,sql_saldo_ab,'c_Kart_saldo')
его не перетрет?
обработайте курсор напильником до требуемых размеров после получения его от указаной команды
...
Рейтинг: 0 / 0
использование COPY TO
    #33130171
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi KTN!

Кривой ODBC драйвер - это часом не Oracle (если по названию переменной nora судить :)) Если так, то используй Oracle-вский ODBC драйвер, а не MS-ный (он вообще жутко криво работает с вычисляемыми полями). Дабы решить проблему с десятичной точкой при работе с Oracle сделай ПОИСК по данному разделу. Это всего одна команда ALTER SESSION :)

А так вполне справедливо замечено, что SQLEXEC() банально закрывает старый курсор, он вовсе и не должен в него "добавлять" записи, или "использовать структуру".

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
использование COPY TO
    #33132556
KTN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
KTN
Гость
Igor Korolyov

Вы совершенно правы, действительно нужно затолкать в файл результат выполнения SQL запроса к ORACL_у.
Спасибо за наводку. Попытаюсь раздобыть ORACL_овый ODBC.
...
Рейтинг: 0 / 0
использование COPY TO
    #33135036
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi KTN!

Он устанавливается вместе с Oracle Client - в зависимости от версии либо "напрямую" указывается Oracle ODBC Driver, либо более общее "Windows tools" или как-то так (там ещё и Ole DB провайдер, и oo4o и ещё что-то в одной куче/чекбоксе выбора).
НО дабы не мучиться с проблемами этого драйвера сделай всё-же ПОИСК!!!

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
использование COPY TO
    #33139472
KTN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
KTN
Гость
Hi, Igor Korolyov
В результате "поиска" и проб предложенных вариантов оправдало себя
полностью только следующее предложение:
--------------------------------------------------------------------------
StiletЕсли это были бы регионаальные настройки, то дробная часть пропала бы во всех полях, а она пропадаете только в

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])
------------------------------------------------------------------------------
Отработал текст:
Create dbf aaa (User_id N(12,0), billing_id N(8,0),saldo N(12,2))

cod=sqlexec(nora,sql_saldo_ab,'c_Kart_saldo')
IF cod>0
sele aaa
append from dbf([c_Kart_saldo])
COPY TO Saldo_nas FOX2X as 866
endif
----------------------------------------------------------------------------

СПАСИБО ВСЕМ!
...
Рейтинг: 0 / 0
использование COPY TO
    #33141701
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi KTN!

Всё-же ты не всё нашёл... Да, в MS ODBC драйвере есть проблема - он результаты всех вычислений (в частности функций - как у тебя) представляет в виде N(20,0) - причём ФИЗИЧЕСКИ он таки десятичную точку шлёт - но описанный в заголовку курсора тип не позволяет увидеть дробную часть.
в Oracle ODBC драйвере же такие запросы отдают корректный тип - B (aka Double) - этот тип замечателен тем, что даже если он описан как B(0) то всё равно мы НЕ теряем доступа к дробной части. единственная проблема - это то что часто (уж не знаю почему так) по умолчанию сервер шлёт число с разделителем не точкой, а запятой - и такое число попав в DBF/курсор ведёт себя неадекватно - то видна дробная часть, а то её нету - лечится через ALTER SESSION SET NLS_NUMERIC_CHARACTERS '. ' если мне не изменяет склероз - это точно есть на форуме...

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
использование COPY TO
    #33147136
KTN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
KTN
Гость
Hi, Igor Korolyov!

Об ORACLE ODBC мне придется забыть - велят работать с MS ODBC.
Что-то отработало, но результата не видно - программа свалилась с кодом 1581 (по поводу NULL значений).
Вразумите меня, пожалуйста, как с ними поступить?
В принципе ими можно попуститься (IS NOt NULL), но все же мне нужен полный об"ем.
Текст в prg:

sql_saldo_ab="ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '. ' "+;
"SELECT ss.billing_id,u.user_id, ss.saldo "+;
"FROM t_users u, t_services s, t_saldo ss "+;
"WHERE (u.user_id = ss.user_id and u.dept_id=26341715 and u.iscorp='N') "+;
"and ss.BILLING_ID=200505 and (u.user_id=s.user_id and s.svctype='0')"

c_Kart_saldo=''

cod=sqlexec(nora,sql_saldo_ab,'c_Kart_saldo')

IF cod>0
COPY TO Saldo_nas FOX2X as 866
endif


Подскажите, пожалуйста, может еще что неверно?
...
Рейтинг: 0 / 0
использование COPY TO
    #33149066
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi KTN!

C MS драйвером ты нормальные типы полей не получишь никак. Придётся извращаться с копированием в промежуточный dbf и правкой его на низком уровне (просто COPY TO насколько я помню НЕ решает проблему - дробная часть теряется). Указанный ALTER SESSION этому драйверу по барабану будет. Если тебе вместо NULL нужны какие-то значения (например 0) то используй NVL() в запросе (эта функция есть в Oracle). А вообще проблема с NULL не возникла бы, если бы ты корректно описал поле принимающей таблицы.

Posted via ActualForum NNTP Server 1.2
...
Рейтинг: 0 / 0
использование COPY TO
    #33149114
KTN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
KTN
Гость
Hi, Igor Korolyov!
Спасибо за внимание к моей проблеме.
Судя по всему придется возвращаться к старому алгоритму:
позаписно тащить из курсора все записи в файл нужной структуры.
Работает это значительно медленнее и текст проги становитсь
громоздким. Хотелось как лучше, получилось как всегда - топорно,
но работает.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / использование COPY TO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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