:: Visual Foxpro, Foxpro for DOS
Нужна помощь (QueryExpress+vfpoledb+dbf)
oudod
Автор

Сообщений: 6
Дата регистрации: 03.12.2017
Добрый день !

Есть база на VFP 9.0. Есть потребность по необходимости получать данные в XML.
Опыта работы с VFP -> 0. Спросить рядом некого.

Пытаюсь с использованиям связки QueryExpress+vfpoledb получить желаемый результат.
Получилось подключиться базе и сделать не сложные запросы.
Пробовал сделать такой запрос:

USE registr;
CURSORTOXML("registr","lcXML",1,0,0,"1");
STRTOFILE(m.lcxml,"d:\registr.xml")

Ошибок не выдает;
Выводит список строк;
НО файл registr.xml не создается.

Буду благодарен за любую помощь !
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Надо посмотреть список поддерживаемых команд и функций в фоксовском провайдере.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)




Исправлено 1 раз(а). Последнее : PaulWist, 03.12.17 21:47
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
oudod
Автор

Сообщений: 6
Дата регистрации: 03.12.2017
PaulWist
Надо посмотреть список поддерживаемых команд и функций в фоксовском провайдере.

Действительно, STRTOFILE() - Unsupported Function.

Сделал такой запрос:

use registr;
CursorToXML( "registr", "d:\registr.xml", 1, 512, 10, "1" )

Ошибок не выдает;
Выводит список строк;
НО файл registr.xml не создается.

Буду благодарен за любую помощь !
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
PaulWist

Сообщений: 14618
Дата регистрации: 01.04.2004
Точку с запятой в первой строке надо убрать (в фоксе это продолжение строки, а не конец строки)


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
Pliskin

Сообщений: 2959
Откуда: Новосибирск
Дата регистрации: 19.11.2003
PaulWist
Точку с запятой в первой строке надо убрать
Да и во второй тоже надо!
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
oudod
Автор

Сообщений: 6
Дата регистрации: 03.12.2017
Pliskin
PaulWist
Точку с запятой в первой строке надо убрать
Да и во второй тоже надо!

...убрал точку с запятой.

use registr
cursortoxml("registr","d:\registr.xml", 1, 512, 0, "1")

вышла ошибка - Command contains unrecognized phrase/keyword.
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
msdn.microsoft.com
С чего вы взяли что провайдеру можно передавать произвольные команды?
Большой список поддерживаемых команд в статье хелпе - это команды которые можно использовать в хранимых процедурах и/или триггерах. А вовсе не то что можно посылать из клиентского приложения как допустимую команду. Или, тем более, как батч (набор команд).
Напишите нужный код в виде хранимой процедуры и вызывайте. Кстати, не советую выводить результат "в файл".


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
oudod
Автор

Сообщений: 6
Дата регистрации: 03.12.2017
Igor Korolyov
msdn.microsoft.com С чего вы взяли что провайдеру можно передавать произвольные команды?
Большой список поддерживаемых команд в статье хелпе - это команды которые можно использовать в хранимых процедурах и/или триггерах. А вовсе не то что можно посылать из клиентского приложения как допустимую команду. Или, тем более, как батч (набор команд).
Напишите нужный код в виде хранимой процедуры и вызывайте. Кстати, не советую выводить результат "в файл".

Игорь, спасибо за комментарий.
Я просто ищу вариант с минимальными затратами/потерями...
А вариант с EXECSCRIPT( ) или ТОЛЬКО хранимые процедуры ?
Если не сложно поясните Ваше предупреждение начет "в файл".
Спасибо.
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Можно и с execscript() - главное аккуратно его внутренности написать, отладить (лучше всего в фоксе ), не забыть при помощи CAST "причесать" возвращаемое значение - т.к. в этом случае нужно будет memo поле, в простое "строковое" скорее всего XML банально не поместится.
Можно и вообще напрямую поставить вызов cursortoxml() в качестве выражения в список выбора select (тогда в простом случае не нужно никаких use - алиас "той же таблицы" будет доступен) - но тогда не получится без файла обойтись.

В файл писать (если цель просто в получении данных - т.е. строки с xml-ем) это лишнее звено, при том ещё и из контекста провайдера...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
oudod
Автор

Сообщений: 6
Дата регистрации: 03.12.2017
Igor Korolyov
Можно и вообще напрямую поставить вызов cursortoxml() в качестве выражения в список выбора select (тогда в простом случае не нужно никаких use - алиас "той же таблицы" будет доступен) - но тогда не получится без файла обойтись.В файл писать (если цель просто в получении данных - т.е. строки с xml-ем) это лишнее звено, при том ещё и из контекста провайдера...

Игорь, если Вас не затруднит, покажите как должен выглядеть запрос (execscript()+select+cursortoxml()) с учетом Ваших замечаний и предложений.
XML-файл нужен для обработки в другой среде. Спасибо еще раз за Ваше участие.



Исправлено 1 раз(а). Последнее : oudod, 04.12.17 15:35
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Ну у меня нет никаких QueryExpress-ов, а чисто из самого же фокса через этот провайдер это выглядит примерно вот так:
loCon = CREATEOBJECT("ADODB.Connection")
* предполагаем что требуются данные из таблицы test, и она находится в БД test.dbc
* для free таблиц строка подключения чуть другая - там путь к папке указывается.
loCon.ConnectionString = "Provider=vfpoledb;Data Source=D:\Test\test.dbc;"
loCon.Open()
* XML В файл
* На самом деле возвращаемый рекордсет не очень интересен - там будет просто числовое поле с длинной созданного файла.
* Но можно проверить loRS.EOF и увидеть что таблица пуста - XML при этом всё одно будет создан из-за особенностей работы SQL движка фокса
loRS = loCon.Execute([SELECT CURSORTOXML("test", "d:\registr.xml", 1, 512+16, 0, "1") FROM test WHERE RECNO()=1])
* Просто текст XML-я вернуть.
loRS = loCon.Execute([SELECT CAST(EXECSCRIPT('CURSORTOXML("test", "lcOut", 1, 16, 0, "1")'+CHR(13)+CHR(10)+'RETURN m.lcOut') AS Memo) res FROM test WHERE RECNO()=1])
* Данные в одном единственном поле одной единственной записи - если записи в принципе есть в таблице.
? loRS.Fields("res").Value
* Этим способом не получить "пустой" (только со схемой) XML - просто потому что в рекордсете не будет записей
* Но в принципе можно делать сам запрос к другой таблице - где гарантированно имеются записи,
* оставив внутри скрипта ссылку на требуемую "пустую" таблицу.
* Но тогда код для execscript нужно сильно усложнять.
Каким образом нужно собирать строки чтобы там не перемешивались разные ограничители для твоей среды, я не в курсе. В фоксе все три способа ввода строковых литералов взаимозаменяемы - и одинарные, и двойные кавычки и квадратные скобки - поэтому для "бутерброда" из строки содержащей SELECT содержащей EXECSCRIPT содержащей строку с командами/функциями, в свою очередь содержащими строковые параметры я применил все 3 вида ограничителей. Ну и CHR(13)+CHR(10) - фоксовый вариант указания "перевода строки" - таким образом в фоксе отделяются друг от друга команды - не через ;

P.S. Я везде добавил к "флагам" CURSORTOXML 16 - для указания в xml той же кодировки в какой находится сама таблица. Можно вместо этого использовать флаг 48 - тогда данные будут перекодированы в utf-8. Оставлять "как есть" не стоит - фокс пропишет в качестве кодировки 1252, хотя сами данные запишет "как есть" - а это, естественно, неправильно.

P.P.S. Ну и да, само условие WHERE RECNO()=1 "нехорошее" - если вдруг в таблице первая физически запись будет удалена, то второй вариант ничего не вернёт... Первый то всё одно создаст файл - даже если записей в таблице нет вообще - фокс делает "тестовый прогон" выражений в списке полей для определения типов/размеров полей создаваемого курсора - как побочный эффект для такого случая сработает и CURSORTOXML с записью в файл...
Впрочем, всяко лучше сделать таки ХП в фоксовой базе, и вызывать именно напрямую функцию а не извращаться с хитрыми обёртками внутри функций в SELECT...


------------------
WBR, Igor




Исправлено 2 раз(а). Последнее : Igor Korolyov, 04.12.17 17:38
Ratings: 0 negative/0 positive
Re: Нужна помощь (QueryExpress+vfpoledb+dbf)
oudod
Автор

Сообщений: 6
Дата регистрации: 03.12.2017
Игорь, БОЛЬШОЕ СПАСИБО за пример !

Буду экспериментировать.

PS - Query Express is a simple Query Analyzer: www.albahari.com



Исправлено 1 раз(а). Последнее : oudod, 05.12.17 18:24
Ratings: 0 negative/0 positive


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

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

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