powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос к курсору -> must be created with SELECT ... INTO TABLE
13 сообщений из 13, страница 1 из 1
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32542636
Moleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть файл aaa.dbf

Делается:
select * from aaa where name='M' into cursor zzz

Результат курсор zzz

Потом:
select * from zzz where name='Mo' into cursor xxx

Результат: "<cursor>" must be created with SELECT ... INTO TABLE.

Вопрос: Почему так, если на других машинах работает.
Установлен FoxPro6.0
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32542662
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому, чо при определенных обстоятельствах, вместо создания курсора как временной таблицы иногда таблица источник просто переоткрывается в другой рабочей области с наложенным фильтром. По таким "отфильтрованным" таблицам недопустимо делать повторный запрос. Чтобы этого избежать надо давать опцию NOFILTER:

select * from aaa where name='M' into cursor zzz NOFILTER

select * from zzz where name='Mo' into cursor xxx

Подробнее читай здесь

http://]http://www.foxclub.ru/kb/index.php?sid=24056&aktion=artikel&rubrik=001&id=6&lang=ru

Раздел "Курсор"
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32542666
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32542743
Moleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извините, а можно настройками FoxPro установить по умолчанию NOFILTER?
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32542861
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет. Это одна из опций команды Select-SQL. Причем только в том случае, если запрос отправляется в курсор (INTO CURSOR)
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32542907
Moleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32543567
Moleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все равно не дает мне покоя, почему на других машинах не требуется NOFILTER?
И что это за « …различные условия, от которых этот курсор может иметь разное физическое "воплощение" и разные свойства…»
Можно их как-то обойти? :)
Может поставить FoxPro 7 или там это тоже есть? :(
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32543636
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в VFP 7.0 это уже есть...
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32543984
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А по ссылке сходить - религия не позволяет? Вот выдержка оттуда:

******************************************************************************
(...)

В зависимости от различных условий этот курсор может иметь разное физическое "воплощение" и разные свойства

Если SQL-запрос полностью оптимизируем, то вместо создания нового файла будет просто открыта та же самая таблица с наложенным на нее фильтром. Зачастую это очень неприятная неожиданность. Проверить, чем же физически является сформированный курсор, можно используя функцию DBF()

Код: plaintext
1.
  SELECT * FROM MyTable INTO CURSOR TmpTable  
  ?DBF('TmpTable')   


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

Если Вы хотите при любых запросах быть уверенными, что курсор - это именно временная таблица, а не исходная таблица с наложенным фильтром, то Вам следует добавить опцию NOFILTER

Код: plaintext
  SELECT * FROM MyTable INTO CURSOR TmpTable NOFILTER  


Эта опция появилась только в 5 версии Visual FoxPro, хотя там она еще не была документирована. В более ранних версиях необходимо добавлять фиктивные условия или признаки группировки, чтобы исключить возможность оптимизации.

Однако если курсор - это временная таблица, то это еще не значит, что эта временная таблица будет непременно физически расположена на диске. Вполне возможно, что вся временная таблица целиком поместится в оперативную память. Т.е. функция DBF('TmpTable') будет исправно показывать некий временный файл, но попытка найти его физически на диске окончится неудачей и функция FILE(DBF('TmpTable')) вернет .F.

Правда расположение временной таблицы целиком в памяти ни в коем случае не помешает работе с этой временной таблицей. Собственно, в подавляющем большинстве случаев Вас и не должно заботить где физически расположена та или иная таблица.
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32543989
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если говроить конкретно о запросе

select * from aaa where name='M' into cursor zzz

то будет наложен фильтр, если существует индекс по полю name и этот индекс используется в rushmore-оптимизации данного запроса.

Переход на любую другую версию ничего не даст. Срособ работы один для всех.
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32544057
Moleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Статью я читал, спасибо очень интересная и много что я узнал.

Но меня интересует: почему на ОДНИХ машинах, где установлен FoxPro, после запроса ВСЕГДА формируется временная таблица, а на других НЕТ. И как на результат запроса может зависеть, на какой машине он выполняется.

P.S. По полю name существует индекс. :)
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32544097
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это зависит не от машины, а от уровня оптимизации запроса. Уровень оптимизации можно проверить, используя функцию SYS(3054).

В частности, на него влияюте еще такие факторы:

-) Текущая настройка SET DELETED
-) Если используется SET DELETED ON, то факт наличия индекса по выражению deleted()
-) Факт совпадения текущей настройки SET COLLATE и значение IDXCollate() индексов

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

Поэтому, просто возьмите за правило, всегда, если Вы используете опцию INTO CURSOR, ставить дополнительную опцию NOFILTER.
...
Рейтинг: 0 / 0
Запрос к курсору -> must be created with SELECT ... INTO TABLE
    #32544132
Moleg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо, посмотрю в данном направлении.

Что надо ставить NOFILTER это я понимаю, но мне в наследство осталось много программ на FoxPro, где нет NOFILTER. Несколько уже отказались работать – пришлось срочно переписывать. Вот мне и хотелось решить данную проблему одним флажком. :)

Еще раз огромное спасибо за помощь.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос к курсору -> must be created with SELECT ... INTO TABLE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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