- •Microsoft Visual FoxPro. Учебно-справочное пособие
- •Предисловие
- •Возможные значения type
- •1. Соглашения
- •1.1. Имена
- •1.1.1. Имена в тексте и комментарии
- •1.1.2. Имена в программе
- •1.1.3. Рекомендуемые имена
- •1.1.3.1. Переменные
- •Возможные значения scope
- •1.1.3.2. Поля таблиц
- •Возможные значения type
- •1.1.3.3. Объекты
- •Возможные значения prefix
- •1.1.3.4. Константы и окна
- •1.2. Команды, функции и объекты
- •1.2.1. Способ представления
- •1.2.2. Синтаксис команд и функций
- •1.2.3. Параметры команд и функций
- •Возможные значения type
- •1.3. Примеры
- •1.4. Структура пособия и поиск материала
- •1.5. Часто употребляемые опции и параметры
- •Общие опции команд, оперирующих диалогами и файлами
- •Общие опции команд, оперирующих таблицами
- •2. Простое приложение
- •2.1. Назначение и состав приложения
- •2.2. База данных и проект HomeLibrary
- •Поля таблиц базы данных HomeLibrary
- •Индексы таблиц базы данных HomeLibrary
- •2.3. Связи между таблицами
- •2.4. Триггеры и правило проверки записи
- •2.5. Файлы проекта
- •2.5.1. Перечень файлов и порядок их описания
- •Файлы приложения HomeLibrary
- •2.5.2. Главный файл проекта
- •2.5.3. Форма "Авторы"
- •2.5.3.1. Состав формы
- •Элементы управления формы "Авторы"
- •2.5.3.2. Добавленные свойства формы
- •2.5.3.3. Обработчики событий формы и ее элементов
- •Действия кнопок формы
- •2.5.4. Форма AuthorEdit
- •2.5.4.1. Обработчик события Init
- •2.5.4.2. Запись данных на диск
- •2.5.4.3. Ввод даты
- •2.5.4.4. Альтернативный вариант ввода и записи данных
- •2.5.5. Форма "Книги"
- •2.5.6. Форма BookEdit
- •2.5.7. Форма "Содержание книг"
- •2.5.8. Форма WorkEdit
- •2.5.9. Форма "Виды произведений"
- •2.5.10. Анализ ошибки 1995
- •2.5.11. Отображение пометки удаления
- •2.5.12. Упаковка таблиц
- •2.5.13. Меню приложения
- •3. Типы данных
- •3.1. Общие сведения
- •3.1.1. Перечень функций
- •Список функций
- •3.1.2. Перечень типов данных
- •Типы данных vfp
- •Типы данных vfp, употребляемые только для полей таблиц
- •3.1.3. Получение информации о типе данных
- •Символ, возвращаемый type( ) и vartype( )
- •3.1.4. Null-величины
- •3.1.4.1. Понятие null
- •3.1.4.2. Функции и команда для null
- •3.1.4.3. Null в логических выражениях
- •Null в логических выражениях
- •3.1.4.4. Null в командах и встроенных функциях vfp
- •3.1.5. Пустые значения
- •Пустые значения
- •3.1.6. Чистые значения
- •Чистые значения
- •3.1.7. Преобразование типов данных
- •Значения параметра cDataType и флаги присутствия параметров nFieldWidth и nPrecision
- •Возможные преобразования типов данных, выполняемые cast( )
- •3.2. Числовые типы данных
- •3.2.1. Перечень команд
- •Список команд для числовых данных
- •3.2.2. Числовые константы
- •3.2.3. Операции для числовых данных
- •Операции для числовых данных
- •3.2.4. Преобразование числовых данных
- •3.2.5. Форматирование числовых данных
- •3.2.6. Функции для числовых данных
- •Функции для числовых данных
- •3.2.7. Вычисления в таблицах
- •Опции и параметры команд, выполняющих вычисления в таблицах
- •Функции, употребляемые в eExpressionList команды calculate
- •Данные таблицы Test.Dbf
- •3.3. Битовые функции
- •Результаты битовых операций
- •Битовые функции
- •3.4. Тип данных Currency
- •3.4.1. Перечень команд и функций
- •Список команд и функций
- •3.4.2. Употребление типа Currency
- •3.5. Логический тип данных
- •3.5.1. Логические операции
- •Логические операции
- •3.5.2. Операции отношения
- •Операции отношения
- •3.6. Приоритет выполнения операций
- •3.7. Типы данных Character и Varbinary. Кодовые страницы
- •3.7.1. Перечень команд
- •Список команд для символьных данных и кодовых страниц
- •3.7.2. Символьные константы
- •3.7.3. Операции для символьных данных
- •3.7.4. Команды для символьных данных
- •Примеры влияния set exact на результат сравнения
- •3.7.5. Функции для символьных данных
- •Символьные функции
- •Описание параметра nConversionSetting
- •Описание параметра nFlag
- •Описание параметра nFlag
- •Преобразования transform( ) при опущенном cFormatCodes
- •3.7.6. Кодовые страницы, поддерживаемые vfp
- •Кодовые страницы
- •3.7.7. Команды и функции для кодовых страниц
- •Функции для кодовых страниц
- •3.7.8. Тип данных Varbinary
- •3.7.9. Типы данных Varchar и Varchar (Binary)
- •3.8. Работа с полями типа Memo
- •3.8.1. Перечень команд и функций
- •Список команд и функция для memo-полей
- •3.8.2. Интеактивное редактирование memo-поля
- •3.8.3. Функции для memo-полей
- •3.9. Дата и время
- •3.9.1. Перечень команд и функций
- •Список команд и функций
- •3.9.2. Задание даты и времени
- •3.9.3. Изменение представления даты и времени
- •3.9.4. Константы, задающие дату и время
- •3.9.5. Даты по григорианскому и юлианскому календарям
- •3.9.6. Операции для данных типа Date и DateTime
- •3.9.7. Команды для данных типа Date и DateTime
- •Установки set date и соответствующие им форматы представления дат и дат и времени
- •3.9.8. Функции для данных типа Date и DateTime
- •Встроенные функции для данных типа Date и DateTime
- •3.9.9. Вывод системных календаря и часов
- •3.9.9.1. Вывод системных часов
- •3.9.9.2. Вывод системного календаря
- •3.9.10. Использование ole-календаря
- •4. Вывод данных в окно vfp, текстовый файл, на принтер и в порт
- •4.1. Перечень команд, функций и системных переменных
- •Список команд, функций и системных переменных
- •4.1.1. Слияние текста и его выражений
- •Значения параметра eExpression
- •4.1.2. Управление выводом
- •4.1.2.1. Организация вывода на принтер
- •4.1.2.2. Команды и функции, управляющие выводом
- •Символы, входящие в cFontStyle
- •Значения параметра nAttribute
- •Функциональные коды
- •Картинные коды
- •4.2. Вывод сообщений
- •Значения, применяемые для задания nDialogBoxType
- •Возвращаемые значения
- •Кнопки диалога и их действия
- •Варианты получения дополнительных данных о set-команде
- •4.3. Команды display и list
- •Display-команды
- •Опции и параметры display-команд
- •4.4. РАбота с текстовыми файлами
- •Функции для работы с текстовыми файлами
- •5. Элементы программирования
- •5.1. Перечень команд, функций и директив
- •Список команд, функций и директив
- •5.2. Основная программа
- •5.3. Структура программы
- •5.4. Вложенные вызовы программ
- •5.5. Создание констант и переменных
- •5.5.1. Константы
- •5.5.2. Переменные
- •5.5.2.1. Виды переменных
- •5.5.2.2. Имя переменной
- •5.5.2.3. Локальные переменные
- •5.5.2.4. Глобальные переменные
- •5.5.2.5. Частные переменные
- •5.5.2.6. Инициализация переменных
- •Ограничения на скалярные переменные и массивы
- •5.5.2.7. Освобождение переменных
- •5.5.2.8. Сохранение и восстановление значений переменных
- •5.6. Выражения
- •5.6.1. Построение и вычисление выражения
- •5.6.2. Оценка выражения
- •5.7. Управляющие конструкции
- •5.8. Процедуры и функции
- •5.8.1. Способы употребления
- •5.8.2. Обмен данными между программными компонентами
- •5.8.3. Число переданных параметров
- •5.8.4. Передача параметров по значению и ссылке
- •5.8.5. Поиск программных компонентов
- •5.8.6. Компиляция исходного текста
- •Расширения исходных и объектных файлов
- •5.8.7. Команды для процедур и функций
- •5.8.7.1. Задание и редактирование программных компонентов
- •Результаты, возвращаемые EditSource( )
- •Редакторы, открываемые функцией EditSource( )
- •5.8.7.2. Вызов Внешних функций
- •Возможные значения параметров cFunctionType и cParameterType1
- •5.8.7.3. Запуск программных компонентов
- •Имена для параметра KeyLabelName
- •Значения параметра cOnCommand
- •5.9. Макросы
- •5.9.1. Понятие макроса
- •5.9.2. Интерактивное формирование макроса
- •5.9.2.1. Запись макроса
- •5.9.2.2. Программирование макроса
- •5.9.3. Команды для макросов
- •6. Массивы
- •6.1. Перечень команд и функций
- •Список команд и функций для массивов
- •6.1.2. Создание и присваивание массива
- •6.1.3. Создание массива
- •Значения cType и варианты преобразования типа, заданного cType
- •6.1.4. Массив как параметр программных компонентов
- •6.1.5. Функции для массивов
- •Содержимое строки массива, формируемого adir( )
- •Содержимое строки массива, формируемого adockstate( )
- •Состав массива arrayDockState
- •Значения элементов массива ArrayName, созданного aerror( )
- •Элементы массива ArrayName, когда второй параметр равен 0
- •Элементы массива ArrayName, когда второй параметр равен 1
- •Содержимое строки массива ArrayName, когда задан параметр oEventObject
- •Содержимое строки массива, формируемого afields( )
- •Значения параметра nType и варианты возвращаемых результатов
- •Значения параметра nFlags
- •Информация об объекте vFunc
- •Состав массива ArrayName
- •Состав массива ArrayName для разных объектов проектирования
- •Значения параметра nValue
- •Действие параметра nType
- •Биты параметра nFlags
- •Условия поиска, задаваемые параметром nFlags
- •Элементы строки массива, формируемого astackinfo( )
- •Состав строки массива, формируемого ataginfo( )
- •Состав строки массива, формируемого avcxclasses( )
- •6.1. Отображение массива в форме
- •6.2.1. Решаемые задачи
- •6.2.2. Элементы управления формы
- •Элементы управления формы ArrayShow
- •6.2.3. Свойства и событие Init формы
- •Новое и измененные свойства формы
- •6.2.4. Поле списка формы
- •6.2.5. Кнопки формы
- •6.2.6. Счетчик и переключатели формы
- •6.2.7. Надписи формы
- •6.2.8. Массив как параметр формы
- •7. Обработка ошибок исполнения
- •7.1. Перечень команд и функций
- •Список команд и функций
- •7.2. Виды обработчиков ошибок
- •Значения, возвращаемые функцией sys(2410)
- •7.3. On error-обработчик ошибок
- •Функции для локализации и расшифровки ошибки
- •Команды cancel, resume, retry, return и suspend
- •7.4. Обработчик события Error
- •7.5. Конструкция try ... Catch ... Finally
- •7.5.1. Синтаксис и порядок выполнения конструкции
- •7.5.2. Дополнительные команды конструкции
- •7.5.3. Throw в try-конструкции
- •7.5.4. Итоговые замечания
- •7.6. Взаимодействие обработчиков
- •7.7. Генерация ошибок vfp
- •8. Оптимизация функционирования
- •8.1. Перечень команд и функций
- •Список команд и функций
- •8.2. Рашмор-оптимизация
- •8.2.1. Бинарный поиск
- •8.2.2. Сравнение последовательного и бинарного поиска
- •8.2.3. Использование индексов для оптимизации вычислений
- •8.2.4. Потенциально оптимизируемые Команды
- •8.2.5. Управление рашмор-оптимизацией
- •Уровни рашмор-оптимизации запроса
- •8.2.6. Оптимизация выражений
- •8.2.7. Составление оптимизируемых выражений
- •Варианты рашмор-выражений
- •8.3. Оптимизация программ
- •8.3.1. Некоторые приемы программирования
- •8.3.2. Оптимизация повторных обращений к свойствам объектов
- •8.3.3. Обращение к нескольким свойствам объекта
- •9. Проект
- •9.1. Перечень Команд и объектов
- •Список команд и объектов, употребляемых с проектом
- •9.2. Проект и диспетчер проекта
- •9.3. Проект как объект vfp
- •9.4. Создание и редактирование проекта
- •9.5. Включаемые и не включаемые файлы
- •9.6. Главный файл проекта
- •9.7. Добавление, изменение и удаление файлов проекта
- •9.8. Закрытие проекта
- •9.9. Построение приложения
- •Значения параметра nBuildAction
- •9.10. Запуск и выход из приложения
- •10. Формы
- •10.1. Перечень команд, функций и объектов
- •Список команд, функций и объектов
- •10.2. Создание формы
- •10.3. Выполнение формы
- •10.3.1. Команда do form
- •10.3.2. Отображение формы, созданной программно
- •10.4. Форма как объект
- •10.4.1. Свойства, события и методы формы
- •Категории доступности свойств формы
- •10.4.2. Форма как контейнер
- •10.4.3. Обеспечение доступа к объектам формы и набора форм
- •10.5. Набор форм
- •10.6. Окружение данных
- •10.6.1. Объект DataEnvironment
- •10.6.2. Объекты Cursor и Relation
- •10.7. Объекты, размещаемые в форме
- •10.7.1. Перечень объектов
- •Объекты формы
- •10.7.2. Координаты объектов
- •10.7.3. Примеры управления вложенными объектами
- •10.7.4. Список с различными источниками данных
- •10.8. Панель инструментов: создание и пример употребления
- •10.9. Дополнительные сведения для форм
- •10.9.1. Обмен данными между формами
- •10.9.2. Устранение главного окна vfp
- •10.9.3. Использование изображений
- •10.9.4. Сессия данных
- •11. Меню
- •11.1. Команды и функции для меню
- •Команды и функции
- •11.2. Применение меню
- •11.2.1. Проектировщик меню
- •11.2.2. Создание меню средствами проектировщика
- •Skip For-выражения
- •11.2.3. Короткое меню
- •11.2.4. Меню в sdi-форме
- •11.3. Системное меню
- •Заголовки и имена пунктов горизонтального подменю системного меню vfp
- •Заголовки и имена пунктов вертикальных подменю системного меню vfp
- •12. Извлечение и отображение данных
- •12.1. Перечень команд и системных переменных
- •Список команд и системных переменных
- •12.2. Проектировщик запроса
- •12.3. Перекрестные таблицы
- •Параметры генератора перекрестной таблицы
- •12.4. Диаграммы
- •12.5. Проектировщик отчета
- •12.6. Проектировщик этикетки
- •12.7. Команды для отчета и этикетки
- •13. Классы и объекты
- •13.1. Перечень команд и функций
- •Список команд и функций
- •13.2. Классы
- •Базовые классы vfp
- •Описание элементов массива pemName_comattrib
- •Флаги атрибута
- •13.3. Объекты
- •13.4. События объектов vfp
- •Значения параметра nFlags
- •Значения параметра nInfoType
- •Значения cProperty
- •Значения параметра nNewValue
- •13.6. Информация о классе и объекте
- •Значения параметра nAttribute
- •13.7. Объекты, встроенные в vfp
- •Объекты, встроенные в vfp
- •14. БазА данных
- •14.1. Перечень команд и функций
- •Список команд и функций
- •14.2. Реляционная модель данных
- •Отношение "Сотрудник – Дата рождения"
- •14.3. Функциональные зависимости и нормализация таблиц данных
- •14.3.1. Представление функциональных зависимостей
- •Уточненное однотабличное представление зависимости "Сотрудник – Дата рождения"
- •Уточненное двухтабличное представление зависимости "Сотрудник – Дата рождения"
- •14.3.2. Нормализация отношений
- •Изделия и поставщики
- •Реализация изделий
- •Изделия
- •Поставщики изделий
- •Поставщики
- •Поставщики изделий
- •Виды изделий
- •Изделия
- •14.4. Ссылочная целостность данных
- •14.5. Состав и свойства базы данных и ее компонентов
- •14.6. Команды для баз данных
- •14.6.1. Команды, оперирующие базой данных
- •14.6.2. Команды, оперирующие таблицей базы данных
- •14.6.3. Триггеры
- •14.6.4. Хранимые процедуры
- •14.7. Функции для баз данных
- •Возможные значения параметра cType
- •Возможные значения параметра cType
- •15. Команды и функции для таблиц и их индексов
- •15.1. Перечень команд
- •Список команд и функций
- •15.2. Выбор рабочей области
- •15.3. Открытие и закрытие таблицы
- •15.4. Создание и изменение таблиц
- •Варианты задания параметров FieldType, nFieldWidth и nPrecision
- •Поля таблицы, создаваемой copy structure extended
- •15.5. Сортировка таблицы
- •15.6. Редактирование записей таблиц
- •15.6.1. Общие опции и параметры команд
- •Опции и параметры команд
- •15.6.2. Предварительные замечания
- •15.6.3. Добавление записей
- •Значения по умолчанию полей разных типов
- •15.6.4. Обновление записей
- •15.6.5. Копирование записей
- •15.6.6. Удаление и восстановление записей
- •15.7. Сопутствующие команды
- •Значения для параметра nLevel
- •Команды и функции, на которые влияет установка set compatible
- •15.8. Функции для таблиц
- •15.9. Управление индексами
- •15.9.1. Индексирование таблиц
- •15.9.2. Команды для индексов
- •15.9.3. Функции для индексов
- •Значения nIndexNumber
- •15.10. Поиск и перемещение в таблице
- •15.10.1. Команды для Поиска и перемещения в таблице
- •15.10.2. Функции для Поиска и перемещения в таблице
- •15.11. Блокировка таблиц и записей
- •15.11.1. Автоматическая блокировка
- •Команды и функции, выполняющие автоматическую блокировку
- •15.11.2. Команды, используемые при блокировке таблиц и записей
- •15.11.3. Функции, используемые при блокировке таблиц и записей
- •15.12. Экспорт и импорт данных
- •Типы экспортируемых и импортируемых файлов
- •15.13. Управление свойствами таблиц и курсоров
- •Свойства курсора vfp
- •Свойства курсора vfp, не описанные в табл. 15.11
- •15.14. Курсор-адаптер
- •15.15. Буферизация
- •15.15.1. Виды буферизации
- •15.15.2. Фиксация и отмена изменений
- •Значения параметра nRows
- •Результаты функции getfldstate( ) и параметр nFieldState функции setfldstate( )
- •15.16. Транзакции
- •15.17. Связывание таблиц
- •15.18. Просмотр и редактирование таблиц
- •15.18.1. Команда browse
- •Возможные символы cFormatCodes
- •15.18.2. Вычисляемые поля
- •15.18.3. Поддержка set skip
- •15.18.4. Обновление данных
- •15.18.5. Команды edit и change
- •15.19. Выбор данных
- •Агрегатные функции
- •Значения параметра JoinType
- •Опции и параметры выражения отбора
- •Допустимые неявные преобразования типов данных
- •Результаты неявного преобразования типов данных двух полей
- •Особенности поведения sql-опций в версии 8.0
- •Особенности поведения sql-опций в версии 9.0
- •16. Представление данных
- •16.1. Перечень команд и функций
- •Перечень команд и функций для именованных соединений
- •Перечень функций для sql-соединений
- •Перечень команд и функций для sql-видов
- •16.2. Именованные Соединения
- •16.2.1. Создание Именованного Соединения
- •16.2.2. Команды для именованных соединений
- •16.3.1. Работа с удаленным источником данных
- •16.3.2. Описание базы данных BookSale
- •Некоторые таблицы базы данных BookSale.Mdb
- •Поля таблиц базы данных BookSale.Mdb
- •Индексы таблиц базы данных BookSale.Mdb
- •16.3.3. Параметр и результат sql-Функций
- •16.3.4. Выполнение sql-функций в асинхронном режиме
- •Свойства sql-соединения
- •Столбцы курсора, создаваемого sqltables( )
- •Имена столбцов курсора в формате "foxpro"
- •Имена столбцов курсора в формате "native"
- •Состав массива aCountInfo
- •16.3.6. Пример с запросом к нескольким таблицам
- •16.4. Виды
- •16.4.1. Понятие вида. Интерактивное построение
- •16.4.2. Команды и функции для sql-видов
- •16.4.3. Автономные виды
- •17. Динамический обмен данными
- •Список dde-функций
- •Служебные имена dde-серверов
- •Параметры, передаваемые процедуры, заданной cUdfName
- •Значения параметра cOption
- •Параметр Action и соответствующие значения параметров Item, Data и AdviseStatus
- •Значения параметра cOption
- •Параметры cUdfName-функции
- •Номера dde-ошибок
- •18. Окна, клавиатура, мышь и цвет
- •Команды и функции для окон
- •Команды и функции для клавиатуры
- •Команда и функции для мыши
- •Управление цветом
- •19. Файлы и директории
- •19.1. Перечень команд
- •Список команд
- •19.2. Команды для файлов и директорий
- •19.3. Функции для файлов и директорий
- •Функции для файлов и директорий
- •19.4. Диалоги
- •Одноименные параметры рассматриваемых в разделе функций
- •Наиболее часто употребляемые значения параметра nFlags
- •Форматы графических файлов, поддерживаемые vfp
- •20.1. Перечень команд и функций
- •Список команд и функций
- •20.2. Некоторые понятия xml
- •20.3. Набор символов Unicode
- •20.4. Кодировка utf-8
- •20.5. Базовые правила xml
- •Кодирование зарезервированных символов
- •Формы представления различных типов данных
- •20.6. Схемы
- •20.7. Формат экспортируемых данных
- •20.8. Описание xml-функций
- •Значения параметра nOutputFormat
- •Значения для параметра nFlags
- •Значения параметра nFlags
- •Соответствия Windows-совместимых кодовых страницы и значений xml-атрибута encoding
- •Значения параметра cSchemaName
- •Значения для параметра nFlags
- •Соответствие типов данных vfp и xsd
- •Значения для параметра nFlags
- •Литература
- •Предметный указатель
- •Содержание
15.9. Управление индексами
15.9.1. Индексирование таблиц
Таблица может иметь несколько индексных IDX- и CDX-файлов.
IDX-файл содержит один индекс, имя которого совпадает с именем файла. CDX-файл может содержать несколько индексов, называемых также тегами. Сам же индексный CDX-файл называется поэтому составным.
Один из CDX-файлов может быть структурным, то есть входящим в структуру таблицы. Его имя совпадает с именем таблицы и он всегда открывается вместе с таблицей. Кроме того, он размещается в той же директории, что и таблица.
Прочие CDX-файлы таблицы, если таковые имеются, являются независимыми. Имя независимого CDX-файла отличается от имени таблицы; его размещение также не привязано к директории таблицы.
CDX-файлы и их теги и IDX-файлы создаются командой INDEX. Структурный CDX-файл и его теги могут быть созданы интерактивно, а также программно командами CREATE TABLE – SQL и ALTER TABLE – SQL.
По умолчанию записи упорядочиваются в индексных файлах по возрастанию. Чтобы изменить порядок сортировки в индексном файле, при создании индекса или тега употребляется опция DESCENDING. Эта же опция может быть применена и для изменения порядка доступа к записям файла при установке контролирующего IDX-индекса или CDX-тега в командах USE, SET INDEX и SET ORDER.
Открываются индексные IDX- и независимые CDX-файлы таблицы командой USE, употребленной с опцией INDEX. Когда таблица открыта, индексные файлы можно открыть командой SET INDEX.
Несколько индексных файлов таблицы могут быть открыты одновременно. Управляющим, однако, является один IDX-файл или тег составного индексного CDX-файла. Управляющий индексный файл или управляющий тег определяет порядок, в котором записи отображаются и обрабатываются. Например, управляющий индексный файл или тег используется командой SEEK и одноименной функцией.
Назначается управляющий индексный файл или тег командой SET ORDER, а также командами USE и SET INDEX.
Не открытые независимые CDX- и индексные IDX-файлы при добавлении, удалении и модификации записей таблицы не обновляются. Таким образом, индексные файлы могут стать неотвечающими таблице. Восстановление соответствия индексного файла и таблицы осуществляется командой REINDEX; и таблица и обновляемый файл должны быть открыты.
Структурный CDX-файл, поскольку он всегда открывается вместе с таблицей, обновляется в процессе работы приложения. Причинами несоответствия такого индексного файла и таблицы могут стать только сбои в работе приложения или системы.
15.9.2. Команды для индексов
Команда
INDEX ON eExpression TO IDXFileName | TAG TagName [BINARY] [COLLATE cCollateSequence ] [OF CDXFileName] [FOR lExpression] [COMPACT] [ASCENDING | DESCENDING] [UNIQUE | CANDIDATE] [ADDITIVE]
создает индексный файл или индекс, употребляемый для упорядочения доступа к данным и их отображения.
Опции и параметры:
eExpression – индексное выражение, которое может включать имя поля или имена нескольких полей текущей таблицы. Индексный ключ создается в индексном файле для каждой записи таблицы. VFP использует эти ключи для отображения и доступа к записям таблицы.
Индексное выражение сохраняется в заголовке индексного файла.
Нельзя использовать в eExpression переменные, элементы массивов, а также поля других таблиц.
Memo-поля могут быть использованы в eExpression только в сочетании с другими символьными выражениями.
Имена полей таблицы в eExpression указываются без псевдонима таблицы, поскольку в некоторых случаях (при выполнении команды USE ... AGAIN, SQL-запросов и др.) таблица автоматически получает иной псевдоним, и индекс не может быть надлежащим образом обновлен.
Пользовательские функции не следует включать в индексные выражения, поскольку это серьезно снизит производительность. Кроме того, при наличии в индексном выражении пользовательской функции не всегда выполняется обновление индекса.
VFP не поддерживает ключи переменной длины. Потому если индексное выражение вычисляется с различной длиной, например RTRIM(Author), к более коротким результатам будут добавлены правые пробелы. Рациональнее, если есть необходимость уменьшить размер индекса, употребить, например, выражение LEFT(Author, 20).
Длина ключа IDX-индекса должна быть в диапазоне 1 – 100 символов, а CDX-индекса – в диапазоне 1 – 240 символов. В некоторых collate-последовательностях или при использовании 2-байтовых символов длина eExpression в CDX-индексе ограничена 120 символами. При превышении допустимой длины ключа генерируется ошибка "Invalid key length".
Замечание. Употребление RECNO( ) в индексном выражении для буферизованного курсора портит индекс и приводит к бесконечному циклу.
TO IDXFileName – создается индексный IDX-файл. Имя файла может включать путь и не содержать расширения. По умолчанию IDX-файл получает расширение IDX. Однако оно может быть изменено путем соответствующего задания опции
INDEX extension
файла конфигурации VFP.
TAG TagName [COLLATE cCollateSequence] [OF CDXFileName] – создает тег составного индексного CDX-файла CDXFileName. Такой файл в отличие от IDX-файла может содержать несколько индексов (тегов).
Длина имени тега TagName не должна быть более 10 символов.
Составной индексный файл имеет предопределенное расширение – CDX.
Если при выполнении команды INDEX опция OF CDXFileName отсутствует, то будет создан тег структурного составного индексного файла, имя которого всегда совпадает с именем таблицы. Если опция присутствует, то создается тег независимого составного индексного файла. При этом будет создан и файл CDXFileName, если создается его первый тег.
Информация о наличии структурного индексного файла хранится в заголовке таблицы. При открытии таблицы открывается и ее структурный индексный файл, что обеспечивает его постоянное обновление. Если при открытии таблицы структурный индексный файл не обнаружен, то возникнет диалог (рис. 15.10)
Рис. 15.10. Не найден структурный CDX-файл
При выборе Ignore таблица будет открыта, а ссылка на ненайденный структурный CDX-файл из ее заголовка удалена.
Если, однако, затем потребуется эту ссылку восстановить, то при открытии таблицы следует употребить опцию INDEX:
use TableName index cdxFileName
Независимые CDX-файлы и IDX-файлы должны открываться явно командами SET INDEX или USE с опцией INDEX: в заголовок таблицы никаких сведений о таких файлах не заносится.
Индексные CDX-файлы всегда являются компактными, поэтому опция COMPACT избыточна.
BINARY – создает двоичный индекс.
COLLATE cCollateSequence – задает collate-последовательность. Если опция опущена, то для cCollateSequence берется значение по умолчанию – MACHINE или установленное командой SET COLLATE.
Реакция системы при попытке создать существующий IDX-файл или тег CDX-файла зависит от установки SET SAFETY.
FOR lExpression – задает условие-фильтр: доступны (как для просмотра, так и для редактирования) будут только записи, для которых lExpression вычисляется со значением .T. Для повышения быстродействия выражение lExpression должно быть рашмор-оптимизируемо.
COMPACT – создает компактный IDX-файл.
ASCENDING – (по умолчанию) задает возрастающий порядок для тега CDX-файла.
DESCENDING – задает убывающий порядок для тега CDX-файла.
Тег CDX-файла, однако, может быть иметь возрастающий порядок, но открыт с опцией DESCENDING командой SET INDEX или получить ее командой SET ORDER.
IDX-файл всегда имеет возрастающий порядок, но тоже может быть употреблен с убывающим порядком благодаря опции DESCENDING команд SET INDEX и SET ORDER.
UNIQUE – указывает, что при наличии записей с повторяющимися ключами в IDX-файл или тег CDX-файла будет включаться ключ только для первой записи. Таким образом, если UNIQUE-индекс является управляющим, то в подмножестве записей с повторяющимися индексными выражениями доступна только первая.
Использование опции UNIQUE равнозначно установке SET UNIQUE в ON перед выполнение команды INDEX или REINDEX.
Если UNIQUE-индекс активен и значение индексного выражения изменилось таким образом, что уникальность восстановлена, то прежде неуникальная запись будет доступна только после выполнения REINDEX.
Активный (управляющий) UNIQUE-индекс не препятствует добавлению записей с неуникальными значениями ключей, но ограничивает к ним доступ.
CANDIDATE – создается кандидатный тег структурного индекса. Опция CANDIDATE может быть включена только при создании тега структурного индекса. В противном случае VFP генерирует ошибку.
Кандидатный индекс не позволяет добавлять записи, приводящие к неуникальности ключа. VFP генерирует ошибку, если выполняется попытка создать кандидатный тег для поля или комбинации полей, уже содержащей повторяющиеся значения.
ADDITIVE – не закрывает ранее открытые индексные файлы. Если опция опущена, все ранее открытые индексные файлы таблицы, кроме структурного составного индексного файла, закроются.
После выполнения команды INDEX управляющим становится созданный ей индекс или тег. Записи отображаются и обрабатываются в порядке, определяемом индексным выражением управляющего индекса или тега. Физический порядок записей не нарушается.
Если SET TALK установлен в ON, VFP сообщит о количестве проиндексированных записей. Интервал между сообщениями регулируется командой SET ODOMETER.
Информация об открытых индексных файлах отображается командой DISPLAY STATUS.
Изменение значения ключевого поля изменяет значение ключа и, следовательно, его позицию в индексном файле. Это нужно учитывать при выполнении команд, таких, как SCAN ... ENDSCAN, REPLACE ALL. Также необходимо понимать результат команды REPLACE при работе с индексом, построенным с применением опции FOR.
Пусть, например, все записи таблицы Authors имеют одно и то же значение InputDate (рис. 15.11).
Рис. 15.11. Фрагмент таблицы Authors
Выполним следующий код:
select Authors
&&
&& Создаем индексный IDX-файл d:\iDate.idx
index on InputDate to d:\iDate
&&
&& Управляющим является индекс iDate
k = 0 && Число обновленных записей
scan
replace Authors.InputDate with Authors.InputDate + 1
k = k + 1
endscan
? k && Напечатает: 1
При выполнении цикла SCAN ... ENDSCAN, когда управляющим является индекс iDate с индексным выражением InputDate, изменится дата только первой записи таблицы. Это объясняется тем, что после увеличения даты на 1 день, ключ первой записи перемещается на последнюю позицию, что влечет завершение цикла SCAN ... ENDSCAN.
Тот же результат будет получен и при выполнении цикла DO WHILE … ENDDO.
Команда
SET UNIQUE ON | OFF
задает, если установлена в ON, что в индексном файле не могут присутствовать записи с повторяющимися индексными ключами (в файл включается только первая из повторяющихся записей). Если же установка команды OFF, то в индексный файл будут включены ключи всех записей.
По умолчанию команда установлена в OFF.
Замечание. Индексный файл сохраняет свою SET UNIQUE-установку при выполнении REINDEX.
Установка команды сохраняется с текущей сессией данных.
Команда
REINDEX [COMPACT]
перестраивает все открытые индексные файлы текущей таблицы. Если указана опция COMPACT, обычные IDX-файлы конвертируются в компактные IDX-файлы.
Команда может быть выполнена, если таблица открыта в режиме монопольного доступа.
Индексный файл перестает соответствовать таблице, если таблица изменяется, а индексный файл не открыт. Соответствие восстанавливает командой REINDEX. Индексные файлы, которые нужно привести в соответствие, должны быть открыты.
При выполнении REINDEX также обновляется и структурный индексный CDX-файл, который автоматически открывается с таблицей и, следовательно, всегда ей отвечает (если, конечно, не было в сбоев в работе системы).
Для ускорения перестройки индексных файлов можно, обратившись к функции SYS(3050), установить достаточно большой размер буфера, например такой, что в нем размещается вся таблица.
Пример 1:
select Authors
if IsExclusive( )
reindex
else
wait 'Таблицу нужно открыть монопольно!' window
endif
Пример 2. Выполняется обновление IDX-файла SomeTableIndex, а также структурного CDX-файла SomeTable.cdx (если таковой имеется).
use SomeTable index SomeTableIndex exclusive
reindex
Команда
SET ORDER TO [nIndexNumber | IDXIndexFileName | [TAG] TagName [OF CDXFileName] [IN nWorkArea | cTableAlias] [ASCENDING | DESCENDING]]
устанавливает управляющий индексный файл или тег (индекс) для текущей или указанной таблицы.
Опции и параметры:
nIndexNumber – номер, по которому выбирается управляющий индексный файл или управляющий тег составного индекса.
Параметр nIndexNumber указывает на индексный IDX-файл или тег структурного или независимого составного индекса. IDX-файлы и независимые составные индексные файлы задаются в списке открываемых индексных файлов команды SET INDEX или опции INDEX команды USE.
Первоначально нумеруются IDX-файлы в соответствии с порядком их следования в списке. Затем нумеруются теги (индексы) структурного CDX-файла, если таковой имеется, в порядке их создания. И, наконец, нумеруются теги независимых CDX-файлов также в порядке их создания.
Следующий пример показывает, как реализуется нумерация индексных IDX-файлов и тегов CDX-файлов.
Таблица Video.dbf открывается с тремя индексными файлами Title.idx, Costs.cdx и Rating.idx в первой рабочей области. Один из них является составным.
use Video index Title.idx, Costs.cdx, Rating.idx in 1
Таблица Video имеет также структурный составной индексный файл Video.cdx с двумя тегами NumberSold и YearSold. Этот CDX-файл автоматически открывается с таблицей Video.
Независимый составной индексный файл Costs.cdx имеет теги RentalCost и BuyCost.
Поскольку IDX-файлы нумеруются в первую очередь, то SET ORDER TO 1 сделает управляющим индекс Title.idx, а SET ORDER TO 2 – Rating.idx:
set order to 1 && Управляющий индекс Title.idx
set order to 2 && Управляющий индекс Rating.idx
Затем нумеруются теги структурного CDX-файла Video.cdx:
&& Устанавливаем в качестве управляющего тег NumberSold файла Video.cdx
set order to 3
&& Устанавливаем в качестве управляющего тег YearSold файла Video.cdx
set order to 4
В последнюю очередь нумеруются теги независимого составного индексного файла Costs.cdx:
&& Устанавливаем в качестве управляющего тег RentalCost файла Costs.cdx
set order to 5
&& Устанавливаем в качестве управляющего тег BuyCost файла Costs.cdx
set order to 6
В качестве nIndexNumber можно указать 0. Выполнение
SET ORDER TO 0
означает, что все индексные файлы остаются открытыми и обновляются, когда записи добавляются, удаляются или изменяются. Однако записи отображаются и обрабатываются в порядке их физического расположения в таблице.
Команда SET ORDER TO без дополнительных опций и параметров равнозначна команде SET ORDER TO 0.
Если величина nIndexNumber больше числа открытых IDX-файлов и тегов открытых CDX-файлов, то VFP генерирует ошибку.
IDXIndexFileName – устанавливает IDX-файл с именем IDXIndexFileName в качестве контролирующего.
[TAG] TagName [OF CDXFileName] – устанавливает в качестве управляющего тег с именем TagName CDX-файла CDXFileName. Опция OF CDXFileName употребляется, если имеются одинаковые теги в разных открытых CDX-файлах таблицы.
Если открытый IDX-файл и тег открытого CDX-файла имеют одинаковые имена и опции TAG и OF CDXFileName опущены, то приоритет имеет IDX-файл.
ASCENDING | DESCENDING – обеспечивает отображение и обработку записей в возрастающем или убывающем порядке значений контролирующего индекса. На состав индексного файла или тега эти опция влияния не оказывают.
Команда
SET INDEX TO [IndexFileList | ?] [ORDER nIndexNumber | IDXIndexFileName | [TAG] TagName [OF CDXFileName] [ASCENDING | DESCENDING]] [ADDITIVE]
открывает один или более индексных файлов для текущей таблицы.
Опция и параметр:
IndexFileList – список имен открываемых индексных файлов. Имена файлов разделяются запятыми. В списке может присутствовать любое сочетание имен IDX- и CDX-файлов. Расширения могут быть опущены, если имена IDX- и CDX-файлов не совпадают. Имя файла может содержать путь. Если он опущен, то файл ищется в директории по умолчанию.
Первый индексный файл списка становится после выполнения команды управляющим. Записи, если первый элемент списка IndexFileList – это CDX-файл, будут отображаться и обрабатываться в порядке их физического расположения в таблице до тех пор, пока не выполнена команда SET ORDER TO TAG TagName.
ADDITIVE – ранее открытые индексные файлы таблицы не будут закрыты при выполнении команды. Если опция опущена, то все индексные файлы, кроме структурного составного индексного файла, будут закрыты.
Смысл прочих опций параметров см. в описании команды SET ORDER.
Команда
SET INDEX TO
закроет все открытые индексные файлы текущей таблицы, кроме ее структурного CDX-файла.
Команда
COPY INDEXES IndexFileList | ALL [TO CDXFileName]
создает составной индексный CDX-файл текущей таблицы из ее индексных IDX-файлов.
Опции и параметры:
IndexFileList – список имен IDX-файлов, индексные выражения которых используются для создания тегов CDX-файла. Имена файлов разделяются запятыми.
ALL – в составной CDX-файл войдут все открытые IDX-файлы текущей таблицы.
TO CDXFileName – имя создаваемого независимого составного CDX-файла.
Команда
COPY TAG TagName [OF CDXFileName] TO IndexFileName
создает индексный IDX-файл IndexFileName из тега TagName составного индексного CDX-файла текущей таблицы.
Опция и параметр:
OF CDXFileName – имя открытого составного CDX-файла, содержащего тег TagName. Если опция опущена, то VFP берет первый тег структурного составного CDX-файла, если такового нет, то тег выбирается из открытого независимого составного CDX-файла.
Команды
DELETE TAG TagName1 [OF CDXFileName1] [, TagName2 [OF CDXFileName2]]...
или
DELETE TAG ALL [OF CDXFileName]
удаляют теги из составных индексных CDX-файлов.
Опции и параметры:
TagName1 [OF CDXFileName1] [, TagName2 [OF CDXFileName2]]... – список удаляемых тегов. Опция OF CDXFileName включается, если два или более тегов разных CDX-файлов имеют одинаковое имя.
ALL [OF CDXFileName] – удаляет все теги составного CDX-файла. Если опция OF CDXFileName опущена, то удаляются теги структурного CDX-файла; сам файл удаляется с диска и из заголовка таблицы вычищается ссылка на этот файл. В противном случае удаляются теги открытого CDX-файла, заданного параметром CDXFileName.
VFP выдает предупреждение, если удаляется первичный или кандидатный тег и SET SAFETY установлен в ON.
Команда
CLOSE INDEXES
закрывает, как и SET INDEX TO, все открытые индексные IDX- и составные независимые CDX-файлы таблицы текущей рабочей области. Структурный CDX-файл, автоматически открываемый вместе с таблицей, не закрывается.
