powered by simpleCommunicator - 2.0.40     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как создать временную таблицу в оперативке через vfpoledb
24 сообщений из 24, страница 1 из 1
Как создать временную таблицу в оперативке через vfpoledb
    #34722360
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работаю с таблицами 1С (дбф) через vfpoledb.

Все замечательно - но постоянно требуется использовать данные
подзапроса во многих частях основного.

Нет ли возможности выложить подзапрос в некую временную таблицу?
Можно конечно выложить в файл дбф - но это очень медленно.

Вот такой код отрабатывается нормально
Select SC33.ID as ID INTO CURSOR TmpTable NOFILTER

но потом обратиться к TmpTable не получается :(
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34722785
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kiruhaВот такой код отрабатывается нормально
Select SC33.ID as ID INTO CURSOR TmpTable NOFILTER

но потом обратиться к TmpTable не получается :(
А в чем конкретно проблема при обращении?
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34723000
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сначала делаю

Select SC33.ID as ID from sc33 INTO CURSOR TmpTable NOFILTER (в первом посте забыл from в спешке)

Потом пытаюсь использовать курсор

Select TmpTable.ID as ID from TmpTable

Получаю

FAILED! ICommandText::Execute(): File 'tmptable.dbf' does not exist.
Ссесию подключения не прерываю.
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34723243
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Создать файл со скриптом

Код: plaintext
1.
Select SC33.ID as ID from sc33 INTO CURSOR TmpTable NOFILTER 
Select TmpTable.ID as ID from TmpTable

2. Выполнить его через exectscript в OLEDB
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34723456
Wiskas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вообще-то vfpoledb поддерживает EXECSCRIPT(...). Это то, что Вам нужно, подробности в стандартном хелпе, удачи.
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724065
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В командном окне FoxPro команда

EXECSCRIPT('Select SC33.ID as ID from sc33 INTO CURSOR TmpTable NOFILTER '+CHR(13)+'Select TmpTable.ID as ID2 from TmpTable')

выполняется так как хотелось.
Но передаю ее vfpoledb - на выходе :
return_value 1

И вообще - какой бы я скрипт ни писал - на выходе всегда "1" :(
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724098
Sergey Sizov.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что Вы хотели получить от ExecScript? Это его нормальное поведение. Его задача - выполнить код, переданный ему параметром и сообщить об не/успешностисполнения.
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724127
Wiskas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторFAILED! ICommandText::Execute(): File 'tmptable.dbf' does not exist.
Вот это интересней, ссори, что сразу не увидел.
Можно подробнее, как коненнектимся, как выполняемся ?
Меня терзают смутные сомнения, что то, что Вам нужно получить, можно дернуть и без EXECSCRIPT.
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724265
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Wiskas авторFAILED! ICommandText::Execute(): File 'tmptable.dbf' does not exist.
Вот это интересней, ссори, что сразу не увидел.
Можно подробнее, как коненнектимся, как выполняемся ?
Меня терзают смутные сомнения, что то, что Вам нужно получить, можно дернуть и без EXECSCRIPT.

Подключаемся при помощи специальной компоненты через OLEDBData .Строка Соединения
|Provider=VFPOLEDB.1;
|Deleted=Yes;
|Null = Yes;
|Exclusive = No;
|SourceType = DBF;
|Data Source=" ...";
|Mode=ReadWrite;
|Extended Properties="""";
|User ID="""";
|Password="""";
|Mask Password=False;
|Collating Sequence=MACHINE;
|DSN="""""

Команды FoxPro выполняются через oledbcommand

Можно использовать хранимые процедуры.
А временные таблицы как создавать 1С-ники не знают. Поэтому
либо выполняют по нескольку раз один и тот же запрос (в подзапросах),
либо без группирования тянут все на клиента и там уже группируют
при помощи языка.
Как сохранить в ДБФ - известно, но признано неэффективным по времени.
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724286
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Sizov.А что Вы хотели получить от ExecScript? Это его нормальное поведение. Его задача - выполнить код, переданный ему параметром и сообщить об не/успешностисполнения.

Вот и у меня такое впечатление - что он код возвращает флаг успешности/неуспешности.
Но тогда - почему в коммандном окне - все ОК?
И в справке фоксклуба и на MSDN то же самое :

"Возвращаемое значение определяется значением, которое возвращается из указанного программного кода cExpression. Если никакого значения не возвращается, то система Visual FoxPro возвращает, как обычно, = .T. (True)
Функция ExecScript( ), в отличие от Расширенного Макро, обеспечивает такой же эффект, как при вводе нескольких строк программного кода в Командном окне и нажатии клавиши <Enter>."
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724295
Wiskas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
A у Вас там в 1ц ADO или ADO.NET ?
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724330
"Возвращаемое значение определяется значением, которое возвращается из указанного программного кода cExpression

И какого типа может быть результат выражения? И внутри ЕxecScript была попытка что-то вернуть? Какая?
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724377
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WiskasA у Вас там в 1ц ADO или ADO.NET ?

Нет, ADO может использоваться, но не используется - неэффективно, так как приходится
перебирать все строки выборки, при получении данных.

Кажется используется ODBCRecordSet, но это нужно уточнять у автора компоненты.

Из спецификации :
"Если запрос содержит несколько SQL инструкций (multistatement batch),
результаты возвращаются только от первой инструкции.
Однако, на драйвер уходит весь текст запроса
(По спецификации ODBC, будут ли выполнены остальные инструкции в пакете зависит от драйвера.
Для драйвера SQL Server они выполняются), остальные результаты игнорируются. "

Честно говоря не понимаю как это информация поможет проблеме :(
В не зависимости от 1С или не 1С - в foxpro кто нибудь использовал временные таблицы
при соединении через OLeDB ???
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724392
Wiskas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У тебя нет другого выхода кроме как загонять все в RecordSet и имеено перебирать. Только непонятно , зачем тянуть всю таблицу, что за потребность такая.
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724406
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий. "Возвращаемое значение определяется значением, которое возвращается из указанного программного кода cExpression

И какого типа может быть результат выражения? И внутри ЕxecScript была попытка что-то вернуть? Какая?

Если буквально -Таблица. Колонка return_value . Одна строка. Значение 1, тип число.
Но в 1С всегда возвращается таблица, поэтому скорее вернулось просто число 1.
Если ошибка в скрипте - сообщение об ошибке и ничего не возвращает.
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724564
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
WiskasУ тебя нет другого выхода кроме как загонять все в RecordSet и имеено перебирать. Только непонятно , зачем тянуть всю таблицу, что за потребность такая.

Протестировал все на чистом ADO. Строка подключения та же.
rs = ADO.Execute(EXECSCRIPT(" 'Select SC33.code as ID from sc33 INTO CURSOR TmpTable NOFILTER '+CHR(13)+' Select TmpTable.ID as ID2 from TmpTable' ");

Результат - одна запись с
Rs.Fields("return_value").Value=-1

Могу проверять все в обоих вариантах.
Пока результат один :(
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724641
Мой вопрос, видимо, не был понят и не обдуман. ExecScript может вернуть результат выражения . Не команды, а выражения! А результат выражения не может быть таблицей. И результат надо возавращать, то есть использовать Return.
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724765
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.Мой вопрос, видимо, не был понят и не обдуман. ExecScript может вернуть результат выражения . Не команды, а выражения! А результат выражения не может быть таблицей. И результат надо возавращать, то есть использовать Return.

Через Return я могу возвратить только одну переменную простого типа.
А как мне вернуть таблицу?
И почему сам Fox возвращает в командном окне все что надо?
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34724810
Через Return я могу возвратить только одну переменную простого типа.
Вот на это я и намекал. Фокс может вернуть в вызывающую программу только одно значение.

А как мне вернуть таблицу?
А вот над этим надо думать.
[/quot]
И почему сам Fox возвращает в командном окне все что надо?[/quot]
В командном окне он ничего не возвращает. Фокс показывает результат выполнения команд, а не вычисления выражений. При этом команда может вычислять результат какого-то выражения и показывать полученный результат в каком-то зависящем от команды виде.
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34770174
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо Wiskas!

Проблема была решена при помощи
EXECSCRIPT('SELECT * INTO CURSOR ...)
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34770177
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Также и
EXECSCRIPT('SELECT * INTO ARRAY ...)

В документации написано, что в случае курсора
"временная таблица создается в этом случае на диске." А массива - в оперативке.

Но никакой разницы по скорости я не заметил...
?
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34770181
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kiruhaНо никакой разницы по скорости я не заметил...?
Это потому что FoxPro стремится все разместить в памяти. И если таблица очень маленькая то разницы между массивом и таблицей в Вашем случае нет...
...
Рейтинг: 0 / 0
Как создать временную таблицу в оперативке через vfpoledb
    #34770183
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey Ch kiruhaНо никакой разницы по скорости я не заметил...?
Это потому что FoxPro стремится все разместить в памяти. И если таблица очень маленькая то разницы между массивом и таблицей в Вашем случае нет...

О большое спасибо ! :)
Тогда по умолчанию я буду использовать курсор, до этого думал ARRAY.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Как создать временную таблицу в оперативке через vfpoledb
    #39581816
sdjoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kiruha,

Попробуй результат выполнения первого запроса поместить в переменную которую не очищай до последнего. А потом выполняй второй запрос.
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Как создать временную таблицу в оперативке через vfpoledb
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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