powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос и грид
11 сообщений из 11, страница 1 из 1
Запрос и грид
    #32427289
Andrew St
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Каким образом можно результат запроса без помещения его в таблицу, вывести в ворме в виде грида.

Что такое курсор? Как им пользоваться?

можно поподробнее...
...
Рейтинг: 0 / 0
Запрос и грид
    #32427316
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CurSOR - типа Current Set Of Record - ништо иное как обычная табличка временная, кот афтоматически прибиваеца Фоксом при закрытии. Можна его создать через CREATE CURSOR - тада это практически одно и тоже што и таблица, тока с разницей афтоматического удаления с диска. Либа через SELECT-SQL с опцией INTO CURSOR. Тада этот курсор будет тока РидОнли (c VFP70 появилась опция сделать и его РидВрайт) ну и хватит уже - остальное в доках :)
...
Рейтинг: 0 / 0
Запрос и грид
    #32427352
Курсор можно рассматривать как временную таблицу. VFP по возможности размещает курсор в оперативной памяти. При необходимости выполняется свопинг на диск в специальном формате (не DBF). Создать курсор можно двумя способами:

1. SELECT * FROM MyTable INTO CURSOR MyCursor
2. CREATE CURSOR MyCursor (список_полей)

Курсор, созданный по первому варианту, немодифицируемый (только чтение).
Курсор, созданный по второму варианту, модифицируемый. Его можно так же индексировать (т.е. работаем как с обычной таблицей).
Начиная с VFP7 при создании курсора в SELECT..SQL можно использовать ключевое слово READWRITE:
SELECT * FROM MyTable INTO CURSOR MyCursor READWRITE
Созданный по этой команде курсор так же можно модифицировать и индексировать (ранее нужно было использовать CursorSetProp, что достаточно трудоёмко).
Закрыть курсор можно командой
USE IN MyCursor
VFP освободит занимаемую им память.
Для использования курсора в GRID в свойстве RecordSource укажите имя курсора, свойство RecordSourseType установите в 1 (Alias).
Работа с курсором ничем не отличается от работы с обычной таблицей.
Подробнее см. FoxHelp:
CREATE CURSOR - SQL Command
SELECT - SQL Command
...
Рейтинг: 0 / 0
Запрос и грид
    #32427371
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав КлепининПри необходимости выполняется свопинг на диск в специальном формате (не DBF)
CREATE CURSOR creates a temporary table that exists only until it is closed. A temporary table created with CREATE CURSOR can be manipulated like any other table — it can be browsed and indexed, and you can append and modify records.
(с) хельп
Это табличка, тока расширение у нее TMP и название голимое, проверить кот можна ф-цик DBF(). Фокс заточен отлична работать с таблицами и создавать што-то в специальном формате ИМХО глупо было бы. Ведь начиная с FPD20 менюшки, экраны, проекты и прочая представляет из ся обычные таблицы
...
Рейтинг: 0 / 0
Запрос и грид
    #32427381
SSV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSV
Гость
Дополнение: курсор, созданный по 1-му варианту:
Код: plaintext
1.
 1 . SELECT * FROM MyTable INTO CURSOR MyCursor 

без опции ReadWrite можно 1 раз индексировать .
...
Рейтинг: 0 / 0
Запрос и грид
    #32427410
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
индексить - скока угодна. а вот пользовать в кампаудном индексе, то да, толька один тег возможен
...
Рейтинг: 0 / 0
Запрос и грид
    #32427412
to SSV:
без опции ReadWrite можно 1 раз индексировать
Если открыта таблица, из которой сделан SELECT..SQL, и в этой таблице есть поле, по которому выполняется индекстация - то да, VFP для построения индекса использует эту таблицу. В остальных случаях - нет.

to Hel!Riser:
Рекомендую посмотреть содержимое TMP-файла курсора в папке TEMP Windows и найти 1 (одно) отличие от содержимого DBF-файла.
...
Рейтинг: 0 / 0
Запрос и грид
    #32427432
Ruslan Ibraev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообщем в лоаде формы создаёшь курсор. В гриде на форме указываешь Controlsource на этот курсор.
...
Рейтинг: 0 / 0
Запрос и грид
    #32427433
Фотография Hel!Riser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
поскоку файл у мя покашто не получаеца свопнуть, то и смотреть не получица. Однака если есть различие, то оно имхо несущественное, потому как работает USE DBF('MyCursor') IN 0 AGAIN ALIAS MyCursor2 и не кричит, што что-то повреждено.
...
Рейтинг: 0 / 0
Запрос и грид
    #32427495
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Курсор

В очередной раз вспоминается лень американцев и их стремление все сокращать (впрочем, русские здесь ушли еще дальше - могут сказать почти все, используя только несколько специфических слов). Термин "курсор" употребляется сразу в нескольких смыслах в зависимости от контекста.

Курсор - это образ файла DBF открытого в одной из рабочих областей

Курсор - это временная таблица являющаяся результатом выполнения команды Select-SQL

Курсор - это указатель положения индикатора ввода текста с клавиатуры

Ну, последнее определение не очень-то интересно. В том смысле, что здесь все ясно, кроме того, почему этот термин был использован еще и для временных таблиц, ведь слово "cursor" собственно и переводится как "указатель".



Курсор как образ файла DBF
Опять же такое краткое определение не совсем точно, поскольку в этом смысле используется некий специфический объект . Введение этого объекта объясняется необходимостью визуализации таблицы при проектировании форм и отчетов.

Замечу еще, что курсор, как объект, используется не только как образ файлов DBF, но и как образ View. А View и таблица - это не одно и то же.



Курсор как временная таблица
Вот это наиболее употребительное использование данного термина. Собственно есть 2 способа создания таких курсоров

Первый способ - это использование команды CREATE CURSOR . Созданный таким способом курсор будет редактируемым. И это будет именно временная таблица, т.е. она будет автоматически уничтожена в момент закрытия. Ну, про этот способ сказать особо нечего. Здесь нет каких-то проблем и особенностей

Второй способ - это использование опции CURSOR в команде SELECT-SQL. Примерно в следующем синтаксисе

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


Вот этот-то TmpTable и есть курсор

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

Если 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.

Правда расположение временной таблицы целиком в памяти ни в коем случае не помешает работе с этой временной таблицей. Собственно, в подавляющем большинстве случаев Вас и не должно заботить, где физически расположена та или иная таблица.

Еще один немаловажный вопрос связан с тем, что полученные таким образом курсоры нельзя редактировать. Они доступны только на чтение. Начиная с 7 версии Visual FoxPro, для решения этой проблемы появилась специальная опция ReadWrite

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


Использование этой опции позволяет создавать курсор, который можно редактировать. Для более ранних версий FoxPro для того, чтобы курсор можно было редактировать, его следует переоткрыть

Код: plaintext
1.
2.
SELECT * FROM MyTable INTO CURSOR TmpReadTable NOFILTER
USE (DBF('TmpReadTable')) IN  0  AGAIN ALIAS TmpWriteTable
USE IN TmpReadTable 


Переоткрытый таким образом курсор TmpWriteTable уже можно будет редактировать

Курсоры можно индексировать также как и обычные таблицы. Правда, если курсор открыт в режиме только для чтения, то Вы сможете создать для него только один индексный тэг.

Все созданные таким образом курсоры автоматически удаляются с диска (если временный файл физически был создан на диске) в момент их закрытия. Если Вы создали для такого курсора структурный индексный файл, то этот файл также будет автоматически удален в момент закрытия курсора.



Формрование имени курсора в команде Select-SQL
Это не такой простой вопрос, как может показаться. Проблема здесь в том, что имя курсора - это фактически алиас (alias) временной таблицы. Но в FoxPro в одном сеансе данных не может быть открыто 2 таблиц с одинаковыми алиасами.

Курсор всегда создается на машине клиента, поэтому конфликтов с другими пользователями можно не опасаться. Более того, даже если запущен дважды один и тот же проект на одной машине все равно не будет конфликта связанного с одинаковыми именами курсоров, поскольку они открыты в разных сеансах данных. Конфликт возможен, если Вы создаете несколько курсоров с одним и тем же именем в одном сеансе данных

Ну, например, Вы открыли 2 формы использующих Default DataSession и в обеих формах создали курсор с одним и тем же именем. В этом случае, курсор созданный позднее затрет курсор созданный ранее. При этом настройка SET SAFETY не играет никакой роли. Курсор будет пересоздан молча. Без каких-либо дополнительных запросов.

Избежать подобных конфликтов можно несколькими способами

Открывать формы и отчеты только в Private DataSession

Самостоятельно следить за уникальностью имен курсоров

Использовать функцию для генерации уникальных имен файлов

Последний вариант кажется наиболее предпочтительным. Однако тут следует быть осторожным. Дело в том, что в описании к FoxPro для генерации уникальных имен файлов предлагается использовать следующую функцию

Код: plaintext
lcCursorName=SubStr(SYS( 2015 ), 3 , 10 )


Проблема в том, что функция SYS(2015) может содержать в возвращаемом значении, как буквы, так и цифры. Это значит, что при использовании выделения строки по SubStr() Вы вполне можете получить первым символом цифру. А использование в качестве имени переменной цифры в синтаксисе FoxPro недопустимо и Вы неожиданно получите сообщение о синтаксической ошибке. Чтобы этого избежать следует либо принудительно подмешать букву

Код: plaintext
lcCursorName='t'+SubStr(SYS( 2015 ), 3 , 10 )


Либо вообще не выделять строку

Код: plaintext
lcCursorName=SYS( 2015 )


Соответственно выполнение запроса станет выглядеть так:

Код: plaintext
1.
2.
LOCAL lcCursorName
lcCursorName=SYS( 2015 )
SELECT * FROM MyTable INTO CURSOR &lcCursorName NOFILTER 


Такой способ создания уникальных имен курсоров действительно обеспечит уникальность, но это очень неудобный способ из-за необходимости при обращении к такому курсору постоянного использовать макроподстановки. Поэтому по возможности желательно его избегать.
...
Рейтинг: 0 / 0
Запрос и грид
    #32427530
to Ruslan Ibraev:
А что, теперь у Grid'a есть свойство ControlSource?

to Hel!Riser:
Так это же просто! Создай большой курсор, а потом крахни прогу - и смотри TMP!

Я так понял, что г-н Максимов привёл выдержку из новой книги?
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Запрос и грид
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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