:: Вопросы по 1С
Создание курсоров через ADO
nikepopov
Автор

Сообщений: 10
Дата регистрации: 14.03.2018
Строка подключения:
Driver={Microsoft Visual FoxPro Driver};UID=;PWD=;SourceDB=D:\Base;SourceType=DBC;Exclusive=NO;BackgroundFetch=Yes;Collate=Machine;Null=Yes;Deleted=No;

Данные драйвера:
Provider = MSDASQL.1
Version = 10.0

Задача:
Перетаскиваю данные одной известной системы на FoxPro на другую известную систему. Для фильтра требуется таблицу передать на сторону FoxPro (в курсор). Для этого выполняю последовательно следующие запросы к FoxPro (1 команда - 1 запрос):
CREATE CURSOR Table1 (ID C(4));
INSERT INTO Table1 (ID) VALUES("0000") -- тут вываливается ошибка
INSERT INTO Table1 (ID) VALUES("0001")
INSERT INTO Table1 (ID) VALUES("0002")
INSERT INTO Table1 (ID) VALUES("0003")

Ошибка:
[Microsoft][ODBC Visual FoxPro Driver]File 'table1.dbf' does not exist.

Думал, что я неправильно что-то делаю с INSERT. Попробовал выполнить команды:
CREATE CURSOR Table1 (ID C(4));
SELECT Table1.ID FROM Table1 AS Table1 -- тут вываливается ошибка

Ошибка (она же):
[Microsoft][ODBC Visual FoxPro Driver]File 'table1.dbf' does not exist.

Пытался использовать "USE", "FREE TABLE", "READWRITE" (все что нарывал на форумах не разбираясь). Ничего не помогает. Я знаю про обход с "CREATE TABLE" вместо "CREATE CURSOR", но с ним тоже не всё гладко и хотелось бы использовать курсоры.
При том, работает набор запросов:
SELECT abc.ID INTO CURSOR cursor1 FROM abc AS abc
SELECT cursor1.ID FROM cursor1 AS cursor1

То есть в целом, возможность работы с курсорами поддерживается. Запрос на создание курсора проходит. Есть ощущение, что курсор создаётся "не в нужной области" или что-то подобное. Подскажите, пожалуйста, бедолаге куда копать..
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
Для начала попробовать использовать VFPOleProvider.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
nikepopov
Автор

Сообщений: 10
Дата регистрации: 14.03.2018
Попробовал через VFPOleProvider. Такая же история.
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
nikepopov
CREATE CURSOR Table1 (ID C(4));
Что здесь делает знак "точка с запятой"?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
nikepopov
Автор

Сообщений: 10
Дата регистрации: 14.03.2018
Её нет в выполняемых командах. Формирую одну строку выполняемых команд, потом разделяю команды с разделителем ";". Это нужно для визуального просмотра выполняемых запросов (чтобы не в цикле 20 строк смотреть, а видеть все запросы целиком). Забыл когда выкладывал удалить символы.
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Какие курсоры могут быть в рамках ODBC соединения? Делай постоянную таблицу (можно временную - т.е. потом удалять её).
VFP ODBC застрял на 6-й версии. Лучше OLEDB провайдер напрямую использовать. Хотя и там никаких CREATE CURSOR не следует применять - только TABLE.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
nikepopov
Автор

Сообщений: 10
Дата регистрации: 14.03.2018
Я сейчас так и делаю. Просто решение "некрасивое" (по сравнению с курсорами).
Странно, что работают такого характера команды:
SELECT abc.ID AS ID INTO CURSOR cursor1 FROM abc as abc
SELECT cursor1.ID AS ID FROM cursor1 as cursor1

То есть в целом, курсоры доступны. Такая последовательность команд даёт правильный результат. Я естественно пишу упрощённо. В реальной работе у меня используется в JOIN-е по 4-5 курсоров. Так удобно.

При этом следующая команда не вылетает с ошибкой:
CREATE CURSOR cursor1 (ID C(4)).

То есть FoxPro эти курсоры даже создаёт.
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Он то их может и создаёт, вопрос в какой "области видимости" - т.е. когда одно ODBC обращение-вызов перестаёт видеть другое.
Если использовать хранимые процедуры (в т.ч. триггера), тогда внутри такой ХП использование курсора будет вполне нормальным вариантом. Но никто не обещает что между разными вызовами фокс будет сохранять всё состояние - открытые курсоры, созданные глобальные переменные и т.п.
Тем более если нет прямого контроля над последовательностью вызовов функций ODBC АПИ, а используется та или иная "прослойка", в т.ч. MSDASQL


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
nikepopov
Автор

Сообщений: 10
Дата регистрации: 14.03.2018
Я использую один объект "ADODB.Connection", который остаётся "живым" на протяжении всей работы программы. Но для каждой команды использую свой ADODB.Command.

При том, опять же, курсоры, полученные методом "SELECT ... INTO CURSOR" видимы в других запросах, а созданные "CREATE CURSOR" - нет...
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
PaulWist

Сообщений: 14614
Дата регистрации: 01.04.2004
Попробуйте создавать курсоры на основе любой таблицы через select, например

select
cast(null as int) as field1,
cast(null as c(20)) as field2
from Существующая_таблица
where .f.

в принципе почти определение курсора.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
nikepopov
Автор

Сообщений: 10
Дата регистрации: 14.03.2018
Я тоже уже к этому пришёл Но по ощущениям "пошловато" это как-то
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Начнём с того что ты НЕ работаешь с VFPOLEDB, а ходишь через конвертер к ODBC драйверу - что и как он делает - одним авторам известно.

Ну и самое простой - чего ты хочешь то в итоге Ну не работает оно в таком виде - продукт не поддерживается уже много лет как - ODBC драйвер наверное все 20 лет (он 6-й версии остался), провайдер - чуть меньше, но тоже прилично. Никто ничего исправлять не будет - тем более что они (и ODBC и OLEDB) формально никаких CREATE CURSOR поддерживать и не обязаны (хотя по факту внутри ХП работают без проблем, насколько я знаю - ну да там "область жизни" совершенно чётко будет одна и та же - в коде создающем и тут же использующем этот самый курсор).

msdn.microsoft.com

docs.microsoft.com

Где там есть хоть слово про CREATE CURSOR


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
nikepopov
Автор

Сообщений: 10
Дата регистрации: 14.03.2018
Igor Korolyov
Начнём с того что ты НЕ работаешь с VFPOLEDB, а ходишь через конвертер к ODBC драйверу - что и как он делает - одним авторам известно.
Ну и самое простой - чего ты хочешь то в итоге Ну не работает оно в таком виде - продукт не поддерживается уже много лет как - ODBC драйвер наверное все 20 лет (он 6-й версии остался), провайдер - чуть меньше, но тоже прилично. Никто ничего исправлять не будет - тем более что они (и ODBC и OLEDB) формально никаких CREATE CURSOR поддерживать и не обязаны (хотя по факту внутри ХП работают без проблем, насколько я знаю - ну да там "область жизни" совершенно чётко будет одна и та же - в коде создающем и тут же использующем этот самый курсор).

Я в общем то и не спорю, что у меня запросы неадекватные Просто когда за что-то берусь, всегда хочу сделать максимально технологично. Если сам не могу - курю документацию, FAQи и форумы. Ну, если не получается - значит "не шмогла я, не шмогла"

Igor Korolyov
msdn.microsoft.com

docs.microsoft.com

Где там есть хоть слово про CREATE CURSOR

Эти ссылки я уже заучил как отче наш.

Всем спасибо за советы! Остановлюсь, наверное на этом:

PaulWist
select
cast(null as int) as field1,
cast(null as c(20)) as field2
from Существующая_таблица
where .f.
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если ты хочешь сделать по уму - не используй никаких "хитрых приёмов", и тем паче г*нокода, к которому очень приближается такой вот select. Кстати, он будет ReadOnly (и на кой хрен он тебе нужен в таком виде) а сработает ли опция READWRITE, я не знаю

Если есть сам фокс - можешь сделать на нём COM-сервер с нужным функционалом и использовать из 1с (но могут быть проблемы с 64-битностью, и с необходимостью устанавливать или хотя-бы размещать рядом с dll фоксовый рантайм, да и сам com-сервер нужно регистрировать).

Как разновидность первого варианта - сделать не просто COM сервер, а обернуть его в web-service и установить на какой-нить специально выделенной машине - поближе к фоксовой БД и помягче с требованиями к ПО (лучше всего на XP или старинном Windows Server - вполне можно "виртуальном"). Насколько я понимаю с использованием веб-сервисов в 1с нет особых проблем. Из плюсов - сам 1с (особенно если это серверная установка) останется "чистым" - никаких фоксовых компонент на машине не нужно будет держать.

Если хочешь остаться в рамках VFPOLEDB провайдера - можешь просто написать несколько хранимок в dbc (при том даже не обязательно чтобы сами живые данные были в таблицах этого самого dbc контейнера) - в 9-й версии в принципе можно обойтись через XMLTOCURSOR() для приёма "списка" и SETRESULTSET() для возврата собственно конечного результата - внутри кода ХП как раз не проблема будет использовать курсор. Минусы схожие - провайдер только 32-битный, его нужно "устанавливать" там где он будет использоваться (т.е. на том же 1с сервере).

Есть и ещё гораздо более плохие варианты - написать просто exe на фоксе - принимающий к примеру файлы и выдающий данные в файлы же (XML как наиболее универсальный, но и старорежимный dbf подойдёт - его 1c напрямую сможет прочесть и даже записать XBase классом или как там его). Т.е. сложную/тяжелую логику можно таким вот образом сделать, а в 1с чисто формирователи файлов-параметров и читатели файлов-результатов делать.
Или exe который САМ лезет к 1с через тот же коннектор и что надо берёт, что надо выкладывает обратно. Это если можно "инициатором процесса" держать не 1с, а другую сторону. Тут, конечно, потребуется более фундаментальный знаток фокса - чтобы это реализовать (как и для первых вариантов). Только ХП можно рисовать сравнительно слабо понимая фокс (тем более там и сам язык сильно ограничен - скажем объектов/классов нет вообще).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
Foxtrot

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
если речь про 1с, то на кой вся эта лабуда когда оно может работать с дбф напрямую/из коробки


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
spinz

Сообщений: 5263
Дата регистрации: 21.01.2016
Ну щас это не модно

Нужно запилить минимум свою отдельную фабрику классов

Потом на фабрике построить кучу станков для производства станков.

И на энной итерации тех станков запилить ружье, из которого стрелять тоже нельзя.

Так как нужны библиотеки шаблонов для реализации физических условий, при которых ружье вообще может стрелять

И когда вы покажете макет ружья главному командиру, он вам радостно сообщит, что оборудование устарело,
скоро нам завезут новые фабрики фабрик фабрик - и вот тогда то мы начнем разрабатывать спецификации по утверждению планов выпуска чертежей нового ружья.
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Foxtrot
если речь про 1с, то на кой вся эта лабуда когда оно может работать с дбф напрямую/из коробки
- Смотря какие DBF, не все он прожуёт. Про "гениальность" системы требующей русские региональные настройки - да да, не системную локаль, не поддержку 1251, а именно чтобы в качестве форматов дат/чисел стояла "Россия", иначе никакой тебе кириллицы - это я вообще молчу. Тут даже индусы отдыхают

- Смотря какой объём данных. Заливать через XBase миллионы записей для того чтобы в итоге выбрать всего пяток, и так в интерактиве - скажем на ввод чего-либо в какой-либо документ - так себе вариант...

Т.е. можно, но с массой ограничений и нюансов - и не факт что это будет приемлемо.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
spinz
Ну щас это не модно
Эк бомбануло то

Оно то да... Но и "кондовый код" на 100500 страниц единой простынёй без всякого понимания ООП - с кучей глобальных сущностей, связью "всего со всем" и прочими прелестями, которые так любят ненавистники паттернов и ОО подхода... Вызывает желание взять таки настоящее ружьё, и отыскать автора


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
Foxtrot

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
если оно так, то такую задачу так точно не стоит решать
приемлемо или нет это уже ТС скажет, потому как мульонов записей (слава фантазии ИК!) нам не привели


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Создание курсоров через ADO
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Foxtrot
если оно так, то такую задачу так точно не стоит решать
приемлемо или нет это уже ТС скажет, потому как мульонов записей (слава фантазии ИК!) нам не привели

Цитата:
Для фильтра требуется таблицу передать на сторону FoxPro (в курсор)
По моему мнению означает что объём данных таков, что забрать всё и отфильтровать "своими силами" становится накладно...


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 2 (Гостей: 2)

© 2000-2024 Fox Club 
Яндекс.Метрика