Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
Каким образом можно результат запроса без помещения его в таблицу, вывести в ворме в виде грида. Что такое курсор? Как им пользоваться? можно поподробнее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 10:11 |
|
||
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
CurSOR - типа Current Set Of Record - ништо иное как обычная табличка временная, кот афтоматически прибиваеца Фоксом при закрытии. Можна его создать через CREATE CURSOR - тада это практически одно и тоже што и таблица, тока с разницей афтоматического удаления с диска. Либа через SELECT-SQL с опцией INTO CURSOR. Тада этот курсор будет тока РидОнли (c VFP70 появилась опция сделать и его РидВрайт) ну и хватит уже - остальное в доках :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 10:20 |
|
||
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
Курсор можно рассматривать как временную таблицу. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 10:33 |
|
||
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
Вячеслав КлепининПри необходимости выполняется свопинг на диск в специальном формате (не 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 менюшки, экраны, проекты и прочая представляет из ся обычные таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 10:39 |
|
||
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
Дополнение: курсор, созданный по 1-му варианту: Код: plaintext 1. без опции ReadWrite можно 1 раз индексировать . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 10:44 |
|
||
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
индексить - скока угодна. а вот пользовать в кампаудном индексе, то да, толька один тег возможен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 11:07 |
|
||
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
to SSV: без опции ReadWrite можно 1 раз индексировать Если открыта таблица, из которой сделан SELECT..SQL, и в этой таблице есть поле, по которому выполняется индекстация - то да, VFP для построения индекса использует эту таблицу. В остальных случаях - нет. to Hel!Riser: Рекомендую посмотреть содержимое TMP-файла курсора в папке TEMP Windows и найти 1 (одно) отличие от содержимого DBF-файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 11:09 |
|
||
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
вообщем в лоаде формы создаёшь курсор. В гриде на форме указываешь Controlsource на этот курсор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 11:18 |
|
||
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
поскоку файл у мя покашто не получаеца свопнуть, то и смотреть не получица. Однака если есть различие, то оно имхо несущественное, потому как работает USE DBF('MyCursor') IN 0 AGAIN ALIAS MyCursor2 и не кричит, што что-то повреждено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 11:19 |
|
||
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
Курсор В очередной раз вспоминается лень американцев и их стремление все сокращать (впрочем, русские здесь ушли еще дальше - могут сказать почти все, используя только несколько специфических слов). Термин "курсор" употребляется сразу в нескольких смыслах в зависимости от контекста. Курсор - это образ файла DBF открытого в одной из рабочих областей Курсор - это временная таблица являющаяся результатом выполнения команды Select-SQL Курсор - это указатель положения индикатора ввода текста с клавиатуры Ну, последнее определение не очень-то интересно. В том смысле, что здесь все ясно, кроме того, почему этот термин был использован еще и для временных таблиц, ведь слово "cursor" собственно и переводится как "указатель". Курсор как образ файла DBF Опять же такое краткое определение не совсем точно, поскольку в этом смысле используется некий специфический объект . Введение этого объекта объясняется необходимостью визуализации таблицы при проектировании форм и отчетов. Замечу еще, что курсор, как объект, используется не только как образ файлов DBF, но и как образ View. А View и таблица - это не одно и то же. Курсор как временная таблица Вот это наиболее употребительное использование данного термина. Собственно есть 2 способа создания таких курсоров Первый способ - это использование команды CREATE CURSOR . Созданный таким способом курсор будет редактируемым. И это будет именно временная таблица, т.е. она будет автоматически уничтожена в момент закрытия. Ну, про этот способ сказать особо нечего. Здесь нет каких-то проблем и особенностей Второй способ - это использование опции CURSOR в команде SELECT-SQL. Примерно в следующем синтаксисе Код: plaintext Вот этот-то TmpTable и есть курсор В зависимости от различных условий этот курсор может иметь разное физическое "воплощение" и разные свойства Если SQL-запрос полностью оптимизируем, то вместо создания нового файла будет просто открыта та же самая таблица с наложенным на нее фильтром. Зачастую это очень неприятная неожиданность. Проверить, чем же физически является сформированный курсор, можно используя функцию DBF() Код: plaintext 1. Если будет возвращено имя файла с расширением DBF, то данный курсор является той же самой исходной таблицей с наложенным на нее фильтром. Если Вы хотите при любых запросах быть уверенными, что курсор - это именно временная таблица, а не исходная таблица с наложенным фильтром, то Вам следует добавить опцию NOFILTER Код: plaintext Эта опция появилась только в 5 версии Visual FoxPro, хотя там она еще не была документирована. В более ранних версиях необходимо добавлять фиктивные условия или признаки группировки, чтобы исключить возможность оптимизации. Однако если курсор - это временная таблица, то это еще не значит, что эта временная таблица будет непременно физически расположена на диске. Вполне возможно, что вся временная таблица целиком поместится в оперативную память. Т.е. функция DBF('TmpTable') будет исправно показывать некий временный файл, но попытка найти его физически на диске окончится неудачей и функция FILE(DBF('TmpTable')) вернет .F. Правда расположение временной таблицы целиком в памяти ни в коем случае не помешает работе с этой временной таблицей. Собственно, в подавляющем большинстве случаев Вас и не должно заботить, где физически расположена та или иная таблица. Еще один немаловажный вопрос связан с тем, что полученные таким образом курсоры нельзя редактировать. Они доступны только на чтение. Начиная с 7 версии Visual FoxPro, для решения этой проблемы появилась специальная опция ReadWrite Код: plaintext Использование этой опции позволяет создавать курсор, который можно редактировать. Для более ранних версий FoxPro для того, чтобы курсор можно было редактировать, его следует переоткрыть Код: plaintext 1. 2. Переоткрытый таким образом курсор TmpWriteTable уже можно будет редактировать Курсоры можно индексировать также как и обычные таблицы. Правда, если курсор открыт в режиме только для чтения, то Вы сможете создать для него только один индексный тэг. Все созданные таким образом курсоры автоматически удаляются с диска (если временный файл физически был создан на диске) в момент их закрытия. Если Вы создали для такого курсора структурный индексный файл, то этот файл также будет автоматически удален в момент закрытия курсора. Формрование имени курсора в команде Select-SQL Это не такой простой вопрос, как может показаться. Проблема здесь в том, что имя курсора - это фактически алиас (alias) временной таблицы. Но в FoxPro в одном сеансе данных не может быть открыто 2 таблиц с одинаковыми алиасами. Курсор всегда создается на машине клиента, поэтому конфликтов с другими пользователями можно не опасаться. Более того, даже если запущен дважды один и тот же проект на одной машине все равно не будет конфликта связанного с одинаковыми именами курсоров, поскольку они открыты в разных сеансах данных. Конфликт возможен, если Вы создаете несколько курсоров с одним и тем же именем в одном сеансе данных Ну, например, Вы открыли 2 формы использующих Default DataSession и в обеих формах создали курсор с одним и тем же именем. В этом случае, курсор созданный позднее затрет курсор созданный ранее. При этом настройка SET SAFETY не играет никакой роли. Курсор будет пересоздан молча. Без каких-либо дополнительных запросов. Избежать подобных конфликтов можно несколькими способами Открывать формы и отчеты только в Private DataSession Самостоятельно следить за уникальностью имен курсоров Использовать функцию для генерации уникальных имен файлов Последний вариант кажется наиболее предпочтительным. Однако тут следует быть осторожным. Дело в том, что в описании к FoxPro для генерации уникальных имен файлов предлагается использовать следующую функцию Код: plaintext Проблема в том, что функция SYS(2015) может содержать в возвращаемом значении, как буквы, так и цифры. Это значит, что при использовании выделения строки по SubStr() Вы вполне можете получить первым символом цифру. А использование в качестве имени переменной цифры в синтаксисе FoxPro недопустимо и Вы неожиданно получите сообщение о синтаксической ошибке. Чтобы этого избежать следует либо принудительно подмешать букву Код: plaintext Либо вообще не выделять строку Код: plaintext Соответственно выполнение запроса станет выглядеть так: Код: plaintext 1. 2. Такой способ создания уникальных имен курсоров действительно обеспечит уникальность, но это очень неудобный способ из-за необходимости при обращении к такому курсору постоянного использовать макроподстановки. Поэтому по возможности желательно его избегать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 11:42 |
|
||
|
Запрос и грид
|
|||
|---|---|---|---|
|
#18+
to Ruslan Ibraev: А что, теперь у Grid'a есть свойство ControlSource? to Hel!Riser: Так это же просто! Создай большой курсор, а потом крахни прогу - и смотри TMP! Я так понял, что г-н Максимов привёл выдержку из новой книги? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2004, 11:52 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=32427495&tid=1597089]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 265ms |
| total: | 408ms |

| 0 / 0 |
