Text
                    Лебедев А. Н.
Visual FoxPro 9.0
УДК 004.655.3
ББК 32.973.26-018.2
лзз
Подписано в печать 14.07.2005. Формат 70x90/16. Гарнитура «Баскервиль».
Печать офсетная. Усл. печ. л. 23,78. Тираж 4000 экз. Зак. N« 5652.
Лебедев А. Н.
ЛЗЗ Visual FoxPro 9 / Лебедев А. Н. - М. : НТ Пресс, 2005. - 328 с.: ил. - (Самоучитель).
ISBN 5-477-00194-1
Эта книга не претендует на полное руководство по Visual FoxPro 9. Ее цель -быстро подготовить начинающих разработчиков к работе в среде Visual FoxPro 9, помочь перейти от предыдущих версий FoxPro к новой версии этой среды, описать ее возможности. Несмотря на то, что книга ориентирована на начинающих, в ‘ ней рассматриваются и некоторые «хитрости», нюансы программирования.
В книге приводится много примеров, иллюстрирующих практическое применение материала. При условии выполнения практических заданий вы получите простое, но легко расширяемое программное средство для учета сотрудников с возможностью печати отчетности и экспорта данных в формат XML. При желании можно самостоятельно модернизировать его и использовать, например, в отделе кадров.
Издание состоит из 5 глав, глоссария и предметного указателя.
УДК 004.655.3
ББК 32.973.26-018.2
Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельца авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но, поскольку вероятность технических ошибок все равно остается, издательство не может гарантировать абсолютную точность и правильность приводимых сведений. В связи с этим издательство не несет ответственности за возможный ущерб любого вида, связанный с применением содержащихся здесь сведений.
Все торговые знаки, упомянутые в настоящем издании, зарегистрированы. Случайное неправильное использование или пропуск торгового знака или названия его законного владельца не должно рассматриваться как нарушение прав собственности.
©Лебедев А. Н., 2005
©Оформление. «НТ Пресс», 2005
Сканирование и перевод книги в формат BJVu осуществлен при поддержке ПСЛАГСИ Электронный вариант данной книги предназначен исключительно для образовательных целей!
Оглавление
Введение...........................................................8
Глава 1 ▼ Установка и настройка Visual FoxPro.............................. 12
Установка Visual FoxPro 9........................................ 12
Как пользоваться средой разработки Visual FoxPro 9............... 17
Запуск......................................................... 17
Основное меню.................................................. 19
Настройка среды ............................................... 21
Окно команд.....................................................34
Технология IntelliSense........................................34
Справочная система...........................................  35
Выход из среды................................................ 37
Итоги главы......................................................38
Глава 2 т Начальные сведения о базах данных.................................39
Базы данных. Для чего они?.......................................39
Технологии работы с базами данных................................41
Выделенный файл-сервер.........................................41
Технология «клиент-сервер».....................................42
Проектирование баз данных........................................45
Жизненный цикл базы данных.....................................45
Определение требований к БД и анализ задачи....................46
Проектирование базы данных.....................................47
Реализация.....................................................49
Внедрение......................................................49
Эксплуатация ..................................................50
Visual FoxPro 9
Что такое реляционные базы данных ................................50
Типы данных ....................................................  52
Создаем базу данных...............................................54
Создание структуры таблицы.....................................54
Добавление записей в таблицу ................................. 56
Просмотр содержимого таблиц и заполнение полей................ 58
Удаление записей ............................................. 61
Создание базы данных.........................................  64
Создание удаленного представления при помощи Мастера.......... 65
Создание локального представления при помощи Мастера.......... 69
Создание представления при помощи Дизайнера представлений .... 70
Корректируем базу данных..........................................72
Выбор рабочей области........................................  73
Открытие таблицы...............................................74
Общая информация о таблице.....................................76
Перемещения по таблице.........................................77
Поиск данных в таблице.........................................78
Изменение данных в записи .................................... 80
Индексы. А зачем они? ............................................82
Создание индексов .............................................82
Использование индексов........................................ 85
Создание индексов при помощи Дизайнера таблиц................. 88
Связывание таблиц.................................................90
SQL-запросы. Грамотное решение ...................................94
Создание таблиц................................................95
Изменение структуры таблиц.................................... 96
Удаление таблиц................................................97
Добавление записей ............................................98
Изменение данных в записях.................................... 98
Удаление записей.............................................. 99
Выборка данных из таблиц...................................... 99
Расширения возможностей выборки в Visual FoxPro 9 ........... 110
Управление транзакциями...................................... 111
Работа с удаленными базами данных............................ 112
Настройка ODBC............................................... 113
Оглавление
Контроль целостности базы данных..........................   116
Связь таблиц по первичному ключу.........................  116
Триггеры.................................................. 120
Итоги главы................................................. 122
Глава 3▼
Введение в программирование................................... 123
Создаем первую программу.................................... 123
Создание новой программы ................................. 124
Сохранение программы в файле ............................. 124
Открытие сохраненного файла программы..................... 125
Ввод текста программы .................................... 125
Запуск программы на выполнение............................ 128
Переменные и массивы ....................................... 129
Типы переменных........................................... 129
Область видимости переменных............................   130
Рекомендации по наименованию переменных .................. 131
Массивы................................................... 132
Использование процедур и функций............................ 133
Процедуры................................................. 134
Функции .................................................. 137
Арифметические действия..................................... 139
Операторы................................................. 139
Функции .................................................. 140
Операции над строками....................................... 143
Выполнение при определенных условиях ....................... 148
Конструкция IF............................................ 148
Конструкция IIF........................................... 150
Конструкция CASE.......................................... 150
Циклы ...................................................... 154
Цикл FOR ................................................. 155
Цикл DO WHILE ............................................ 156
Цикл SCAN ................................................ 157
Кодировки. Почему русский текст так ужасно выглядит?........ 160
А даты бывают разные ....................................... 165
V Visual FoxPro 9 Работа с файлами................................................... 170
Итоги главы....................................................  176
Глава 4 ▼ Работа с проектом................................................ 177
Как создать новый проект. Что при этом происходит............... 178
Создание при помощи Мастера ................................. 178
Application Builder.......................................... 180
Вкладка General.............................................. 180
Вкладка Credits.............................................. 181
Вкладка Data ................................................ 181
Вкладки Forms и Reports ..................................... 182
Вкладка Advanced ............................................ 183
Окно Project Manager......................................... 184
Работа с формами. Красиво оформляем окно........................ 187
Создание новых окон.......................................... 189
Панель инструментов Form Designer............................ 190
Свойства элементов окна...................................... 191
Процедуры, запускаемые событиями в форме........................ 196
Использование элемента Grid......................................203
Мастер Grid Builder.......................................... 204
Редактирование в элементе Grid............................... 205
Создание и вызов основного меню приложения ..................... 209
Что сделать, чтобы форма появилась при запуске приложения....... 218
Работаем с XML.......................'.......................... 224
Краткое описание XML......................................... 224
Новшества Visual FoxPro версии 9 в части работы с XML........ 226
Требования к XML-документам ................................. 226
Импорт и экспорт данных в формате XML........................ 228
Выборка данных из удаленной базы данных..........................235
Если требуется вывести данные на печать......................... 245
Способы печати без применения генератора отчетов ............ 245
Создание печатных форм при помощи Дизайнера отчетов.......... 245
Добавление полей в отчет..................................... 248
Сохранение макета отчета в файл ............................  250
Формирование отчета.......................................... 250
Отладчик. Как и для чего им пользоваться ....................... 261
Оглавление
Компилируем проект.................................................265
Практика........................................................ 268
Использование классов..............................................269
Программное объявление класса................................... 270
Создание класса при помощи Class Designer....................... 270
Добавление класса в проект...................................... 271
Итоги главы.....................................................   272
Глава 5 ▼
Полезные дополнения..................................................274
Дополнительные приложения, поставляемые с Visual FoxPro 9..........274
Готовим дистрибутив созданного приложения..........................275
Установка InstallShield Express 5.0 for Microsoft Visual FoxPro. 276
Создание дистрибутива при помощи InstallShield Express 5.0...... 279
Мастера Visual FoxPro 9..........................................  297
Установка Microsoft SQL Server 2000 Desktop Engine.................310
Итоги главы....................................................    312
Глоссарий............................................................313
Использованная литература............................................320
Предметный указатель.................................................321
Введение
Visual FoxPro 9 - популярный и мощный инструмент для разработки приложений, работающих с базами данных. На нем написано большое количество статистических, экономических и других приложений, связанных с расчетами и хранением информации. Кроме того, Visual FoxPro представляет собой не только среду разработки, но и систему управления базами данных, что позволяет при помощи пунктов меню или прямого ввода команд в командном окне работать с таблицами базы данных.
Компания Microsoft официально заявила о поддержке версии 8 до 2010-го года. В декабре 2004 года вышла очередная, девятая версия Visual FoxPro. С февраля 2005-го года она появилась на рынке в виде самостоятельного программного продукта и в поставке MSDN.
На протяжении 80-х-ЭО-х годов система управления базами данных FoxPro была самым популярным инструментом хранения и манипулирования данными для операционной системы MS DOS. Она обладала и удобным механизмом работы с реляционными базами данных, и встроенным командным языком, который позволял работать в интерактивном режиме и создавать программы с легко узнаваемым интерфейсом пользователя. Создателем столь успешного продукта выступила компания Fox Software. Создана FoxPro на основе системы управления базами данных FoxBASE той же компании. До настоящего времени работает довольно большое количество программ, созданных в версии FoxPro 2.6 для MS DOS.
С возникновением операционных систем семейства Windows появились новые средства разработки с применением технологии визуального проектирования. Объектно-ориентированное программирование возникло еще в эпоху MS DOS. К настоящему моменту времени все среды разработки приложений
Введение V
поддерживают объектно-ориентированный подход в программировании. Компания Microsoft, купившая Fox Software, неустанно модернизировала FoxPro. Возникла версия FoxPro для Windows. Затем появилась обновленная ветвь -Visual FoxPro.
В последнее время Visual FoxPro несколько потеснили такие средства разработки, как Borland Delphi, MS Access и C++ Builder. Однако с выходом версии 9 ситуация может измениться в пользу Visual FoxPro за счет некоторых нововведений.
Обсуждение в конференциях Internet и личное общение с программистами говорят о том, что переход разработчиков к работе с версией 9 происходит довольно активно.
Что характерно, в Visual FoxPro 9 заметно улучшены средства работы с XML XML (extensible Markup Language) - расширяемый язык разметки, формат описания структурированных данных, разработанный для Internet и получающий все большее распространение как универсальное средство обмена данными. В сочетании с XSL - механизмом для отображения XML-данных в удобном для просмотра и печати виде - он составляет серьезную конкуренцию стандартном}' генератору отчетов. Кроме того, стоит отметить, что многие серьезные организации осуществляют документооборот с использованием формата XML. Так, например, Банк России внедряет новые форматы электронных документов, основанные на XML.
Еще одно важное новшество версии 9 - улучшенная совместимость с СУБД Microsoft SQL Server. Например, введены новые типы данных. И более ранние версии Visual FoxPro поддерживали работу' с различными СУБД, но в версии 9 эффективность выполнения команд SQL стала гораздо выше.
Претерпели некоторые изменения и возможности проектирования и отображения экранных форм. Стал удобнее и стабильнее генератор отчетов.
В первой главе этой книги описывается процесс установки и первичной настройки, аппаратные и программные требования. Рассматриваются элементы окна Visual FoxPro 9, описывается методика использования среды разработки.
Вторая глава знакомит с понятием баз данных, понятием о системах управления базами данных, основами проектирования баз данных. Дается понятие реляционных баз данных. Описываются типы полей, используемых в таблицах баз данных. Рассматриваются основные возможности для создания баз данных, их редактирования и оптимизации работы с базой данных. Конструкции универсального языка запросов SQL, который может использоваться в Visual FoxPro 9, также рассмотрены в этой главе.
Visual FoxPro 9
Третья глава будет полезна начинающим разработчикам. В ней даются основы программирования в Visual FoxPro 9. Рассматривается синтаксис встроенного языка, процедуры и функции, условные операторы и операторы циклов. Приводятся примеры использования команд.
В четвертой главе описывается процесс создания проекта в Visual FoxPro 9. Рассматриваются возможности добавления в проект новых элементов. В этой же главе содержится описание создания новых форм (диалоговых окон), меню, отчет ов для печати, экспорта данных в формат XML.
В пятой главе приведены некоторые полезные дополнения к материалу книги.
Если вы только начинаете изучать программирование в среде Visual FoxPro, рекомендуется читать книгу с первых глав, не пропуская ничего.
Если вы программист со стажем работы в FoxPro для MS DOS, имеет смысл ознакомиться с первой главой для изучения интерфейса среды, изучить вопрос с кодировками в конце третьей главы, а затем сразу перейти к четвертой главе.
Эт а книга не претендует на полное руководство по Visual FoxPro 9. Ее цель -быс тро под! отовить начинающих разработ чиков к работе в среде Visual FoxPro 9, помочь перейти от предыдущих версий FoxPro к новой версии этой среды, описать ее возможности. Несмотря на то что книга ориентирована гга начинающих, мы изучим некоторые «лисьи» хитрости.
В книге приводится много примеров, иллюстрирующих практическое применение материала на примерах. При условии выполнения практических заданий должно получиться простое, но легко расширяемое программное средство для учета сотрудников с возможностью печати отчетности и экспорта данных в формат XML. При желании можно самостоятельно модернизировать его и использовать, например, в отделе кадров.
Таким образом, мощная и гибкая среда разработки Visual FoxPro 9, что позволит вам создавать приложения как для себя, так и в коммерческих целях. А насколько они будут успешными, зависит от вашего желания и терпения.
Уд.он'1
Введение
Соглашения, принятые в книге
В книге выделены:
>	команды FoxPro - моноширинным шрифтом;
>	определения, новые понятия - курсивом;
>	элементы интерфейса - полужирным шрифтом;
>	последовательность команд, выполняемых из меню, отмечается стрелкой, например Пуск > Программы > Microsoft Visual FoxPro 9.0 (Start > Programs > Microsoft Visual FoxPro 9.0);
>	клавиши, нажимаемые одновременно, записываются со знаком + (плюс), например Ctrl+F.
Таким образом помечены замечания автора, сопровождающие основной текст.
РЭтот знак применяется для того, чтобы обратить ваше внимание на разного рода технические замечания, касающиеся особенностей работы с программой.
Установка и настройка Visual FoxPro
Установка Visual FoxPro 9
Вы держите в руках компакт-диск с названием «Visual FoxPro 9»? Или вам записали на жесткий диск папку с дистрибутивом (комплектом для установки)? И в том и в другом случае стоит сначала определиться, сможет ли среда разработки Visual FoxPro версии 9 работать на вашем компьютере. Разработчиками Visual FoxPro 9 выдвигаются следующие требования к аппаратному и программному обеспечению:
> процессор: Pentium-совместимый;
> память: 64 Мб (рекомендуется 128 Мб или больше);
> свободный объем жесткого диска: для предустановок - 20 Мб; для минимальной конфигурации - 115 Мб; для максимальной конфигурации - 155 Мб;
> видео: разрешающая способность - 800x600; 256 цветов (рекомендуется 16-битный режим High Color);
> операционная система: Microsoft Windows 2000 Service Pack 3 или выше, Windows ХР или Windows Server 2003.
Хотя, как правило, устанавливается Visual FoxPro 9 только на указанные выше операционные системы, имеется возможность создавать приложения для операционных систем Windows 98 и Windows ME.
Настоятельно рекомендуется перед началом установки Visual FoxPro 9 закрыть все остальные работающие в Windows приложения.
Установка Visual FoxPro 9
V
Если вы хотите обновить установленную у вас версию Visual FoxPro до версии 9, следует сначала деинсталлировать (удалить) старую версию, азатем приступать к установке новой. Если вы хотите и оставить на своем компьютере старые версии Visual FoxPro, и установить новую, укажите при установке другую папку. Это замечание относится и к бета-версии Visual FoxPro 9, то есть, если у вас была установлена бета-версия Visual FoxPro 9, сначала деинсталлируйте ее, а затем приступайте к установке релиза Visual FoxPro 9.
Чтобы начать процесс установки, нужно запустить на выполнение файл setup.exe.
После запуска программы установки на экране появится окно, представленное на рис. 1.1.
gA Prerequisites
"И Reinstall system components for Visual FoxPro to ensure that they are not corrupted, or install a new version of the Prerequisites.
Visual FoxPro
Repair, reinstall, or install additional Visual FoxPro features.
You can also uninstall Visual FoxPro.
.Service Releases
IK Check for the latest Service Releases to ensure optimal functionality of Visual FoxPro. This link will take you to the Ijj Visual FoxPro Products Update web page.
Exit
Рис. 1.1т Окно программы установки
Если доступен для запуска второй этап (цифра 2 такая же яркая, как цифра 1), пропустите следующий абзац.
На первом этапе предлагается запустить установку программных компонентов, необходимых для работы установщика среды Visual FoxPro. Для запуска выполнения этого этапа следует щелкнуть по ссылке Prerequisites. В результате появится окно, содержащее текст лицензионного соглашения для
V ГЛАВА 1 V Установка и настройка Visual FoxPro
предустанавливаемых компонентов и начинающееся заголовком «End User License Agreement» (Лицензионное соглашение). Изучив его, щелкните по переключателю (надписи) I accept the agreement (Я принимаю соглашение), а затем по ссылке Continue (Продолжить). Появится окно со списком из компонентов, которые предполагается установить. Наличие на вашем компьютере уже установленных компонентов проверяется автоматически, поэтому список может состоять из разного количества пунктов, ио, скорее всего, будут перечислены два компонента: Setup Runtime Files и Microsoft SOAP Toolkit. Вам не остается ничего иного, как щелкнуть по ссылке Install Now! (Установить сейчас!). Программа установки займется распаковкой и установкой указанных компонентов, показывая процент выполненной работы. Успешно установленные компоненты помечаются галочкой. Когда все компоненты в списке будут отмечены, следует щелкнуть по ссылке Done (Готово).
Вновь появится окно, представленное на рис. 1.1. На этот раз активным будет и второй пункт под названием Visual FoxPro. Следует щелкнуть по ссылке Visual FoxPro. Программа установки попросит вас подождать несколько секунд, пока она готовит систему к установке. Затем появится окно, содержащее текст лицензионного соглашения, начинающегося заголовком «End User License Agreement» (Лицензионное соглашение), приведенное на рис. 1.2. В этом же окне присутствуют два поля, которые необходимо заполнить: Product Key (Код продукта) и Your Name (Имя пользователя). Код продукта должен быть написан на компакт-диске или на коробке для диска. Из этого же окна можно запустить просмотр файла ReadMe (такие файлы описывают процесс установки и системные требования и прилагаются обычно ко всем программным средствам). Эго можно сделать, щелкнув мышью по ссылке Review the ReadMe File. Изучив лицензионное соглашение, введите код продукта и свое имя (реальное или вымышленное) и щелкните по режиму переключателя (надписи) I accept the agreement (Я принимаю соглашение), а затем по ссылке Continue (Продолжить).
Появится окно, представленное на рис. 1.3. В нем показан список компонентов Visual FoxPro, которые будут установлены. Они отображаются в виде дерева. Слева от каждого пункта расположены квадраты. Если в квадрате стоит галочка (флажок), то указанный компонент будет установлен. Галочки (флажки) можно устанавливать и снимать щелчком мыши по квадратику, однако рекомендуется установить все компоненты. В поставку Visual FoxPro 9 Professional входят следующие компоненты:
>	интегрированная среда разработки Visual FoxPro 9;
>	Visual FoxPro Samples - примеры программ и библиотек;
Установка Visual FoxPro 9
V

Microsoft
Visual FoxPro
Where do you want to go today?'
__________________Microsoft
Start
Options Install
To install Microsoft Visual FoxPro
End User License Agreement
Be sure to carefully read and understand all of the rights and restrictions described in the ELILA, You will be asked to review
On this page'
a)	Read the end-user license agreement (ELLA).
b)	Accept the conditions of the EULA.
c'i Enter your name.
d) Click “Continue."
and either accept or not accept the terms of the EULA. This product will not set up on your computer unless and until you accept the terms of the EULA. For your future reference, you may print the text of the EULA from the eula.txt file of this product. You may also receive a copy of this EULA by contacting the Microsoft subsidiary serving your country, or by writing to : Microsoft Sales Information Center/One Microsoft Way/Redmond, WA 98052-6399.
2 On the Options page.
al Choose the feature? you would like to
IMPORTANT-READ CAREFULLY: This License Agreement for Pre-Release Software (“Aareement") is a leoal aareement between MJ
install
bf When you’re ready, click "install Now!"
Print License-Agreement
0 I accept the agreement;
О I do not accept the agreement
product Key:
НКСБ4 .IWFWH K31KD
Your Name:
Феликс
Review the ReadMe File
Continue Cancel
Рис. 1.2 ▼ Ввод кода и имени пользователя
> Visual FoxPro Tools - полезные служебные программы и их исходные тексты;
> Visual FoxPro Shared Features - коллекции готовых компонентов, которые можно использовать в своих проектах. Например, библиотека картинок, пиктограмм, курсоров и видеофайлов.
В этом же окне следует выбрать место для установки Visual FoxPro. Предлагаемое место для установки показано в текстовом поле справа от надписи Path в правой части окна. Вы можете либо согласиться с предложенным, либо указать диск и папку по своему выбору. Это можно сделать «вручную», щелкнув в текстовом поле и заменив диск или папки, указанные там, либо щелкнуть по кнопке с многоточием (...). Во втором случае откроется окно для выбора папки. Чтобы облегчить ваш выбор, разработчики Visual FoxPro в правой нижней части окна организовали список дисков вашего компьютера. Список сопровождается
ГЛАВА 1 ▼ Установка и настройка Visual FoxPro
Microsoft	Where do you want to go today?'
Visual FoxPro	__________'_________ Microsoft
Start шЯпВш Install
	Feature properties
Select items to install: _____________
I--0£b Visual FoxPro Samples
I-0е=Э Visual FoxPro Tools
Й-йьЬ Visual FoxPro Shared Features
L ЙСЪ Visual FoxPro Graphics Library
Name	Visual FoxPro 9.0 Professional	
	CXProgfam FilesXMiciosoft Visual FoxPfo 9\	...
Space Required	211.82 MB	
Q Feature description
Visual FoxPro 9.0 Professional
Details of core Visual FoxPro language, tools, and other product features including Designers, Builders, and Wizards.
Space allocation
Duve C:
В Used Space (4.8 GB)  Free Space (5.3 G8)
Drive П*
Cancel

Рис. 1.3 т Выбор комплектации при установке
диаграммами, которые показывают процент занятости дисков. Наглядно видно, сколько места занято на каждом диске (Used Space) и сколько свободно (Free Space). В окне указано и сколько места на диске требуется для установки выбранной конфигурации Visual FoxPro. Это можно увидеть справа от надписи Space Required в правой верхней части окна. Когда вы определитесь с тем, куда установить Visual FoxPro, щелкните по ссылке Install Now! (Установить сейчас!).
Программа установки начнет распаковку и установку компонентов Visual FoxPro, попутно отображая текст, рассказывающий о новых возможностях Visual FoxPro 9. Когда процесс установки закончится, ссылка под названием Cancel (Отмена) сменится ссылкой Done (Готово). По ней и следует щелкнуть мышью.
Вновь перед нами возникнет окно с рис. 1.1. На это раз есть возможность выбрать пункт 3. Если вы не подключены к Internet или у вас нет желания немедленно обновить только что установленные компоненты Visual FoxPro 9, то щелкать по ссылке Service Releases не следует.
Как пользоваться средой разработки Visual FoxPro 9
Для окончания процесса установки щелкаем по ссылке Exit (Выход).
Войдя в меню по кнопке Пуск (Start) и выбрав пункт меню Программы (Programs), вы должны увидеть новый пункт - Visual FoxPro 9.0.
Разработчики Visual FoxPro 9 предупреждают: если у вас установлено антивирусное средство Norton AntiVirus, в процессе установки Visual FoxPro 9 оно может выдать предупреждающее сообщение «Norton AntiVirus has detected a potential threat in the displayed Activity» («Norton AntiVirus выявил потенциальную угрозу файлам, отображаемым на экране»), которое запрещает работу с файлом vfpstart.hta. Антивирусное средство может заблокировать запуск этого файла. Чтобы разрешить запуск и нормально выполнить установку, следует выбрать в диалоговом окне антивирусной программы вариант Allow the entire script once from the Action menu (Выделить весь скрипт из меню Action) и щелкнуть по кнопке ОК.
Как пользоваться средой разработки Visual FoxPro 9
Запуск
Запуск Visual FoxPro осуществляется с помощью последовательности команд Пуск > Программы > Microsoft Visual FoxPro 9.0 (Start > Programs > Microsoft Visual FoxPro 9.0).
На экране появляется окно, представленное на рис. 1.4.
При первом запуске поверх основного окна может появиться окно под названием Task Pane Manager (Менеджер витрины задач). Менеджер витрины задач создан для ускорения работы, однако это удобство «на любителя». Пользуясь ссылками в этом окне, можно просмотреть список новых возможностей Visual FoxPro 9.0 (What’s new in Visual FoxPro?), настроить среду (Customize my development environment), создать новое приложение (Create a new application), создать новую базу данных (Create a new database), посетить web-сайт разработчиков (Go to the Visual FoxPro web site), если вы подключены к Internet. В нижней части окна отображаются список проектов и список баз данных, с которыми работали последнее время. Можно быстро открыть проект (кнопка Open project) или создать новый (кнопка New Project). Так же быстро можно отредактировать базу данных (кнопка Open Database) и создать новую (кнопка New Database). Открыть проект или базу данных можно также,
V
ГЛАВА 1 ▼ Установка и настройка Visual FoxPro
Рис. 1.4 v Вид основного окна Visual FoxPro 9.0
щелкнув по их именам. Пользоваться окном Task Pane Manager (Менеджер витрины задач) можно, если это покажется вам удобным, а можно просто закрыть его. Все, что делается с помощью вышеперечисленных ссылок в окне Task Pane Manager (Менеджер витрины задач), можно сделать, используя пункты меню Visual FoxPro.
Чтобы отключить появление окна Task Pane Manager (Менеджер витрины задач) при запуске Visual FoxPro 9, надо щелкнуть мышью по кнопке Options (Параметры) в этом окне. Появится окно настроек Task Pane Options (Параметры витрины задач), представленное па рис. 1.5.
Щелкните в левой части окна по папке Task Pane Manager. В появившихся в правой части окна настройках снимите щелчком мыши флажок режима Open the Task Pane Manager when Visual FoxPro starts (Открывать Менеджер витрины задач, когда запускается Visual FoxPro).
Как пользоваться средой разработки Visual FoxPro 9
Рис. 1.5 т Вид окна Task Pane Options
Основное меню
Традиционно в верхней части основного окна Visual FoxPro 9 располагается меню, состоящее из следующих пунктов:
>	 File (Файл) - команды для создания, открытия и сохранения различных файлов, настройка печати и вывод на печать, импорт и экспорт файлов;
>	Edit (Правка) - команды для работы с буфером обмена, отмена и повтор действий, поиск содержимого в файлах и замена его, вызов списка переменных и быстрой подсказки;
>	View (Вид) - настройка внешнего вида окна, вызов и отключение панелей инструментов;
>	Format (Формат) - настройка используемого шрифта, отступов и отображения пробелов в виде точек;
>	Tools (Инструменты) - содержит подменю для выбора Мастеров (программ, помогающих выполнить сложное действие с помощью вопросов и ответов); команды для записи клавиатурных макросов, команды вызова служебных программ (браузер классов, браузер объектов, галерея компонентов и др.). В этом пункте меню присутствует команда вызова отладчика
ГЛАВА 1 V Установка и настройка Visual FoxPro
(Debugger). Здесь же присутствует весьма полезная команда Options (Параметры), которая позволяет выполнить настройки среды Visual FoxPro;
>	Program (Программа) - команды запуска, останова и компиляции программ;
>	Window (Окно) - содержит команды настройки окна;
>	Help (Справка) - команды вызова справочной информации.
По умолчанию (если вы ничего не настраивали дополнительно) в основном окне под строкой меню присутствует панель инструментов Standard (Стандартная). Рассмотрим ее подробнее.
Р| открывает окно для создания нового файла или набора файлов. Возможные варианты:
-	Project - создается проект с набором необходимых файлов;
-	Database - создается файл базы данных;
-	Table - создается новая таблица базы данных;
-	Query - создается запрос к базе данных;
-	Connection - создастся соединение с базой данных;
-	View - создается представление базы данных, открытой локально на вашем компьютере;
-	Remote View - создается представление удаленной базы данных, к которой вы подсоединены через ODBC или как-либо еще;
-	Form - создается новая форма (диалоговое окно);
-	Report -- создается новый отчет:
-	Label - создается этикетка;
-	Program - открывается окно для создания новой программы;
-	Class - создается новый класс на основе уже существующего;
-	Text file - открывается окно для создания текстового файла;
- Menu - создается новое меню;
вызывает стандартное окно открытия файла. По умолчанию тип файла установлен Project (*.pjx), но вы можете выбирать другие типы файлов Visual FoxPro;
Щ открывает стандартное окно сохранения файла;
осуществляет печать на принтер с текущими установками печати;
позволяет просмотреть страницу в том виде, в каком она будет напечатана;
стандартная кнопка Вырезать для работы с буфером обмена;
ВД стандартная кнопка Скопировать для работы с буфером обмена;
Как пользоваться средой разработки Visual FoxPro 9
datal	| v
(таблицы);
стандартная кнопка Вставить для работы с буфером обмена;
io отменяет последнее действие;
Си повторяет последнее отмененное действие;
J запускает на выполнение текущую программу, форму, запрос или отчет; изменяет SCX-файл, ассоциированный с текущей формой;
раскрывающийся список для выбора текущей базы данных
Щ отображает или скрывает окно Command;
Igp открывает окно Data session (Сессия работы с данными). Это окно позволяет открыть, изменить и закрыть таблицу базы данных, изменить свойства и структуру таблицы, установить связь с другими таблицами; отображает окно свойств текущего элемента. Элемент, свойства которого представлены в окне, показан в раскрывающемся списке в верхней части окна;
открывает окно Document view window (Вид документа);
вызывает инструмент Class Browser (Браузер классов), позволяющий просмотреть структуру классов;
вызывает Object Browser (Браузер объектов) для отображения установленных OLE-объектов;
отображает на экране окно Task Pane Manager (Менеджер витрины задач);
создает или отображает созданную панель инструментов.
Настройка среды
Настройка среды Visual FoxPro 9 осуществляется в основном при помощи окна, которое вызывается с помощью команды Options (Параметры) из меню Tools (Инструменты). В этом окне (рис. 1.6) присутствуют вкладки, отвечающие за ту или иную область настроек. Определим назначение каждой вкладки.
Вкладка View
Вкладка View (Вид) позволяет настроить вид основного окна Visual FoxPro 9 и содержит флажки режимов:
>	Status bar (Строка состояния);
>	Clock (Часы);
ГЛАВА 1 ▼ Установка и настройка Visual FoxPro
>	Command results (Результаты команд) - флажок, позволяющий выводить или скрывать сообщения о результатах действия команд (соответствует команде SET TALK ON I OFF);
>	System messages (Системные сообщения) - флажок, разрешающий или отменяющий вывод системных сообщений в строку состояния (соответствует команде SET NOTIFY ON I OFF);
>	Open last project on startup (Открывать последний проект при запуске).
На этой же вкладке присутствует числовое поле Most Recently Used list contains ... items (Список наиболее часто используемых элементов содержит ... записи) для задания количества строк в нижней части меню File (Файл). При выборе такой строки можно быстро запустить редактирование объектов, с которыми работали в последнее время. На этой же вкладке присутствует числовое поле List display count (Количество элементов в списке). Оно позволяет задать максимальное число элементов, одновременно появляющихся в раскрывающемся списке интеллектуальной подсказки при вводе команд. Подробнее систему интеллектуальной подсказки IntelliSense рассмотрим чуть ниже.
Вкладка General
Вкладка General (Общие) позволяет изменить общие настройки среды Visual FoxPro 9. Эта вкладка включает группу Warning sound (Звук предупреждения),
Как пользоваться средой разработки Visual FoxPro 9
настраивающую звук, который слышно, когда вы пытаетесь выполнить недопустимую операцию. На этой же вкладке присутствует группа Programming (Программирование), содержащая флажки режимов:
>	Cancel programs on escape (Прерывать программу при нажатии Escape);
>	Log compilation errors (Протоколировать ошибки при компиляции), который позволяет включить или выключить создание файла с ошибками при компиляции (создается файл с именем проекта, имеющий расширение .err);
> Set development, позволяющий включить режим, когда программа перекомпилируется перед запуском, если файл с текстом программы переписывался позднее, чем откомпилированный файл (то есть если вы вносили изменения в текст программы после последней компиляции).
Единственный флажок режима в группе Year 2000 Compliance (Соответствие 2000 году) - Strict Date Level (Уровень точной даты). Он позволяет установить уровень проверки формата дат: Off - выключена, Constants - даты проверяются на соответствие текущему установленному формату, Constants plus CTOD() and CTOT() - идентично предыдущему, но проверке подвергаются и функции CTOD () и СТОТ (), которые символьные значения дат преобразуют в формат даты и времени.
Рассмотрим далее флажок режима dBase compatibility (Совместимость с dBase). Он обеспечивает совместимость с набором команд FoxBase+ и dBase.
Флажок режима Use Visual FoxPro color palette включает или выключает использование цветовой палитры Visual FoxPro для отображения графических файлов.
Confirm file replacement (Подтверждать замену файла) - флажок, определяющий, должен ли Visual FoxPro запрашивать подтверждение, если сохраняемый файл уже существует, или молча перезаписывать его.
Флажок Browse IME control вызывает Input Method Editor (Редактор метода ввода) в момент перехода на текстовое поле при использовании команды Browse. Он позволяет редактировать текстовое поле.
Группа Data entry (Ввод данных) содержит раскрывающийся список, определяющий, какими клавишами для навигации вы будете пользоваться: как принято в MS DOS или стандартными для Windows. В этой же группе два флажка:
>	Fill new records with current values (Заполнять новую запись текущими значениями);
>	Enter or tab to exit fields (Использовать клавиши Enter или Tab для выхода из текстового поля).
ГЛАВА 1 У Установка и настройка Visual FoxPro
Вкладка Data
Вкладка Data (Данные) - вкладка для установки параметров работы с таблицами базы данных.
Флажок режима Open exclusive позволяет установить, открывается ли таблица по умолчанию в эксклюзивном режиме (флажок установлен) или нет (флажок снят).
Флажок Show field names (Показывать имена полей) определяет, выводить или нет имена полей таблицы в случае выполнения команд DISPLAY, CALCULATE, AVERAGE, LIST и SUM.
Prompt for code page (Запрос на кодовую страницу) определяет, следует ли запрашивать кодовую страницу при открытии файла, если к этому моменту она еще не прописана в файле.
Ignore deleted records (Игнорировать удаленные записи) - определяет, отображать или нет записи, помеченные на удаление.
Флажок Rushmore Optimization включает использование технологии Rushmore в командах, использующих for.
Следующий флажок - Unique records in indexes (Уникальные записи в индексах) - служит для определения режима включения в индексный файл записей с повторяющимися ключевыми полями. Если флажок установлен, в индексный файл будет занесен только индекс первой из нескольких записей с одинаковыми ключевыми полями.
Раскрывающийся список Collating sequence позволяет выбрать кодовую страницу для определения порядка сортировки л соответствует команде SET COLLATE.
Числовое поле Record counter interval определяет, сколько записей должно быть обработано (например, при выполнении команды СОРА ТО), прежде чем обновится счетчик страниц в строке состояния. Значения могут колебаться в диапазоне от 1 до 32767.
Числовое поле Memo block size (bytes) - Размер блока Мето - позволяет установить минимальный размер блока для хранения memo-полей.
Поля Browse refresh interval (sec) и Table refresh interval (sec) задают временные интервалы, через которые будет происходить обновление соответственно отображаемой по команде BROWSE на экране таблицы и таблицы в памяти, считанной туда с сетевого ресурса.
Группа Locking and buffering (Блокировка и буферизация) содержит:
> флажок Automatic file locking (Автоматическая блокировка файла), обеспечивающий автоматический захват и блокировку от записи другими пользователями или программами файла при выполнении команд
Как пользоваться средой разработки Visjial FoxPro 9
AVERAGE, COPY TO, INDEX, REPORT, SORT и TOTAL (если флажок не установлен, то автоматической блокировки не происходит);
> флажок Multiple record locks (Блокировка нескольких записей) для разрешения одновременной блокировки нескольких записей. Если вы попытаетесь при выключенном флажке заблокировать другую запись, предыдущая заблокированная запись автоматически разблокируется.
Входящий в эту же группу раскрывающийся список Buffering (Буферизация) позволяет установить способ буферизации при внесении изменений в таблицы. Если установлено значение;
>	Off (Выключено), буферизации не происходит, изменения немедленно вносятся в файлы таблиц (этот режим рекомендуется, если изменения в эту таблицу можете внести только вы);
>	Record (Pessimistic), запись захватывается, изменения буферизуются (другие пользователи не могут изменять эту запись) и вносятся в таблицу, когда происходит переход к другой записи;
>	Record (Optimistic), запись не захватывается, изменения буферизуются (другие пользователи могут изменять эту запись) и вносятся в таблицу, когда происходит переход к другой записи;
>	Table (Pessimistic), записи захватываются, изменения буферизуются (другие пользователи не могут изменять эти записи) и вносятся в таблицу, когда происходит вызов функции TABLEUPDATE (это самый безопасный способ редактирования таблиц, но при этом накладываются самые существенные ограничения на работу других пользователей с этой таблицей);
> Table (Optimistic), записи не захватываются, изменения буферизуются (другие пользователи могут изменять записи) и вносятся в таблицу, когда происходит вызов функции TABLEUPDATE.
И последний элемент, который мы рассмотрим на вкладке Data (Данные), -раскрывающийся список Reprocessing (Повторный процесс). Он определяет, через какое время Visual FoxPro будет пытаться захватить запись, уже захваченную другим пользователем. Возможные варианты;
>	Attempt Lock (Default) - попытаться захватить запись один раз;
>	Attempt Lock (Automatic) - пытаться захватить запись до тех пор, пока не получится это сделать или пока пользователь не нажмет ESC;
>	Wait for Lock - пытаться захватить запись до тех пор, пока не получится это сделать (у пользователя нет возможности прервать попытки захвата);
>	Retry Attempts - задает количество попыток захвата записи;
V	ГЛАВА 1 ▼ Установка и настройка Visual FoxPro
>	 Retry Seconds - задает период времени, в который могут осуществляться попытки доступа (если время истечет, а запись останется занятой, выдается сообщение об ошибке).
Вкладка Remote Data
Вкладка Remote Data (Удаленные данные) - вкладка для установки параметров работы с таблицами удаленных баз данных.
Группа Remote View Defaults включает настройки по представлениям (курсорам) удаленных таблиц. Эта группа включает:
>	флажок Share connection, определяющий возможность подключения к новой таблице через существующее соединение (если он включен, то через текущее, а если выключен, то создается новое соединение);
>	флажок Fetch memo задает способ работы с полями memo и general. Если он включен, такие поля загружаются из удаленной таблицы только при их активации;
>	два раскрывающихся списка, относящихся к SQL updates - Criteria и Method. Первый определяет способ проверки изменений записи перед проведением SQL-команды UPDATE, а второй - каким способом производить команду UPDATE: использовать SQL UPDATE или комбинацию SQL DELETE и SQL INSERT;
>	числовое поле Records to fetch at a time задает количество записей, которые приходят в курсор из удаленной таблицы за один раз (можно включить флажок АН, и тогда придут сразу все записи);
>	числовое поле Maximum records to fetch задает максимальное количество записей, которые могут прийти в курсор из удаленной таблицы;
>	чтобы задать максимальное количество символов в текстовых полях, используется поле Use memo for fields >= (если размер поля превысит это значение, оно будет автоматически преобразовано в поле memo-типа);
>	числовое поле Records to batch update служит для задания количества обновлений, посылаемых за один раз.
Группа Connection Defaults включает настройки соединения с удаленными таблицами. Эта группа включает:
>	флажок Asynchronous execution в установленном состоянии говорит о том, что выполнение SQL-команд с использованием функций SQLEXEC, SQLMORERESULTS, SQLTABLES и SQLCLOUMNS будет происходить в фоновом режиме, то есть после вызова этих функций, не дожидаясь результата их работы, управление будет передано следующей за ними команде;
Как пользоваться средой разработки Visual FoxPro 9 V
>	флажок Display warnings определяет, выводить или нет сообщения с предупреждениями на экран;
>	если вы используете мультизапрос в команде SQLEXEC, установленный флажок Batch processing говорит о том, что результат выполнения возвращается только в тот момент, когда все результаты компонентов запроса получены;
>	флажок Automatic transactions определяет, как обрабатываются транзакции (если флажок отключен, нужно самостоятельно выполнять SQLCOMMIT или SQLROLLBACK);
>	 раскрывающийся список Show login указывает, в какой момент запрашивать имя пользователя и пароль для получения данных из удаленной таблицы. Варианты: Only When Necessary (Только когда необходимо), Always (Всегда), Never (Никогда);
>	числовое поле Connection timeout (sec) определяет время ожидания отклика от сервера (в секундах) при установке соединения. Если за указанное время отклик не получен, Visual FoxPro генерирует ошибку;
>	- числовое поле Idle timeout (min) задает в минутах время, через которое соединение будет разорвано, если никаких запросов не делается. Если по окончании этого времени произошло рассоединение и был сформирован запрос, будет предпринята попытка восстановить соединение автоматически;
>	поле Query timeout (sec) предназначено для ограничения времени ожидания ответа на запрос. Если время, указываемое в секундах от 0 до 600, прошло, Visual FoxPro генерирует ошибку;
>	- для указания времени, через которое будет осуществлена проверка завершения выполнения SQL-запроса, используется поле Wait time (ms). Время указывается в миллисекундах.
Вкладка File Locations
Вкладка File Locations (Расположение файлов) - вкладка, показывающая и дающая возможность изменить пути к файлам, используемым Visual FoxPro. Многие пути заполнены автоматически в зависимости от того, в какую папку вы установили Visual FoxPro. Эти пути изменять не рекомендуется, если вы не уверены в необходимости этого.
Два пути, на которые имеет смысл обратить внимание, - Default Directory (Папка по умолчанию) и Search Path (Путь поиска). В первом случае устанавливается папка, которая станет текущей, а во втором - список папок, в которых будет осуществляться поиск файлов, если они не найдены по другим путям.
ГЛАВА 1 ▼ Установка и настройка Visual FoxPro
Вкладка Forms
Вкладка Forms (Формы) - вкладка с параметрами дизайнера форм.
Элементы группы Grid (Сетка):
>	флажок Grid lines (Линии сетки) указывает, отображать ли линии сетки на форме для облегчения размещения элементов в окне формы (эта сетка - только разметка и при запуске формы на выполнение не отображается);
>	флажок Snap to grid (Захватить в сетку) во включенном состоянии приводит к тому, что новый элемент, размещаемый в форме, выравнивается по ближайшим линиям сетки;
>	числовые поля Horizontal spacing (pixels) и Vertical spacing (pixels) задают шаг сетки (величину ячейки) по горизонтали и вертикали соответственно (в точках).
Если флажок Show position (Показывать позицию) установлен, в строке состояния показывается позиция размещаемого элемента в окне формы.
Раскрывающийся список Tab ordering позволяет задать порядок обхода объектов при использовании клавиши Tab.
Для выбора максимального размера окна формы при использовании дизайнера форм используется раскрывающийся список Maximum design area (Максимальная площадь дизайна).
Пользуясь элементами группы Template classes, можно выбрать классы, на основе которых будут строиться ваши новые формы.
Если включить флажок Builder lock (Закрепление Мастера) при размещении в окне формы элементов, для которых предусмотрены Мастера создания (Builder), они будут вызываться автоматически. Например, если разместить в окне формы элемент Grid, автоматически запустится Grid Builder.
Последний флажок на вкладке Forms (Формы) - Prompt to save changes before running form. Если он установлен, то при запуске формы на выполнение из дизайнера форм будет выдан запрос на сохранение изменений, сделанных вами в форме после последнего сохранения.
Вкладка Projects
Вкладка Projects (Проекты) - вкладка, содержащая настройки для менеджера проектов.
Переключатель Project double-click action позволяет выбрать один из двух вариантов действий при двойном щелчке по имени файла в проекте: Run Selected
Как иельзааатыг.я средой разработки Visual FoxPro 9
File (Запустить выбранный файл) или Modify Selected File (Изменить (отредактировать) выбранный файл).
Флажок Prompt for Wizards определяет, что при создании нового файла вам будет предложено воспользоваться Мастером (Wizard), если такой Мастер существует.
Если установить флажок Display user-defined container icons, менеджер проектов будет отображать контейнеры заданными пользователем пиктограммами.
Группа Source control options (Настройки контроля источника) содержит элементы, позволяющие настроить приложение контроля источника. При установке флажка Project class появляется возможность задать класс, на основе которого будет создан новый проект.
Вкладка Controls
Вкладка Controls (Управление) - вкладка, содержащая настройки для регистрации библиотек визуальных классов, для классов, указанных во вкладке Forms (Формы).
Вкладка Regional
Вкладка Regional (Национальная настройка) - вкладка, которая задает используемые национальные настройки.
Если установить флажок Use System Settings (Использовать системные установки), то все настройки этой вкладки будут определены в соответствии с установками в вашей операционной системе.
Настройки группы Date and time (Дата и время) влияют на формат даты и времени, используемый по умолчанию.
Настройки группы Currency and numbers (Денежная единица и числа) задают формат обозначения национальной валюты и чисел.
Вкладка Debug
Вкладка Debug (Отладка) - вкладка, позволяющая настроить окно встроенного Отладчика (Debugger).
Раскрывающийся список Environment (Окружение) служит для определения окна, в котором будет работать Отладчик. Если указано Debug frame, все окна Отладчика открываются в одном окне, внешнем по отношению к основному окну Visual FoxPro. Если указано значение FoxPro frame, окна размещаются внутри основного окна Visual FoxPro.
ГЛАВА 1 V Установка и настройка Visual FoxPro
Установка флажка Display timer events (Показывать события таймера) приводит к тому, что при трассировке программы в окне трассировки отображается наступление событий объекта Timer Control.
Расположенный ниже переключатель Specify Window (Настроить окно) определяет, какое окно Отладчика мы в данный момент настраиваем.
Вкпадка Editor
Вкладка Editor (Редактор) - вкладка с настройками встроенного редактора Visual FoxPro.
Флажок Selection margin определяет, нужна ли слева от текста полоса для выделения строк.
Установка флажка Drag drop between words (Перетаскивание между словами) говорит о том, что перетаскивание мышью выделенного фрагмента возможно только в промежутки между словами (если флажок не установлен, можно перетаскивать и в середину слова).
Если флажок Enable hyperlinks (Гиперссылки возможны) установлен, редактор воспринимает фразы, начинающиеся с «http:/», как гиперссылку.
Поле Comment string (Строка комментария) позволяет задать символы, которые идентифицируют комментарий в тексте программы.
Раскрывающийся список Background Compile (Фоновая обработка) задает стиль, которым выделяются нарушения синтаксиса. Например, таким стилем будет отмечена команда, которую вы начали набирать, но Visual FoxPro еще не распознал ее. Варианты:
>	Red Inversion (Выделение красным);
>	Gray (Серый);
>	Underline (Подчеркивание);
>	None (Нет).
Группа Syntax color settings (Установки цвета по синтаксису) позволяет настроить цветовую гамму по каждому объекту, выбранному в раскрывающемся списке Area:
>	Comments (Комментарии);
>	Keywords (Ключевые слова);
>	Literals (Литеры);
>	Normal (Нормальный текст);
>	Operators (Операторы);
>	Strings (Строки);
>	Variables (Переменные).
Как пользоваться средой разработки Visual FoxPro 9 V
Чуть ниже отображается для примера кусочек программы, где наглядно показано, какие элементы текста программы в какие цвета окрашиваются.
Вкладка Field Mapping
Вкладка Field Mapping (Назначение полей) - вкладка для назначения соответствия типов данных и элементов форм.
Табличка Map fields to classes for drag-and-drop operations (Назначьте соответствие полей и классов для операций drag-and-drop) позволяет установить соответствие между перетаскиваемым на форму полем и создаваемым для его отображения и редактирования элементом формы.
Группа Database options (Настройки базы данных) представлена четырьмя флажками:
>	Drag-and-drop field caption (Заголовки полей drag-and-drop) - включается, если требуется, чтобы названия создаваемых классов совпадали с именами полей;
>	Copy field comment (Копировать комментарии полей) - включается, если требуется скопировать комментарий поля в свойство Comment соответствующего класса;
>	Copy field input mask (Копировать маску ввода) - включается, если требуется скопировать маску ввода поля в свойство InputMask соответствующего нового класса;
>	Copy field format (Копировать формат поля) - включается, если требуется скопировать спецификации формата поля в свойство Format соответствующего нового класса.
Вкладка IDE
Вкладка IDE содержит настройки для редакторов Visual FoxPro.
Раскрывающийся список Туре (Тип), входящий в группу Specify file/window (Задайте файл/окно), определяет, для какого объекта вы будете делать установки на вкладке IDE. Если для выбранного объекта поддерживается настройка параметра, он будет активным, если нет - заблокированным. Ниже рассмотрим возможные настройки.
Поле Extensions (Расширения) позволяет задать список расширений файлов, в которых хранится информация текущего типа.
Группа Indentation включает:
>	числовые поля Tab size (Размер табуляции) и Indent size (Размер отступа);
ГЛАВА 1 » Установка и настройка Visual FoxPro
> переключатель, позволяющий установить один из двух режимов: Insert spaces (Вставлять пробелы) или Keep tabs (Сохранять символы табуляции). Размеры устанавливаются в символах.
Группа Save options (Настройки сохранения) позволяет задать следующие параметры процедуры сохранения файлов на диск:
>	Make backup (Создавать резервную копию) - при сохранении файла в отдельный файл записывается его предыдущее состояние;
>	Save with line feeds (Сохранять с символами конца строк) - каждая строка файла оканчивается символом переноса и символом конца строки (символы с кодами 13 и 10);
>	Save with end-of-file marker (Сохранять с меткой end-of-file) - вставляет в конец файла специальный символ конца файла;
>	Compile before saving (Компилировать перед сохранением) - для соответствующих файлов выполняет компиляцию перед сохранением.
Группа Appearance and behavior (Оформление и поведение) содержит следующие настройки:
>	раскрывающийся список Alignment (Выравнивание) задает способ выравнивания строк (Left - по левому краю, Right - по правому, Center - по центру);
>	поле Font (Шрифт) позволяет задать характеристики шрифта (для вызова окна настройки шрифта следует щелкнуть мышью по кнопке с тремя точками);
>	флажок режима Drag-and-drop editing (Редактирование с Drag-and-drop) позволяет при редактировании использовать технологию перетаскивания мышью;
>	флажок режима Automatic indent (Автоматический отступ) включает режим, когда при переходе на новую строку автоматически определяется нужный отступ и курсор устанавливается с учетом этого отступа;
>	флажок режима Show line/column position (Показывать позицию стро-ки/столбца) управляет отображением в строке состояния основного окна строку/столбец, где находится курсор в memo-полях;
>	флажок Word wrap (Перенос слов). Если установлен, то при достижении конца строки курсор будет автоматически перескакивать на начало следующей;
>	флажок Syntax coloring (Выделение цветом по синтаксису). Установленный флажок говорит о том, что элементы текста в окне будут выделяться цветом в соответствии с установками на вкладке Editor (Редактор);
Как пользоваться средой разработки Visual FoxPro 9
>	флажок Embedded hyperlinks (гиперссылки) определяет, будут ли включаться в файл гиперссылки;
>	флажок Display white space (Отображать пробелы). При установленном флажке пробелы, символы табуляции и другие невидимые символы будут отображаться специальными значками.
Вкладка Reports
Вкладка Reports (Отчеты) отвечает за настройки Дизайнера отчетов.
Флажок Use private data sessions (Использовать отдельную сессию) включает режим использования отдельной сессии извлечения данных для формирования отчета.
При установке флажка Save printer environment (Сохранять установки принтера) текущие установки принтера сохраняются вместе с отчетом.
Если флажок Use DBC field captions (Использовать наименования полей DBC) установлен, при перетаскивании на заготовку отчета полей из DBC (database container) будут использоваться их наименования.
Раскрывающийся список Ruler scale (Размерность линейки) дает возможность выбрать единицы измерения для горизонтальной и вертикальной линейки.
Флажок Show position in status bar (Отображать позицию в строке состояния) позволяет вывести в строку состояния информацию о позиции указателя мыши.
При установке флажка Snap to grid новый элемент, размещаемый в отчете, выравнивается по ближайшим линиям сетки.
Флажок Show grid lines (Показывать линии сетки) позволяет скрыть/ото-бразить линии сетки при редактировании отчета. При печати готового отчета эти линии не отображаются.
Числовые поля Horizontal spacing (Горизонтальный пробел) и Vertical spacing (Вертикальный пробел) дают возможность настроить шаг сетки (в точках) по горизонтали и вертикали соответственно.
Поле Default font (Шрифт по умолчанию) позволяет задать характеристики шрифта (для вызова окна настройки шрифта следует щелкнуть мышью по кнопке с тремя точками).
Таким образом, мы рассмотрели основные возможности по настройке Visual FoxPro. Если вы новичок в работе с Visual FoxPro, можно оставить все настройки по умолчанию. В случае необходимости стоит скорректировать пути Default Directory (Папка по умолчанию) и Search Path (Путь поиска) на вкладке File Locations (Расположение файлов). В первом случае устанавливается папка, которая станет текущей, а во втором - список папок, в которых
ГЛАВА 1 V Установка и настройка Visual FoxPro
будет осуществляться поиск файлов, если они не найдены другим путем. Однако не бойтесь экспериментировать - настройки по умолчанию всегда можно вернуть, щелкнув по кнопке Set As Default (По умолчанию).
Окно команд
В рабочей области основного окна Visual FoxPro размещается окно Command (Командное). Как и другие окна, это окно можно перемещать по вашему усмотрению в любое удобное место. Часто разработчики, привыкшие к классическому FoxPro для MS DOS, располагают его в правом нижнем углу рабочей области. Это окно предназначено для ввода команд Visual FoxPro. При нажатии клавиши Enter набранная команда выполнится. Это очень удобная возможность работать с базой данных в интерактивном режиме. А для разработчиков программ это еще и возможность проверять действие процедур и функций. Иногда возникает потребность, например, оценить, какой результат возвращает функция с определенными параметрами на входе и как изменяется результат при вариациях параметров.
Технология IntelliSense
Технология IntelliSense- весьма популярная функция, реализованная во многих современных редакторах исходного текста программ. Интеллектуальная подсказка IntelliSense делает написание кода более легким благодаря возможности автоматического завершения написания оператора, свойства или функции. Вы начинаете писать команду или параметр, a Visual FoxPro предлагает возможные их варианты. Такая возможность уменьшает количество вводимого вручную кода и позволяет разработчику не искать в документации параметры, свойства, методы нужной функции или объекта. Предоставлена возможность подсказок параметров команды (Quick Info) - пример показан на рис. 1.7, списка объектов (List Members) - пример показан на рис. 1.8, списка значений (List Values) - пример показан на рис. 1.9.
В Visual FoxPro 9 интеллектуальная подсказка действует и в окне Command (Командное).
Включить или выключить поддержку IntelliSense можно, выбрав в меню Tools (Инструменты) команду IntelliSense Manager. Откроется диалоговое окно, показанное на рис. 1.10. Если на вкладке General (Общие) установлен флажок Enable IntelliSense, то поддержка технологии IntelliSense включена. В этом же окне (IntelliSense Manager) задаются параметры работы IntelliSense.
13 Programi *
JSE [[Databe$eNaiTiei]Table | SQLViewName | ?]
[IN nWorkArea | cTableAlias]
[ONLINE]
[ADMIN]
[AGAIN]
[NOREQ1 'EkY [nDotaSes5i07iN>;ir.ber]]
[NODATA]
[INDEX IndexFileList | ?
[ORDER [nlndexNumber | IDXFileName
| [TAG] TagName[OF CDXFileName]
[ASCENDING | DESCENDING]]]]
[ALIAS cTableAhas]
[EXCLUSIVE]
[SHARED]
[NOUPDATE]
[CONNSTRING cConi iSctiGnSinng 1 (cSUtc-meritHardkFkniv.iir)]
Рис. 1.7 ▼ Подсказка параметров команды
I Object Form]	fyji: Pjocedwe. j v Load	j v i
1 TnigForm,}	a :
i	Activate	[a
i	[^ActiveControl	й
j	^ActiveFofjn
-OAddObject
i	J^AddProperty
!	$ AfterDock
I	ffiAllowOutput
I	^AlwaysOnBottom
I	^AlwaysOnTop
!	gg’AutoCenter	
|	g4?BackColur
i	g^BaseClass
I	P BeforeDod-
i	g4?BindControl>	jv
i < ] j	E§*BorderStyle	;v	>]'
Рис. 1.8 т Подсказка списка объект ов
Справочная система
Еще одно удобство Visual FoxPro 9 - наличие встроенной развитой справочной! системы. В меню Help (Справка) находя гея команды, вызывающие следующие действия:
> Microsoft Visual FoxPro Help ~ справочная система Visual FoxPro;
> MSDN Search - поиск но справочной системе MSDN (действует, если эта система у вас установлена);
ГЛАВА 1 V Установка и настройка Visual FoxPro
Object ! ЩИsrnil	^vV Procedure: I i> Load	|vl
ThisForia.EorderSsYle^ 0 - No border	b*v
1 - Fixed Single 2 • Fixed Dialog
I 3 • Sizable (Default)
Рис. 1.9 v Подсказка списка значений
f:| Custom l| Advanced __________________________________
0Enable InteffiSense ------------------------------ ----------------- - • -
List members: [Automatic	[vj.	[ Browse ]
Quickinfo bps: J Automatic	[ Jjps j
Capitalization / Expansion-------------------------------------
Functions:	Leave current settings (m.) (UPPERCASE)
Commands:	j Leave current settings [vj: (UPPERCASE)
FoxCode default: i	fvL
О Apply changes to Visual FoxPro language only
f T ST I [» Cancel ]
Рис. 1.10 ▼ Окно IntelliSense Manager
>	Technical Support - справка по оказанию технической поддержки;
>	Visual FoxPro on the Web - переход на страничку в Internet, посвященную Visual FoxPro;
>	About Microsoft Visual FoxPro - вызывает окно указанием текущей версии Visual FoxPro, введенных вами персональных данных и сведений об авторском праве на данный продукт.
Как пользоваться средой разработки Visual FoxPro 9
<<J	Q Й*’
•ззеш Шрифт Печать Параметры
АН и- 4
Скрыть ri-i	Далее г.
Сзлер.ам-е |	| rWo | У-«л!±
д|
s-j \1J What's New in Visual FoxPro ГТ* =] Guide to Reporting Improv? > =| Data and XML Feature Enl -j S] SQL Language Improveme’ i |] Class Enhancements  I [i] Language Enhancements [i] Interactive Development E Is] Enhancements to Visual Fc
Miscellaneous Enhanceme1 |i] Changes in Functionality fo; |j] Visual FoxPro New Reserv У] How to: Submit Feedback  ? belting Started with Visual FoxlL(li I - ♦ I sing Visual FoxPro	11
* ♦ Samples and Walkthroughs |
<L^ J f>r
i Visual FoxPro 0 0
Microsoft Visual FoxPro 9.0
i Welcome to Microsoft Visual FoxPro. Visual FoxPro is
I the object-oriented relational database management
I system that makes rt possible for you to create
i database solutions for the desktop to the Web. Visual
 FoxPro provides powerful data handling capabilities, rapid application development tools for maximum
I productivity, ana the flexibility needed to build ай types • of database solutions.
In the Visual FoxPro Documentation
What’s Meww FoxPro
Describes the new features and enhancements included in this version of Visual FoxPro.
Getfrw Started with U'.'soj/ FoxPro
Рис.1.11 ▼ Окно справочной системы Visual FoxPro
Окно справочной системы Visual FoxPro сделано по классической схеме и разделено на две части (рис. 1.11). В левой части располагаются четыре вкладки: Содержание, Указатель, Поиск и Избранное.
На вкладке Содержание отображаются названия разделов и статей в виде дерева. Щелкая по плюсу слева от наименования раздела, можно раскрыть перечень входящих в него статей. В правой части окна отображается текст выбранной статьи.
Вкладка Указатель позволяет быстро найти описание процедуры, функции или любого ключевого слова Visual FoxPro. Достаточно ввести его или выбрать из списка.
Найти среди справочных сведений нужное описание по слову или сочетанию слов можно, используя третью вкладку - Поиск. Введите слова для поиска и получите список разделов, где они упоминаются. Можно управлять параметрами поиска, устанавливая или убирая флажки Предыдущий поиск, Похожие слова и Только в заголовках.
Выход из среды
Закончить работу со средой Visual FoxPro 9 можно, либо используя команду' Exit (Выход) из меню File (Файл), либо щелкнув по стандартной кнопке Закрыть в
ГЛАВА 1 ▼ Установка и настройка Visual FoxPro
заголовке окна Visual FoxPro, либо выполнив команду QUIT в окне Command, либо нажав комбинацию клавиш Alt+F4.
Итоги главы
Мы рассмотрели, как выглядит окно программы Visual FoxPro (VFP) и как настраивать среду разработки VFP 9. Наличие разветвленного, но хорошо организованного меню дает широкие возможности как для тех, кто использует Visual FoxPro 9 для работы с таблицами без программирования, так и для программистов, создающих приложения на языке Visual FoxPro 9.
Наличие панелей инструментов сильно облегчает выполнение рутинных операций и позволяет экономить время.
Visual FoxPro 9 позволяет произвести тонкую настройку под конкретного пользователя и условия работы.
В следующей главе мы разберемся, как, используя эту среду, создать базу данных и организовать работу с ней. Вы убедитесь в удобстве интерфейса Visual FoxPro 9 для проведения этих операций.
Начальные сведения о базах данных
Базы данных. Для чего они?
Представим, что мы работаем на большом складе. На этот склад товар свозили от разных производителей в разное время. Никто не занимался сортировкой товара, его складывали как попало (а точнее, как было удобно грузчикам). К воротам склада подъехал грузовик, к вам спешит экспедитор с накладной на товар. «Скорее! Отгрузите мне холодильники, - кричит он. -- Спрос на них в пашем магазине превысил все ожидания!» Вы начинаете метаться по складу в поисках холодильников, и хорошо, если успеете их найти, пока все покупатели не убежали к конкурентам. Ведь вы точно знаете, они должны быть где-то здесь...
Так и с хранящимися в компьютерах данными. Чтобы быстро отыскать нужную информацию, ее надо как-то логически упорядочить. Упорядочивают ее при помощи баз данных. База данных (БД) -- это именованная совокупность данных, отражающая состояние объектов и их отношений в рассматриваемой предметной области. Другими словами, база данных - это хранящиеся вместе в определенном виде данные, посвященные одной тематике. Хранящаяся в базе данных информация описывает какие-либо объекты или события реального мира. Эти обьекты и события называют' предметной областью (ПрО). Предметную область выявляют на начальном этапе проектирования базы данных.
Для управления доступом к данным, хранящимся в базах данных, принято использовать специальные программные системы, называемые системами управления базами данных (СУБД). Официально термин СУБД определяют как
ГЛАВА 2 V Начальные сведения © базах данных
совокупность языковых и программных средств, предназначенных для создания, ведения и совместного использования БД несколькими пользователями.
С помощью СУБД можно:
>	определять структуру базы данных;
>	задавать ограничения для хранящихся данных;
>	• манипулировать данными;
>	регламентировать доступ к данным;
>	обеспечивать целостность данных;
>	обеспечивать непротиворечивость данных;
>	восстанавливать информацию в базе данных.
Базы данных бывают однопользовательскими и многопользовательскими. Если с информацией в базе данных в один момент времени может работать только одно приложение (программное средство), то это однопользовательская БД. Если же предусмотрен механизм совместного использования ресурсов БД, то такая БД является многопользовательской.
Кроме самих данных, описывающих предметную область, в БД хранится описание способа хранения этих данных. Такие данные о данных называют метаданными.
По степени универсальности СУБД различают СУБД общего назначения и СУБД специализированного назначения. Первые не ориентированы на какую-либо конкретную предметную область. Специализированные СУБД довольно дороги в создании и эксплуатации. Наиболее распространены СУБД общего назначения. Они, как правило, обладают развитыми средствами настройки под конкретную предметную область.
Масштаб данных и количество пользователей определяет, насколько мощную (и, соответственно, дорогую) СУБД придется использовать. СУБД, входящая в состав Visual FoxPro 9, не самая мощная. Она вполне прилично обеспечивает контроль непротиворечивости и целостности данных, но, если предполагается использовать хранящиеся данные на уровне нескольких отделов предприятия с более чем двумя десятками пользователей, лучше остановить свой выбор, например, на Oracle или хотя бы на Microsoft SQL Server. Однако это не означает, что в таких случаях средства работы с базой данных Visual FoxPro 9 совершенно бесполезны. Очень удобно выбирать нужные данные из централизованной СУБД (что средства программирования Visual FoxPro 9 позволяют делать очень эффективно) в локальную промежуточную базу данных, с которой работает приложение. Для этой локальной базы данных весьма удобно использовать СУБД Visual FoxPro 9. Команды, позволяющие работать в
Технологии работы с базами данных V интерактивном режиме с базой /данных, используются и в программах и специально адаптированы для обработки записей базы данных, в то время как в других языках программирования, таких как Visual С, для этого существуют специально подключаемые библиотеки.
Технологии работы с базами данных
Выделенный файл-сервер
Традиционная технология opi анизации работы с БД состоит в том, что на отдельном компьютере, называемом файл-сервер, содержатся общие данные (в виде набора файлов), и приложения, работающие на персональных компьютерах пользователей, по сети обращаются к общим файлам.
Схема работы с данными в случае применения технологии на основе файл-сервера представлена на рис. 2.1.
Рис. 2.1т Схема обработки данных в технологии с выделенным файл-сервером
При использовании этой технологии приложения самостоятельно открывают файлы с таблицами баз данных и выполняют все операции по добавлению и удалению записей, изменению и поиску нужных данных. При этом,
ГЛАВА 2 ▼ Hwai»w»w? сведения о дчинми
например, выборка нескольких записей по определенному условию выглядит примерно л ак:
> приложение запрашивает по сети открытие файла с таблицей;
X приложение запрашивает по сети чтение первой записи;
>• к приложению приходят по сети данные первой записи таблицы;
> приложение проверяет выполнение условия, и, если оно верно, запись попадает в результирующую выборку;
> приложение запрашивает следующую запись, получает ее по сети, проверяет се и так далее, пока псе записи таблицы не будут проверены.
Можно себе представить обьем данных, который перемещается по сети при использовании технологии с выделенным файл-сервером. На качество каналов связи при этом возлагаются довольно большие надежды. Технология работы с выделенным файл-сервером приводит, как говорят, к увеличению трафика сети. Трафик - это поток данных па определенном участке сети. Кроме того, несмотря па все придуманные механизмы контроля доступа к общим файлам, в сетевых операционных системах, размещаемых на серверах, и в приложениях периодически возникают конфликты совместного доступа к общим данным. Еще один недостаток систем с выделенным файл-сервером - довольно слабая защита данных, реализуемая в основном средствами сетевых операционных сис тем.
Есть ли способ уменьшить сетевой трафик и не так сильно зависеть от надежности сетевых устройств? Конечно, да. Была разработана технология, которая в информационных системах крупного и среднего размера дает заметный выигрыш по производителыюсги и надежности. Название этой новой технологии - клиент сервер.
Технология «клиент-сервер»
В чем отличие технологии клиент-сервер о г технологии с выделенным файл-сервером? Сервер, храпящий базу данных, называют сервером баз данных. На этом сервере устанавливают СУБД. Приложения, размещенные на рабочих станциях пользователей, посылают запросы к базе данных. Эти запросы обрабатываются СУБД. Собственно, приложения напрямую не работают с файлами, содержащими данные. Они поручают вьшо'шпть те или иные действия над данными системе управления базами данных.
Схема работы с данными 1? случае применения технологии «клиент-сервер» представлена на рис. 2.2.
Запросы приложений представляют собой команды для определения данных и команды для манипулирования данными. Поскольку различных СУБД существует довольно много, а языков программирования еще больше, возникла
Технологии работы с базами данных
Сервер баз данных
| СУБД |
результаты выполнения запросов
SQL-запросы к базе данных
I
Рис. 2.2 т Схема обработки данных в технологии «клиент-сервер»
необходимость универсального языка общения между клиентской частью - приложениями - и серверной частью - СУБД. Таким языком на настоящий момент является SQL (Structured Query' Language) - язык структурированных запросов.
Приложение, работающее на компьютере пользователя, посылает запрос, например, на выборку данных по определенному условию на языке SQL. СУБД, расположенная на сервере баз данных, обрабатывает его и посылает результат обработки запросившему его приложению, а именно готовую выборку по указанному условию. При этом по сети передаются только нужные записи, а не все, как при использовании файл-сервера.
Работу в соответствии с технологией «клиент-сервер» обеспечивают все наиболее известные СУБД: Oracle, Informix, Sybase, MS SQL Server.
Современный вариант применения этой технологии несколько расширен. СУБД выполняет не только пришедшие от приложений запросы, но и так называемые хранимые, процедуры. Хранимые процедуры - это специальные программы, работающие на сервере баз данных и запускаемые СУБД по команде клиентского приложения.
Контроль целостности баз данных СУБД осуществляют с помощью механизма, называемого триггерами. Триггеры - это особый тип хранимых процедур, которые запускаются при возникновении определенного события в БД. Триггеры могут срабатывать, например, при добавлении записи в таблицу, при удалении записей из таблицы. Триггеры могут вызывать хранимые процедуры.
Исключительное удобство механизмов хранимых процедур и триггеров заключается в том, что они составляют общий набор для всех приложений и
ГЛАВА 2 ▼ Начальные сведения о базах данных
хранятся в общей базе данных. Это может значительно упростить и ускорить работу по созданию большого количества приложений, работающих с общей БД. Особенно это полезно, если приложения создают разные разработчики.
Существует несколько вариантов топологии систем на основе технологии «клиент-сервер». Возможные варианты представлены на рис. 2.3.
Несколько клиентов -один сервер
Рис. 2.3 т Варианты топологий при использовании технологии «клиент-сервер^
Проектирование баз данных
В самом простом случае для каждого клиента запускается свой сервер. При этом не обязательно выделять под каждый сервер отдельный компьютер, можно запустить несколько серверов на одном компьютере. Тип такой компоновки называют «один клиент - один сервер».
Вторая из рассматриваемых топологий - «несколько клиентов - один сервер». Это самый распространенный случай. На выделенном компьютере запускается сервер баз данных, который обрабатывает запросы от множества пользователей.
Самый сложный в организации и настройке вариант - «несколько клиентов -несколько серверов». В этом случае множество клиентов обращаются не к реальным серверам, а к одному виртуальному серверу - диспетчеру. Диспетчер определяет, к какой из баз данных сделан запрос и на каком реальном сервере она находится, а затем переправляет запрос по назначению.
В случае, когда большая часть функций по обработке таблиц вынесена на сервер баз данных и, соответственно, снята с клиентского приложения, такие приложения называют тонким клиентом. Иногда для хранения и выполнения этих функций выделяют отдельный сервер приложений.
Учитывая сложность современных информационных систем и особую зависимость СУБД от правильной настройки контроля целостности, вы не обойдетесь без этапа проектирования базы данных. Более того, чем внимательнее разработчики подходят к этому этапу, тем надежнее и эффективнее работает впоследствии информационная система. Этап проектирования базы данных должен тщательно документироваться, что позволит успешно развивать систему и увеличивать ее масштаб.
Проектирование баз данных
При создании новой базы данных, без сомнения, каждому не терпится поскорее сесть к компьютеру и приступить к организации структуры для хранения информации и непосредственно вводу данных для хранения. Однако многие пословицы и поговорки предупреждают нас о коварности такого подхода. И особенно это важно при работе с БД. Торопиться здесь нельзя ни в коем случае, иначе придется вносить кардинальные изменения в БД, когда она уже будет наполнена важными данными. При этом есть вероятность потери и самих данных, и большого количества рабочего времени. Какой же подход правильный? Поговорим об этом.
Жизненный цикл базы данных
База данных с течением времени проходит определенные этапы развития - от образа в головах разработчиков до полноценного воплощения и последующей модернизации.
V ГЛАВА 2 V Начаиыиые сведения о батях данных
Этапы развития БД ио времени совпадают с этапами жизненного цикла всей информационной системы, поскольку БД - это стержень, основа информационной системы.
Технологии проектирования, применяемые в настоящее время, предполагают поэтапную разработку системы. Этапы по общности целей могут объединяться в стадии.
Жизненный цикл БД - это совокупность стадий и этапов, которые проходит БД в своем развитии от момента принятия решения о создании базы данных до момента прекращения функционирования базы данных.
Жизненный цикл (ЖП) БД обычно разбивается на следующие этапы:
>	определение требований (предпроектная стадия);
>	анализ задачи;
>	• проектирование базы данных;
>	• реализация;
>	внедрение (тестирование, опытная эксплуатация);
>	 эксплуатация (сопровождение, модернизация).
Определение требований к БД и анализ задачи
На этом этапе определяют цели и задачи создаваемой БД. Выявляют предметную область, то есть определяют, какие сведения предполагается хранить и какие направления деятельности подразделений предприятия будут охвачены создаваемой информационной системой.
Выбирают, централизованным или распределенным будет хранение информации (будет ли БД единая, или их будет несколько). Иногда выгодно применить компромиссный вариант и хранить большинство данных в общей БД с жестким контролем целостности, а часть редко обновляемой информации справочного характера или информации, используемой отдельной группой пользователей, - в локальных БД. Определяют, какие при этом могут потребоваться технические средства (аппаратное обеспечение). Если планируется связать создаваемую БД с уже существующей БД, определяют точки соприкосновения.
Производят анализ документооборота внутри и между подразделениями. Желательно закрепить выявленные по токи в виде схем на бумаге и согласовать с сотрудниками автоматизируемых подразделений. Лучше всего, если это будет оформлено в официальном виде с пометкой «Согласовано» и подписями начальников автоматизируемых подразделений (в этом случае гораздо легче разрешаются спорные ситуации, когда вопрос «кто виноват?» выходит на повестку дня). Пусть вас посчитают «буквоедом» (или «буквоедкой»), но чем чаще при
Проектирование баз данных
разработке БД вы будете официально согласовывать с заказчиком свои действия, тем меньше вероятность, что при ошибке кого-то из пользователей вас, как разработчика, сделают «стрелочником» и свалят все на ошибку в программном обеспечении.
В результате работ на этом этапе оформляется технико-экономическое обоснование (ТЭО) и техническое задание (ТЗ) на разработку.
Проектирование базы данных
Проектирование базы данных осуществляется поэтапно. На первом этапе происходит концеп туальное проектирование, на втором - логическое проектирование и, наконец, на третьем - физическое проектирование.
На этапе концептуального проектирования представляют структуры данных при помощи различных технологий моделирования. Самая распространенная среди них - модель «сущность-связь», или ER-модель (Entity-Relationship), предложенная П. Ченом в 1976 году.
В процессе моделирования строится ER-диаграмма. Единого общепризнанного формата для графического представления ER-диаграмм не установлено, хотя для самих ER-моделей существует международный стандарт ISO 9007 «Concepts and terminology for the conceptual schema and the information base» («Концепции и терминология для концептуальной схемы и информационной базы»). Главными понятиями модели «сущность-связь» являются сущности, атрибутыа связи между сущностями.
Сущность - абстракция реально существующего объекта, процесса или явления, информацию о котором необходимо сохранять в БД. Сущностями в ER-модели могут быть как предметы, так и какие-либо явления или процессы. Сущностями могут быть люди, документы, техника, товары, услуги и тому подобное. Тип сущности определяет набор однородных объектов, например автомобили, а экземпляр сущности представляет конкретный объект этого набора, например ВАЗ-2109. Тип сущности должен иметь уникальное имя, позволяющее отличать его от других типов.
Атрибут - поименованная характеристика сущности. Атрибуты описывают различные свойства сущностей. Атрибут обязательно должен иметь имя. Для него может быть определено множество допустимых значений. Например, для сущности «автомобиль» можно определить атрибуты: «цвет», «комплектация» и «цена».
Атрибут или совокупность атрибутов может быть уникальным идентификатором сущности. В этом случае такой атрибут или совокупность атрибутов называется ключом сущности.
ГЛАВА 2 V Начальные сведения о базах данных
Связь - поименованная ассоциация между сущностями в ER-модели. Связям также присваивают имена, как правило, представляющие их функции.
Связи могут быть бинарные (связи между двумя сущностями), тернарные (между тремя сущностями), кватернарные (между четырьмя сущностями) и п-арные связи (между п сущностями). Для каждой связи определяют:
>	имя;
>	степень множественности («один к одному», «один ко многим», «многие к одному», «многие ко многим»);
>	мощность связи (максимальное количество экземпляров одной сущности, связанных с одним экземпляром другой сущности).
Чаще всего для элементов модели используют графические обозначения, представленные на рис. 2.4.
Приведем пример построения ER-диаграммы. Опишем две сущности: должность и сотрудник (рис. 2.5).
Рис. 2.4 ▼ Графические обозначения элементов ER-модели
Сущность
Атрибут
Связь
Рис. 2.5 ▼ ER-диаграмма
Следующий после построения ER-диаграмм шаг в процессе проектирования базы данных состоит в построении набора предварительных отношений и указании предполагаемого первичного ключа для каждого отношения.
Итогом логического проектирования является построенная логическая модель данных, которая преобразуется из созданной на предыдущем шаге концептуальной модели. Логические модели данных могут быть различных типов, но наибольшее распространение получили сетевые, иерархические и реляционные модели. Выбор того или иного типа модели данных непосредственно связан с вопросом выбора системы управления базой данных по той причине, что СУБД, как правило, поддерживает только одну конкретную модель данных.
Проектирование баз данных V
Физическое проектирование связано с выбором конкретной СУБД и проектированием структур данных с учетом особенностей хранения данных в выбранной СУБД. На этом этапе производится формирование набора таблиц (если используется реляционный тип модели данных), вырабатываются методики контроля целостности данных и методики защиты данных.
По итогам этого этапа происходит оформление технического проекта.
Реализация
На этапе реализации осуществляется физическое создание базы данных по определенной ранее модели в установленной СУБД. В результате появляются на свет файлы базы данных, содержащие пустую структуру для хранения данных. На этом же этапе в соответствии с выработанной ранее методикой создаются механизмы контроля целостности базы данных.
На этом этапе БД часто заполняют некоторым количеством тестовых данных и на их основе отлаживают механизмы защиты данных и механизмы контроля целостности базы данных. Отладка механизмов базы данных при этом происходит параллельно отладке прикладного программного обеспечения.
Далее этапы жизненного цикла базы данных проходят в тесной связке с жизненными циклами приложений, работающих с данными.
Внедрение
На этапе внедрения происходит тестирование и опытная эксплуатация базы данных. Она может наполняться тестовыми или уже реальными данными.
Разработчики тестируют созданную информационную систему, как правило, при помощи разработанных тестов, позволяющих учесть реакцию информационной системы на работу в различных режимах и с различной нагрузкой. Существуют и специальные программные средства, позволяющие тестировать базы данных. Например, довольно популярно средство для тестирования SQLBanch (для платформы «клиент-сервер»). Эти средства позволяют определить такие характеристики системы управления базами данных, как время отклика при нормальных и пиковых нагрузках. Они начинают «бомбардировать» СУБД различными запросами и отслеживают реакцию. Пользоваться такими средствами желательно после создания структур БД, но до наполнения базы данных реальными сведениями.
После тестирования разработчиками с базой данных начинают работать конечные пользователи при помощи разработанных к этому времени прикладных программ (опытная эксплуатация). В этот момент пользователи работают с применением новой технологии и продолжают дублировать свои действия в
ГЛАВА 2 T Начальные сведения о базах данных
прежнем режиме. Результаты, полученные тем и другим способом, сравниваются между собой, и выносится решение о прекращении или продолжении опытной эксплуатации. Кроме того, на этом этапе конечные пользователи учатся работать с новым программным обеспечением и по новым информационным технологиям.
В идеальном случае к следующему этапу жизненного цикла система переходит только после окончания полного тестирования и обучения всех пользователей работе в новых условиях. Однако па практике часто над разработчиками довлеют сроки подписания документов о сдаче информационной системы в промышленную эксплуатацию.
На этом этапе подписывают акт о приемо-сдаточных испытаниях информационной системы.
Эксплуатация
На этапе эксплуатации происходит сбор замечаний и статистики о функционировании базы данных. Это делается с помощью опроса пользователей, дополнительными средствами тестирования и сбора статистики и средствами диагностики, поставляющимися с СУБД.
Казалось бы, в конце концов все ошибки и недоработки будут отловлены и СУБД начнет работать идеально. Но не тут-то было! В процессе исправления старых ошибок нередко вносятся новые. Изменяются внешние условия работы информационной системы, например выходят новые законодательные акты, меняющие набор реквизитов документов, которые вы храните. Кроме того, разрабатываются новые прикладные программные средства, в связи с чем могут измениться требования к БД. Кроме программных средств периодически модернизируются и аппаратные, что также может повлиять на настройку СУБД.
За сопровождение может отвечать вовсе не тот человек, который проектировал базу данных. Чаще всего именно так и бывает. По этой причине хорошая документация, составляемая на каждом из этапов, - вещь необходимая.
Приведенные в этом подразделе рекомендации по проектированию БД, возможно, кажутся излишними. Однако при создании даже простой базы данных требуется проектирование, и даже простая БД проходит в своем развитии все перечисленные этапы.
Что такое реляционные базы данных
Различных способов организации информации в базе данных предлагалось немало. Существуют, например, сетевые и фреймовые базы данных. Однако
Что такое реляционные базы данных
V
наибольшее распространение получили базы данных (БД) на основе табличных структур, связанных между собой по какому-либо полю или нескольким полям. Такие БД назвали реляционными. Видимо, успеху этого типа БД способствовала привычка многих людей представлять большое количество однотипных данных в виде таблиц, где есть шапка, описывающая наименования столбцов таблицы (полей), а ниже идут строки со значениями полей. Например, нам нужно хранить список сотрудников предприятия для использования в отделе кадров и, может быть, в бухгалтерии. Возможно, и руководитель иногда захочет посмотреть, кто из подчиненных еще остался под его чутким руководством. Посмотрим на табл. 2.1.
Таблица 2.1т Список сотрудников в табличном виде
Табельный номер	Ф.И.О.	Дата рождения	Адрес	Код должности
7001	Петров Анатолий Иванович	30.12.1970	ул. Академика Ушакова, 10, кв.112	01007
7002	Семёнов Игорь Степанович	31.05.1950	ул. Петровская, 3, кв.10	01002
7003	Балашова Зинаида Дмитриевна	15.07.1950	ул. Резинстроя, 20, кв.77	01003
7004	Феоктистова Елена Михайловна	22.08.1971	ул. Пушкина, 1, кв.1	01005
7005	Семёнов Павел Игоревич	22.05.1975	ул. Петровская, 3, кв. 10	01005
7006	Семипятный Андрей Львович	17.02.1957	ул. Лесная, 7	01001
7007	Смоленская Лидия Павловна	10.10.1980	ул. Привокзальная, 10, кв.2	01008
Имена полей в этом случае имеют следующие названия: «Табельный номер», «Ф.И.О.», «Дата рождения», «Адрес» и «Код должности». Последнее поле является ссылкой на записи в другой таблице (табл. 2.2). В этой таблице приводится список должностей и оклады. Получается, что две таблицы связывает поле «Код должности».
Таблица 2.2 т Список должностей в табличном виде
Код должности	Наименование должности	Оклад, руб.
01001	Директор	2500000
01002	Заместитель директора	2000000
01003	Главный бухгалтер	2000000
01004	Начальник отдела	1800000
01005	Ведущий специалист	1500000
01006	Специалист 1 категории	1200000
01007	Водитель	1000000
01008	Секретарь-референт	1200000
V ГЛАВА 2 V Начальные сведения о базах данных
Каждое поле может принимать значения определенного типа. Мы заранее знаем, что дата рождения состоит только из цифр и не бывает буквенной (по крайней мере, во многих странах мира это не принято), сумма оклада тоже не требует для своей записи букв. И в техническом плане проще организовать хранение данных в файле, если определить для каждого поля его тип. В разных БД могут встречаться разные типы полей, но практически везде присутствуют текстовый (символьный) тип, числовой тип, тип даты. Часто еще используется логический тип. Поля такого типа принимают одно из двух значений: истина (True) или ложь (False).
Типы данных
В Visual FoxPro используются поля следующих типов:
>	Character - символьный тип. Позволяет хранить любой текст. Отводится 1 байт на символ, то есть хранится только код каждого символа без обозначения, каким шрифтом его отображать, какого размера и цвета. Максимальная длина поля - 254 символов;
>	Float - числовой тип. Отводится 8 байт;
>	 Numeric - числовой тип. Отводится 8 байт;
>	Integer - целочисленный тип. Отводится 4 байта;
>	 Double - числовой тип с двойной точностью. Можно использовать большее количество знаков после запятой, чем в других числовых типах. Отводится 8 байт;
>	Date - тип даты. Отводится 8 байт;
>	DateTime - тип даты с указанием времени. Отводится 8 байт;
>	Currency - тип валюты. Отводится 8 байт;
>	Logical - логический тип. Отводится 1 байт. Имеет значение либо True (.Т.), либо False (.Е);
>	- Мето - содержит ссылку на текстовое поле, хранящееся в отдельном файле с расширением .fpt. Отводится 4 байта;
>	General - содержит ссылку на OLE-объект. Отводится 4 байта;
>	Blob - ссылка на двоичные данные неопределенной длины. Отводится 4 байта;
>	Varchar - символьный тип. Позволяет хранить любой текст, но не допускаются дополнительные пробелы. Отводится 1 байт на символ. Максимальная длина поля - 254 символов;
>	Varbinary - двоичный тип. Позволяет хранить значения в десятичном виде.
Типы данных
Одно из новшеств Visual FoxPro 9 - это улучшенная совместимость с Microsoft SQL Server. Три последних поля в списке - Blob, Varchar и Varbinary - специально введены для этого.
При работе с данными в таблице базы данных происходит их автоматический контроль. Например, если вы попытаетесь внести в поле числового типа буквы, Visual FoxPro выдаст ошибку- Data type mismatch (Неподходящий тип данных).
Определимся с типами данных в наших табличках со списком сотрудников и списком должностей. Табельный номер обычно состоит только из цифр и не имеет ни одного знака после запятой, то есть является целым числом. Для этого поля лучше всего подойдет тип Integer. Для записи имен и адресов требуются буквы, а значит, следует использовать символьный тип. Видимо, длины поля Character (254 символа) достаточно и для записи имен, и для записи адресов. Возможный вариант выбора типов полей для наших таблиц приведен в таблицах 2.3 и 2.4. В этих же таблицах указаны имена полей латинскими буквами. Традиционно для лучшей совместимости имена полей задаются именно латинскими буквами, хотя Visual FoxPro позволяет работать и с русскими именами полей.
Таблица 2.3 ▼ Типы полей таблицы списка сотрудников
Назначение поля	Имя поля в таблице	Тип поля	Размерность
Табельный номер	tabnum	Integer	4
Ф.И.О.	name	Character	50
Дата рождения	birthday	Date	8
Адрес	address	Character	50
Код должности	id	Character	10
Таблица 2.4 т Типы полей таблицы списка должностей
Назначение поля	Имя поля в таблице	Тип поля	Размерность
Код должности	id	Character	10
Наименование должности	whois	Character	20
Оклад	Sum	Currency	8
Таким образом, мы спроектировали структуру таблиц будущей базы данных и определили тип и размерность полей. Также мы определили связь между таблицами по полю. Именно с проектирования и начинается создание базы данных. Чем лучше вы будете представлять себе будущий набор таблиц и их связь между собой, тем эффективнее у вас получится организовать хранение и обработку
ГЛАВА 2 ▼ Начальные сведения о базах данных
данных. А главное, будет меньше путаницы, особенно если с созданными таблицами будут работать несколько разработчиков.
Создаем базу данных
Мы уже определились с терминологией, однако именно перед рассмотрением этапа создания баз данных стоит повторить еще раз: база данных объединяет несколько таблиц по их назначению или смысловой нагрузке. В традиционном FoxPro для MS DOS создавался набор таблиц (файлов с расширением .dbf), а объединение их в базу данных происходило либо только логически в головах разработчиков и в технической документации, либо путем расположения файлов в одном каталоге (папке). В Visual FoxPro существует способ создания и работы с базой данных, в которой кроме таблиц (традиционно хранящихся в файлах с расширением .dbf) могут содержаться представления таблиц, в том числе удаленных, и хранимые процедуры. Если вы предполагаете использовать локальную базу данных, к которой не будут производиться запросы из других приложений, есть смысл воспользоваться традиционным подходом. Для начала рассмотрим процесс создания отдельных таблиц в Visual FoxPro, а затем создание баз данных.
Создание структуры таблицы
File type ©Protect
О Database <
©'Table
©Connection
© View © Remote view
©Form ©fl eport ©label
© Program О Class :;
© Text file: ©Menu
New fie
Wizard
[ Cancel | I Help |
Рис. 2.6 ▼ Вид окна New
Для создания новой таблицы выберите в меню File (Файл) команду New (Новый). В русскоязычной версии эта команда может называться Создать. Либо можно щелкнуть по кнопке Q. Появится диалоговое окно, представленное на рис. 2.6.
В области File type (Тип файла) следует выбрать значение Table (Таблица). Далее есть два варианта действий: выбрать кнопку New file (Новый файл) и задать имена полей и их типы самостоятельно или воспользоваться Мастером для автоматизированного создания таблиц (Wizard). Воспользуемся первым способом, то есть щелкнем по кнопке New file (Новый файл). В результате откроется стандартное окно Create (Создание) для создания файла. В поле Enter table name (Введите имя таблицы) следует ввести имя таблицы. Она будет сохранена в указанной вами папке в файле с расширением .dbf. После щелчка мышью по кнопке Сохранить (Save) появится окно Table Designer (Дизайнер таблиц), представленное на рис. 2.7.
Создаем базу данных
Рис. 2.7 т Вид окна Table Designer
В этом окне, на вкладке Fields (Поля) осуществляется ввод и редактирование полей и их характеристик. Имя нового поля вводят в столбец Name (Имя). Далее из выпадающего списка Туре (Тип) выбирают тип поля и, если выбранный тип это предусматривает, устанавливается размерность поля в столбцах Width (Ширина) и Decimal (Десятые), если тип поля числовой. Раскрывающийся список Index (Индекс) позволяет указать, по возрастанию или по убыванию упорядочивать записи в случае индексирования по этому полю. С индексированием разберемся позднее. Если вы установите флажок Null, это будет говорить о том, что поле может принимать значение Null, то есть значение поля на данный момент не определено. Для вставки нового поля можно воспользоваться кнопкой Insert (Вставить). Если вы последовательно вводите поля, можно просто ставить курсор в пустой прямоугольник под уже введенными полями в столбце Name (Имя) и набирать имя очередного поля. Если вы хотите удалить поле, щелкните по его имени, а затем по кнопке Delete (Удалить). Порядок расположения полей можно изменить, перетаскивая мышью прямоугольник слева от имени поля ([$]). По окончании редактирования щелкните по кнопке ОК; если вы передумали и все внесенные вами изменения не нужны, щелкните по кнопке Cancel (Отмена).
ГЛАВА 2 ▼ Начальные сведения о базах данных
Таким образом, создается пустая структура таблицы. Сразу после создания таблица остается открытой. Это значит, что с ней есть постоянная связь. Вы можете в любой момент просмотреть ее, выполнив команду BROWSE. Для этого щелкните мышью в окне Command, введите BROWSE и нажмите Enter. При выполнении этой команды откроется окно, в заголовке которого будет присутствовать имя открытой таблицы. В этом окне будут показаны записи, хранящиеся в таблице. Для заполнения новой записи вначале добавляется пустая запись, а затем вводятся значения ее полей.
Добавление записей в таблицу
Чтобы добавить пустую запись, следует выбрать в меню Table (Таблица) команду Append New Record (Добавить новую запись) или нажать комбинацию клавиш Ctrl+Y. Можно также ввести в окне Command команду
APPEND BLANK
Если необходимо заполнить таблицу записями из другой таблицы, можно использовать команду APPEND FROM.
APPEND FROM <Имя_файла> I ? [FIELDS <Список_полей>] [FOR <Условие>] [[TYPE] [DELIMITED [WITH <Разделитель1> I WITH BLANK | WITH TAB
I WITH CHARACTER <Разделитель2>] I DIF I FW2 i MOD I PDOX I RPD
I SDF I SYLK I WK1. I WK3 I WKS I WR1 I WRK I CSV I XLS
I XL5 (SHEET <Имя_листа>] I XL8 [SHEET <Имя_листа>]]]
[AS <Кодовая_страница>]
>	 <Имя_файла> - имя таблицы, записи которой требуется добавить;
>	? - выдается стандартное диалоговое окно открытия файла для выбора таблицы, записи которой требуется добавить;
>	<Список_полей> - через запятую перечисляются поля, значения которых требуется добавить;
>	<Условие> - добавляются только записи, которые удовлетворяют условию. Можно использовать функции и операции сравнения;
>	TYPE - определяет тип файла-источника;
>	DELIMITED - позволяет добавить записи из ASCII-файла, строки которого оканчиваются символами перевода строки (CHR(13 )) и символами конца строки (CHR (10)). По умолчанию содержимое полей в ASCII-файле должно быть разделено запятыми, а символьные поля заключены в кавычки ("Петров", "бухгалтер", 15000);
>	<Разделитель1> - указывается символ, которым выделяются символьные поля, если для этого не используются кавычки;
Создаем базу данных
>	WITH BLANK - содержимое полей в ASCII-файле разделено пробелами;
>	WITH TAB - содержимое полей в ASCII-файле разделено символами табуляции;
>	<Разделитель2> - указывается символ, которым разделено содержимое полей в ASCII-файле;
>	DIF - указывает, что данные добавляются из DIF-файла (файлы VisiCalc);
>	FW2 - указывает, что данные добавляются из файла с расширением .fw2, созданного во Framework II;
>	MOD - указывает, что данные добавляются из файла с расширением .mod, созданного в Microsoft Multiplan версии 4.01;
>	PDOX - указывает, что данные добавляются из файла с расширением ,db, созданного в Paradox версии 3.5 или 4.0;
>	RPD - указывает, что данные добавляются из файла с расширением .rpd, созданного в RapidFile версии 1.2;
>	SDF - позволяет добавить записи из ASCII-файла формата System Data Format со строками фиксированной длины;
>	SYLK - указывает, что данные добавляются из файла SYLK (Symbolic Link), созданного в Microsoft Multiplan;
>	WK1 - указывает, что данные добавляются из файла с расширением .wkl, созданного в Lotus 1-2-3 версии 2.x;
>	WK3 - указывает, что данные добавляются из файла с расширением .wk3, созданного в Lotus 1-2-3 версии 3.x;
>	WKS - указывает, что данные добавляются из файла с расширением .wks, созданного в Lotus 1-2-3 версии 1-А;
>	WR1 - указывает, что данные добавляются из файла с расширением .wrl, созданного в Lotus Symphony версии 1.1 или 1.2;
>	WRK - указывает, что данные добавляются из файла с расширением .wrl, созданного в Lotus Symphony версии 1.0;
>	CSV - позволяет добавить записи из ASCII-файла. По умолчанию содержимое полей в ASCII-файле должно быть разделено запятыми. Первая строка текстового файла содержит имена полей. Она игнорируется;
>	XLS - указывает, что данные добавляются из файла с расширением .xls, созданного в Microsoft Excel;
>	XL5 - указывает, что данные добавляются из файла с расширением .xls, созданного в Microsoft Excel версии 5.0;
>	XL8 - указывает, что данные добавляются из файла с расширением .xls, созданного в Microsoft Excel 97;
ГЛАВА 2 Г Начальные сведения о базах данных
>	SHEET <Имя_ листа> - при добавлении записей из файла с расширением .xls, созданного в Microsoft Excel, позволяет указать лист, данные которого нужно загружать;
>	<Кодовая_страница> - задает кодировку, в которой хранятся данные в файле-источнике.
Просмотр содержимого таблиц и заполнение полей
Для заполнения полей записи при использовании команды BROWSE нужно щелкнуть в нужном поле мышью и ввести его значение. Значение сохраняется, когда вы переходите к следующему полю. Перейти к следующему полю можно также, нажав Enter или Tab.
Рассмотрим подробнее команду отображения и редактирования таблиц BROWSE:
BROWSE [FIELDS <Список_полей>] [FONT <Имя_шрифта> [,<Размер_шрифта>]]
[STYLE <Стиль_шрифта>] [FOR <Условие1> [REST]] [FORMAT]
[FREEZE <Имя_поля>] [KEY <Выражение1> [, <Выражение2>]] [LAST I NOINIT] [LOCK <Количество_полей>] [LPARTITION] [NAME <Имя_объекта>] [NOAPPEND] [NOCAPTIONS] [NODELETE] [NOEDIT I NOMODIFY] [NOLGRID] [NORGRID]
[NOLINK] [NOMENU] [NOOPTIMIZE] [NOREFRESH] [NORMAL] [NOWAIT]
[PARTITION <4исло> [LEDIT] [REDIT]]
[PREFERENCE <Предпочтительное_имя>] [SAVE] [TIMEOUT <Секунды>]
[TITLE <Текст_заголовка>] [VALID [:F] <Условие2> [ERROR <Текст_ошибки>]] [WHEN <УсловиеЗ>] [WIDTH <Ширина_столбцов>] [WINDOW <Имя_окна1>] [IN [WINDOW] <Имя_окна2> I IN- SCREEN] [COLOR SCHEME <Номер_схемы>]
>	<Список_полей> - перечисление полей через запятую, если нужно отобразить не все поля, а только часть из них;
>	<Имя_шрифта> - дает возможность задать шрифт, которым будут отображаться данные;
>	<Размер_шрифта> - дает возможность задать размер шрифта, которым будут отображаться данные;
>	 <Стиль_шрифта> - позволяет выбрать стиль шрифта, которым будут отображаться данные. Варианты: 'В' - жирный, 'I' - курсив, 'N' - нормальный, 'S' - тень, '-' - зачеркнутый, 1Т' - прозрачный, 'U' - подчеркнутый;
>	<Условие1> - показываются только записи, которые удовлетворяют условию. Можно использовать функции и операции сравнения;
>	REST - оставляет курсор на текущей записи. В противном случае текущей становится первая запись отображаемого диапазона записей;
Создаем базу данных V
FORMAT - устанавливает контроль формата ввода данных в поля в соответствии с установками, сделанными командой SET FORMAT;
FREEZE <Имя_поля> - позволяет разрешить внесение изменений только в указанное поле;
KEY <Выражение1> - ограничивает диапазон отображаемых записей, если таблица проиндексирована. Указанное выражение должно соответствовать ключу, по которому в данный момент упорядочена таблица;
LAST I NOINIT - позволяет записывать текущую конфигурацию по окончании работы с командой;
LOCK <Количество_полей> - позволяет закрепить указанное количество полей. Эти поля всегда будут видны на экране, независимо от положения горизонтальной полосы прокрутки. Допускаются отрицательные значения; LPARTITION - при использовании LOCK устанавливает курсор в первое поле в левой части окна. По умолчанию в таком случае курсор устанавливается в первое поле правой части окна;
NAME <Имя_объекта> - создает ассоциированный с окном Browse объект, имеющий набор свойств, аналогичных свойствам объекта Grid. Подробнее об этом объекте можно будет прочитать в главе 4;
NOAPPEND - запрещает добавлять записи с помощью комбинации клавиш Ctrl+Y или команды Append New Record (Добавить новую запись) из меню Table (Таблица). Если в окне Command ввести команду APPEND BLANK, то новая запись успешно добавится;
NOCAPTIONS - принудительный вывод в качестве наименований столбцов таблицы имен полей, даже если заданы иные наименования;
NODELETE - запрещает помечать записи на удаление мышью или комбинацией клавиш Ctrl+T. Если в окне Command ввести команду DELETE, то на запись успешно установится пометка на удаление;
NOEDIT | NOMODIFY - запрещает изменять содержимое полей таблицы, однако можно добавлять записи и удалять их;
NOLGRID - убирает линии сетки, разделяющей ячейки таблицы, в левой части окна;
NORGRID - убирает линии сетки, разделяющей ячейки таблицы, в правой части окна;
NOLINK - разрывает связь между перемещениями курсора в левой и правой частях окна. По умолчанию при перемещении курсора в одной части окна курсор в другой части окна перемещается на ту же запись;
NOMENU - запрещает вывод пункта меню Table (Таблица) в основном меню; NOOPTIMIZE - отключает оптимизацию по технологии Rushmore;
ГЛАВА 2 ▼ Начальные сведения о базах данных
NOREFRESH - запрещает обновление таблицы. Обычно обновление происходит с установленной командой SET REFRESH периодичностью;
NORMAL - выводит окно таблицы с параметрами по умолчанию;
NOWAIT - продолжает работу программы после вывода окна с таблицей на экран. Если не указать этот параметр, программа ждет завершения работы команды BROWSE и лишь потом продолжает свою работу;
PARTITION < Число - разбивает окно на две части и определяет ширину частей;
LEDIT - позволяет редактировать левую часть окна;
REDIT - позволяет редактировать правую часть окна;
PREFERENCE <Предпочтительное_имя> - сохраняет установки окна;
SAVE - оставляет окно с таблицей на экране и позволяет вернуться к нему после работы с другими окнами. Имеет смысл только при вызове BROWSE из программ;
TIMEOUT <Секунды> - определяет, через какое время (в секундах) окно с таблицей автоматически закроется. Имеет смысл только при вызове BROWSE из программ;
TITLE <Текст_заголовка> - заменяет помещаемое в заголовок окна имя таблицы на заданный вами текст;
VALID [: F] <Условие2> - если произошло редактирование какого-либо поля записи и сделана попытка перейти к другой записи, осуществляется проверка указанного условия, и, если оно не выполняется, переход не возможен. Например, при вводе в поле с именем сотрудника (Name) новых сведений всегда кроме фамилии должны присутствовать или имя и отчество, или инициалы. От фамилии они отделяются пробелом. Тогда можно проверять наличие пробела (функция АТ ()). Чтобы в таком случае не захватить пробел в начале или в конце строки, воспользуемся функцией, отрезающей «крайние» пробелы, - ALLTRIM (). Команда BROWSE с такой проверкой будет выглядеть так:
BROWSE VALID AT(CHR(32), ALLTRIM(Name)) <> 0
ERROR <Текст_ошибки> - указывает сообщение, которое выводится, если проверка VALID показала нарушение. Например, ERROR «Вы не ввели имя или инициалы!». Указанное сообщение отобразится в сроке состояния;
WHEN <УсловиеЗ> - проверяет условие при переходе к следующей записи и запрещает ее редактирование. Отличие от VALID в том, что VALID не выпускает курсор из ошибочной записи, a WHEN позволяет переходить к другим записям;
Создаем базу данных V
> WIDTH <Ширина_столбцов> - позволяет задать при отображении ширину столбцов в символах. Если содержимое поля шире отведенной ширины, отобразится только часть содержимого, которая уместилась в указанные рамки, а остальное можно увидеть, если щелкнуть в поле мышью и перемещать курсор внутри поля с помощью клавиш со стрелками вправо и влево;
> WINDOW <Имя_окна1> - позволяет разместить содержимое окна Browse внутри указанного окна. Полезно для придания окну с таблицей требуемых характеристик;.
>	IN [WINDOW] <Имя_окна2>-указывает, какое окпо будет родительским для окна с таблицей, то есть в рабочем поле какого окна будет откры то окно с таблицей;
>	IN SCREEN - указывает, что родительским окном будет основное окно Visual FoxPro;
>	COLOR SCHEME <Номер_схемы> - задает номер цветовой схемы для окна с таблицей.
Удаление записей
Пометка записей на удаление при работе с таблицей через BROWSE происходит при щелчке мышью в поле слева от полей записи. При установке пометки поле окрасится в другой цвет (обычно в черный). Чтобы снять пометку, надо еще раз щелкнуть в этом поле. Установка пометки на удаление еще не значит, что запись удаляется физически из таблицы. Еще есть время подумать.
Второй способ пометки записей на удаление - команда DELETE, вводимая в окне Command.
DELETE [<Диапазон>] [FOR <Условие1>] [WHILE <Условие2>]
[IN <Рабочая_область> I <Имя_таблицы>] [NOOPTIMIZE]
>	<Диапазон> - если не используется FOR или WHILE и указать ALL, то будут помечены на удаление все записи;
>	<Условие1> - удаляются только записи, которые удовлетворяют условию. Можно использовать функции и операции сравнения;
>	<Условие2> - записи удаляются, пока выполняется условие;
>	<Рабочая_область> I <Имя_таблицы> - указывается таблица или рабочая область, где производится удаление.
Если не указывать параметры, то будет помечена на удаление текущая запись таблицы в текущей рабочей области.
Можно выполнить и обратную операцию и снять пометку на удаление. Для этого существует команда RECALL.
ГЛАВА 2 ▼ Начальные сведения о базах данных
RECALL [<Диапазон>] [FOR <Условие1>] [WHILE <Условие2>]
[IN <Рабочая_область> I <Имя_таблицы>] [NOOPTIMIZE]
>	<Диапазон> - если не используется FOR или WHILE и указать ALL, то будут сняты пометки на удаление со всех записей;
>	<Условие1> - снимаются пометки на удаление только с записей, которые удовлетворяют условию. Можно использовать функции и операции сравнения;
>	<Условие2> - пометки на удаление снимаются с записей, пока выполняется условие;
>	<Рабочая_область> I <Имя_таблицы> - указывается таблица или рабочая область, где производится снятие пометок на удаление.
Таким образом, например, для снятия пометок на удаление со всех записей используется команда RECALL ALL.
Если с удалением записей решено окончательно и бесповоротно, то следует упаковать таблицу командой РАСК в окне Command.
PACK [MEMO] [D3F] [<Имя_таблицы>] [IN <Рабочая_область>I<Имя_таблицы>]
>	МЕМО - удаляет неиспользуемые пробелы в memo-полях, не удаляя при этом записи;
>	DBF - удаляет помеченные на удаление записи, не затрагивая при этом memo-файл.
Если использовать команду РАСК без параметров, удалятся все помеченные на удаление записи таблицы в текущей рабочей области и упакуется присоединенный memo-файл.
I®"
Упаковку таблицы Visual FoxPro производит следующим образом: все записи таблицы, кроме помеченных на удаление, копируются во временную таблицу, исходная таблица удаляется, а временной таблице присваивается имя исходной.
Чтобы команда РАСК успешно выполнилась, таблица должна быть открыта в эксклюзивном режиме. Если для открытия таблицы вы пользовались командой USE, следует указать параметр EXCLUSIVE. Если открытие таблицы происходит при помощи диалогового окна, следует установить флажок Open exclusive.
Для создания таблиц из нашего примера (списки сотрудников и их должностей) предпримем следующие действия:
1.	Создайте отдельную папку example. В ней будем хранить созданные нами таблицы и индексные файлы.
Создаем базу данных . V
2.	Выберите из меню File (Файл) команду New (Новый).
3.	В появившемся окне выберите Table (Таблица) и щелкните по кнопке New file (Новый файл).
4.	В появившемся окне Create (Создание) перейдите в созданную вами папку example и в поле Enter table name (Введите имя таблицы) введите persons (так мы назовем таблицу с информацией о сотрудниках).
5.	В появившемся окне Table Designer (Дизайнер таблиц) введите поля и их характеристики из табл. 2.3. Должно подушиться так же, как это показано на рис. 2.7.
6.	Щелкните по кнопке ОК.
7.	Щелкните мышью в окне Command, введите в нем команду BROVJSE и нажмите Enter. На экране появится окно, в заголовке которого будет указано имя только что созданной вами таблицы - persons.
8.	Таблица пуста. Чтобы ее заполнить, выберите из меню Table (Таблица) команду Append New Record (Добавить новую запись) или нажмите комбинацию клавиш Ctrl+Y. В таблице появится новая пустая запись. Если вы не видите в меню пункта Table (Таблица), щелкните в любом месте окна с таблицей, чтобы оно стало активным.
9.	Щелкните мышью в первом поле новой записи и введите значение поля, взяв его из табл. 2.1. Перейдите к следующему полю текущей записи, нажав Enter или Tab. Введите его значение и переместитесь на следующее поле и так далее, пока не заполните всю запись.
10.	Добавьте новую запись, как указано в п.7. Заполните все ее поля данными из табл. 2.1. Продолжайте добавлять строки и вводить данные, пока не введете всю информацию, приведенную в табл. 2.1. Должно получиться, как на рис. 2.8.
11.	По окончании ввода щелкните мышью в окне Command, введите в нем команду USE.
Этим действием вы закроете окно с записями созданной вами таблицы и закроете саму таблицу (разорвете с ней связь).
12.	Выполните действия пунктов 2-11 для создания и заполнения второй таблицы со списком должностей. Задайте для нее имя stuff. Используйте сведения табл. 2.2 и 2.4.
Как создавать таблицы, мы обсудили. Однако Visual FoxPro 9 предоставляет возможность создавать полноценную базу данных, а не только набор таблиц, как это было, например, в FoxPro для MS DOS. В понятие «полноценная» включается возможность создания представления таблиц, в том числе удаленных, и хранимых процедур.
ГЛАВА 2 ▼ Начальные сведения о базах данных
.«ом"’"1” ‘ ' ............................................................

Iabnum
Name
Addret»
70002; Семенов Игорь Степанович
Bnthday_____________ ___________________
=12/30/70 гул. Академика Ушакова 10. кв.112-01007 =
?05731/S0 =ул. Петровская. З.кв.10
01002
70003= Балашова Зинаида Дмитриевна 70004; Феоктистова Елена Михаиловна
70005:Семенов Павел Игоревич
70006= СеммпягныйАмарей Львович
107/15/50 ; ул. Резинстроя. 20. кв 77
|08/22/71 ^л.Пушкина.1.кв.1
= 05/22/75 =ул. Петровская. 3. кв.10
! 02/17/57 - ул. Лесная, 7
101003 i i01005 I
101005 I
101001 i
70007;Смоленская Лидия Павловна
рС/10/80 -ул. Привокзальная. 10. кв.2 101008
Рис. 2.8 г Вид таблицы persons после ввода всех записей
Создание базы данных
Создается база данных тем же путем, что и другие объекты Visual FoxPro 9, -при помощи команды New (Новый) из меню File (Файл). Либо можно щелкнуть по кнопке Q. Появится диалоговое окно, представленное на рис. 2.6.
В области File type (Тип файла) следует установить переключатель в положение Database (База данных). Затем нужно щелкнуть по кнопке New file (Новый файл). В результате откроется стандартное окно Create (Создание) для создания файла. В поле Enter database (Введите имя базы данных) следует ввести имя базы данных. Файл базы данных будет сохранен в указанной вами папке, в файле с расширением .dbc. После щелчка мышью по кнопке Сохранить (Save) появится окно, представленное на рис. 2.9.
Рис. 2.9 т Вид окна Database Designer
Создаем базу данных	V
-Это окно Дизайнера базы данных. При помощи инструментов этого окна можно добавлять, изменять и удалять таблицы, устанавливать связи между ними, редактировать хранимые процедуры. Рассмотрим панель инструментов Дизайнера базы данных.
создает новую таблицу;
добавляет существующую таблицу. При щелчке по этой кнопке открывается стандартное окно открытия файла, которое позволяет указать dbf-файл с добавляемой в базу данных таблицей;
удаляет таблицу из базы данных;
Ф создает новое удаленное представление. При этом открывается окно View Designer (Дизайнер представлений);
tty создает новое локальное представление. При этом открывается окно View Designer (Дизайнер представлений);
позволяет изменить структуру и свойства таблицы;
выполняет команду BROWSE для указанной таблицы;
выполняет редактирование хранимых процедур. При этом открывается редактор, подобный редактору для ввода текстов программ;
® создает соединение с удаленной базой данных. При этом открывается окно Connections (Соединения).
Рассмотрим подробнее, как создавать представления. И при создании локального представления, и при создании удаленного представления открывается окно для выбора способа создания: при помощи Мастера представлений или вручную.
В первом случае (при помощи Мастера представлений) надо щелкнуть мышью по кнопке View Wizard (Мастера представлений). Далее рассмотрим отдельно случай для удаленного представления и для локального представления.
Создание удаленного представления при помощи Мастера
Откроется первое из окон Мастера представлений (рис. 2.10). На первом этапе предлагается выбрать источник данных.
Такими источниками могут служить источники данных, доступные посредством ODBC, и существующие соединения с базами данных. Выбрать нужный тип соединения можно, установив переключатель в соответствующее положение -ODBC data sources или Connections. Далее, если вы выбрали ODBC data
ГЛАВА 2 ▼ Начальные сведения о базах данных
’^"EKvSTvSarT”^"
Step 1 - Choose Data Source	i v :
To which data source do you want to connect to create you remote view?
Specify either a data souce or an existhg connection to a
Available Data Sources:
5ЙЙЙЙИЗЯ®ЕЫ ©QOBCdatasources
tsssMtawM	КЬ^шаив
гОгуДвд Файлы Excel
УУУУУУуВВУУТ	[vlisO Include system tables r
[ He!p [	[ Cancel |	< E - ’	[ Цех1> j
Рис 2.10 т Выбор источника данных
sources и указали соответствующий источник, щелкните по кнопке Next (Далее). Откроется окно для уточнения источника данных (файла, где он содержится). После указания источника откроется окно, представленное на рис. 2.11.
Рис. 2.11т Выбор полей таблиц
Создаем базу данных
В этом окне происходит выбор таблиц (Tables) и полей в них (Available Fields). Переместить поля из списка доступных (Available Fields) в список выбранных полей (Selected Fields) можно, используя следующие кнопки:
[ > ] перемещает указанное поле из списка доступных (Available Fields) в список выбранных полей (Selected Fields);
[ ► >] перемещает все поля из списка доступных (Available Fields) в список выбранных полей (Selected Fields);
[~7~] убирает указанное поле из списка выбранных нолей (Selected Fields);
[<< ] убирает все поля из списка выбранных полей (Selected Fields).
После выбора нужных полей следует щелкнуть мышью по кнопке Next (Далее). На следующем этапе происходит выбор связанных данных, и этот этап отображается только в случае, когда во втором окне Мастера вы выбрали поля нескольких таблиц.
На следующем этапе (рис. 2.12) происходит отбор полей для сортировки записей. Выбор поля осуществляется с помощью щелчка по кнопке Add (Добавить), отказ от выбора - посредством щелчка по кнопке Remove (Удалить). Выбрать направление сортировки (по возрастанию или по убыванию) можно, установив переключатель в нужное положение - Ascending (По возрастанию)/ Descending (По убыванию).
Рис. 2.12 ▼ Выбор полей для сортировки
V
ГЛАВА 2 ▼ Начальные сведения о базах данных
После выбора установок по сортировке следует щелкнуть мышью по кнопке Next (Далее). Следующее окно (рис. 2.13) позволяет установить фильтр на записи, то есть задать определенные условия, по которым будет осуществляться отбор записей.

2 xxx Ш xxx
*	x.. ы
Fielct_	- 
| TestPerAddiess
I Help )
| Step 5 • Filter Records
Do you want to display only certah records?
Create ar» expression that describes the records you want to see by using the Field, Operator, and Value boxes.
То see the resufts of you filter expression. cick Preview.
Operator _ ; equals
r>

(*)£nd	О fir
Operator_____
I ' Jrl’.-i ”
< equals Ivii i
[ Eteview- ]
I . Cancel , ) [ <fl«* jLjfeO, J [ £nsh ]
Рис. 2.13 vУстановка фильтра на записи
Что удобно, в этом окне есть кнопка Preview (Просмотр), используя которую можно увидеть отобранные при текущих установках фильтра записи. Это позволяет заранее уточнить условия отбора. После того как все установки по отбору записей сделаны, можно щелкнуть по кнопке Next (Далее). В результате откроется последнее окно Мастера (рис. 2.14).
В этом окне можно выбрать дальнейшие действия Мастера:
>	Save remote view - сохранить удаленное представление;
>	Save remote view and browse - сохранить удаленное представление и открыть для редактирования командой BROWSE;
>	Save remote view and modify it in the View Designer - сохранить удаленное представление и открыть для редактирования Дизайнером представлений.
После выбора следует щелкнуть мышью по кнопке Finish (Готово). После этого в ответ на появившийся запрос (рис. 2.15) надо ввести имя создаваемого представления в вашей базе данных (надо его придумать).
Создаем базу данных
Рис. 2.14т Выбор дальнейших действий
Рис. 2.15тВводименипредставления
Создание локального представления при помощи Мастера
Откроется первое из окон Мастера представлений (рис. 2.16). На первом этапе предлагается выбрать таблицы (Databases and tables) и поля в них (Available Fields). Переместить поля из списка доступных (Available Fields) в список выбранных полей (Selected Fields) можно так же, как и аналогичное окно в Мастере для удаленного представления.
Основная разница между этими окнами в том, что в окне, представленном на рис. 2.16, под надписью Databases and tables (База данных и таблицы) есть раскрывающийся список. В нем можно выбрать либо имя открытой БД, и тогда в списке ниже будут присутствовать таблицы из этой БД, либо значение Free
4W ГЛАВА 2 V Начальные сведения о базах данных
Which fields do you wart in Iteyfew resells? You may select fields from one or more tables or
j Step 1  Select Fields
Select a database dr Free Tables, select a table-orvi^^rid; then select the fidds you wa^.
lL.'~.~heip' 1	| Cancel }	< F r | ' £|ext> ] f £mh ]
Рис. 2.16 т Выбор полей таблиц
Tables (Свободные таблицы), и тогда можно указать таблицы, хранящиеся на диске в виде dbf-файлов.
Следующие окна Мастера локальных представлений соответствуют окнам Мастера удаленных представлений.
Создание представления при помощи
Дизайнера представлений
Окно View Designer (Дизайнер представлений) показано на рис. 2.17.
В этом окне имеется панель инструментов Дизайнера представлений, вкладки настройки представления и укна, обозначающие исходные таблицы для представления, с перечнями полей. Разберем назначение кнопок панели инструментов:
Rq. добавляет новый источник данных для создания представления;
удаляет существующий источник данных;
добавляет новую связь между' таблицами-источниками данных;
$ГЦ показывает окно с SQL-запросом, в результате которого образуется представление (подробнее см. раздел «SQL-запросы. Грамотное решение»);
Щ расширяет окно с таблицами-источниками данных за счет вкладок настройки представлений.
Создаем базу данных


......
Teslper
id name address
Testper а
name address
Vtewt>esi£} ao c* °S
ад Q
Available fields:
Testpei.*
g
TestperName Testper Address Te$tper a.’
Functions and expressions: [ Tesiperld
I...........I
| ArfdAg» |
Selected fields:
Рис. 2.17 т Окно View Designer
В окне Дизайнера представлений существуют следующие вкладки для настройки представлений:
> Fields (Поля) - отображает список доступных и отображаемых полей. Перемещать поля из одного списка в другой можно с помощью кнопок Add (Добавить), Add All (Добавить все), Remove (Удалить), Remove All (Удалить все). На этой же вкладке присутствует кнопка Properties (Свойства). При щелчке по этой кнопке открывается окно View Field Properties (Свойства представления поля), в котором можно задать условия отображения и проверки поля (рис. 2.18);
>	Join (Объединение) - позволяет задать параметры объединения нескольких исходных таблиц в одно представление;
>	Filter (Фильтр) - позволяет задать фильтр для выборки данных из исходных таблиц в представление;
>	 Order by (Упорядочить) - позволяет задать условия сортировки записей в представлении;
>	Group by (Группировка) - определяет условия группировки записей в представлении;
>	Update Criteria (Критерий обновления) - определяет порядок обновления записей в представлении;
ГЛАВА 2 ▼ Начальные сведения о базах данных
Рис. 2.18 т Окно свойств поля в представлении
> Miscellaneous (Смешения) - содержит настройки смешения записей из нескольких таблиц для выборки представления.
При помощи Database Designer (Дизайнера базы данных) можно задавать ключевые индексы и связывать таблицы и представления по ним. Это позволяет контролировать целостность базы данных. Подробнее мы рассмотрим работу с индексами в разделе «Индексы. А зачем они?».
Корректируем базу данных
Таблицы нашей базы данных созданы. Это замечательно, но мы создавали табличные структуры, чтобы хранить в них данные, просматривать, добавлять новые записи, а иногда и удалять не нужные более записи. Visual FoxPro предоставляет для этого широкий инструментарий.
Первая команда, которую обычно рассматривают, - BROWSE. Ее описание было дано в предыдущем разделе.
Прежде чем что-либо делать с таблицей, ее необходимо открыть.
В случае применения команды BROWSE, если таблица не открыта в текущей рабочей области, таблица открывается автоматически. Мы упомянули новое понятие - рабочая область. Каждая таблица открывается в своей рабочей области. Если вы открываете таблицу в рабочей области, где уже открыта другая
Корректируем базу данных
таблица, первая таблица автоматически закроется. Во многих командах Visual FoxPro действует правило: если в команде явно не указана таблица или рабочая область, действие производится над таблицей в текущей рабочей области. Сделать рабочую область текущей, то есть перейти в произвольную рабочую область, можно, используя команду SELECT. Главное - не путать ее с командой языка SQL, которая называется так же.
Выбор рабочей области
Выбор рабочей области осуществляется с помощью команды:
SELECT <Номер_рабочей_области> I <Апиас_таблицы>
> <Номер_рабочей_области> - задает номер рабочей области, которую требуется сделать текущей. Если указать номер 0, произойдет переход в рабочую область, не занятую никакой таблицей;
> <Алиас_таблицы> - указывается имя таблицы или ее алиас.
Что такое алиас? Иногда вместо использования имени таблицы ей присваивают псевдоним, дают ей короткое «прозвище».
Если требуется определить номер текущей рабочей области или рабочей области, в которой находится определенная таблица, для этого предусмотрена функция SELECT().
SELECT([О I 1 | <Алиас_таблицы>])
Как видите, она отличается от команды SELECT для выбора рабочей области только тем, что использует скобки для приема параметров и возвращает определенное значение. Если указать в качестве параметра 0 или оставить скобки пустыми, то возвратится номер текущей рабочей области. Если указать в качестве параметра 1, то возвратится номер незанятой рабочей области с максимальным номером. Если указать в качестве параметра алиас или имя таблицы, то возвратится номер рабочей области, в которой открыта эта таблица.
Примеры:
SELECT О
USE Persons
? SELECTO
В результате выполнения первой команды произойдет переход в первую незанятую рабочую область. С помощью второй команды мы открываем таблицу Persons (подробнее об этой команде см. в следующем подразделе). Посредством третьей команды выводим номер текущей рабочей области на экран.
V ГЛАВА 2 V Начальные сведения о базах данных
Иногда требуется определить, занята рабочая область или нет и если занята, то кем. Для этого предусмотрены две функции: USED () и ALIAS ().
USED([<Номер_рабочей_области> I <Алиас_таблицы>])
Функция USED () возвращает логическое значение True (,Т.), если указанная рабочая область занята, и False (,Е), если она свободна. Если не задавать параметры (оставить скобки пустыми), проверяться будет текущая рабочая область.
ALIAS([<Нсмер_рабочей_области> I <Алиас_таблицы>])
Функция ALIAS () возвращает имя или алиас таблицы, открытой в указанной рабочей области. Если не задавать параметры (оставить скобки пустыми), проверяться будет текущая рабочая область.
Открытие таблицы
Открытие таблицы производят посредством команды:
USE [[<Ваза_данных>!] <Имя_таблицы> I <Представление_30Е> I ?]
[IN <Номер_рабочей_области> I <Алиас_таблицы>] [ONLINE] [ADMIN] [AGAIN] [NOREQUERY [<Номер_сессии_данных>]] [NODATA]
[INDEX <Список_индексных_файлов> I ?
[ORDER [<Номер_индекса> I IDXFileName I [TAG] <Имя_тега>
[OF <Имя_СОХ-файла>] [ASCENDING I DESCENDING]]]]
(ALIAS <Алиас_таблицы>] [EXCLUSIVE] [SHARED] (NOUPDATE]
[CONNSTRING <Строка_соединения> I <Указатель> ]
> <База_данных> - указывается имя базы данных, в которой находится открываемая таблица. Если таблица находится в текущей базе данных или используется сама по себе, без указания принадлежности к базе данных, то этот параметр команды не указывается;
> <Имя_таблицы> - имя открываемой таблицы;
> <Представление_50Е> - открывает представление, хранящееся в текущей базе данных;
> ? - открывает стандартное диалоговое окно для выбора файла таблицы;
> IN <Номер_рабочей_области> I <Алиас_таблицы> - указывается рабочая область (или алиас), в которой требуется открыть таблицу;
>	ONLINE - открывает offline-представление, сохраненное предварительно с помощью команды CREATEOFFLINE ();
>	ADMIN - открывает offline-представление, сохраненное предварительно с помощью команды CREATEOFFLINE (), не обновляя измененные в представлении данные на сервере;
Корректируем базу данных V
> AGAIN - позволяет повторно открыть в другой рабочей области уже открытую на данный момент таблицу;
> NOREQUERY - определяет, что открываемое SQL-представление не обновляется из БД в момент открытия;
> NODATA - загружает структуру SQL-представления;
> INDEX <Список_индексных_файлов> I ? - задает индексные файлы, используемые для упорядочивания записей в таблице. Подробнее индексы рассмотрим позже. Если указать ?, откроется стандартное диалоговое окно для выбора индексного файла;
> ALIAS <Алиас_таблицы> - указывает алиас (псевдоним) для открываемой таблицы;
> EXCLUSIVE - открывает таблицу в эксклюзивном режиме. Такой режим запрещает другим пользователям, открывшим эту же таблицу, вносить изменения. Этот режим требуется для выполнения определенных операций над таблицами;
> SHARED - позволяет открывать таблицу' при совместном использовании несколькими пользователями даже в случае, когда она уже открыта одним из пользователей в эксклюзивном режиме;
> NOUPDATE - запрещает изменение таблицы.
> CONNSTRING <Строка_соединения> | «Указатель» - задает строку соединения для базы данных, к которой происходит подключение через драйверы ODBC. Если указать вместо строки соединения пустые кавычки (""), откроется стандартное диалоговое окно ODBC Data Source.
Использование USE без параметров закрывает таблицу в текущей рабочей области.
Примеры:
USE Persons
USE Persons ALIAS Prs
USE Persons IN 0
Первая из приведенных команд просто открывает таблицу Persons. Вторая команда открывает таблицу Persons и задает доя нее алиас Prs. Дальнейшее обращение к этой таблице может происходить не по имени, а по алиасу Prs. Например, желая узнать, в какой рабочей области открыта эта таблица, можно использовать функцию SELECT ("Prs"). Третья команда открывает таблицу Persons в первой незанятой рабочей области. Она равносильна сочетанию команд:
SELECT О
USE Persons
ГЛАВА 2 ▼ Начальные сведения о базах данных
Если таблица свободная (Free), то есть она не входит в базу данных, а располагается на диске в виде файла, можно сразу открывать ее с помощью команды USE.
Если же таблица входит в базу данных, требуется сначала открыть базу данных. Это можно сделать, используя команду OPEN DATABASE.
OPEN DATABASE [<Имя_базы_данных> I ?] [EXCLUSIVE I SHARED]
[NOUPDATE] [VALIDATE]
>	EXCLUSIVE - открывает базу данных в эксклюзивном режиме;
>	SHARED - открывает базу данных в режиме совместного использования;
>	NOUPDATE - открывает базу данных и запрещает ее редактирование;
>	VALIDATE - открывает базу данных и производит проверку наличия входящих в состав базы данных файлов надиске.
OPEN DATABASE MyVFPbase EXCLUSIVE
Эта команда открывает базу данных MyVFPbase в эксклюзивном режиме. После открытия базы данных входящие в ее состав таблицы можно открывать обычным образом при помощи команды USE.
Для редактирования открытой базы данных используется команда MODIFY DATABASE. При этом откроется окно Дизайнера базы данный (Database Designer).
Закрыть открытую базу данных можно при помощи команды CLOSE DATABASE.
Если открыто одновременно несколько баз данных или и база данных и свободные таблицы, имеет смысл обращаться к таблицам, входящим в состав базы данных с использованием префикса. Префикс в данном случае состоит из имени базы данных, в которой находится таблица. Имя базы данных в префиксе отделяется от имени таблицы восклицательным знаком. Например:
USE MyVFPbaselalvt
Команда, приведенная выше, открывает таблицу alvt, находящуюся в базе данных MyVFPbase.
Общая информация о таблице
Visual FoxPro при работе с таблицами поддерживает систему курсоров. Курсор указывает для каждой таблицы, какая запись является текущей. При работе с командой BROWSE та запись, поле которой выделено (обычно рамочкой вокруг поля), и является текущей. Узнать номер текущей записи можно, если воспользоваться функцией RECNO ().
RECNO([<Номер_рабочей_области> I <Алиас_таблицы>])
Корректируем базу данных V
Если не указать параметры, будет возвращена информация по таблице, открытой в текущей рабочей области.
Попробуйте набрать в окне Command
? REGNO()
Если в текущей рабочей области есть открытая таблица, на экране появится номер текущей записи (номер появится в левой части рабочего поля основного окна Visual FoxPro, и вы можете не увидеть его, если он закрыт какими-либо окнами). Результаты работы подобных функций в интерактивном режиме удобнее смотреть, если они выведены в окно сообщений. Сделать это можно с помощью команды MESSAGEBOX. В качестве параметра в скобках указывается функция, которая должна возвращать интересующее нас значение. Например, чтобы увидеть номер текущей записи следует набрать в окне Command
MESSAGEBOX(RECNO())
В результате появится диалоговое окно с номером текущей записи и кнопкой ОК. При щелчке мышью по кнопке ОК окно закроется.
Еще одна полезная функция для получения информации о записях таблицы -RECCOUNT (). Она возвращает число записей в таблице.
RECCOUNT([<Номер_рабочей_области> I <Алиас_таблицы>] )
Если не указать параметры функции, она возвращает число записей в таблице, открытой в текущей рабочей области.
Перемещения по таблице
Быстро перемещать курсор по таблице (делать ту или иную запись текущей) можно посредством команды GO.
GO [RECORD] <Номер_записи> [IN <Номер_рабочей_области>
I IN <Алиас_таблицы>]
GO TOP [IN <Номер_рабочей_области> I IN <Алиас_таблицы>] -делает текущей первую запись таблицы.
GO BOTTOM [IN <Номер_рабочей_области> I IN <Алиас_таблицы>] - делает текущей последнюю запись таблицы.
Таким образом, чтобы переместиться в начало текущей таблицы надо выполнить команду:
GO ТОР
ГЛАВА 2 ▼ Начальные сведения о базах данных
Перемещаться относительно текущей записи можно, если воспользоваться командой SKIP.
SKIP [<Число>][IN <Номер_рабочей_области> I IN <Алиас_таблицы>]
<Число> - указывается количество записей, на которое надо перескочить от текущей записи. А как узнать, какая запись текущая? На этот случай у Visual FoxPro припасена функция RECNO (}, которая была рассмотрена выше.
Если указать в качестве параметра SKIP отрицательное число, состоится переход назад от текущей записи. Например, если текущая запись имеет номер 5:
SKIP 3 && Переход на запись 8
произойдет переход на 3 записи от текущей.
А если текущая запись имеет номер 5 и сделать так:
SKIP -4 && Переход на запись 1
произойдет переход назад на 4 от текущей записи.
Если указать команду SKIP без параметров, произойдет переход на одну запись вперед.
Если текущая запись имеет номер 5 и сделать так:
SKIP &L Переход на следующую запись
помер текущей записи станет 6.
Поиск данных в таблице
Следующая группа команд, которую мы рассмотрим, - команды поиска записей. Основные команды поиска записей - LOCATE, CONTINUE и SEEK. Первая и вторая работает с таблицами независимо от того, проиндексирована таблица или нет. Команда SEEK осуществляет поиск только в проиндексированных таблицах.
LOCATE [FOR <Условие1>] [Диапазон] [WHILE <Условие2>] [NOOPTIMIZE]
>	<Условие1> - ищется первая запись, удовлетворяющая этому условию;
>	Диапазон - задает диапазон поиска и может принимать значения: ALL -все записи, NEXT «Количество - указанное количество следующих за текущей записей, RECORD <Номер_записи> - поиск в конкретной записи, REST - поиск начиная с текущей записи и до конца таблицы;
>	«Условие!> - задает выражение, при истинности которого продолжается поиск;
>	NOOPTIMIZE - отключает использование оптимизации Rushmore.
Корректируем базу данных V
Команда LOCATE ищет запись, соответствующую условиям поиска, и делает ее текущей. Продолжить поиск после нахождения первой записи, удовлетворяющей условиям поиска, можно посредством команды CONTINUE. Поиск в этом случае будет продолжен с записи, следующей за текущей.
Рассмотрим синтаксис команды SEEK.
SEEK <Ключевое_выражение> [ORDER <Номер_индекса> I <Имя_1йх-файла>
I [TAG] <Имя_тега> [OF <Имя_сйх-фаЙла>] [ASCENDING I DESCENDING]]
[IN <Номер_рабочей_области> I IN <Алиас_таблицы>]
>	 <Ключевое_выражение> - выражение для поиска записи, соответствующее ключевому выражению, использованному при индексировании;
>	<Номер_индекса> I <Имя_1йх-файла> - определяет номер или имя индексного idx-файла, в соответствии с индексами которого производится поиск;
>	<Имя_тега> - имя тега в cdx-файле, в соответствии с индексами которого производится поиск;
>	ASCENDING - поиск в таблице будет производиться по возрастанию индексов;
>	DESCENDING - поиск в таблице будет производиться по убыванию индексов;
>	<Номер_рабочей_области> I <Алиас_таблицы> - обозначение таблицы, в которой производится поиск.
Команда SEEK ищет запись, соответствующую условиям поиска, и делает ее текущей. Как мы уже говорили, команда SEEK работает только с индексированными таблицами и поиск можно осуществлять только по полям или выражениям над полями, по которым производилось индексирование. Подробнее об использовании индексов будет рассказано в следующем разделе.
Определить, найдена ли запись командами LOCATE, CONTINUE или SEEK, можно, если после их выполнения оценить значение, возвращаемое функцией FOUND().
FOUND([<Номер_рабочей_области> I <Алиас_таблицы>])
Если функция FOUND () вернула значение True (.Т.), значит, поиск увенчался успехом, если функция FOUND() вернула значение False (.F.) - искомое значение не найдено.
Например, мы решили найти в таблице persons запись о сотруднике с табельным номером 70005. Сделать это можно следующим образом:
LOCATE FOR tabnum = 70005
V ГЛАВА 2 ▼ Начальные сведения о базах данных
Если вы просматриваете таблицу по команде BROWSE и не желаете пользоваться командами Visual FoxPro, можно осуществлять простейший поиск средствами команд основного меню Visual FoxPro. Для такого поиска следует выбрать в меню Edit (Правка) команду Find (Найти). Есть и другой способ, более быстрый, - сочетание клавиш Ctrl+F. Появится диалоговое окно, представленное на рис. 2.19.
Look tor: .пример	[уо | FudjjeKt |
f°Pton5 •- V ------------------ ' (Beplace..!
; О Match ease Q Match whole woid . ,	'
;□ Wrap sound QSeschbackwsd ' I F**”1. .] iEJUsswIdcs*
✓Scope - - - ----- -.......-.......-	’.....'
’'c-c.-vzc	Cai .bsc’s '
Рис. 2.19тОкно поиска
В поле Look for (Найти) следует ввести собственно то, что мы хотим найти. Можно вводить и целиком значение искомого поля, и какую-либо часть его. После этого надо щелкнуть мышью по кнопке Find Next (Найти следующее). Указатель установится на запись, в поле которой встретилось первое упоминание введенного вами. Окно поиска при этом останется на месте, не пропадет с экрана. Если нашлась не та запись, можно продолжить поиск, щелкнув еще раз по кнопке Find Next (Найти следующее).
Изменение данных в записи
Изменять значения полей при работе с командой BROWSE можно интерактивно, щелкнув в соответствующем поле и вводя новое его значение. Если вы обращаетесь к таблице не из программы, а просто запустили среду Visual FoxPro и открыли таблицу, работа в окне с записями таким образом - самое естественное поведение. Однако рассмотрим и изменение значений полей с использованием команд, вводимых в окне Command.
Для изменения значений полей в записях существует команда REPLACE.
REPLACE <Имя_поля> WITH <3начение> [ADDITIVE]
[,<Имя_поля2> WITH <3начение> [ADDITIVE]] ... [Диапазон]
[FOR <Условие1>] [WHILE <Условие2>] [IN <Номер_рабочей_области>
I <Алиас_таблицы>] [NOOPTIMIZE]
Корректируем базу данных V
> <Имя_поля> - имя поля, значение которого требуется изменить;
> <3начение> - новое значение поля;
> ADDITIVE - позволяет добавлять текст в memo-поле, а не заменять его;
> <Условие1> - значение полей будут изменены только в тех записях, которые удовлетворяют этому условию;
> <Условие2> - значение полей будут изменяться до тех пор, пока выполняется условие;
> <Номер_рабочей_области> I <Алиас_таблицы> - обозначение таблицы, в которой производятся изменения;
> NOOPTIMIZE - отключает использование оптимизации Rushmore.
Попробуем исправить значения нескольких полей в таблице persons, хранящей список сотрудников. Выполните следующие действия.
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку example.
2.	Откроем таблицу persons, используя команду
USE persons
Если Visual FoxPro выдаст ошибку, значит, таблица в текущей папке не найдена, следует закрыть окно с ошибкой щелчком мышью по кнопке ОК и еще раз выполнить команду CD ?, как это описано в п.1.
При успешном открытии таблицы никакого сообщения не появится. Проверить, что таблица открылась, нужно, выполнив команду BROWSE. Окно с именем таблицы в заголовке появится на экране.
3.	Щелкните мышью в пятой по счету записи в поле Name. Содержимое этого поля должно быть «Семенов Павел Игоревич». Допустим, при вводе данных об этом сотруднике допустили ошибку и его отчество не Игоревич, а Петрович. Курсор после щелчка мышью установился в поле Name. Можно стереть «Игоревич» и набрать «Петрович». После этого щелкните мышью в другом поле или нажмите Enter. Внесенные вами изменения сохранены.
4.	Воспользуемся другим способом изменения данных - командой REPLACE. Изменим значение поля Address в записи со значением поля Tabnum = 70004.
REPLACE Address WITH "ул. Ленина, 2, кв.5" FOR Tabnum = 70004
ГЛАВА 2 ▼ Начальные сведения о базах данных
5.	Убедитесь, что изменения произошли, и именно в записи со значением поля ТаЬпшп = 70004.
6.	Закроем таблицу посредством команды
CLOSE TABLES
Индексы. А зачем они?
В принципе вы можете обойтись совершенно без них. Однако, если ваши таблицы содержат более сотни записей, если вы хотите получить быстрый способ поиска записи по какому-либо критерию, если вы хотите получить легкий способ связывания таблиц, - не стоит пренебрегать индексами. Конечно, в первую очередь индексы используются для сортировки записей. Это весьма удобно - на одну таблицу можно создать несколько индексов и пользоваться нужным из них в зависимости от ситуации. Индексы помогают выделять из большого количества записей только подмножества с необходимыми характеристиками.
Что же такое индексы? Индексы - это заранее выбранные и распределенные в указанном вами порядке ссылки на записи таблицы. Когда вы создаете таблицу и наполняете ее данными, записи хранятся в файле в том порядке, в каком вы их туда помещали. Если индексы не используются, обработка этих записей, поиск в них будут производиться в том же порядке. Когда вы создаете индекс (индексируете вашу таблицу), физическое расположение записей в файле таблицы не меняется. Изменяется только порядок обработки записей индексированных таблиц. При этом довольно сильно возрастает скорость поиска данных по определенному условию.
Сами индексы хранятся в отдельном файле либо с расширением .idx, либо с расширением .cdx. В idx-файле может храниться только один индекс, и длина индексного выражения не может превышать 100 символов. Cdx-файлы позволяют хранить несколько индексов с длиной индексного выражения до 240 символов. Само индексное выражение может представлять собой имена полей и функции, производящие какие-либо действия над именами полей.
Создание индексов
Основная команда, служащая для создания индексных файлов, - INDEX.
INDEX ON <Выражение> ТО <Имя_1Фх-файла> I TAG <Имя_тега> [COLLATE <Национальная_сортировка>] [OF <Имя_сФх-файла>]
Индексы. А зачем они?
V
[FOR <Условие >] [COMPACT] [ASCENDING I DESCENDING]
[UNIQUE I CANDIDATE] [ADDITIVE][BINARY]
> <Выражение> - индексное выражение;
> <Имя_1йх-файла> - имя файла для хранения индекса (указывается, если создается одиночный индекс в idx-файле);
> <Имя_тега> - имя индекса внутри комплексного индексного cdx-файла (указывается, если создается индекс внутри cdx-файла);
> <Национальная_сортировка> - необязательный параметр, указывающий, как производить сортировку символьных полей с национальными кодировками. Возможные значения см. в раскрывающемся списке Collating sequence (Последовательность сортировки) на вкладке Data (Данные): Tools (Инструменты) > Options (Параметры);
> <Имя_сбх-файла> - имя файла для хранения индекса (указывается, если создается индекс в cdx-файле);
> <Условие> - логическое условие для отбора записей. В индекс войдут только те записи, которые удовлетворяют условию. Эта возможность позволяет выделять из большого количества записей только подмножество с необходимыми характеристиками. Физически в таблице все записи останутся, но при работе с индексами покажутся только удовлетворяющие условию записи;
> COMPACT - создается компактный idx-файл. Для cdx-файла этот параметр значения не имеет, так как он всегда создается компактным;
> ASCENDING I DESCENDING - направление сортировки. Если указано DESCENDING, то по убыванию. Если ничего не указывать, то сортировка происходит по возрастанию;
> UNIQUE I CANDIDATE-определение режима включения в индексный файл записей с повторяющимися ключевыми полями. Если UNIQUE, в индексный файл будет занесен только индекс первой из нескольких записей с одинаковыми ключевыми полями;
> ADDITIVE - при создании индекса индексные файлы, уже открытые для данной таблицы, продолжают оставаться открытыми;
> BINARY - создание бинарных индексов. При этом не поддерживаются параметры FOR, ASCENDING, DESCENDING, UNIQUE и CANDIDATE. Для бинарных индексов не поддерживаются команды SET ORDER и SEEK.
Попробуем создать индекс для таблиц нашего примера (список сотрудников и должностей). Создадим для списка должностей два одиночных индекса (idx-файлы), а для списка сотрудников - комплексный индекс (cdx-файл). Последовательность действий для этого приведена ниже.
1^ ГЛАВА 2 V Начальные сведения в базах данных
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку example.
2.	Выполните в окне Command команду
USE staff.
Если Visual FoxPro выдаст ошибку, значит, таблица в текущей папке не найдена, следует закрыть окно с ошибкой щелчком мышью по кнопке ОК и вернуться к п.1. При успешном открытии таблицы никакого сообщения не появится. Проверить, что таблица открылась, нужно, выполнив команду BROWSE. Окно с именем таблицы в заголовке появится на экране.
3.	Индексировать будем по полю ID. Выполните в окне Command команду INDEX ON ID ТО id_staff.
4.	Убедитесь, что записи в таблице расположены в соответствии с возрастанием значений поля ID и в папке example образовался файл id_staff.idx. Если в окне с таблицей оперативно не обновился порядок строк, щелкните мышью в любом месте этого окна, чтобы оно стало активным.
5.	Создадим еще один индекс по полю SUM, но при этом поставим на записи фильтр по суммам. Пусть в индекс попадут только записи с суммами, которые меньше 20000 (SUM < 20000.00). Выполните в окне Command команду
INDEX ON SUM ТО su_staff FOR SUM < 20000.00
6.	Убедитесь, что записи в таблице расположены в соответствии с возрастанием значений поля SUM, записей с суммами больше или равными 20000 в таблице нет, в папке example образовался файл su_staff.idx. Если в окне с таблицей оперативно не обновился порядок строк, щелкните мышью в любом месте этого окна, чтобы оно стало активным.
7.	Откроем в другой рабочей области таблицу persons. Для этого перейдем в свободную (не занятую открытой таблицей) рабочую область, используя команду
SELECT 0
Откроем таблицу persons с помощью команды
USE persons
Индексы. А зачем они? V
Если Visual FoxPro выдаст ошибку, значит, таблица в текущей папке не найдена, следует закрыть окно с ошибкой щелчком мышью по кнопке ОК и выполнить команду USE ?. В результате откроется окно для выбора файла. Найдите в папке example файл persons.dbf и щелкните по нему, а затем по кнопке ОК. При успешном открытии таблицы никакого сообщения не появится. Проверить, что таблица открылась, нужно, выполнив команду BROWSE. Окно с именем таблицы в заголовке появится на экране.
8.	Один индекс создадим по полю NAME, а другой по полю ID. Для этого сначала выполним в окне Command команду
INDEX ON NAME TAG NAMES OF PERSONS
Здесь NAME - имя поля, по которому строится индекс,
NAMES - имя индекса в cdx-файле,
PERSONS - имя cdx-файла.
9.	Убедитесь, что записи в таблице расположились в соответствии с возрастанием значений поля NAME и в папке example образовался файл persons.cdx. Если в окне с таблицей оперативно не обновился порядок строк, щелкните мышью в любом месте этого окна, чтобы оно стало активным.
10.	Создадим индекс по полю ID. Для этого выполним в окне Command команду
INDEX ON ID TAG IDS OF PERSONS
Здесь ID - имя поля, по которому строится индекс,
IDS - имя индекса в cdx-файле,
PERSONS - имя cdx-файла.
11.	Убедитесь, что записи в таблице расположились в соответствии с возрастанием значений поля ID. Если в окне с таблицей оперативно не обновился порядок строк, щелкните мышью в любом месте этого окна, чтобы оно стало активным.
12.	Закроем обе таблицы, используя команду
CLOSE TABLES
Если вы выполнили успешно все шаги, перечисленные выше, у вас получатся две проиндексированные таблицы. В папке example появятся файлы id_staff.idx, su_staff.idx и persons.cdx, содержащие индексы.
Использование индексов
Для того чтобы упорядочить записи по готовым индексам, можно при открытии таблицы указать соответствующий индексный файл. Для idx-файлов этого
V ГЛАВА 2 ▼ Начальные сведения о базах данных
достаточно, а для cdx-файлов требуется еще указать тег индекса (имя нужного индекса внутри cdx-файла), по которому происходит упорядочивание.
В простейшем случае для idx-файлов команда имеет вид:
USE <Имя_таблицы> INDEX <Имя_1йх-файла>
Для cdx-файлов есть два варианта.
Если при индексировании вы задали имя, совпадающее с именем таблицы, индексный файл откроется автоматически при открытии таблицы. То есть в простейшем случае вы используете команду
USE <Имя_таблицы> ORDER TAG <Имя_тега>
При этом индексный cdx-файл с именем, таким же как имя таблицы, откроется автоматически, а записи будут отсортированы в соответствии с индексом, указанным в параметре <Имя_тега>.
Если при индексировании вы задали имя, не совпадающее с именем таблицы, придется принудительно открывать cdx-файл, а затем указывать тег, по которому произойдет сортировка. Можно это сделать либо с помощью двух раздельных команд
USE <Имя_табпицы> INDEX <Имя_сйх-файла>
SET ORDER ТО TAG <Имя_тега>
либо посредством одной, но более сложной команды
USE <Имя_табпицы> INDEX <Имя_сдх-файла> ORDER TAG <Имя_тега>
Как вы, наверное, поняли, в процессе работы, если требуется сортировать таблицу, то пользуясь одним индексом cdx-файла, то другим, используют команду SET ORDER ТО TAG <Имя_тега>.
Опробуем использование индексов на практике. Выполните следующие действия.
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку example.
2.	Выполните в окне Command команду
USE staff INDEX id_staff
Если Visual FoxPro выдаст ошибку, значит, таблица в текущей папке не найдена, следует закрыть окно с ошибкой щелчком мышью по кнопке ОК и еще раз выполнить команду CD ?, как указано в п.1. При успешном открытии таблицы никакого сообщения не появится. Проверить, что
Индексы. А зачем они? V
таблица открылась, нужно, выполнив команду BROWSE. Окно с именем таблицы в заголовке появится на экране.
3.	Убедитесь, что записи отсортированы в порядке увеличения значения поля ID.
4.	Закройте таблицу, используя команду
USE
5.	Выполните в окне Command команду
USE staff INDEX su_staff
При успешном открытии таблицы никакого сообщения не появится. Проверить, что таблица открылась, нужно, выполнив команду BROWSE. Окно с именем таблицы в заголовке появится на экране.
6.	Убедитесь, что записи в таблице расположены в соответствии с возрастанием значений поля SUM и записей с суммами больше или равными 20000 в таблице нет.
7.	В другой рабочей области откроем таблицу persons. Для этого перейдем в свободную (не занятую открытой таблицей) рабочую область, используя команду
SELECT О
Откроем таблицу persons посредством команды
USE persons ORDER TAG NAMES
При успешном открытии таблицы никакого сообщения не появится. Проверить, что таблица открылась, нужно, выполнив команду BROWSE. Окно с именем таблицы в заголовке появится на экране.
8.	Убедитесь, что записи в таблице расположились в соответствии с возрастанием значений поля NAME.
9.	Попробуем расположить записи в соответствии с другим индексом, хранящимся в этом же индексном cdx-файле. Для этого выполните команду
SET ORDER ТО TAG IDS
10.	Убедитесь, что записи в таблице расположились в соответствии с возрастанием значений поля ID. Если в окне с таблицей оперативно не обновился порядок строк, щелкните мышью в любом месте э того окна, чтобы оно стало активным.
11.	Закроем обе таблицы, используя команду
CLOSE TABLES
ГЛАВА 2 ▼ Начальные сведения о базах данных
Создание индексов при помощи Дизайнера таблиц
Когда мы рассматривали создание таблиц при помощи Дизайнера таблиц (Table Designer), мы уделяли максимум внимания вкладке Fields (Поля) и минимум вкладкам Indexes (Индексы) и Table (Таблица). Настало время исправить' эту несправедливость. Вкладка Indexes (Индексы) для таблицы Persons из нашего примера показана на рис. 2.20. Увидеть окно Дизайнера таблиц (Table Designer) вновь после процесса создания таблицы можно, выполнив следующие действия:
1.	Откройте таблицу.
2.	Выполните последовательность команд Window > Data Session (Окно > Сессия работы с данными) или щелкните по кнопке на стандартной панели инструментов.
3.	В появившемся окне Data Session (Сессия работы с данными) щелкните мышью по кнопке Properties (Свойства).
4.	В открывшемся окне Work Area Properties (Свойства рабочей области) щелкните по кнопке Modify (Изменить).
Рис. 2.20 тВкладка Indexes
Индексы. А зачем они? V
На этой вкладке перечисляются существующие индексы для таблицы. Стоит обратить внимание, что, если вы хотите добавлять новые индексы или менять что-либо в структуре таблицы, надо открывать таблицу в эксклюзивном режиме. Для этого нужно:
> либо открыть таблицу, используя команду USE Persons EXCLUSIVE;
> либо в окне открытия таблицы установить флажок Open exclusive.
Кнопка Delete (Удалить) позволяет удалить выделенную запись.
Кнопка Insert (Вставить) помогает вставить пустую запись перед выделенной.
Кнопка со стрелкой слева от имени индекса позволяет задать направление сортировки записей. Если стрелка направлена вверх, то сортировка производится по возрастанию, если вниз - по убыванию. Изменить направление сортировки можно с помощью щелчка мышью по этой кнопке.
Имя индекса можно задавать произвольное. В столбце Expression (Выражение) указывается индексное выражение, в качестве которого может выступать поле, комбинация полей или какие-либо функции от поля. Можно ввести это выражение вручную или воспользоваться окном, появляющимся при щелчке по кнопке с многоточием справа от поля для ввода выражения.
Что представляет собой тип индекса (столбец Туре)? Возможны следующие варианты:
>	Regular - все записи с одинаковым значением индексного выражения учитываются и будут отображаться в порядке их ввода;
>	Unique - будет учитываться только первая из записей с одинаковым значением индексного выражения, и только она будет отображаться;
>	Candidate - уникальный индекс, не содержащий полей с пустыми значениями. Этот индекс - кандидат на роль первичного ключа, то есть он удовлетворяет всем требованиям к первичным ключам, но не является им, потому что первичный ключ для таблицы может быть только один;
>	Primary - первичный ключ. Он может быть только один для таблицы. Предназначен для связывания таблиц между собой и проверки условий целостности базы данных;
> Binary - двоичный индекс, основанный на логических выражениях. Не позволяет использовать фильтр для записей.
Индекс типа Primary имеет смысл только при использовании таблиц в составе базы данных. Если вывести таблицу из состава базы данных и сделать ее свободной, индекс типа Primary удаляется.
4V ГЛАВА 2 ▼ Начальные сведения о базах данных
Индексы в базе данных при работе с Дизайнером базы данных (Database Designer) в окнах таблиц выделяются, как показано на рис. 2.21. Индекс типа Primary отмечается значком с обозначением ключа (рис. 2.22).
Столбец Filter (Фильтр) аналогичен условию после ключевого слова FOR в команде INDEX.
£l(1ersl
birthday address id
Slndexes: sids
Рис. 2.21 ▼ Вид окна проиндексированной таблицы в Дизайнере базы данных
© Fields:
sum
®ndexe$:
*|ids
Рис. 2.22 ▼ Обозначение Primary-ключа

Связывание таблиц
Существует две возможности установки связи между таблицами. Важно не путать их между собой, потому что назначение у этих связей совершенно разное.
Возможность связи между таблицами для проверки целостности информации в базе данных будет рассмотрена в разделе «Контроль целостности базы данных».
Попробуем разобраться с возможностью связывать таблицы так, чтобы при перемещении указателя по записям одной таблицы указатель в другой таблице (или нескольких таблицах) автоматически перемещался на соответствующие записи. Например, в одной таблице хранятся фамилии работников и номера смен, в которые эти люди должны выходить на текущей неделе, а в другой таблице хранятся номера смен и соответствующие им периоды рабочего времени (табл. 2.5 и 2.6). Если мы свяжем эти две таблицы по полю «Смена», при переходе от одной записи к другой в таблице с фамилиями работников (например, при просмотре по команде BROWSE) указатель в таблице с периодами рабочего времени тоже будет перемещаться на записи с номерами смены, соответствующими номерам смены в таблице с фамилиями работников. Мы делаем текущей в таблице с фамилиями работников запись о Васечкине А.Н., в таблице с периодами рабочего времени автоматически станет текущей запись о второй смене с диапазоном рабочего времени 9:00-18:00. Как же установить связь между таблицами?
Связывание таблиц
Таблица 2.5 т Список работников и номера смен
Работник	Смена
Петров В.А. Васечкин А.Н. Корнеев Ф.С. Малов П.С. Ткачев Л .А. Горевой А.А. Стечкин М.И.	1 II 1 III II III 1
Таблица 2.6 т Периоды рабочего времени
Смена	Рабочее время
1	8:00-17:00
II III	9:00-18:00 14:00-23:00
Для связывания таблиц служит команда SET RELATION. При этом таблица, с которой мы связываем главную таблицу, должна быть проиндексирована по тому полю или группе полей, по которому мы собираемся связывать таблицы.
SET RELATION ТО [<Выражение1> INTO <Рабочая_область1>I<Имя_таблицы1> [, <Выражение2> INTO <Рабочая_область2>|<Имя_таблицы2> ...] [IN <Рабочая_область>I<Имя_таблицы>] [ADDITIVE]]
>	<Выражение1> - поле главной таблицы или действие над полями главной таблицы, соответствующее индексному выражению в таблице, с которой связывается главная таблица;
>	<Рабочая_область1>I<Имя_таблицы1> - указывается либо номер (или имя) рабочей области, либо имя таблицы, с которой устанавливается связь;
>	<Выражение2> INTO <Рабочая_область2>|<Имя_таблицы2>...-еслитаблиц, с которыми вы хотите связать главную таблицу, несколько, соответствующие индексные выражения и имена таблиц или номера рабочих областей перечисляются через запятую (между каждым выражением и именем таблицы ставится ключевое слово INTO);
>	IN <Рабочая_область> I <Имя_таблицы> - указывается либо номер (или имя) рабочей области, либо имя таблицы, которая является главной, если она не является текущей (расположена не в текущей рабочей области);
V ГЛАВА 2 Т Начальные сведения о базах данных
> ADDITIVE - при создании новой сохраняет все существующие связи главной таблицы (если не указывать этот параметр, все существовавшие до этого момента связи главной таблицы будут разорваны).
Если требуется разорвать связь текущей таблицы со всеми таблицами, можно воспользоваться командой SET RELATION ТО без параметров. Если же необходимо разорвать соединение текущей таблицы с конкретной таблицей, следует использовать команду SET RELATION OFF.
SET RELATION OFF INTO <Рабочая_область>I<Имя_таблицы>
<Рабочая_область> I <Имя_таблицы> - указывается либо номер (или имя) рабочей области, либо имя таблицы, с которой требуется разорвать связь.
Установленные связи таблиц довольно удобно наблюдать в окне Data Session (Сессия работы с данными), вызываемом с помощью последовательности команд Window > Data Session (Окно > Сессия работы с данными) или посредством щелчка по кнопке 1^1 на стандартной панели инструментов. Связь между таблицами отображается в поле Relations (Связи), как это показано на рис. 2.23.
Попробуем попрактиковаться в связывании таблиц на примере созданных нами ранее списков сотрудников и должностей. Индексы для этих таблиц также уже созданы нами.
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку example.
Связывание таблиц
2.	Выполните в окне Command команду
USE staff INDEX id_staff
Если Visual FoxPro выдаст ошибку, значит, таблица в текущей папке не найдена, следует закрыть окно с ошибкой щелчком мышью по кнопке ОК и еще раз выполнить команду CD ?, как указано в п.1. При успешном открытии таблицы никакого сообщения не появится. Проверить, что таблица открылась, нужно, выполнив команду BROWSE. Окно с именем таблицы в заголовке появится на экране.
3.	В другой рабочей области откроем таблицу persons. Для этого перейдем в свободную (не занятую открытой таблицей) рабочую область, используя команду
SELECT О
Откроем таблицу persons, используя команду
USE persons
Проверить, что таблица открылась, нужно, выполнив команду BROWSE. Окно с именем таблицы в заголовке появится на экране.
4.	Установим связь между нашими таблицами по полю ID. Главной таблицей пусть будет persons. Таблица staff проиндексирована нами ранее по полю ID. Выполните следующую команду:
SET RELATION ТО ID INTO Staff IN persons
Здесь ID - поле таблицы persons, которое соответствует индексному выражению индекса id_staff таблицы staff (индекс по полю ID таблицы staff).
5.	Расположите окна с таблицами так, чтобы они были видны одновременно (рис. 2.24).
6.	Щелкните мышью по любой записи в таблице persons. Обратите внимание, какая запись показывается в этот момент в таблице staff. Соответствует ли значение поля ID в таблице staff значению поля ID в текущей записи таблицы persons? Если в таблице staff не видна ни одна запись, значит, не найдено ни одного соответствия (стоит проверить, правильно ли вы ввели значения ID).
7.	Откройте окно Data Session (Сессия работы с данными), выполнив команды Window > Data Session (Окно > Сессия работы с данными) или щелкнув по кнопке IgJ на стандартной панели инструментов. Связь между таблицами должна отображаться в поле Relations (Связи), как это показано на рис. 2.23.
ГЛАВА 2 V Начальные сведения о базах данных
8.	Закройте окно Data Session (Сессия работы с данными). Закройте таблицы с помощью команды
CLOSE TAELES


' Micrcwfi Vhud’ toxPro
He > Eda View Tools Program Table Window Help
ЗВ?	я>Г
Spetsorn
Tabnum	Name
2	7UO31: Петров Анатолии Иванович
_ _	700U2=Семенов Игорь Степанович
J	7U00.T Балашова Зинаида Дмитриевна
7U004 Феоктистова Елена Михаиловна 70005- Семенов Павел Игоревич 7G0U6 Семипятныи Андреи Львович 7С007;Смоленская Лидия Павловна 70и08и~аври4ов Иван Савельевич
Birthday
12/30/70
05/3 1/50
07/15/50
08/22/71
05/22/75
02/17/57
10/10/80
01/02/74
__________________________Address
^ул. Академика Ушакова. 10.кв.112
ул. Петровская. 3. кв.10
= ул. Резинстроя. 20. кв.77
;ул. Пушкина. 1. кв.1
ул. Петровская. 3. кв.10
• ул. Лесная. 7
; ул. Привокзальная.10.кв 2
; ул. Горького. Д.2. КВ.5
bJ'£.lS
__!!______И
01007
101002 _	i ,
!01003	! :
=01005 ~	i
[ШобГ	 i
101001 _	! i
101008 __	i i
101004	L—,
И Staff

Id	Whois
1ЙЙ&	Директор
___ 010C2	; Заместитель директор
U1003	Главныи бухгалтер
Sum
25000.0000= zOOOO’OOOO:
20000.00001
! Command
SELECT 2 > EROUSE LAST
Staff (d\4fleKC^\bodc\««ripte\staff-dbt)-
Record. 1/8
Eitclustve


Рис. 2.24 т Окна с таблицами
SQL-запросы. Грамотное решение
Для того чтобы из любой программы, на каком бы языке она ни была написана, можно было обращаться к любой базе данных, придумали язык структурированных запросов SQL (Structured Query Language). Существует стандарт на синтаксис этого языка. Приложения, работающие с БД, пишутся на выбранном языке программирования, а для формирования запросов к БД используются «внедренные» конструкции языка SQL. Все известные СУБД в той или иной мере поддерживают стандарт SQL. Visual FoxPro имеет поддержку языка SQL. Для работы с базами данных Visual FoxPro можно вводить команды SQL прямо
SQL-запросы. Грамотное решение
в окне Command. Для обращения к удаленным БД используется более хитрый способ, но конструкции SQL те же.
Реализация технологии «клиент/сервер» производится именно с использованием запросов SQL. По всем этим причинам в программах при работе с БД более грамотно отдавать предпочтение, например, SQL-команде UPDATE, а не REPLACE, или SQL-команде INSERT, а не связке команд APPEND BLANK и REPLACE.
Создание таблиц
Оператор SQL для создания таблиц - CREATE TABLE.
CREATE TABLE <Имя_таблицы> (<Определение_полей>)
Что собой представляет <Определение_поля>? Это комбинация имени поля и его типа через пробел. После указания типа можно в скобках указать размер поля. Если полей несколько, то они перечисляются через запятую. Перечень типов приведен в табл. 2.7.
Таблица 2.7 ▼ Перечень обозначений типов полей в SQL
Тип поля в SQL	Тип поля в Visual FoxPro	Описание
Стандартные для SOL типы данных		
CHAR, или С	Character	СИМВОЛЬНЫЙ тип
. NUMERIC, или N	Numeric	числовой тип
FLOAT, или F	Float	числовой тип
INTEGER, или 1	Integer	целочисленный тип
DOUBLE PRECISION, или В	Double	числовой тип с двойной точностью
DATE, или D	Date	тип даты
Дополнительные типы данных, реализованные в Visual FoxPro		
L	Logical	логический тип
Y	Currency	тип валюты
T	DateTime	тип даты с указанием времени
G	General	ссылка на OLE-объект
W	Blob	ссылка на двоичные данные
Попробуем создать с помощью команд SQL таблицы из нашего примера: список сотрудников и список должностей. Чтобы не стереть уже созданные таблицы, назовем новые таблицы new_pers и new_st.
1.	Смените текущую папку; выполнив в окне Command команду
CD ?
V	ГЛАВА 2 ▼ Начальные сведения о базах данных
Откроется окно, в котором нужно найти созданную нами ранее папку example.
2.	Выполните создание таблицы new_pers для хранения списка сотрудников, используя команду CREATE TABLE. Для этого в окне Command следует набрать
CREATE TABLE new_pers (tabnum INTEGER(4), name CHARACTER(30), birthday DATE, address CHARACTER(50), id CHARACTER(10))
3.	Выполните в окне Command команду
BROWSE
и убедитесь, что в таблице появились все описанные нами поля.
4.	Убедитесь, что в папке example появился новый файл new_pers.dbf.
5.	Выполните создание таблицы new_st для хранения списка должностей с помощью команды CREATE TABLE, набрав в окне Command
CREATE TABLE new_st (id CHARACTER(10), whois CHARACTER (20), sum NUMERIC(15,4))
6.	Выполните в окне Command команду
BROWSE
и убедитесь, что в таблице появились все описанные нами поля.
7.	Убедитесь, что в папке example появился новый файл new_st.dbf.
8.	Закройте таблицы, используя команду
CLOSE TABLES
Изменение структуры таблиц
Оператор SQL для изменения структуры таблиц - ALTER TABLE.
ALTER TABLE <Имя_таблицы> ADD [COLUMN] <Определение_поля>
I ALTER [COLUMN] <Имя_поля> <Определение_поля>
I DROP [COLUMN] <Имя_поля>
I ADD <Накладываемое_ограничение>
I DROP CONSTRAINT <Имя_удаляемого_ограничения>
>	ADD COLUMN - позволяет добавить столбец;
>	ALTER COLUMN - позволяет изменить столбец;
>	DROP COLUMN - позволяет удалить столбец;
>	ADD <Накладываемое_ограничение> - позволяет наложить на таблицу ограничение для проверки целостности;
>	DROP CONSTRAINT - позволяет удалить ограничение для проверки целостности.
SQL-запросы. Грамотное решение
Допустим, что появилась необходимость добавить в созданную нами таблицу new_st еще одно поле - worktime (нормированный рабочий день или нет).
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку example.
2.	Выполните добавление поля worktime в таблицу new_st, набрав в окне Command
ALTER TABLE new_st ADD COLUMN worktime CHARACTER(25)
3.	Выполните в окне Command команду
BROWSE
и убедитесь, что в таблице появилось новое поле.
4.	Закройте таблицы, используя команду
CLOSE TABLES
Удаление таблиц
Оператор SQL для удаления таблиц - DROP TABLE.
DROP TABLE <Имя_таблицы>
Чтобы опробовать удаление таблиц с помощью команд SQL, удалим созданные нами таблицы new_pers и new_st.
1.	Смените текущую папку, выполнив в окне Command команду CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку example.
2.	Удалите таблицу new_pers, набрав в окне Command
DROP TABLE new_pers
3.	Убедитесь, что в папке example больше нет файла new_pers.dbf.
4.	Удалите таблицу new_st, набрав в окне Command
DROP TABLE new_st
5.	Убедитесь, что в папке example больше нет файла new_st.dbf.
ГЛАВА 2 ▼ Начальные сведения о базах данных
Рассмотренные нами команды позволяют работать со структурой таблицы и изменять метаданные, а также удалять таблицу. Для обработки записей таблиц существует другая группа команд. Рассмотрим ее.
Добавление записей
Для добавления записей в SQL используется конструкция INSERT INTO.
INSERT INTO <Имя_таблицы> (<Список-полей>) VALUES (<Список_значений>)
Потренируемся вставлять записи в готовые таблицы с помощью команд SQL. Чтобы добавить запись в таблицу persons, выполните следующие действия:
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку example.
2.	Вставьте запись в таблицу persons, набрав в окне Command
INSERT INTO persons (tabnum, name, birthday, address, id) VALUES (70008, 'Гаврилов Иван Савельевич', {^1974/01/02}, "ул. Горького, д.2, кв.5", "01004")
Обратите внимание на формат даты {лгггг/мм/дд), где гггг - четырехзначное значение года, мм - двузначный номер месяца, дд - двузначный номер дня.
3.	Введите в окне Command команду
BROWSE
и убедитесь, что в таблице появилась новая запись.
4.	Закройте таблицу, набрав в окне Command
CLOSE TABLES
Изменение данных в записях
Для изменения данных в записях в SQL используется конструкция UPDATE.
В SQL есть две формы оператора изменения - позиционная и поисковая. Позиционное изменение осуществляется с помощью курсоров, а поисковое использует предложение WHERE с заданием условия, которому должны удовлетворять изменяемые записи. Позиционное изменение рассматривать не будем потому, что при работе через SQL с различными БД оно реализуется по-разному (это зависит от того, какой стандарт на SQL поддерживается в той или иной СУБД).
SCIL-запросы. Грамотное решение
Синтаксис lii/bATb приведен ниже.
UPDATE <Иия таблицыл SET <Иия..поля> = <Новое„значение>
[, <Ииъ_поля> = <Новое_зпачение>...] [WHERE <Условие_отбора>]
Для указания новых значений нолей можно использовать не только конкретные значения, но и значения, вычисленные, например, по другой таблице. Такой оператор обновления может выглядеть, например, как показано ниже.
UPDATE Persons SET Id = (SELECT Id FROM Staff WHERE Sum = 15000.00) ;
WHERE Tabnum = 70008
Удаление записей
Для удаления записей в SQL используется конструкция DELETE FROM.
DELETE FROM <Игы_таблиць:> [WHERE <Условие_отбора>]
Если не указывать никакого условия (предложение WHERE отсутствует), будут удалены все записи таблицы.
Допускается в предложении WHERE использовать операции над значениями полей этой же или другой таблицы. Например, мы решили удалить из списка всех сотрудников, чей табельный номер не превышает средний по предприятию. Это можно сделать следующим образом (если есть желание опробовать приведенную ниже команду на таблицах из нашего примера, выполните это на копии таблицы Persons, сделанной, например, при помощи команды COPY ТО Pers).
DELETE FROM Pers WHERE Tabnum < (SELECT AVG(Tabnum) FROM Pers)
Выборка данных из таблиц
Основой оператор для выборки данных в SQL - SELECT.
В Visual FoxPro 9 существует два варианта использования команды SELECT. В одном случае параметров команды большее количество, но в полном объеме они работают только при выборке данных из базы данных Visual FoxPro. Во втором случае применяется минимальный набор параметров, но все они будут работать практически со всеми системами управления базами данных. Надо помнить, что при обращении приложения к базе данных и приложение должно поддерживать формат запроса, чтобы его сформировать и суметь обработать результат, и СУБД, к которой приложение обращается, должна иметь возможность понять запрос и обработать его.
SELECT [АГ.Ь I DISTINCT] <Список_полей1> FROM <Список__таблиц>
[WHERE <Условле1> [AND I OR <Условие2>] ...]
ГЛАВА 2 V Начальные сведения о базах данных
[GROUP BY <Список_полей2> i, ...]j [HAVING <Условие> [AND i OR [UNION <ЗЕЬЕСТ-выборка>] [ORDER BY <Список_выражений> [ASC I DESC] [INTO <Имя__таблицы>)
>	DISTINCT - показывает, что в результирующую выборку из нескольких одинаковых записей включается только одна;
>	FROM <Список_таблиц> - позволяет задать таблицу или список таблиц, к которым осуществляется запрос;
>	WHERE <Условие1> -- позволяет задать условия для выбора записей. В результирующую выборку будут включены только записи, удовлетворяющие условию. Условие может быть сложным и состоящим из нескольких условий, разделенных логическими операторами AND или OR;
>	GROUP BY <Список_полей2> ^-указывается список полей для группировки по ним. Имеет смысл использовать, если в <Список_полей1> включить функции SUM (суммирование), COUNT (количество записей) и т.п.;
>	HAVING <Условие> - условие, которому должны удовлетворять записи. Имеет смысл при использовании GROUP BY, иначе действие аналогично WHERE;
>	UNION <ЗЕЬЕСТ-выборка>-позволяет объединить результаты нескольких выборок в одну результирующую таблицу;
>	ORDER BY - упорядочивает результат выборки по указанным полям по возрастанию (ASC) или убыванию (DESC);
>	INTO <Имя_таблицы> - позволяет указать таблицу, в которую следует поместить результирующую выборку.
Простейший пример выборки всех полей всех записей таблицы Persons:
SELECT * FROM Persons
Если ввести эту команду в окне Command, в результате ее выполнения появится окно с результирующей выборкой в окне с заголовком Query. Это временная таблица, и на диск она не записывается. Когда вы закроете таблицу Query, она просто исчезнет.
При выборке не всех, а только нужных полей требуется указать их через запятую. Например, требуется выбрать все записи и отобразить поля с фамилиями (Name) и адресами (Address). Для этого можно использовать следующую команду:
SELECT Name, Address FROM Persons
Если требуется выбрать не все записи, а по определенному условию, надо применить параметр WHERE:
SQL-запрось:. Грамотное решение
SELECT Name, Address FROM Persons WHERE Tabnum > 70005
В результате применения этой команды в выборку попадут записи, в которых в поле Tabnum стоят значения больше 70005.
В условиях можно применять операторы сравнения: = (равно), < > (не равно), > (больше), < (меньше), >= (больше или равно), <= (меньше или равно).
При указании условия можно использовать логические выражения и получать, таким образом, сложные условия, состоящие из нескольких простых. Какими ключевыми словами обозначаются логические операторы?
> NOT - логическое «не»;
> AND - логическое «и»;
> OR - логическое «или».
Как пользоваться логическими выражениями? Логическое «не» означает отрицание, то есть если условие, стоящее после NOT, истинно, то в результате логической операции «не» оно станет ложным.
(25 + 5) = 30 - истинно,
NOT ((25+5) =30) - ложно.
И наоборот:
(20 + 5) = 30 - ложно,
NOT ((20 + 5) = 30) - истинно.
Логическое «и» говорит о том, что, для того чтобы условие стало истинным, все условия, между которыми стоит оператор AND, должны быть истинными.
( (25	+	5) =	30)	- истинно,
( (15	+	5) =	30)	- ложно,
( (25	+	5) =	30)	AND ((15 + 5) = 30) - ложно.
( (20	+	5) =	30)	- ложно,
( (15	+	5) =	30)	- ложно,
( (25	4-	5) =	30)	AND ((15 + 5) = 30) - ложно.
( (25	1-	5) =	30)	- истинно,
( (15	+	5) =	20)	- истинно,
( (25	+	5) =	30)	AND ((15 + 5) - 20) - истинно
Логическое «или» говорит о том, что, для того чтобы условие стало истинным, хотя бы одно из условий, между которыми стоит оператор OR, должно быть истинным.
((25+5) =30) - истинно,
((15 + 5) = 30) - ложно,
((25 + 5) = 30) OR ((15 + 5) = 30) - истинно.
ГЛАВА 2 V Начальные сведения о базах данных
((20 + 5) = 30) - ложно, ((15 + 5) = 30) - ложно, ((25 + 5) = 30) OR ((15 + 5) = 30) - ложно. ((25 + 5) = 30) - истинно, ((15 + 5) = 20) - истинно, ((25 + 5) = 30) OR ((15 + 5) = 20) - истинно.
Допустим, что требуется выбрать записи со значениями табельного номера от 70003 до 70005 включительно:
SELECT Name, Address FROM Persons;
WHERE Tabnum >= 70003 AND Tabnum <= 70005
В результате применения этой команды в выборку попадут записи, в которых в поле Tabnum стоят значения больше или равные 70003 и меньше или равные 70005.
Оператор AND имеет приоритет перед OR. Он более «сильный». Например, в выражении
Tabnum = 70002 OR Tabnum <= 70007 AND Tabnum >= 70004
сначала будет выполнен логический оператор AND, а затем результат будет участвовать в операторе OR. Таким образом, будут выбраны записи с табельным номерами 70002, 70004, 70005, 70006 и 70007. Если бы OR выполнился раньше, чем AND, в выборку попали бы записи с табельными номерами 70004, 70005, 70006 и 70007.
Допускается применение в условиях скобок. При помощи скобок при необходимости можно менять приоритеты выполнения логических операций.
Например:
SELECT Name, Address FROM Persons;
WHERE Tabnum >= 70003 AND Tabnum <= 70007 OR Id = 701007?
Эта команда вернет выборку из записей со значениями поля Tabnum с 70003 по 70007 и со значениями в поле Id равными 701007? (рис. 2.25).
Если в условие приведенной выше команды добавить скобки
SELECT Name, Address FROM Persons;
WHERE Tabnum >= 70003 AND (Tabnum <= 70007 OR Id = 701007?)
то условие Id = 701007? будет проверяться только совместно с условием Tabnum >= 70003, а если учесть, что у единственной записи с Id = 701007? в поле Tabnum стоит значение 70001, эта запись в результирующую выборку не попадет (рис. 2-26).
SQL-запросы. Грамотное решение
V Microsoft Visual FoxPro
J □ & W
File Edit View Tools Program Table : Window Help Eta p - И
£3 Persons ...........................
Tabnum:	Name
_	70001: Петров Анатолии И ванович
7и002:Семенов Игорь Степанович 70003; Балашова Зинаида Дмитриевна 70004 = Феоктистова Елена Михайловна 70005-Семенов Павел Игоревич 70006; Семипятный Андреи Львович 70007.Смоленская Лидия Павловна 70008 Гаврилов Иван Савельевич
Birthday =12/30/70 *05/31/50 :07/15/50 *08/22/71 105/22775 Ю2/17/57 И 0/10/80 *01/02/74
Address
Id
ул. Академика Ушакова, 10, кв 112 :01007
ул Петровская.З.кв.10
: ул Резинстроя. 20. кв.77
: ул. Пушкина. 1. кв.1
.ул Петровская. З.кв.10
;ул Лесная 7
:ул. Привокзальная. 10. кв.2
ул. Горького.д2. кв.5
= 01002 \01003 [U1UU5 [□1005 [Q1001 ^01008 [01004

Name
Балашова Зинаида Дмитриевна Феоктистова Елена Михайловна Семенов Павел Игоревич Семипятный Андрей Львович Смоленская Лидия Павловна
Command
SELECT Name, Address FROM
WHERE Tabnum >= 70003 AND
NUM [
Tab
1
Selected 6 records#! O.CO seconds
Рис. 2.25 т Результат использования логической операции and
В параметре WHERE можно использовать результаты выборок из других таблиц. Например, мы хотим получить список сотрудников, получающих больше 15000:
SELECT Persons .Name FROM Persons WHERE ;
Persons.Id IN (SELECT Staff.Id FROM Staff WHERE Staff.Sum > 15000)
Если при этом есть желание, чтобы фамилии располагались в алфавитном порядке, надо использовать команду в таком виде (рис. 2.27):
SELECT Persons.Name FROM Persons WHERE ;
Persons.Id IN (SELECT Staff.Id FROM Staff WHERE Staff.Sum > 15000) ;
ORDER BY Persons.Name
Довольно част о даже опытные программисты упускают из виду возможност ь замены оператором IN группы предикатов, объединенных логическими операторами OR. Например:
SELECT Persons.Name FROM Persons WHERE Tabnum = 70003 ;
OR Tabnum = 70005 OR Tabnum = 70007
ГЛАВА 2 V Начальные сведения о базах данных
Не Edit View Tools Program Table Window Help
В Persons
Name
Т abnum
70001 ;Петров Анатолии Иванович 70002^Семенов Игорь Степанович
70003;Балашова Зинаида Дмитриевна
70004: Феоктистова Елена Михайловна
70005: Семенов Павел Игоревич
700061 Семипятныи Андрей Л ьвович
70007;Смоленская Лидия Павловна
70008) Гаврилов Иван Савельевич
< Birthday	А
: 12/30/70  ул. Академика •05/31/50 107/15/50 108/22/71 :05/22/75 |02/17/57 110/10/80 Д1/02/74
ул. Петровская, 3
• ул Реэинстроя. 2
Пушкина. 1. ке
Петровская. 3
Лесная, 7
уд yn :ЧЛ.
ул ул
Горького, д.2.
]№ олава]
tjPjS
diets_________Id	a )
иаксва.Ю.кБ.112 Ш1007
J.kb.10	101002	' ।
?0,kb.77	:01003	i
b.1	[01005
J.kb',0	;01005	i
pl 001
эя. 10. kb?	101008
.KB.5	101004	:
Феоктистова Елена Михайловна Семенов Павел Игоревич Семипягныи Андрей Львович Смоленская Лидия Павловна
Name
; Command
i SELECT Name, Address FROM Persons;
WHERE T&tonum >= 70003 AND (Tabnum
ad
Query
l> □
70007 OR Id - "01007")
 J>r

Рис. 2.26 т Результат выборки при использовании скобок
Такой запрос можно выполнить и по-другому:
SELECT Persons.Name FROM Persons WHERE Tabnum IN (70003, 70005, 70007)
В списке полей допускается использование агрегатных функций. Например, для подсчета записей используют функцию COUNT (*), для суммирования значений - функцию зим(<имя_поля>). Правда, использование этих функций оправдано прежде всего при использовании группировки результирующей выборки по каким-либо значениям (GROUP BY). Записи объединяются в группы так, что все записи, входящие в одну группу, имеют одинаковые значения поля, по которому происходит группировка. По каждой группе в результирующей таблице будет только одна запись. Для чего это может потребоваться? Например, если нужно подсчитать в списке сотрудников количество сотрудников, занимающих одинаковые должности.
SELECT Persons.Id, COUNT(*) FROM Persons GROUP BY Id
SQL-запросы. Грамотное решение
‘*8/ Mfcro&ft S F»rfr<,ir~rn
Не УЛ J£tew Tools Piogram Table Window Help	(	;
Q / Efe r
□	4 J? J9
ЕЗ Persons
Tabnum	Name:
_ _	70001 • Петров Анатолии Иванович
• _	70002;СеменовИгорьСтепанович
70003. Балашова Зинаида Дмитриевна _ _	70004:Феоктистова Елена Михаиловна
_	70005 Семенов Павел Игоревич
70006.Семипятный Андрей Львович
7U0G7-Смоленская Лидия Павловна  _	70008; Гаврилов Ивэн Савельевич
Birthday И2/30/70
167715/50
168/22/71 ” 105/22/75’’
102/17/57 ” ll 0/10/80’
То i /Ь’2/74
Address
у и. Академика Ушакова, 10, кв 112 уя. Петровская, 3, кв.10
Резинстроя, 20, кв 77
Пушкина, 1, кв 1
Петровская, 3, кв.10
Лесная, 7
Привокзальная. 10, кв. 2
Горького, а 2, кв 5
ф.л. \w-
W-
W,
; Id ;01007 101002...
ГсПОЛ з”’ 161005’’’ loiods...
loibdi”’ ’ 101008 101004"’
Name
Гаврилов Иван Савельевич
Семенов Игорь Степанович Семипятныи Андреи Львович
Corns nvind
SELECT Persons.Name FROM Persons UHEPE ;
Persons.Id IN (SELECT Staff.Id FROM Staff WHERE Staff.S ORDER 3Y Persons.Name
Quety
Record: 1/4
Exclusive
15000):
I
Рис. 2.27 ▼ Операция упорядочивания записей
Результат такой операции представлен на рис. 2.28.
В данном случае операция группировки не дает такого потрясающего визуального эффекта, однако, если она применяется, чтобы подсчитать, например, количество документов разных типов, а общее число документов исчисляется тысячами, операция группировки незаменима.
Наличие параметра HAVING имеет смысл только при использовании его совместно с GROUP BY. В чем же отличие WHERE от GROUP BY? Проверка WHERE выполняется раньше; затем записи, прошедшие проверку, группируются GROUP BY, а затем они подлежат проверке по HAVING. Например:
SELECT Persons.Id, COUNT(*) FROM Persons;
GROUP BY Id HAVING COUNT(*) > i
В отличие от предыдущего запроса, результатом этого запроса будут только записи по группам, в которые входит больше одной записи исходной таблицы.
ГЛАВА 2 ▼ Начальный сведения о базах дачных
File gjdt Vtew Format look Program Window FJelp	I
j d7»h~^1 j Г7 й 7-= ^"7ТK~r~Qfig	'
пр«.Г5111к	-’2	i
Fabnum ;	Name	Biiihday  Addiett ............................ Id	*
>	7U001 Петров Анатолий Иванович	г12/30/70	= ул. Академика Ушакова. 10, кв 112	=01007
70002:Семенов Игорь Степанович	=05731/50	= ул Петровская.З.квЮ	=01002
-<	70003 Балашова Зинаида Дмитриевна	;07/)5/50	=ул Резимстроя. 20. кв.77	;01003
70004 Феоктистова Елена Михаиловна	=08/22/71	= ул. Пушкина. 1. кв.1	:0Ю05	!
70005 Семенов Павел Игоревич	=05/22775	=чл. Петровская. З.кв.10	=01005
___	70006= Семипятный Андрей Львович	=02/17/57	= ул. Лесная. 7	/01001
_	70007.Смоленская Лидия Павловна	И0/10/80	=чл. Привокзальная. 10, кв.2	-01008	'
_	70003 Гаврилов Иван Савельевич	;01/02774	= ул Горького, д 2. кв 5	=011104	,
т...........=............................I.................. '  	; ч/
1< >
Iв »<-=/	>.. с, Q
: I Id : cm ______________________ 'а|
7Г ОЮ01	i =
_ 01002.....1.......11................... I
_ ~ 01003	' ' =... 1=..................
....................................77 УйййтЛЙ-з.......................... "	□
•__01005....	;	.2=............. .....................................
01007 .... =... ii ............ - 	‘'-- J
	................ l SELECT Persons. Id, COUNT(’) FPOtt Persons GF.OUP EY II ___ 01008.....................; 1i.	..... ।
l<	> J	>j
Pefsws(d\a>wcefi\took\ei<amt^\pef3on5d)f)	i Record 1/8	RecwdUr>Iocked :Z	7 |NUM I 7777.'.
Рис. 2.28 ▼ Операция группировки записей
Мы уже упоминали агрегатные функции, которые можно ис но л г.зова) в запросах. Перечислим их:
>	COUNT () - возвращает количество записей в группе. Обычно используют COUNT(*);
>	SUM (<поле>) - возвращает числовую сумму значении указанного поля д чя группы записей;
>	А\70(<поле>) - возвращает среднее значение чисел указашино ноля для группы записей;
>	МАХ (оголел) - возвращает максимальное значение указанного поля д =я группы записей;
>	MIN(<попе>) - возвращает минимальное значение указанною поля для группы записей.
Подсчитаем общую сумму окладов сотрудников из нашей таблицы:
SELECT SUM(Staff.Sum) FROM Staff, Persons;
WHERE Staff.Id = Persons.Id
SQL-запросы. Грамотное решение
Результат представлен на рис. 2.29. В этом примере использованы данные из двух таблиц и, соответственно, имена таблиц перечислены через запятую после ключевого слова FROM.
File E-cRt View Tools Propiram Table Window Help
ГрgeW/ fefelPPPi	Ча'в»;'"
ЕЗ Persons
Tabnum	Name	. Birthday t
Addie»
l<
70001: Петров Анатолий Иванови-
70002:Семенов Игорь Степанович® Query
70003-Балашова Зинаида Дмитру|~“(' Sum_wm "'IIIIJ 703U4:Феоктистова Елена МихаиЬ
70005; Семенов Павел Игоревич
70006;Семипятный Андрей Львов
70007;Смоленская Лидия Павлов 70008;Гаврилов Иван Савельева
ова, 10, KB.112
Jo...........
b.77.........
.10
П St ,1i
I________и
jT 0Ю01 ~T|oioo: ^1°1003 01004 ____ 01005~ 4 01006 101007 ” 01008
~_________Whois
i Директор
; Заместитель директор : Г лэвный бухгалтер ^Начальник отдела ;Ведушии специалист
: Специалист 1 категор (Водитель
। Секретарь-референт
10, kb.2
5.......
01007 01002
01003 101005 '01005
101001 : 01303
101004
25000.00001 20000 00001 20000.00001
18000.0000]
15000.0000] 12000 0000 [
10000.0000 ] 12000.0000]
Command
SELECT SUM(Staff .Sunt) FROM !
WHERE Staff.Id = Persons.Id

1

п
Stat <*1
I
Рис. 2.29 г Использование агрегатных функций
Иногда используется функция проверки существования EXISTS (). Она может помочь в случаях, когда в результате действия подзапроса не требуется возврата значения, а достаточно просто знать, существуют или нет результирующие записи подзапроса. Например, требуется узнать на основе наших таблиц со списками сотрудников и должностей, какие должности, имеющиеся в таблице Staff, не занимает ни один сотрудник.
SELECT Staff.Whois FROM Staff WHERE ;
NOT EXISTS (SELECT * FROM Persons WHERE Staff.Id = Persons.Id)
Полям в результирующей таблице можно присваивать произвольные имена. Для этого в списке полей после имени исходного поля надо поставить AS
ГЛАВА 2 ▼ Начальные сведения о базах данных
<новое_имя>. В случае, если для предыдущего запроса нам хочется назвать поле в результирующей таблице Empty, запрос будет выглядеть так:
SELECT Staff.Whois AS Empty FROM Staff WHERE ;
NOT EXISTS (SELECT * FROM Persons WHERE Staff.Id = Persons.Id)
В приведенном выше запросе хорошо видно использование префиксов. Вы, наверное, уже заметили в примерах, что перед названием поля часто ставится имя таблицы и между7 именем таблицы и именем поля ставится точка. Имя таблицы и есть префикс. Основной смысл использования префиксов в том, чтобы четко определить, какие поля какой таблице принадлежат. В приведенном выше примере в подзапросе в условии WHERE использованы префиксы, иначе было бы не понятно, поле какой таблицы сравнивать с полем какой, поскольку оба поля носят имя Id.
Иногда имена полей слишком длинные, и неудобно их использовать в качестве префиксов. Получается очень длинная строка запроса. В таких случаях используют конструкцию AS <короткое_имя>. Например,
SELECT S.Whois AS Empty FROM Staff AS S WHERE ;
NOT EXISTS (SELECT * FROM Persons AS P WHERE S.Id = P.Id)
Результат такого запроса приведен на рис. 2.30.
Если таблица содержится в базе данных и таких баз открыто несколько, имеет смысл включить в префикс имя базы данных. При этом имя базы данных отделяется от имени таблицы восклицательным знаком.
SELECT alvt.Name FROM MyVFPbaselalvt
До этого момента мы рассматривали команду SELECT без указания, в какую таблицу поместить результирующую выборку. А в Visual FoxPro предусмотрена такая возможность. Можно в качестве хранилища результатов запроса использовать массив, таблицу или курсор (временная таблица, которая по окончании сеанса работы в Visual FoxPro пропадает). Например, требуется поместить результирующую выборку в таблицу MyReslt. Следует поступить следующим образом:
SELECT Persons.Name FROM Persons WHERE ;
Persons.Id IN (SELECT Staff.Id FROM Staff WHERE Staff.Sum > 15000) ;
ORDER BY Persons.Name INTO TABLE MyReslt
В результате выполнения указанной команды выборка поместится в таблицу MyReslt. При этом, если таблица не была создана заранее, она создастся, а если уже существует такая таблица, она будет перезаписана.
SQL-sanpotbs. Грамотное решение
Name
Addipjj
Fite Edit View Tools Program Table Window - Help ГЙ“ёГй
Я PflSO’i.
Tabnum
70001 Петров Анатолий Иванович
_ _	70002 Семемов Игорь Степанович
70003 Балашова Зинаида Дмггтриевна
_ _	70004: Феоктистова Елена Михайловна
t_	70005. Семенов Павел Игоревиа-
_ _	70006; Семипятный Андрей J h
70007. Смоленская Пидия Паг
? _	70008. Г акрилов Иван Савель
Birthday i12/30/70 105/31/50 107/15/50 I08/22/71
ул. Академика Ушакова, 10. кв.112
ул. Петровская. 3, кв.10
ул. Резинстроя. 20, кв. 77
;ул. Пушкина, 1. кв 1
WSi*
Empty toM	1(»<r Tp
И Staff
J______M
JT 01001
01002
_ ’ 01003
T 01004
01005
01006”
01007
" 01008
Whois
;01007
)01002 i01003 j01005 ;01005
i01001 101008 101004
Query
Директор
Замеот иге ль дирек Главный бухгалтер Начальник отдела
Ведущий специалист Специалист 1 категор Водитель
Секретарь-референт
18000.0000; ”l 5000.0000; "12000 00001
10000.0000;
12000.00001
и
Empty FROM Staff AS S ИНЕЕ1[Л)
Command SELECT S.Uhois AS NOT EXISTS (SELECT * FROH Persons AS P WHEPE
Record 1/1
Exclusive
Д

Рис. 2.30 т Операция с использованием префиксов
Если есть желание поместить результирующую выборку во временную таблицу MyCurs, следует поступить следующим образом:
SELECT Persons.Name FROM Persons WHERE ;
Persons.Id IN (SELECT Staff.Id FROM Staff WHERE Staff.Sum > 15000);
ORDER BY Persons.Name INTO CURSOR MyCurs
В этом случае откроется временная таблица MyCurs, и результирующая выборка попадет в эту таблицу.
Довольно удобно для оценки результатов выборки использовать системную переменную Visual FoxPro 9 с именем _TALLY. Если запрос успешно отработан, в эту переменную попадает количество записей в результирующей выборке. Довольно часто после выполнения запроса делают проверку переменной _TALLY, чтобы узнать, вернул ли запрос хоть одну запись или, наоборот, записей, удовлетворяющих условию, нет, и по этой причине не имеет смысла как-либо обрабатывать результирующую выборку.
ГЛАВА 2 V Начальные сведения о базах данных
Расширения возможностей выборки в Visual FoxPro 9
В версии 9 разработчики предусмотрели некоторые расширения SQL-запросов в части отмены существовавших ранее ограничений для SQL команд пли значительно расширили их возможности.
В частности, количество объединений (JOIN) и подзапросов раньше было ограничено девятью. Теперь ограничение снято.
Количество выборок, объединяемых при помощи ключевого слова UNION, также теперь не ограничено (ранее было 9).
Максимальное количество используемых в запросах алиасов и таблиц теперь не ограничено, а ранее не могло превышать 30.
Конструкция IN ранее не могла включать более 24 элементов. В версии 9 снято ограничение на количество элементов в этой конструкции.
Какие еще приятные новинки припасли для разработчиков создатели Visual FoxPro 9?
Поддерживаются подзапросы любой степени вложенноети. Например:
SELECT ... WHERE ... (SELECT ... WHERE ... (SELECT ...) ...) ...
В предыдущей версии - 8 - поддерживался только один уровень подзапросов. Если в этой версии в подзапросе указать подзапрос, Visual FoxPro 8 выдаст ошибку.
Еще одно снятое ограничение - возможность использовать GROUP BY в подзапросах.
Новая хитрость - можно использовать в <Список_полей1> подзапросы. Например:
SELECT Tabnum, (SELECT Sum FROM Staff WHERE Persons.Id = Staff.Id) ; FROM Persons
В версии 9 стало возможным использование в подзапросе агрегатных функций.
Результаты выборки SELECT возможно теперь использовать даже в качестве имени таблицы, из которой происходит другая выборка.
Visual FoxPro 9 обеспечивает ускорение при помощи технологии Rushmore выборки из нескольких таблиц, когда после ключевого слова FROM указываются имена нескольких таблиц.
При использовании UNION в выборке ранее можно было после ключевых слов ORDER BY указывать только номера полей числами. Теперь можно писать имена полей.
SELECT Tabnum, Name FROM Persons WHERE Id = ?01005?;
UNION ;
SQL-запросы. Грамотное решение
SELECT Tabnum, Name FROM Persons WHERE Tabnum > 70014 ;
ORDER BY Tabnum
В команде UPDATE теперь разрешается использовать SELECT для задания новых значений полей. Например:
UPDATE Persons SET Id = (SELECT Id FROM Staff WHERE Sum = 15000);
WHERE Tabnum = 70005
В результате выполнения этой команды в таблице Staff будет найдена запись со значением поля Sum = 15000. Значение поля Id из этой записи занесется в поле Id таблицы Persons, в запись, где значение поля Tabnum = 7 0005.
Количество одновременно обновляемых полей раньше было ограничено 128.
Теперь ограничение не снято, но увеличено до 255.
При изменении структуры таблицы при помощи команды ALTER TABLE стало гораздо больше возможностей по преобразованию типов полей из одного в другой.
При использовании в команде DELETE ключевого слова FROM в версии 9 допускается задавать коррелированное условие. Например:
DELETE Persons FROM Staff WHERE Persons.Jd = Staff.Id AND Sum = 12500
Управление транзакциями
Транзакция - это последовательность операций над БД, рассматриваемых СУБД как единое целое. Удаление записей - это транзакция, добавление записей - это транзакция. Контроль транзакций присущ любой СУБД. В процессе внесения изменений транзакция считается не завершенной, и состояние БД до начала транзакции может быть восстановлено. Подтвердить завершение транзакции можно либо командой, либо автоматически.
При использовании команд SQL для удаления записей в таблицах записи помечаются на удаление, однако физического удаления не происходит. Для таблиц Visual FoxPro для полного удаления записи необходимо использовать команду РАСК. Или, если вы хотите отменить удаление, надо выполнить команду RECALL. Обе эти команды мы уже рассматривали ранее.
Для операций с удаленными таблицами придется использовать другие команды. В случае завершения операции удаления надо выполнить SQLCOMMIT(), а в случае отмены удаления - SQLROLLBACK ().
SQLCOMMIT(<Указатель_на_соединение>)
SQLROLLBACK(<Указатель_на_соединение>)
В обеих командах в качестве параметра задается указатель на соединение. Указатель возвращается при установке соединения при помощи функции SQLCONNECT ().
ГЛАВА 2 ▼ Начальные сведения о базах данных
Эта функция служит для установления связи с удаленными базами данных. Под «удаленными» в данном случае понимают не то, что их уже удалили, а то, что они расположены на других компьютерах или имеют тип, отличный от Visual FoxPro. SQLCONNECT () позволяет после установки связи использовать команды SQL для работы с удаленными таблицами. Например, можно, работая в Visual FoxPro, установить соединение с базой данных, работающей под управлением СУБД Oracle.
Работа с удаленными базами данных
Перед тем как обратиться к удаленной базе данных, требуется установить с ней соединение. Для установки соединения с удаленными базами данных используют функцию SQLCONNECT (). Она возвращает указатель на установленное соединение.
SQLCONNECT([<Имя_соединения> I <Источник_данных>
[, <Имя_пользователя> [, <Паропь> ]][, <Shared>]])
> <Имя_соединения> - имя, использованное при создании соединения при помощи команды CREATE CONNECTION (используется в случае, когда такое соединение предварительно установлено);
> <Источник_данных> - указывается база данных, к которой происходит подключение. Имя источника должно соответствовать имени, указанному в перечне источников данных ODBC;
> <Имя_пользователя> - указывается имя пользователя для подключения к базе данных;
> <Пароль> - указывается пароль для подключения к базе данных;
> <Shared> - указывается тип соединения (в режиме совместного использования или нет). Возможные варианты: True (.Т.) и False (.F.).
Поскольку для дальнейшего обращения к БД, с которой установлено соединение, нам потребуется указатель на соединение, необходимо присвоить значение, возвращаемое функцией SQLCONNECT (), какой-нибудь переменной. Переменная - это поименованная область памяти для хранения какого-либо значения. Для нас сейчас важно, что функцию SQLCONNECT () надо использовать, например, в таком виде:
gn_hndl = SQLCONNECT(?MyBase?)
или
gn_hndl = SQLCONNECT(?MyBase?, ?MyUserName?, ?MyPassword?)
SQL-запросы. Грамотное решение
Для разрыва связи с удаленной БД существует команда SQLDT SCONNECT ().
30ЬО13С(Ж1ЕСТ(<Указатель_на__соединение>)
После соединения с удаленной БД можно использовать для работы с ней команды SQL. Для их выполнения надо воспользоваться командой SQLEXEC ().
SQLEXEC (<Указатель__на_соединение>, <Команда_Зрь> [ , <Курсор>1 )
Команда SQL заключается в кавычки или апострофы, например:
SQLEXEC(gn_hndl, ?SELECT Name, Address FROM Persons?)
Настройка ODBC
В предыдущем разделе мы упомянули средство подключения к источникам данных ODBC. Что это такое?
ODBC (Open Database Connectivity) - стандартное программное средство, входящее в состав операционных систем семейства Windows и позволяющее обращаться к различным источникам данных, включая отдельные файлы с данными и системы управления базами данных, поддерживающие работу с языком SQL. Посредством ODBC ваше приложение, созданное в Visual FoxPro 9, может оперировать данными, хранящимися, например, в СУБД Microsoft SQL Server или в базе данных, работающей под управлением СУБД Oracle. Серьезные разработчики очень часто так и делают. Собственно, ODBC - это набор драйверов. И, конечно, для правильной работы он требует настройки.
Если вы часто обращаетесь к какому-либо стороннему источнику данных, имеет смысл настроить доступ к нему, используя Администратор источников данных ODBC (так средство настройки называется в ОС Windows ХР). Окно Администратора представлено на рис. 2.31.
Все установленные драйверы ODBC перечислены на вкладке Драйверы. Настройки для конкретного пользователя и конкретного источника данных можно определить на вкладке Пользовательский DSN. Как расшифровывается DSN?
DSN (Data Sours Names) - имена источников данных. На вкладке Пользовательский DSN уже есть несколько стандартных источников. В таблице перечислены имена и используемые драйверы. Как добавить новый источник? Для добавления нового источника данных можно щелкнуть мышью по кнопке Добавить.
Откроется первое окно Мастера, представленное на рис. 2.32.
В списке надо выбрать драйвер, соответствующий нужному вам источнику. Допустим, вы хотите подключиться к базе данных Microsoft Access. Значит,
ГЛАВА 2 ▼ Начальные сведения о базах данных

Драйверы | Т рассироека
Пользовательский DSN | Системный DSN?- J? ; Файловый DSN нт- |
Источники данных пользователя:
[Драйвер
Microsoft Access Driver {'.mdb) : Microsoft Access Driver (* mdb)
Microsoft dBase Driver (* dbf)
Microsoft Excel Driver (’ xls)
Имя	]
MyBase
База данных MS Access
Файлы dBASE
Файлы Excel
] Добавить... |
Удалить I
Настройка... |
Источник данных ODBC пользователя сохраняете установке СвяЭисистемником; Он доступен только этому пользователю и может пркленягъся лишь на данном компьютере.
;6kflg	j [[^ СпраВК^
Рис. 2.31 ▼ Окно для настройки ODBC в ОС Windows ХР

Driver do Microsoft Paradox (*.db) Driver para о Microsoft Visual FoxPro Microsoft Access Driver (".mdb] Microsoft Access-Treiber (’.mdb) Microsoft dBase Driver (’.dbf) <1................-..1
Выберите драйвер, для которого задается неточна.
Driver do Microsoft Access (’.mdb) Driver do Microsoft dBase (’ dbf) Driver do Microsoft Excel(’.xl$)
/: If Готово . I . Отмена
Рис. 2.32 т Окно Мастера добавления источника ODBC
следует выбрать Microsoft Access Driver (.mdb). Затем следует щелкнуть ио кнопке Готово.
Появится окно, показанное на рис. 2.33.
SQL-запросы. Грамотное решение
Установка драйвера ODBC для Microsoft Access
Имя источника данных. р^гсеззСБ
^писание.	[’естовая БД
Отмена База данных	............—- 
База данных: '
Выбрать... I / - Создать... I Восстано©1*ть... 1 ...... —" ".""''"'"'"'V	, , ,, ,	J ,..-JJ'J- ',.
'--Системнаябазальных ------- ---- -——
; <• Нет -у <.:
i Г Ваза данных.	V ?
> '	 Ж '  /Т-Т
Рис. 2.33 v Окно описания источника ODBC
В этом окне надо ввести имя источника данных, которое вы можете придумать сами. Лучше придумывать не очень длинное название, потому что именно его вам и придется использовать в командах Visual FoxPro 9 для соединения с источником данных. Поле Описание можно вообще не заполнять, однако лучше вписать какое-нибудь короткое пояснение. Будет удобнее и вам вспоминать, для каких целей вы добавляли новый источник, и, если компьютер со сделанными вами настройками используется другими пользователями, им будет понятно, почему присутствует запись об этом источнике.
Указать конкретную подключаемую базу данных нужно, пользуясь кнопками в группе База данных. Дополнительные условия подключения, такие как имя пользователя и пароль, можно задать в окне, появляющемся при щелчке мышью по кнопке Дополнительно. После задания параметров подключаемой базы данных следует щелкнуть по кнопке ОК. Заданный вами источник появится в списке.
Если требуется удалить источник данных из списка, используется кнопка Удалить.
Для настройки уже существующих источников данных нужно щелкнуть мышью по имени источника и по кнопке Настройка. Откроется окно, представленное на рис. 2.33.
Есть и другая вкладка для настройки и добавления нового источника данных - Системный DSN. Эта вкладка аналогична вкладке Пользовательский DSN. В чем же разница? Установки, сделанные на вкладке Пользовательский DSN, действуют т олько для конкретного пользователя, а установки на вкладке
ГЛАВА 2 V Начальные сведения ® базах данных
Системный DSN будут работать для всех пользователей компьютера и для служб, работающих в операционной системе.
Файловый DSN позволяет установить подключение к конкретному файлу и используется довольно редко.
Вкладка Трассировка служит для облегчения отладки приложений, работающих с ODBC.
На вкладке О программе расположен список основных компонентов ODBC. Указывается наименование компонентов, версия и местоположение файлов, содержащих компоненты.
В настоящий момент существуют и другие универсальные механизмы установки связи приложений с базами данных, однако они менее распространены или имеют более узкую специализацию.
Контроль целостности базы данных
Visual FoxPro 9 предоставляет в ваше распоряжение несколько механизмов для обеспечения контроля целостности данных в таблицах и представлениях, входящих в базу данных. В их число входят триггеры и связь таблиц по первичному ключу.
Связь таблиц по первичному ключу
Для начала стоит заметить, что для связывания таблиц по первичному ключу таблицы должны быть проиндексированы. Болес того, у родительских таблиц должен быть индекс типа Primary (первичный ключ).
Что значит родительских? Одну из таблиц называют родительской, и она должна иметь индекс типа Primary, а другую таблицу, с которой она будет связана, называют дочерней, и ее индекс не обязательно должен содержать уникальные значения. Конечно, индексные выражения обеих таблиц должны быть аналогичными. Например, окно Дизайнера баз данных (Database Designer) при этом может выглядеть так, как э го показано на рис. 2.34.
На этом рисунке в состав базы данных Myvfpbase входят две таблицы - persl и staffl. Таблица persl проиндексирована по полю Id (индекс sids). Таблица staffl проиндексирована по полю Id (индекс ids), и этот индекс является первичным ключом.
Чтобы связать таблицы, надо навести указатель мыши на первичный ключ (слева от названия которого показан значок ключа), нажать левую клавишу мыши и, не отпуская ее, переместить указатель мыши на имя индекса в дочерней таблице. Затем нужно отпустить кнопку' мыши. В результате установится связь, которая графически будет отображаться в виде линии, соединяющей две таблицы (рис. 2.35).
Контроль целостности базы данных

ОаЫмвД
b ао >
%
~7 :- к
 ®
Рис. 2.34 т Окно с выделенным Primary-индексом
Рис. 2.35 т Окно со связанными таблицами
Поскольку у родительской таблицы индекс уникален (первичный ключ), а у дочерней не уникален (есть повторяющиеся значения), установится связь типа «один ко многим».
После установления связи наведите на линию указатель мыши и щелкните правой кнопкой мыши. В появившемся окне выберите команду Edit Referential Integrity. Появится окно, представленное на рис. 2.36. Вызвать появление этого окна можно также с помощью команды Edit Referential Integrity (Редактировать целостность связей) из меню Database (База данных).
ГЛАВА 2 ▼ Начальные сведения о базах данных
I Rules for Updating [ Rules for Deleting j| Rules for Inserting j
Which rule do you want to apply when the key value in the parent table is modified?	|
О Cascade: updates all related records in the child table with the new key value.	|
О Restrict: prohibits the update if there are related records in the child table.	i
©Ignore, allows the update and leaves related records in the child table alone	Г
ParentTable iChildTable lUpdate Delete llnsert ParentTag Child Tag ll*j! I-
Help,,,QK л 7~~] (TZ.Cancel
Рис. 2.36 т Окно Referential Integrity Builder
В этом окне присутствуют три вкладки. Рассмотрим каждую из них.
>- Rules for Updating (Правила обновления) - действия, выполняемые в
•	момент попытки обновления данных, по которым формируется ключевой индекс, в родительской таблице. Возможны три варианта:
-	Cascade (Каскад) - обновляет все связанные записи в дочерних таблицах при изменении поля записи с первичным ключом;
-	Restrict (Ограничить) - запрещает обновление полей, по которым формируется ключевой индекс, в записях родительской таблицы, если есть связанные с ними дочерние таблицы;
-	Ignore (Игнорировать) - позволяет свободно обновлять записи с ключевыми полями. При этом связанные записи в дочерних таблицах остаются в прежнем состоянии.
Если выбрать пункт Restrict (Ограничить), согласиться с запросом на создание хранимой процедуры и попытаться отредактировать ключевые поля родительской таблицы, появится сообщение, подобное представленному на рис. 2.37.
В таблице, в нижней части вкладки, показаны и родительская таблица и дочерняя, и индекс родительской таблицы и индекс дочерней таблицы, и установленные действия для обновления таблиц, вставки новых записей и удаления существующих записей.
Контроль целостности базы данных
Рис. 2.37 т Сообщение о попытке нарушения целостности БД
> Rules for Deleting (Правила удаления) - действия, выполняемые в момент попытки удаления записей, по полям которых формируется ключевой индекс, в родительской таблице. Возможны три варианта (рис. 2.38): - Cascade (Каскад) - удаляет все связанные записи в дочерних таблицах при удалении записи с первичным ключом в родительской таблице;
-	Restrict (Ограничить) - запрещает удаление записей родительской таблицы, по полям которых формируется ключевой индекс, если есть связанные с ними записи дочерних таблиц;
-	Ignore (Игнорировать) - позволяет свободно удалять записи с ключевыми нолями. При этом связанные записи в дочерних таблицах остаются в прежнем состоянии.
Рис. 2.38 г Правила удаления записей с ключевыми данными
ГЛАВА 2 V Начальные сведения о базах дачных
X Rules for Inserting (Правила вставки) - действия, выполняемые в момент попытки вставки новых записей в дочернюю таблицу. Возможны два варианта (рис. 2.39):
-	Restrict (Ограничить) - запрещает вставку новых значений полей, по которым формируется индекс, в записях дочерней таблицы, если таких. значений нет в связанной с ней родительской таблице;
-	Ignore (Игнорировать) - позволяет свободную вставку новых значений полей, по которым формируется индекс, в записях дочерней таблицы.
I Rules fee updating i| Rulesfor Deleting ipRuienu Inserting 
t Which m:? do you want to apply when a new rer-ord is inserted or an existing record is
I updated in tt P child taele'1
pf chib 13 the insert if a matching key value Goes not exist tn the paient table. * C*>loncre allows the insert
Рис. 2.39 ▼ Правила вставки данных в дочернюю таблицу
После выбора правил обновления, удаления и вставки данных в связанные таблицы, при щелчке по кнопке ОК создаются хранимые процедуры, которые срабатывают в момент соответствующих действий с таблицами (обновления, удаления или вставки данных). Просмотреть текст хранимых процедур можно, выбрав в меню Database (База данных) команду Edit Stored Procedures (Редактировать хранимые* процедуры). Вызываются хранимые процедуры при срабатывании триггеров.
Триггеры
Еще один механизм защиты целостности базы данных, непосредственно связанный с хранимыми процедурами, - триггеры. Триггер - это способ запуска на выполнение хранимой процедуры при возникновении определенного события в базе данных. Просмотреть и откорректировать триггеры, а также создать новые триггеры можно, используя Дизайнер таблиц (Table Designer). Для этого
Контроль целасттасти базы данных
предназначена вкладка Table (Таблица). Она представлена на рис. 2.40. Увидеть окно Дизайнера таблиц (Table Designer) вновь после процесса создания таблицы можно, выполнив следующие действия:
1.	Открыть таблицу.
2.	Выполнить команды Window > Data Session (Окно > Сессия работы с данными) или щелкнуть по кнопке на стандартной панели инструментов.
3.	В появившемся окне Data Session (Сессия работы с данными) щелкните мышью по кнопке Properties (Свойства).
4.	В открывшемся окне Work Area Properties (Свойства рабочей области) щелкните по кнопке Modify (Изменить).
Либо, если вы находитесь в окне Дизайнера базы данных (Database Designer), можно щелкнуть по кнопке
Триггеры настраиваются в группе Triggers (Триггеры). В этой группе представлены три поля: для ввода имени процедуры, запускаемой при вставке записи (Insert trigger), для ввода имени процедуры, запускаемой при обновлении записи (Update trigger), и для ввода имени процедуры, запускаемой при удалении записи (Delete trigger).
Рис. 2.40тВкладкаТаЫе
ГЛАВА 2 ▼ Начальные сведения © базах данных
Итоги главы
Таким образом, мы рассмотрели возможности Visual FoxPro 9 для создания базы данных с функциями обеспечения полноценного контроля целостности БД.
Мы убедились, что Visual FoxPro 9 обладает всеми возможностями современных баз данных и для определенного круга задач предпочтительно использовать именно базу данных под управлением СУБД Visual FoxPro 9.
Интерфейс Visual FoxPro 9 позволяет полноценно работать с базой данных и при помощи пунктов меню, и при помощи команд, вводимых в командном окне, и при помощи специальных Мастеров, помогающих неопытным пользователям.
Введение в программирование
В этой главе даются основные принципы процедурного программирования в среде Visual FoxPro. Если вы программист со стажем работы в версии FoxPro для DOS, практически весь материал этой главы будет вам знаком. Если вы новичок в мире программирования или вам не доводилось писать программы с использованием языка Visual FoxPro, то материал этой главы именно для вас. Описание многих команд для работы с базой данных, используемых в программах, было дано в предыдущей главе. Если вы по каким-то причинам пропустили материал предыдущей главы, есть смысл вернуться к ней. Кроме того, база данных, созданная нами в процессе практических упражнений в предыдущей главе, будет использоваться для практических заданий в этой главе.
Вы готовы окунуться в мутные воды программирования? Готовы к растерянности от непонимания, почему все команды в отдельности работают как надо, а в программе их работа приводит к ошибкам? Готовы ощутить себя творцом собственного мира, где действуют придуманные вами правила, а пользователи следуют им? И к претензиям пользователей по этому и многим другим поводам? Тогда начинаем...
Создаем первую программу
Как вы, конечно, понимаете, компьютер без программ - это просто набор довольно дорогих железок. Чтобы эти «железки» могли произвести какую-нибудь
ГЛАВА 3 V Введение в программирование
работу, им нужно внятно сообщить последовательность действий. Этим и занимаются программы.
Программа в Visual FoxPro, как и во многих других языках программирования, состоит из инструкций, записываемых при помощи команд, функций и операторов языка. Основное назначение встроенного языка разработки приложений Visual FoxPro - манипулирование данными. Как говорят иногда, под эту задачу язык и «заточен».
Некоторыми командами и функциями языка Visual FoxPro 9 мы уже пользовались при рассмотрении работы с базой данных в предыдущей главе. Мы вводили эти команды и функции в окне Command. В этом случае команды выполнялись в тот момент, когда мы нажимали клавишу Enter. При написании программы сначала вводится текст программы (или ее части, законченной логически), а затем программа запускается на выполнение. Результат работы программы проявляется только после запуска ее на выполнение. Где же, собственно, вводить текст программы?
Создание новой программы
Для создания новой программы выберите в меню File (Файл) команду New (Новый) или щелкните мышью по кнопке Q, расположенной на панели инструментов Стандартная. Откроется диалоговое окно, представленное на рис. 3.1. Выберите пункт Program (Программа), а затем щелкните мышью по кнопке New file (Новый файл). Откроется пустое окно, предназначенное для ввода текста программы.
Сохранение программы в файле
Сразу отметим, как сохранять программу в файле. Файлы с программами в принципе являются обычными текстовыми файлами с расширением .PRG. Для сохранения файла нужно выбрать в меню File (Файл) команду Save (Сохранить) или щелкнуть по кнопке Q на панели инструментов Стандартная. В результате откроется стандартное окно сохранения документа, где тип файла уже будет указан, а от вас потребуется указать имя файла и место, где он должен храниться. В окне сохранения файла с программой присутствует кнопка Code Page (Кодовая страница). Для чего она? Эта кнопка вызывает список установленных ко-
Рис. 3.1 ▼ Вид окна	дировок и позволяет выбрать, в какой кодировке сохра-
New	пять текст программы. Главным образом выбор кодировки
File type -‘ О Project 1 '
I Q database | О Table . О Query
О Form
I Ofiepoit < : О Label
: Q; Program!
; О Class
. О Text file
1 О Menu
Hew Ые
Н’1
Wizard
| Cancel ]

Создаем первую программу
влияет на текст на национальном языке, встречающийся в вашей программе. Если вы пишете программу для запуска в операционной системе Windows и в вашей программе есть текст на русском языке, можно выбрать кодовую страницу 1251 - Russian Windows, хотя ио умолчанию именно она и установится. Чем грозит ошибка при выборе кодировки? Тем, например, что при запуске программы пользователь вместо осмысленных сообщений на русском языке будет видеть непонятный набор символов, как их некоторые называют, «кря-козябрики». Подробнее о кодировках мы еще поговорим в одном из следующих подразделов. Когда имя программы задано, папка для хранения программы выбрана, щелкаем мышью по кнопке Save (Сохранить). После этого действия в указанной вами папке должен появиться файл с указанным вами именем и расширением .PRG. Если файл уже сохранен и вы выбираете в меню File (Файл) команду Save (Сохранить), то диалоговое окно появляться уже не будет, а файл будет перезаписываться с тем же именем.
Чтобы сохранить открытый файл с другим именем, следует воспользоваться командой Save As (Сохранить как). При этом откроется стандартное окно, описанное выше.
Открытие сохраненного файла программы
Для открытия сохраненного ранее файла программы следует выбрать в меню File (Файл) команду Open (Открыть) или щелкнуть по кнопке на панели инструментов Стандартная. При этом откроется стандартное диалоговое окно открытия файла (рис. 3.2). В нем, в раскрывающемся списке Тип файлов (File types) следует выбрать значение Program, а затем папку, в которой находится файл с вашей программой, и сделать одинарный щелчок по имени файла с программой и щелчок по кнопке ОК или двойной щелчок по имени файла с программой.
Ввод текста программы
Вернемся к разговору о самом тексте программы. Вводить текст программы в Visual FoxPro достаточно просто и удобно. Немало в этом помогает средство интеллектуальной подсказки IntelliSense, которое делает написание кода более легким благодаря возможности автоматического завершения написания оператора, свойства или функции. Вы начинаете писать команду пли параметр, a Visual FoxPro предлагает возможные их варианты. Мы уже рассматривали это средство в разделе «Как пользоваться средой разработки Visual FoxPro 9» (глава 1). Клавиши для ввода текста и его редактирования стандартные для Windows, средства работы с буфером обмена поддерживаются в полном объеме (команды Cut (Вырезать), Сору (Копировать) и Paste (Вставить) из меню Edit - Правка).
ГЛАВА 3 ▼ Введение в программирование
Рис. 3.2 ▼ Вид окна Open
Существуют определенные «джентльменские» соглашения при написании исходных текстов программ. В первую очередь это касается отступов от левого края окна с программой до команды или оператора. Отступы обычно располагают так, чтобы была интуитивно понятна иерархическая структура программы, то есть понятно, какие команды находятся внутри цикла, какие команды составляют тело процедуры или функции и тому подобное. В исходных текстах, написанных таким образом, четко прослеживается структура программы. Это позволяет быстро ориентироваться в тексте программы. Например:
Цикл
Команда_внутри_цикла1
Проверка_условия
Команда_при_выполнении_условия
Конец_проверки_условия
Команда_внутри_цикла2
Конец_цикла
Каждую новую команду или оператор принято начинать с новой строки. Если все параметры команды не умещаются в строке или выражение, которое вы записываете, слишком длинное, можно поставить символ ; и продолжить
Создаем первую программу
запись на новой строке. При этом текст, введенный вами на новой строке после строки, оканчивающейся на ;, будет считаться продолжением предыдущей строки. Например:
BROWSE FIELD Name, Address TITLE "Имена и адреса сотрудников"
то же самое, что
BROWSE FIELD Name, Address ;
TITLE "Имена и адреса сотрудников"
Как вы, наверное, заметили, вторая строка в нашем примере сдвинута вправо. Отступ сделан специально, чтобы подчеркнуть, что TITLE не является новой командой, а служит продолжением предыдущей строки, то есть параметром команды BROWSE.
С чего начать программу? В простейшем случае никаких специальных заголовков программ в Visual FoxPro не требуется. В начале программы принято объявлять глобальные переменные. О том, что такое вообще переменные и каких типов они бывают, мы поговорим чуть позже, а сейчас попробуем составить простейшую программу с использованием уже известных нам команд.
Стоит отметить, что комментарии в Visual FoxPro по умолчанию отделяются либо знаком *, если комментарий размещен в отдельной строке, либо знаком &&, если комментарий находится в конце строки с командой или оператором. Комментарий никак не влияет на работу программы и служит только для того, чтобы было удобнее ориентироваться в тексте программы. На практике довольно часто используют комментарии для отладки программ. Когда какая-либо команда «под подозрением», то есть можно предположить, что программа неправильно работает именно из-за этой команды, то, если позволяет логика программы, перед командой ставят знак комментария. Таким образом, закомментированная команда исключается из программы.
Допустим, требуется, чтобы при запуске программы отображалось окно для просмотра списка имен сотрудников и их табельных номеров. Редактировать данные запрещено. По окончании просмотра надо вывести сообщение «Просмотр завершен!». Текст программы для решения такой задачи может выглядеть так:
BROWSE FIELD Name, Tabnum ; && Выбираем два поля
TITLE "Имена и табельные номера сотрудников";
NOEDIT && Запрещаем редактирование
* А теперь выведем сообщение
MESSAGEBOX("Просмотр завершен!")
ГЛАВА 3 ▼ Введение в программирование
Обратите внимание, что в тексте нашей программы присутствуют три комментария - два с использованием символов && и один, в отдельной строке, с использованием символа *.
Запуск программы на выполнение
Текст мы ввели, сохранили программу в файл. Настала пора запустить программу на выполнение. Это можно сделать, либо выбрав команду Do <Имя_ программы> (Выполнить) из меню Program (Программа), либо нажав комбинацию клавиш Ctrl+E, либо щелкнув по кнопке J на панели инструментов Стандартная. Указанным способом запускается программа, находящаяся в открытом окне.
Если есть желание запустить программу, хранящуюся в какой-либо папке на диске, надо выполнить команду Do (Выполнить) из меню Program (Программа), либо нажать комбинацию клавиш Ctrl+D. При этом открывается окно, представленное на рис. 3.3. В этом окне следует выбрать папку, где находится файл с программой, которую требуется выполнить, далее щелкнуть мышью по имени этого файла, а затем по кнопке Do (Выполнить).
Рис. 3.3 ▼ Вид окна Do
Переменные и массивы
Переменные и массивы
В программах весьма часто возникают ситуации, когда нужно сохранить заранее не известный результат работы функции или каких-либо вычислений. Этот результат надо не просто немедленно вывести на экран, а хранить в памяти в процессе работы программы для дальнейшей обработки. Для этих целей в любом языке программирования есть специальный механизм, предназначенный для работы с переменными. Понятие переменных есть и в математике (а точнее, появилось оно там задолго до возникновения программирования) и используется в том же значении, что и в программировании. Попробуем дать простое определение, привязанное к вычислительной технике. Переменная - это поименованная определенным образом область памяти компьютера, предназначенная для хранения определенного класса значений в процессе работы программы.
Типы переменных
Переменные в Visual FoxPro имеют определенный тип. От типа переменной зависит, какие значения она может принимать. Если вы определили, что переменная будет числовой, ей нельзя присваивать, например, символьные значения. Перечень типов переменных, используемых в Visual FoxPro, представлен в табл. 3.1.
Таблица 3.1 т Перечень типов переменных, используемых в Visual FoxPro
Тип переменной	Размер памяти	Описание	Диапазон значений
Blob	Ограничено доступной памятью	Двоичные данные	
Character	1 байт на символ,	Любой текст	Любые символы
	до 254 символов		
Currency	8 байт	Валюта	от -9223372036854775807
Date	8 байт	Дата, содержащая день,	до 9223372036854775807 ot01.01.0001 до31.12.9999
		месяц и год	
DateTime	8 байт	Дата и время. Содержит	ot01.01.0001 до31.12.9999
Logical	1 байт	день, месяц, год, часы, минуты и секунды Логическое значение	и от 00:00:00 а.т. до 11:59:59р.т. True (.Т.) или False (.F.)
Numeric	8 байт	Целочисленные или	-9999999999Е+19 до
Varbinary	1 байт на шестнадцато-	дробные значения Двоичные данные	9999999999Е+20 Любые шестнадцатеричные
Variant	ричный символ, до 255 символов	Произвольный тип. Может содержать данные любого из перечисленных типов	символы
ГЛАВА 3 ▼ Введение в программирование
Специального объявления типа переменной, как это делается во многих языках высокого уровня, не требуется. Тип переменной, как правило, определяется при первом присваивании ей какого-либо значения. Например:
lc_MyString = "Это текст!" && Объявление символьной переменной ln_RecN = 1137	&& Объявление переменной типа Numeric
gl_FlagMode3 = .Т.	&& Объявление логической переменной
Вы, наверное, заметили некоторую хитрость в именах переменных. В принципе, Visual FoxPro не накладывает ограничений на имена переменных. Можете выдумывать любые сочетания символов. Однако рекомендуется в именах переменных указывать предполагаемый их тип и область видимости переменной. Причем такого мнения придерживаются и компания Microsoft, и многие ведущие разработчики, использующие Visual FoxPro. И действительно, какой смысл держать в голове тип присвоенного где-то ранее в программе значения переменной, когда достаточно просто взглянуть на ее имя? Или вашу программу сопровождает или дорабатывает другой программист. Представляете, сколько раз он вспомнит вас «добрым» словом, если запутается в логике программы из-за переменных? Как показывает практика, даже в своей программе после того, как вы не притрагивались к ней пару месяцев, разобраться бывает сложно.
Область видимости переменных
Мы отметили удобство указания в именах переменных их типа и области видимости. Что такое тип переменной, мы определили, а что представляет собой область видимости? В Visual FoxPro существует три области видимости, характеризуемые ключевыми словами LOCAL, PRIVATE и PUBLIC.
> LOCAL - переменные можно использовать и изменять их значения только внутри той процедуры или функции, в которой они объявлены. Когда процедура или функция завершает работу, переменные удаляются из памяти;
> PRIVATE - скрывает переменные, заданные в программе более высокого уровня, вызывающей текущую программу. Это значит, что если вы объявили в программе переменную pn_RecN = 5 и вызвали процедуру, внутри которой объявлена переменная, также имеющая имя pn_RecN и обладающая областью действия PRIVATE, то внутри процедуры вы можете присваивать ей какие угодно значения, производить над ней какие угодно операции, но переменная вызывающей программы pn_RecN при этом сохранит свое значение и будет по-прежнему pn_RecN = 5;
> PUBLIC - позволяет объявить глобальные переменные. Значения этих переменных видны из всех процедур и функций.
Переменные и массивы
Каким же образом можно, пользуясь указанными ключевыми словами, задать переменным область их видимости? Просто укажите соответствующее ключевое слово, а затем через запятую перечислите переменные. Например:
PUBLIC gn_RecN
Инициализацию переменных размещают в начале программы, процедуры или функции.
Рекомендации по наименованию переменных
Теперь, когда мы знаем, какие бывают типы переменных и области видимости, определимся с рекомендациями по именованию переменных. Конечно, имя можно придумать любое, но гораздо удобнее, если, глядя на имя переменной, можно было бы понять ее назначение и характеристики.
Microsoft рекомендует следующие правила именования переменных:
[ОбластьВидимости]ТипИмяПеременной ,
>• ОбластьВидимости - представляется одним из четырех символов:
1 - LOCAL;
t - параметр;
р - PRIVATE;
g - PUBLIC;
> Тип - тип переменной, представленный одним из следующих символов: с - Character;
n - Number;
1 - Logical;
d - Date;
t - DateUme;
у - Currency;
a - массив;
о - Object;
u - Unknown (используется в случае, когда параметр может принимать значения нескольких типов);
> ИмяПеременной - произвольный набор символов на ваше усмотрение, по желательно, чтобы по имени можно было понять назначение переменной.
Михаил Корнеев, известный специалист по Visual FoxPro, рекомендует в дополнение к указанному выше формату имени отделять первые два символа от имени переменной подчеркиванием ([ОбластьВидимости]Тип_ИмяПере-менной).
ГЛАВА 3 V Введение в программирование
Например:
gcCommandLine - глобальная строковая переменная;
InIndex - локальная переменная числового типа;
ld._dv - локальная переменная, хранящая дату.
Иногда, если есть вероятность совпадения имен полей с именами переменных, по рекомендации Microsoft перед именами переменных ставят префикс m с точкой. Например, m.lnlndex.
Стоит отметить, что язык программирования Visual FoxPro регистронезави сим (иногда используют термин ие сазе-чувствител.т). Это означает, что если вы использовали переменную с именем InJMyNum, а ниже в программе написали ее имя как ln_mynum, то Visual FoxPro воспринимает ее как ту же самую переменную. Это же относится и к командам, и к функциям. Можно писать их имена и большими буквами, и маленькими, и вперемешку.
Массивы
Довольно часто возникают ситуации, когда требуется хранить много однотипных данных одного назначения. Например, вы собираетесь обработать файлы, находящиеся в какой-либо папке. Для этого нужно хранить список имен файлов. Значения каждого элемента в этом списке заранее не известны. Можно, конечно, использовать множество переменных с именами типа gc_Fnamel, gc_Fname2 и так далее. Однако автоматизировать процесс перебора всех этих переменных неудобно. Неудобно и на этапе присвоения им начальных значений, и на этапе обработки. Гораздо проще воспользоваться механизмом, называемым массивами.
Массив представляет собой набор переменных одного типа с одним именем. Обращение к конкретному элементу массива происходит при помощи индексов. Индекс первого элемента равен 1. Возможность использовать массивы есть в любом языке программирования высокого уровня. В Visual FoxPro инициализация массива происходит при выполнении команды:
DIMENSION <Имя_массива1>(<Количество_строк> [, <Количество_столбцов>]) [AS <Тип>]
[, <Имя_массива2> (<Количество_строк> [, <Количествс_столбцов>])] ...
Имена массивов желательно задавать с учетом приведенных выше правил для переменных. Примеры инициализации массивов:
DIMENSION la_FileNames(50) && Массив из 50 строк
DIMENSION ga_Types(50, 2) && Массив из 50 строк и 2 столбцов
Использование процедур и функций
Чтобы обратиться к элементу массива ga_Types, находящемуся во втором столбце третьей строки, следует написать ga_Types (3 , 2). Например:
DIMENSION ga_Types(50, 2)
ga_Types(l, 1) = "prg"
ga_Types(l, 2) = "programs"
ga_Types(2, 1) = "dbf"
ga_Types(2, 2) = "tables"
MessageBox(ga_Types(2, 1)+ " - " + ga_Types(2, 2))
При выполнении этой программы в окно сообщений будет выведена строка dbf - tables, составленная из двух элементов массива - ga_Types (2 , 1) и ga_Types(2 , 2).
Инициализацию массивов, как и переменных, принято размещать в начале программы, процедуры или функции.
При желании можно вместо круглых скобок использовать квадратные.
DIMENSION la_F'ileNames (50)
то же самое, что
DIMENSION la_FileNames[50]
Использование процедур и функций
Допустим, что по ходу выполнения вашей программы требуется несколько раз выполнить совершенно одинаковые действия, например вывести в файл сообщение:
********************************
*** Обработка прошла успешно ***
********************************
Чтобы не засорять текст программы лишним кодом и не удлинять его, можно оформить команды по выводу сообщения в виде процедуры и в нужных местах программы просто вызывать процедуру на выполнение. Что при этом происходит? Программа в процессе выполнения доходит до места, где вызывается ваша процедура, и передает управление ей, то есть начинают выполняться команды, входящие в процедуру. Когда все команды процедуры выполнены, управление передается на команду программы, следующую за вызовом процедуры, и выполнение основной программы продолжается. Как оформить процедуру?
ГЛАВА 3 V Введение в программирование
Процедуры
Оформление процедуры в Visual FoxPro происходит следующим образом:
PROCEDURE <Имя_процедуры>
[ LPARAMETERS <Параметр1>[ , <Параметр2>] ]
Команды_процедуры
[ RETURN [<Возвращаемое_значение>] ]
[ENDPROC]
Имя процедуры можно придумывать любое, но не более 254 символа длиной. Состоять оно может только из букв, цифр и символов подчеркивания. Первым символом в названии процедуры должна быть буква или символ подчеркивания. Главное - не повторяться и не использовать в качестве имени процедуры ключевые слова Visual FoxPro.
Для чего нужно ключевое слово LPARAMETERS? Допустим, что кроме вывода указанного выше сообщения вам требуется указывать номер этапа, который прошел успешно. Например:
*** Обработка прошла успешно ***
*****************************'***
Чтобы не писать отдельную процедуру для каждого этапа, оформим одну универсальную процедуру, а номер этапа будем передавать процедуре. Чтобы осуществлять такую передачу данных от вызывающей программы вызываемой процедуре, и существует механизм передачи параметров. После ключевого слова LPARAMETERS через запятую перечисляются переменные, в которые занесутся переданные параметры. Команды процедуры записываются по тем же правилам, что и команды в теле основной программы. Рекомендуется пользоваться отступами, так же как и в тексте основной программы.
После ключевого слова RETURN указывается результат работы процедуры, который передается вызывающей программе. Можно ничего не передавать, а указать просто RETURN. А можно и ключевого слова RETURN не указывать, если не требуется возвращать никакого значения.
Чтобы обозначить, где кончается текст процедуры, используется ключевое слово ENDPROC. Его присутствие обозначает, что все команды, следующие за ним, уже не относятся к процедуре.
Есть и другой способ оформления процедуры (отличается только способом передачи параметров):
PROCEDURE <Имя_процедуры>([<Параметр1>[ AS <Тип>]
[ , <Параметр2>[ AS <Тип>]] ,... ]) [AS <Тип_возвращаемого„значения>]
Использование процедур и функций
Команды_процедуры
[ RETURN [<Возвращаемое_значение>] ]
[ENDPROC]
Чтобы вызвать процедуру на выполнение из программы, нужно воспользоваться командой:
DO <Имя_программы1> I <Имя_процедуры> [IN <Имя_программы2>]
[WITH <Список_параметров>]
>• <Имя_программы1> | <Имя_процедуры> - имя вызываемой процедуры или имя запускаемой программы;
> IN <Имя_программы2> - указывает имя программы, где находится процедура, которую нужно выполнить, если она располагается не в текущей программе;
> WITH <Список_параметров> - указывает через запятую параметры, которые нужно передать вызываемой процедуре или программе.
Командой Do можно вызывать из программы на выполнение не только процедуры, но и любые исполнимые файлы Visual FoxPro. Если не задать расширение файла программы, то поиск будет осуществляться в следующем порядке:
>	файлы с заданным именем и расширением .ехе;
>	файлы с заданным именем и расширением .арр;
>	файлы с заданным именем и расширением .fxp;
>	файлы с заданным именем и расширением .prg.
Например, запустить из программы другую программу Primer.prg, расположенную в папке D:\MyFolder\, можно, используя команду
DO D:\MyFolder\Primer.prg
Рассмотрим пример программы с процедурой в своем составе. Для этого выполните следующие действия:
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
2.	Откроется окно, в котором нужно найти созданную нами ранее папку example.
3.	Выберите из меню File (Файл) команду New (Новый) или щелкните мышью по кнопке П на панели инструментов Стандартная. Откроется окно, представленное на рис. 3.1. Выберите пункт Program (Программа), а затем щелкните мышью по кнопке New file (Новый файл). Откроется пустое окно, предназначенное для ввода текста программы.
ГЛАВА 3 Т Введение в программирование
4. Ведите следующий ниже текст программы:
PRIVATE pn_Num	a &	Объявляем переменную
USE Persons	&&	Открываем таблицу
pn_Num = RECCOO	&&	Определяем кол-во записей
DO CntMess WITH pn_Num, “Persons"	&&	Вызываем процедуру
USE Staff	& &	Открываем таблицу
pn_Num = RECCOO	&&	Определяем кол-во записей
DO CntMess WITH pn_Num, "Staff"	&&	Вызываем процедуру
* Наша процедура
PROCEDURE CntMess
LPARAMETERS ln_N, ln_BaseName
&& Получаем параметры
? "В таблице"
? ln_BaseName
? ln_N
? "записей"
9 ’•kk'ick-k-kic'k-k-kic-k-k-iric'k-k-k'ic-k-k-k-kic'ki
ENDPROC
5.	Сохраните программу в файле, для чего выберите из меню File (Файл) команду Save (Сохранить) или щелкните по кнопке Q на панели инструментов Стандартная. В результате откроется стандартное окно сохранения документа, где тип файла уже будет указан, а от вас потребуется указать имя файла. Назовем наш файл с программой MyPrg. Щелкните мышью в поле Save Document (Сохранить документ) и введите MyPrg. После этого щелкните мышью по кнопке Сохранить (Save).
6.	Выберите команду Do MyPrg (Выполнить) из меню Program (Программа) , либо щелкните по кнопке J на панели инструментов Стандартная. Программа запустится на выполнение и успешно выполнится.
7.	Результаты выполнения должны появиться в рабочем поле окна Visual FoxPro. Они должны выглядеть, как показано ниже.
В таблице Persons
7 записей
В таблице Staff
5 записей
Использование процедур и функций
Возможно, окно с программой будет закрывать результаты. Если вы их не видите, попробуйте сдвинуть мышью окно с текстом программы за его заголовок.
Функции
Функции очень похожи на процедуры. Основное отличие состоит в том, что функции изначально ориентированы на обязательный возврат какого-либо значения. Функция может не иметь параметров, но вернуть значение она обязана. Если вы сами не обозначите возвращаемое значение, Visual FoxPro автоматически подставит логическое значение True (.Т.).
Фор.мат записи функций аналогичен формату записи процедур:
FUNCTION <Имя_процедуры>
[ LPA.RAMETERS <Параметр1>[ , <Параметр2>] ,... ]
Команды_процедуры
[ RETURN [<Возврашаемое_значение>] ]
[ENDFUNC]
и, так же как процедура, функция имеет второй вариант оформления передающихся параметров:
FUNCTION <Имя_процедуры>([<Параметр1>[ AS <Тип>]
[ , <Параметр2>[ AS <Тип>1] ,... ]) [AS <Тип_возвращаемогэ_значения>]
Команды.._процедуры
[ RETURN [<Возвращаемое„значение>] ]
[ENDFUNC]
Вызов функции можно осуществить, как и вызов процедуры, используя команду Do. Однако мало кто пользуется этим вариантом вызова. Обычно функции вызывают, просто указав после оператора присваивания (=) имя функции и в круглых скобках параметры вызова функции через запятую. Если параметров нет, ставят просто пустые круглые скобки. Ниже приведены два совершенно аналогичных вызова функции.
DO MyFunc WITH "test", 11 && Используют редко
или
lc_RetCode = MyFunc("test", 11) && Так делают чаще
Если важно действие функции, а возвращаемое значение обрабатывать не нужно, можно записать вызов функции так:
= MyFunc("test", 11)
Несколько забегая вперед, отметим, что функции можно использовать в достаточно сложных математических операциях и в операциях над строками.
ГЛАВА 3 V Введение в программирование
Например:
InJCst = ln_Isx - DebetOper(ln_Sum)
В этом примере ln_Ost, ln_Isx и ln_Sum - переменные, a DebetOper - имя функции.
Рассмотрим пример программы с функцией в своем составе. Для этого выполните следующие действия:
1.	Смените текущую папку, выполнив в окне Command команду
СП ?
2.	Откроется окно, в котором нужно найти созданную нами ранее папку example.
3.	Выберите из меню File (Файл) команду New (Новый) или щелкните мышью по кнопке Q на панели инструментов Стандартная. Откроется окно, представленное на рис. 3.1. Выберите пункт Program (Программа), а затем щелкните мышью по кнопке New file (Новый файл). Откроется пустое окно, предназначенное для ввода текста программы.
4.	Ведите следующий ниже текст программы:
PRIVATE piiJ'Jum
&& Объявляем переменную
pn_Num = MyMess("Функция работает") && Вызываем функцию ? "Функция закончила работу"
? pn_Num && Выводим значение, которое вернула функция
* Наша функция
FUNCTION MyMess(lc_Mes)
? "Рады Вам сообщить, что"
? lc_Mes
? "*************************"
RETURN "успешно"
ENDFUNC
э. Сохраните программу в файле, для чего выберите из меню File (Файл) команду Save (Сохранить) или щелкните по кнопке Q на панели инструментов Стандартная. В результате откроется стандартное окно сохранения документа, где тип файла уже будет указан, а от вас потребуется указать имя файла. Назовем наш файл с программой MyPrgl. Щелкните мышью в поле Save Document (Сохранить документ) и введите MyPrgl. После этого щелкните мышью по кнопке Сохранить (Save).
Арифметические действия
6. Выберите команду Do MyPrgl (Выполнить) из меню Program (Программа), либо щелкните по кнопке I на панели инструментов Стандартная. Программа запустится на выполнение и успешно выполнится.
7. Результаты выполнения должны появиться в рабочем поле окна Visual FoxPro. Они должны выглядеть, как показано на рис. 3.4.
Рис. 3.4 т Вид окна Visual FoxPro после выполнения программы
Арифметические действия
Операторы
Конечно, в Visual FoxPro, как и во всех языках программирования высокого уровня, есть операторы для совершения арифметических действий над числами. В этих операторах можно использовать и сами числа, и переменные, содержащие числа. Результат вычисления выражения можно записать в переменную числового типа.
Рассмотрим операторы, которые можно использовать в математических выражениях (табл. 3.2).
ГЛАВА 3 ▼ Введение в программирование
Таблица 3.2 ▼ Математические операторы, используемые в Visual FoxPro
Оператор	Назначение	Пример
+	Сложение	ln_Res = 2 + 5; ln_Res = 7
	Вычитание	ln_Res = 5-2; ln_Res = 3
*	Умножение	!n_Res = 5*2; ln_Res = 10
/	Деление	ln_Res = 5/2; ln_Res = 2.5
%	Остаток от деления	ln_Res = 12 % 5; ln_Res = 2
о	Г руппировка	ln_Res = (5 + 2) * 3; ln_Res = 21
" и **	Возведение в степень	InRes = 3’2; InRes = 9
Допустим, мы хотим рассчитать скорость автомобиля через 2 часа после начала движения, если он разгоняется с постоянным ускорением 35 км/ч.
1п_А = 5 && Ускорение
1п_Т = 2 && Время
ln_V = 1п_А * 1п_Т &Л Расчет скорости
Можно в арифметических выражениях использовать и функции Visual FoxPro, и свои функции, если они возвращают числовые значения.
Например:
ln_Res = MyMath(ln_In) * 578 то же самое, что ln_r = MyMath(ln_In)
ln_Res = ln_r * 578
Функции
Настало время поговорить о математических функциях Visual FoxPro 9. Их насчитывается четыре десятка. Рассмотрим основные функции, разбитые по группам.
Тригонометрические функции Visual FoxPro, как правило, имеют только один параметр (аргумент). К таким функциям относятся:
>	SIN(<аргумент>) - синус;
>	COS (<аргумент>) - косинус;
>	ASIN(<аргумент>) - арксинус;
>	AC0S (<аргумент>) - арккосинус;
>	TAN (<аргумент>) - тангенс;
>	ATAN(< аргумент;-) - арктангенс.
>	функция PI () возвращает значение числа Пи.
> функция DTOR (<аргумент>) конвертирует градусы в радианы. <Аргумент> указывается в градусах.
Арифметические действия
Функции округления и взятия по модулю в Visual FoxPro 9 присутствуют следующие:
> ABS(<аргумент>) - абсолютное значение числа (ABS(-10.7) = 10.7);
>	CEILING (<аргумент>) - ближайшее целое число, большее, чем аргумент, если он дробный (CEILING(10.7) =11);
>	FLOOR (<аргумент>) - ближайшее целое число, меньшее, чем аргумент, если он дробный (FLOOR(10.7) =10);
>	INT (<аргумент>) - целая часть аргумента (INT(10.7) = 10);
> ROUND(<аргумент>, <количество_знаков>) - округляет аргумент до указанного количества знаков после запятой (ROUND (75.235, 2) = 75.24). Допускается отрицательное значение количества знаков. Это приводит к округлению до десятков, сотен и так далее (ROUND (75.235, -1) = 80).
Функция вычисления экспоненты - ЕХР (<аргумент>).
Функции вычисления логарифмов: натуральный логарифм (по основанию ё) -LOG(<apryMeHT>), десятичный логарифм - LOG10 (<аргумент>).
При помощи функции SQRT (<аргумент>) можно вычислить квадратный корень числа.
В Visual FoxPro 9 есть целая группа функций для работы с двоичными числами, представленными классическим типом Numeric и введенными в версии 9 для лучшей совместимости с Microsoft SQL Server двоичными типами Varbinary и Blob. Рассмотрим эти функции. Все их названия начинаются на BIT- , а далее в названии следует производимое действие.
BITAND (<аргумент1>, <аргумент2>, . . . ) - возвращает результат побитовой операции AND над аргументами. Аргументов может быть не более 26. И все аргументы должны быть одного ^ипа. Варианты побитовой операции AND представлены в табл. 3.3.
Таблица 3.3 т Результат побитовой операции and
Аргумент!	Аргумент!	Результат
0 0 1 1	0	0 1	0 0	0 1	1
Сложение происходит так: первый бит первого аргумента складывается с первым битом второго аргумента, второй бит первого аргумента складывается со вторым битом второго аргумента и так далее. Получается, что, если мы
ГЛАВА 3 ▼ Введение в программирование
возьмем число 5 (в двоичном виде 0101) и побитно сложим с числом 3 (в двоичном виде ООП), получится число 1 (в двоичном виде 0001).
В1ТОК(<аргумент1>, <аргумент2>, ... ) - возвращает результат побитовой операции OR над указанными аргументами. Аргументов может быть не более 26. И все аргументы должны быть одного типа. Варианты побитовой операции OR представлены в табл. 3.4.
Таблица 3.4 т Результат побитовой операции ок
Аргумент!	Аргумент!	Результат
0 0 1 1	0	0 1	1 0	1 1	1
В1ТХ0В(<аргумент1>, <аргумент2>, ... ) - возвращает результат побитовой операции исключающего OR над указанными аргументами. Аргументов может быть не более 26. И все аргументы должны быть одного типа. Варианты побитовой операции OR представлены в табл. 3.5.
Таблица 3.5 т Результат побитовой операции исключающего ок
Аргумент!	Аргумент!	Результат
0	0	0
0	1	1
1	0	1
1	1	0
BITCLEAR (<аргумент>, <позиция>) - в указанной позиции двоичного аргумента проставляет 0. Значение позиции может изменяться от 0 (крайняя справа цифра) до 31 (крайняя слева цифра).
BITSET (<аргумент>, <позиция>) - в указанной позиции двоичного аргумента проставляет 1. Значение позиции может изменяться от 0 (крайняя справа цифра) до 31 (крайняя слева цифра).
BITLSHIFT(<аргумент>, <количество>) - сдвигает двоичное число влево на указанное количество разрядов (BITLSHIFT (5,1) =10, 5 в двоичном виде 0101, а 10 в двоичном виде 1010).
В1ТНЗН1ЕТ(<аргумент>, <количество>) - сдвигает двоичное число вправо на указанное количество разрядов (BITRSHIFT (5,1) = 2, 5 в двоичном виде 0101, а 2 в двоичном виде 0010).
Операции над строками
BITTEST (<аргумент>, <позиция>) - проверяет, стоит ли в указанной позиции двоичного аргумента 1. Значение позиции может изменяться от 0 (крайняя справа цифра) до 31 (крайняя слева цифра). Если проверка показывает, что в указанной позиции стоит 1, то функция возвращает значение True (.Т.), если стоит 0, то возвращается False (.F.).
Мы рассмотрели основные функции Visual FoxPro 9 для работы с числами. Можно использовать любые комбинации этих функций в своих собственных функциях и процедурах. Поэкспериментируйте с функциями, запуская их в окне Command. Можно ставить перед функцией команду ?. Например:
? ROUND(75.235, 2)
Тогда результат выполнения функции будет выведен в рабочую область основного окна Visual FoxPro 9. Можно воспользоваться командой MESSAGEBOX. Например:
MESSAGEBOX(ROUND(75.235, 2))
Тогда результат испытываемой функции (ROUND (75.235 , 2)) будет выведен в окно сообщений. Закрывается окно сообщений щелчком мышью по кнопке ОК.
Операции над строками
Над числами, как мы убедились выше, можно с успехом проделывать различные операции. А как быть со строками текста? Было бы здорово выделять часть строки по своему усмотрению или соединять две строки в одну. Эти и множество других операций над строками предусмотрены в Visual FoxPro 9.
Начнем с объединения строк. Эта операция производится абсолютно аналогично сложению чисел. Можно использовать при сложении и сами строки, заключая их в одинарные или двойные кавычки, и переменные, которым присвоены строковые значения. Например:
lc_Stroka = "Здравствуйте, " + "уважаемый пользователь!"
lc_Name = "Петр Федосеевич” lc_Strokal = "Здравствуйте, ” + lc_Name + ”!"
В первом случае в переменную lc_Stroka поместится строка "Здравствуйте, уважаемый пользователь!", а во втором случае переменной lc__Strokal будет присвоено значение "Здравствуйте, Петр Федосеевич!".
ГЛАВА 3 V Введение в программирование
Остальные действия над строками производятся при помощи довольно разнообразных по назначению функций Visual FoxPro 9. Рассмотрим только основные, поскольку, если разбираться с каждой строковой функцией в отдельности, пришлось бы посвятить этому добрую треть книги.
Довольно часто требуется оценить длину строки. Например, если пользователь ввел длинную строку и вам нужно проверить, поместится ли она целиком в ограниченное по длине символьное поле таблицы. Для определения длины строки используют функцию ьЕИ(<строка>). Возвращаемое значение - целое число. Например:
ln_StrLn = LEN("Не очень длинная строка")
Переменная ln_StrLn в итоге будет иметь значение 24. А что получится в результате выполнения указанного ниже выражения?
ln_StrLn = LEN("Mnp!") + LEN("Труд 1") + ЬЕН("Май!")
Каждый из вызовов функции LEN вернет соответственно 4, 5 и 4 (по количеству символов в соответствующих строках). Переменной ln_StrLn будет присвоено значение 13 (4 + 5 + 4).
Для решения еще одной часто встречающейся задачи - выделению подстроки в строке - предназначены функции LEFT, RIGHT и SUBSTR.
LEFT(<строка>, <количество_символов>) - возвращает указанное количество символов строки, отсчитывая их от левого края строки. Например:
lc_sbstr = LEFT("Мультиканальный передатчик", 7)
В результате переменной lc_sbstr будет присвоено значение "Мультик".
RIGHT(<строка>, <количество_символов>) - возвращает указанное количество символов строки, отсчитывая их от правого края строки. Например:
lc_sbstr = RIGHT("Мультиканальный передатчик", 6)
В результате переменной lc_sbstr будет присвоено значение «датчик».
Можно выделять из строки и подстроку в произвольном порядке. Для этого служит следующая функция.
SUBSTR(<строка>, <позиция_начала>[, <количество_символов>]) -возвращает подстроку, начинающуюся с указанной позиции, с заданной длиной. Позиция первого символа - 1. Если не указать длину подстроки, вернется подстрока, начинающаяся с указанного символа и заканчивающаяся с окончанием исходной строки.
Примеры:
lc_sbstr = SUBSTR("Мультиканальный передатчик", 7,5)
Операции над строками
В результате переменной lc_sbstr будет присвоено значение "канал".
lc_sbstr = SUBSTR("Мультиканальный передатчик", 5, 3)
В результате переменной lc_sbstr будет присвоено значение "тик".
lc_sbstr = SUBSTR("Мультиканальный передатчик", 17)
В результате переменной lc_sbstr будет присвоено значение "передатчик".
Вам может потребоваться выделить, например, второе слово в строке из двух слов. А строка не известна заранее. Как быть? В этом случае требуется сначала определить положение пробела, разделяющего первое и второе слово, а затем выделить подстроку начиная с этой позиции.
АТ (<подстрока>, <строка> [, <номер_вхождения>]) - ищет указанное вхождение указанной подстроки в строке. Если ничего не находит, возвращается 0. Для нашего примера:
lc_Str!n = "Два слова"
ln_StrStart = АТ(" ", lc_Str!n) && ищем пробел
lc_SecondWord = SUBSTR(lc_Str!n, ln_StrStart + 1)
В результате переменной lc_StrStart будет присвоено значение 4, а переменной lc_SecondWord - значение " слова". Мы использовали в функции SUBSTR в качестве параметра выражение ln_StrStart + 1 потому, что в переменной ln_StrStart хранится позиция пробела в строке, а нам нужен первый символ слова, следующего за пробелом.
Усложним задачу. Допустим, требуется выделить второе слово в строке, а строка не известна заранее и количество слов в ней больше трех. В этом случае требуется сначала определить положение пробела, разделяющего первое и второе слово, затем определить положение пробела, разделяющего второе и третье слово, а затем выделить подстроку начиная с позиции, следующей за позицией первого пробела, и заканчивая позицией второго пробела. Реализовать эту задачу можно так:
lc_Str!n = "Предложение из четырех слов"
ln_StrStart = АТ(" ", lc_Str!n) && ищем первый пробел
ln_StrEnd = АТ(" ", lc_Str!n, 2) && ищем второй пробел
ln_SbStrLn = ln_StrEnd - ln_StrStart - 1 && длина подстроки
lc_SecondWord = SUBSTR(lc_Str!n, ln_StrStart + 1, ln_SbStrLn)
В результате переменной lc_StrStart будет присвоено значение 12, а переменной lc_StrEnd - значение 15. Длина подстроки, присваиваемая переменной ln_SbStrLn, составит в результате вычисления 2. В результате использования функции SUBSTR переменной lc_SecondWord будет присвоено значение "из".
ГЛАВА 3 ▼ Введение в программирование
Может получиться так, что пользователь ввел в начале исходной строки пробел или даже несколько пробелов. Тогда наша программка не будет работать правильно. Вместо первого пробела, разделяющего, как нам кажется, первое и второе слово, найдется пробел, стоящий в начале строки. Однако и этой беде можно помочь средствами Visual FoxPro 9. Существуют функции, которые обрезают «лишние» пробелы.
LTRIM(<строка>[, <флаг>][, <символ1> [, <символ2>[, ...]]]) - возвращает строку с удаленными из начала строки пробелами или указанными символами. Флаг определяет чувствительность к большим и маленьким буквам. Если флаг не указан, функция регистрозависимая, то есть различает большие и маленькие буквы. Если флаг равен 1, функция регистронезависимая, то есть не различает большие и маленькие буквы. Максимальное количество символов, которые можно указать для удаления, составляет 23.
RTRIM(<строка>[, <флаг>]<символ1> [, <символ2>[, ...]]]) -возвращает строку с удаленными из конца строки пробелами или указанными символами. Флаг определяет чувствительность к большим и маленьким буквам. Если флаг не указан, функция регистрозависимая, то есть различает большие и маленькие буквы. Если флаг равен 1, функция регистронезависимая, то есть не различает большие и маленькие буквы. Максимальное количество символов, которые можно указать для удаления, составляет 23.
АЬЬТК1М(<строка>[, <флаг>][, <символ!> [, <символ2>[, ...]]])- возвращает строку с удаленными из начала и конца строки пробелами или указанными символами. Флаг определяет чувствительность к большим и маленьким буквам. Если флаг не указан, функция регистрозависимая, то есть различает большие и маленькие буквы. Если флаг равен 1, функция регистронезависимая, то есть не различает большие и маленькие буквы. Максимальное количество символов, которые можно указать для удаления, составляет 23.
Что характерно, все три функции работают и с символьным типом Character, и с двоичным типом Varbinary, введенным в Visual FoxPro версии 9. ,
Примеры:
lc_sbstr = LTRIM(" Книга о Visual FoxPro 9")
В результате переменной lc_sbstr будет присвоено значение "Книга о Visual FoxPro 9".
lc_sbstr = LTRIM("Dsr:Книга о Visual FoxPro 9", "D", “s”, "r", ”:)
В результате переменной lc_sbstr будет присвоено значение "KHnraoVisual FoxPro 9".
lc_sbstr = LTRIM("Dsr:Книга о Visual FoxPro 9", "Dsr: ")
Операции над строками
В результате переменной lc_sbstr будет присвоено значение " Книга о Visual FoxPro 9".
lc_sbstr = RTRIM(" Книга о Visual FoxPro 9	")
В результате переменной lc_sbstr будет присвоено значение "Книга о Visual FoxPro 9".
lc_sbstr = ALLTRIMC Книга о Visual FoxPro 9	")
В результате переменной lc_sbstr будет присвоено значение " Книга о Visual FoxPro 9".
Есть и обратные операции, которые добавляют пробелы или указанные символы, чтобы строка достигла определенного размера.
РАОК(<строка>, <размер>[, <символ>]) - добавляет пробелы или указанные символы в конец строки.
PADL(<строка>, <размер>[, <символ>]) - добавляет пробелы или указанные символы в начало строки.
PADC (<строка>, <размер>[, <символ>]) - добавляет пробелы или указанные символы в начало и конец строки.
Примеры:
lc_str = PADL ("Глава", 8, "*")
В результате переменной lc_str будет присвоено значение "***Глава".
lc_str = PADC ('Глава', 9, '*')
В результате переменной lc_str будет присвоено значение "**Глава**".
В Visual FoxPro появились функции для работы со словами в строке, отсутствовавшие в FoxPro для MS DOS: GETWORDCOUNT (), GETWORDNUM ().
GETWORDCOUNT (<строка> [, <разделитель>]) - возвращает количество слов, разделенных разделителем. Если разделитель не указан, считается, что слова разделены пробелами.
GETWORDNUM(<строка>, <номер_слова>[, <разделитель>]) - возвращает слово с указанным номером из строки. Если слова разделяются не пробелами, нужно указать разделитель.
Все приведенные примеры использования строковых функций вы можете опробовать, запуская их на выполнение в окне Command. Программы можно ввести и запустить на выполнение, как это было описано в разделе «Создаем первую программу». Не забудьте в программах добавить последней строкой вывод переменной с результатом. Так же как и в случае использования окна Command, воспользуйтесь для этого либо командой ?, либо командой MESSAGEBOX, как это описано в конце раздела «Арифметические действия».
ГЛАВА 3 ▼ Введение в программирование
Выполнение при определенных условиях
В процессе выполнения программы часто возникает ситуация, когда при определенных условиях надо выполнить группу команд или процедуру, а если условия не выполняются, то выполнять эти команды не нужно или вместо них надо выполнить другие команды. Например, если в результате вычислений получилось положительное число, надо вывести на экран сообщение Положительное, а если отрицательное, - Отрицательное.
В Visual FoxPro предусмотрены специальные конструкции для ветвления выполнения операций.
Конструкция IF
Конструкция IF применяется во многих языках программирования и отличается, как правило, только синтаксисом. В Visual FoxPro синтаксис следующий:
IF <Условие> [THEN]
<Список_команд>
[ELSE
<Список_команд>]
ENDIF
После IF ставится логическое выражение, которое требуется проверить. Если оно истинно, выполняются команды, следующие за условием. Ключевое слово THEN практически никогда не используют. Кончается список команд, выполняемых при истинности условия, ключевым словом ENDIF, если альтернативного списка команд, выполняемого при несоблюдении условия, нет. Если при проверке условия выясняется, что оно ложно, выполняются команды, указанные после ключевого слова ELSE. Например, требуется, если в результате вычислений получилось положительное число, вывести на экран сообщение Положительное, а если отрицательное, - Отрицательное.
ln_Res = ln_In - 15
IF ln_Res > О
MESSAGEBOX("Положительное")
ELSE
MESSAGEBOX("Отрицательное")
ENDIF
Можно использовать следующие операторы сравнения:
>	= (равно);
>	== (точное равенство строк);
Выполнение при определенных условиях
> < (меньше);
> > (больше);
> о, #, != (не равно);
> <= (меньше или равно);
> >= (больше или равно).
Обратите внимание на оператор ==, действующий при сравнении строк. Если при сравнении строк поставить не двойной знак равенства, а обычный одинарный, то сравнение будет происходить не целыми строками. Например:
IF "Владимир" = "Влад" && Условие будет истинным
IF "Владимир" == "Влад" && Условие будет ложным
При записи условия можно пользоваться логическими операторами NOT (логическое «не»), AND (логическое «и») и OR (логическое «или»). Например, требуется вывести на экран сообщение Положительное, если в результате вычислений получилось положительное число или 0, и Отрицательное, если в результате вычислений получилось отрицательное число.
ln_Res = ln_In - 15
IF ln_Res > 0 OR ln_Res = 0
MESSAGEBOX("Положительное")
ELSE
MESSAGEBOX("Отрицательное")
ENDIF
Для записи более сложных логических выражений можно пользоваться скобками.
В Visual FoxPro существуют несколько полезных функций для проверки значений переменных или полей.
EMPTY (спеременная I имя_поля>) - возвращает значение True (.Т.), если значение переменной или поля пустое. К пустым значениям относятся: для числовых типов - значение 0, для символьных типов - строки без единого символа (" ”), строки, состоящие из пробелов, символов табуляции, символов перевода строки, символов окончания строки и любых их комбинаций. Следующий пример выводит сообщение, хранящееся в переменной lc_mes, если оно не пустое.
IF EMPTY(lc_mes)
MES SAGEBOX("Нет сообщения")
ELSE
MESSAGEBOX(lc_mes)
ENDIF
ГЛАВА 3 Т Введение в программирование
Конструкция IIF
Существует более компактный способ записи условного оператора, который в результате проверки не выполняет группу команд, а просто возвращает то или иное значение. Такому оператору можно найти довольно широкое применение. Он выполнен в виде функции и называется IIF.
IIF (<Условие>, <Вь:ражение1>, < Выражение2>)
При истинности условия возвращается первое выражение, если условие ложно - то второе. В выражениях можно использовать функции и переменные любых типов. Вот как может измениться приведенный выше пример с выводом на экран сообщения Положительное, если в результате вычислений получилось положительное число или 0, и Отрицательное, если в результате вычислений получилось отрицательное число, в случае использования IIF.
ln_Res = ln_In - 15
MESSAGEBOX(IIF(ln_Res > 0 OR ln_Res = 0, ;
"Положительное", "Отрицательное"))
Функция IIF часто просто незаменима в отчетах и наклейках. Но об этом мы поговорим позже.
Конструкция CASE
Возможны ситуации, когда надо проверить не просто соответствие переменной или поля какому-то значению, а отреагировать на различные варианты значений. Например, нужно вывести на экран сообщение Положительное, если в результате вычислений получилось положительное число, сообщение Ноль, если в результате вычислений получился 0, и Отрицательное, если в результате вычислений получилось отрицательное число.
Можно, конечно, обойтись использованием вложенной проверки при помощи IF.
ln_Res = ln_In - 15
IF ln_Res > 0
MESSAGEBOX("Положительное")
ELSE
IF ln_Res = 0
MESSAGEBOX("Ноль")
ELSE
MESSAGEBOX("Отрицательное")
END IF
ENDIF
Выполнение при определенных условиях
Но есть способ гораздо изящнее - использовать конструкцию CASE.
DO CASE
CASE <Условие1> [<Список_команд>] [CASE <Условие2> [<Список_команд>] ]
[CASE <УсловиеМ>
[<Список_команд>] ]
[OTHERWISE
[<Список_команд>]]
ENDCASE
Если условие истинно, выполняются указанные команды. Если ни одно из условий не истинно, выполняются команды, указанные после ключевого слова OTHERWISE. Таким образом, наш пример будет выглядеть следующим образом:
ln_Res = ln_ln - 15
DO CASE
CASE ln_Res > 0
ME S SAGEBOX("Положительное")
CASE ln_Res = 0
MESSAGEBOX (’’Ноль’’)
OTHERWISE
MESSAGEBOX("Отрицательное")
ENDCASE
Допустим, мы предоставляем пользователю возможность корректировки таблицы. Предварительно требуется узнать, хочет пользователь просто просмотреть таблицу или будет вносить исправления. В зависимости от его выбора надо либо запретить корректировку, либо разрешить ее. В случае, если мы разрешили корректировку, надо открывать таблицу в эксклюзивном режиме, чтобы иметь возможность упаковать ее при пометке на удаление каких-либо записей.
Для реализации задачи требуется знать возможности команды MESSAGEBOX (). Эта функция выводит на экран диалоговое окно указанного типа с сообщением и возвращает код нажатой в окне кнопки (табл. 3.9).
MESSAGEBOX(<Сообщение> [, <Тип_окна> ][, <3аголовок>][, <3адержка>])
> <Сообщение> - текст сообщения или переменная, значение которой нужно вывести на экран. Можно использовать функции, результат действия которых (возвращаемое значение) и будет отображаться. Максимальная длина сообщения - 1024 символа;
ГЛАВА 3 ▼ Введение в программирование
> <Тип_окна> - определяет, какую пиктограмму и какие кнопки выводить в диалоговом окне. Возможные значения для вариантов наборов кнопок приведены в табл. 3.6, для вариантов пиктограмм - в табл. 3.7, для вариантов установки кнопок по умолчанию - в табл. 3.8. Следует обратить внимание, что допускается суммирование этих значений. Например, надо получить окно с кнопками ОК и Отмена (Cancel), пиктограммой со знаком вопроса и выбором по умолчанию кнопки Отмена (Cancel). В этом случае параметр <Тип_окна> формируется так: 1 + 32 + 256 = 289, то есть надо ставить 289;
>	<3аголовок> - задает строку заголовка диалогового окна;
>	<3адержка> - определяет задержку в миллисекундах. Через указанное время произойдет закрытие окна, если пользователь не нажмет никакую клавишу или не щелкнет' мышью по какой-либо кнопке диалогового окна. Если время вышло, MESSAGEBOX () вернет значение -1.
Таблица 3.6 т Значения для вариантов наборов кнопок
Значение	Набор кнопок-
0 1 2 3 4 5	ОК ОК и Отмена (Cancel) Прервать, Повторить, Пропустить (Abort, Retry', Ignore) Да, Нет, Отмена (Yes, No, Cancel) Да, Нет (Yes, No) Повторить, Отмена (Retry, Cancel)
Таблица 3.7т	г Значения для вариантов пиктограмм
Значение	Пиктограмма
16 32 48 64	Знак Стоп Знак вопроса Восклицательный знак (внимание) Знак информационного сообщения (i)
Таблица 3.8 т	г Значения для вариантов кнопок по умолчанию
Значение	Кнопка по умолчанию
0 256 512	Первая кнопка Вторая кнопка Третья кнопка
Выполнение при определенных условиях
Таблица 3.9 т Возвращаемые messagebox () значения
Возвращаемое значение	Кнопка
1	OK
2	Отмена (Cancel)
3	Прервать (Abort)
4	Повторить (Retry)
5	Пропустить (Ignore)
6	Да (Yes)
7	Нет (No)
При выводе длинных сообщений при помощи команды MESSAGEBOX () для принудительного перевода строки надо использовать символ с кодом 13 (символ перевода строки). Например, "Начало текста на первой строке, " + CHR (13) + "а окончание на второй! ".
Попробуем реализовать задачу, для чего выполните следующие действия:
1.	Смените текущую папку, выполнив в окне команд (Command) команду CD ?
2.	Откроется окно, в котором нужно найти созданную нами ранее папку example.
3.	Создайте копию таблицы persons, вводя в окне команд (Command) следующие команды:
USE persons
COPY ТО test_per CLOSE TABLE
4.	Выберите из меню File (Файл) команду New (Новый) или щелкните мышью по кнопке Р) на панели инструментов Стандартная. Откроется окно, представленное на рис. 3.1. Выберите пункт Program (Программа), а затем щелкните мышью по кнопке New file (Новый файл). Откроется пустое окно, предназначенное для ввода текста программы.
5.	Ведите следующий ниже текст программы:
PRIVATE pn_R.es	<i& Объявляем переменную
pn_Res = MESSAGEBOX ('Корректировать требуется ?’, 292, ’Вопрос’)
DO CASE
CASE pn_Res = 6 && Корректировка требуется
USE test_per EXCLUSIVE
BROWSE
ГЛАВА 3 ▼ Введение в программирование
COUNT FOR DELETED() ТО ln_DelRecs
IF ln_DelRecs о О
PACK
MESSAGEBOX{'Таблица упакована!', 48, 'Внимание')
END IF
OTHERWISE && Корректировка не требуется BROWSE NOEDIT
ENDCASE
6.	Сохраните программу в файле, для чего выберите из меню File (Файл) команду Save (Сохранить) или щелкните по кнопке Q на панели инструментов Стандартная. В результате откроется стандартное окно сохранения документа, где тип файла уже будет указан, а от вас потребуется указать имя файла. Назовем наш файл с программой MyPrg3. Щелкните мышью в поле Save Document (Сохранить документ) и введите MyPrg3. После этого щелкните мышью по кнопке Сохранить (Save).
7.	Выберите команду Do MyPrg3 (Выполнить) в меню Program (Программа) либо щелкните по кнопке I на панели инструментов Стандартная. Программа запустится на выполнение, и на экране появится вопрос о корректировке.
8.	Щелкните по кнопке Да (Yes) и попробуйте отредактировать появившуюся таблицу. Пометьте несколько записей на удаление (либо щелкнув мышью по полю слева от записи так, чтобы это поле потемнело, либо нажав комбинацию клавиш Ctrl+T). Запомните, какие записи вы пометили на удаление.
9.	Закончите редактирование, либо нажав клавишу ESC, либо закрыв мышью окно с таблицей. Появится окно с сообщением об упаковке.
10.	В окне с сообщением об упаковке щелкните мышью по кнопке ОК.
11.	Запустите на выполнение программу еще раз, как это было указано в п.7.
12.	На запрос о корректировке щелкните мышью по кнопке Нет (No).
13.	Убедитесь, что записи, помеченные вами на удаление, действительно удалились из таблицы.
14.	Попытайтесь откорректировать записи в появившейся таблице и убедитесь, что это невозможно.
15.	Закончите просмотр таблицы, либо нажав клавишу Esc, либо закрыв мышью окно с таблицей.
Циклы
Допустим, у вас есть массив переменных, содержащий имена таблиц и индексных файлов, и вам требуется переиндексировать каждую таблицу. Можно
Циклы
написать столько же групп однотипных команд, сколько таблиц в массиве. А если таблиц два десятка? А если список таблиц составляется динамически, то есть вы заранее не знаете, сколько будет элементов в массиве и какие именно будут у них значения?
В подобных случаях на помощь приходят конструкции языка Visual FoxPro, называемые циклами. Они позволяют повторить команду или группу' команд, изменяя их параметры, указанное количество раз или пока выполняется определенное условие. Находящиеся внутри цикла команды при этом называют телом цикла.
Циклических конструкций в Visual FoxPro несколько, что называется, «на все случаи жизни».
Цикл FOR
Во-первых, рассмотрим цикл FOR:
FOR <Переменная> = <Нач._значение> ТО <Кон._значение> [STEP <Шаг>]
<Команды>
[EXIT]
[LOOP]
ENDFOR
В данном цикле используется переменная, значение которой изменяется от <Нач._значение> до <Кон._значение>. То есть при первом выполнении команд внутри цикла переменная имеет значение <Нач._значение>. При выполнении команд второй раз переменная изменяется в соответствии с указанным значением <Шаг>. Если никакой шаг не задать, то переменная увеличится на 1. После такого изменения, прежде чем выполнять команды второй раз, проверяется, не достигла ли переменная значения <Кон._значение>. Если достигла, то выполнение команд внутри цикла прекращается и управление передается команде, следующей за циклом. Например, вам надо вывести сообщение «Я хочу научиться писать программы!» 10 раз.
FOR ln_i = 1 ТО 10
MESSAGEBOX("Я хочу научиться писать программы!")
ENDFOR
В этом случае мы нигде в теле цикла не использовали значение переменной. Рассмотрим другой случай. Допустим, что нам требуется вывести список предметов на складе с указанием порядкового номера. Список предметов хранится в массиве ga_Things. Количество предметов хранится в переменной gn_ThingsCnt.
FOR ln_i = 1 ТО gn_ThingsCnt
? STR(ln_i, 2) + ’. ' + ga_Things[ln_i]
ENDFOR
ГЛАВА 3 ▼ Введение в программирование
Команды EXIT и LOOP прерывают выполнение цикла, но действуют по-разному. EXIT прекращает дальнейшее выполнения цикла и передает управление команде, следующей за циклом. Команда LOOP пропускает выполнение команд, следующих за ней до ключевого слова ENDFOR, и продолжает полноценное выполнение цикла.
Цикл DO WHILE
Когда требуется выполнять группу команд до тех пор, пока выполняется установленное условие, применяют циклическую конструкцию DO WHILE. Собственно, с английского языка эта фраза и переводится «Делай, пока». А после ключевого слова WHILE (пока) и ставится условие, которое должно выполняться.
DO WHILE <Условие>
<Команды>
[EXIT]
[LOOP]
ENDDO
Действие команд EXIT и LOOP аналогично используемым в конструкции FOR.
Рассмотрим применение конструкции DO WHILE на примере. Допустим, требуется выводить значения элементов числового массива ga_Things, пока не встретится значение 0 или пока пользователь не прервет вывод сообщений.
ln_i = 1
DO WHILE ga_Things[ln_i] <> 0
lc_mes = ALLTRIM(STR(ga_Things[ln_i])) + CHR(13) ;
+ "Выводить следующий элемент?"
ln_Res = MESSAGEBOX(lc_mes, 36, “Элементы массива")
IF ln_Res = 7
EXIT
END IF ln_i = ln_i + 1 ENDDO
Что касается применения циклов для обработки массивов, мы немного разобрались. А как быть с записями таблиц? Какой подход считать наилучшим? Можно перебрать все записи таблицы, применив и цикл FOR, и цикл DO WHILE. Например, так:
GO ТОР
FOR ln_i = 1 ТО RECCOO
MESSAGEBOX(MyFld) && Выводим значение поля MyFld SKIP ENDFOR
Циклы
Или так:
GO ГОР
DO WHILE NOT EOF()
MESSAGEBOX(MyFld) && Выводим значение поля MyFld
SKIP
ENDDO
Но существует более грамотное решение. Рассмотрим его ниже.
Цикл SCAN
Мы уже говорили, что язык Visual FoxPro изначально ориентирован на работу с записями таблиц. По этой причине в языке Visual FoxPro предусмотрена специальная циклическая конструкция для перебора записей таблицы. Она называется SCAN.
Рассмотрим синтаксис циклической конструкции SCAN:
SCAN (NOOPTIMIZE] [<Диапазон>] [FOR <Условие1>] [WHILE < Условие2>]
<Команды>
[EXIT]
[LOOP]
ENDSCAN
Команды, указанные в теле цикла, выполняются для каждой записи текущей таблицы или для выбранных по условию записей (FOR). При этом смена текущей записи происходит автоматически, то есть сначала текущей становится первая запись таблицы (или первая запись, удовлетворяющая условию) и для нее выполняются все команды тела цикла, затем вторая запись и для нее выполняются все команды тела цикла и так далее до конца таблицы. Таким образом, приведенный выше пример, реализованный циклами FOR и DO WHILE, можно записать так:
SCAN
MESSAGEBOX(MyFld) && Выводим значение поля MyFld
ENDDO
Замечательным свойством цикла SCAN является возможность перебирать только выбранные по условию записи. И разработчики довольно часто прибегают к ее использованию. Например, требуется отобразить из таблицы Staff только поле Whois записей со значением поля sum > 15000.
USE staff IN 0
SCAN FOR sum > 15C00
MESSAGEBOX(Whois) && Выводим значение поля Whois
ENDDO
ГЛАВА 3 ▼ Введение в программирование
Рассмотрим применение конструкции SCAN на примере. Допустим, требуется выводить значения числовых полей NumVals, пока пользователь не прервет вывод сообщений.
SCAN
lc_mes = ALLTRIM(STR(NumVals)) + CHR(13) ;
+ "Выводить следующий элемент?"
ln_Res = MESSAGEBOX(lc_mes, 36, "Значения полей")
IF ln_Res = 7
EXIT
ENDIF
ENDSCAN
В случае, когда дополнительно требуется не выводить нулевые значения поля, предыдущий пример изменится следующим образом:
SCAN FOR NumVals о О
lc_mes = ALLTRIM(STR(NumVals)) + CHR(13) ;
+ "Выводить следующий элемент?"
ln_Res = MESSAGEBOX(lc_mes, 36, "Значения полей")
IF ln_Res = 7
EXIT
ENDIF
ENDSCAN
Попробуем использовать циклы для создания программы отображения данных из таблиц нашего примера со списком сотрудников и списком должностей (созданных в упражнениях второй главы). Будем выводить в окне сообщений табельный номер, имена и оклады сотрудников. Обратите внимание на то, что табельный номер и имена сотрудников хранятся в таблице со списком сотрудников, а оклады сотрудников хранятся в таблице со списком должностей. Соответственно, придется связывать эти таблицы для синхронного перехода с одной записи на другую. Для этой цели используется команда SET RELATION, рассмотрению которой был посвящен раздел «Связывание таблиц» (глава 2). При этом должно выполняться условие обязательной индексации таблицы, с которой связывается основная таблица. В нашем случае обе таблицы проиндексированы, поэтому мы без дополнительных действий вольны выбирать, какая таблица будет основной, а какая будет вспомогательной. Имеет смысл организовать цикл по таблице со списком сотрудников (эта таблица будет основной).
Для создания программы отображения данных из таблиц нашего примера выполните следующие действия:
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Циклы
2.	Откроется окно, в котором нужно найти созданную нами ранее папку example.
3.	Выберите из меню File (Файл) команду New (Новый) или щелкните мышью по кнопке Р] на панели инструментов Стандартная. Откроется окно, представленное на рис. 3.1. Выберите пункт Program (Программа), а затем щелкните мышью по кнопке New file (Новый файл). Откроется пустое окно, предназначенное для ввода текста программы.
4.	Ведите следующий ниже текст программы:
PRIVATE pn_Res	&& Объявляем переменную
SELECT 0 && Выбираем свободную рабочую область
USE Staff INDEX id_staff && Используем индекс по Id
SELECT 0 && Выбираем свободную рабочую область
USE Persons
SET RELATION TO Id INTO Staff && Связываем по полю Id
SCAN && Перебираем записи таблицы Persons
lc_mes = ALLTRIM(STR(Persons.Tabnum)) + "
+ ALLTRIM (Persons .Name) + " -
+ ALLTRIM(STR(Staff.Sum)) + "руб.”;
+ CHR(13) + + CHR(13);
+ "Выводить следующий элемент?11
pn_Res = MESSAGEBOX(lc_mes, 36, "Значения полей”)
IF pn_Res = 7
EXIT
ENDIF
ENDSCAN
CLOSE TABLES
5.	Сохраните программу в файле, для чего выберите из меню File (Файл) команду Save (Сохранить) или щелкните по кнопке Q на панели инструментов Стандартная. В результате откроется стандартное окно сохранения документа, где тип файла уже будет указан, а от вас потребуется указать имя файла. Назовем наш файл с программой MyPrg4. Щелкните мышью в поле Save Document (Сохранить документ) и введите MyPrg4. После этого щелкните мышью по кнопке Сохранить (Save).
6.	Выберите команду Do MyPrg4 (Выполнить) из меню Program (Программа), либо щелкните по кнопке J на панели инструментов Стандартная. Программа запустится на выполнение, и на экране появится вопрос о корректировке.
7.	Щелкайте по кнопке Да (Yes), если хотите продолжать просмотр записей, и по кнопке Нет (No), если есть желание прекратить просмотр.
ГЛАВА 3 ▼ Введение в программирование
Кодировки. Почему русский текст так ужасно выглядит?
Представьте себе, что вам потребовалась небольшая программка на языке Visual FoxPro, которая уже есть у вашего знакомого. Он с радостью одолжил вам программку, но предупредил, что она написана для MS DOS, например, на FoxPro 2.6. Вы его сердечно благодарите и открываете ее в среде Visual FoxPro 9, что сделать имеете полное право, поскольку обратная совместимость весьма неплохо обеспечивается. Программа появилась в окне на экране... Но что это?! На экран вместо осмысленных текстовых сообщений на русском языке выводятся какие-то странные символы! Может, это вирус?!
Дело в том, что каждый символ обозначается специальным кодом. Набор кодов для обозначения всех символов называется кодировкой (или кодовой страницей). Кодировки бывают разные. Главным образом они отличаются набором символов национальных алфавитов. Каждая кодировка имеет свое название. Как правило, современные операционные системы изначально поддерживают несколько кодировок и позволяют добавлять для использования новые. В операционной системе MS DOS в качестве основной используется одна кодировка (866 - Russian MS DOS), а в операционных системах семейства Windows - другая (1251 - Russian Windows).
Как же выйти из ситуации с программкой? В стандартном окне открытия файла, где вы выбираете, какой файл с программой будет открыт, есть кнопка Code Page (Кодовая страница). При щелчке мышью по этой кнопке открывается окно со списком кодировок (рис. 3.5). В этом окне можно выбрать ту кодировку, в которой создавалась программа. После выбора кодировки надо щелкнуть по кнопке Select (Выбрать).
Please select a code page for cross-platform data sharing
i rPiatfcxm-—A-©Al O&indows OMS&0S ©Macintosh
CodePaga
fwOOO^Standard Macintosh I  10006 • Greek Macintosh 1 i 10007 • Russian Macintosh ’].!0029 • Eastern European Macir Й1250-Windows EE
Рис. 3.5 т Вид окна для выбора кодировки
Кодировки. Почему русский текст так ужасно выглядит?
В результате действий, указанных выше, откроется текст программы, где сообщения на русском языке будут вполне читаемы. Однако это не значит, что в среде Visual FoxPro при запуске программы, написанной в кодировке MS DOS, все сообщения будут выводиться корректно. Что же делать, если требуется использовать такую программу, запуская ее в среде Visual FoxPro 9? Самый простой способ - после корректного открытия файла с программой, когда все русские сообщения читаются нормально, выбрать из меню File (Файл) команду Save As (Сохранить как) и в открывшемся диалоговом окне сохранения файла перед щелчком по кнопке Save (Сохранить) щелкнуть по кнопке Code Page (Кодовая страница). При щелчке мышью по этой кнопке открывается окно со списком кодировок (см. рис. 3.5). В этом окне нужно выбрать ту кодировку, в которой вы в данный момент работаете (если программа должна выполняться в операционной системе семейства Windows, надо выбрать 1251 - Russian Windows). После выбора кодировки надо щелкнуть по кнопке Select (Выбрать). В результате программа сохранится в новой кодировке. При следующем открытии файла с программой уже не нужно указывать, например, кодировку MS DOS, так как мы сохранили этот файл с новой кодировкой.
С аналогичной проблемой сталкиваются и при работе с таблицами, созданными в других кодировках. Однако с таблицами дело обстоит несколько проще. Кодировка, которая используется в текстовых полях таблицы, прописывается в заголовок файла с таблицей. По этой причине большинство созданных в других кодировках файлов с таблицами откроются и отобразятся достаточно корректно.
Исключение составляют файлы с таблицами, где кодировка не прописана. Например, когда создавались базы данных в FoxPro для MS DOS, никто и не помышлял о будущей операционной системе Windows и особенно не задумывался о разнообразии кодовых страниц. В dbf-файлах присутствовало зарезервированное поле, которое впоследствии стали использовать для хранения обозначения кодировки, но в те времена оно оставалось пустым.
В случаях, когда кодировка не прописана в файле, при первом открытии таблицы появляется запрос с перечнем кодовых страниц. Будьте внимательны при выборе кодировки!!! Обозначение выбранной кодировки пропишется в заголовок файла с таблицей, и при повторном открытии таблицы запрос на выбор кодировки появляться не будет! Конечно, безвыходных ситуаций не бывает, но исправление ошибочно заданной кодировки потребует времени и определенной сноровки. Например, для этой цели предусмотрена программа CPZERO, поставляемая вместе с Visual FoxPro 9. Эта программа позволяет удалить обозначение кодовой страницы из файла таблицы. При открытии таблицы после
ГЛАВА 3 ▼ Введение в программирование
операции удаления снова появится запрос кодовой страницы, и вы сможете сделать правильный выбор. Пример таблицы, открытой с неправильно выбранной кодировкой, показан на рис. 3.6.
Рис. 3.6 ▼ Результат неправильного определения кодировки таблицы
РЕсли при первом открытии таблицы окно для выбора кодовой страницы не появилось, выполните следующие действия:
>	выберите в меню Tools (Инструменты) команду Options (Параметры);
>	в появившемся окне перейдите на вкладку Data (Данные);
>	проверьте, установлен ли флажок Prompt for code page (Запрос на кодовую страницу).
Для перекодировки открытой таблицы (когда требуется записать текстовые поля в новой кодировке) можно использовать команду COPY ТО с указанием после ключевого слова AS новой кодовой страницы. Например:
USE Persons
COPY ТО DosPers AS 866
В результате работы указанных команд таблица Persons будет скопирована в таблицу DosPers, причем текстовые поля в новой таблице будут сохранены в кодировке 866 - Russian MS DOS.
Определить кодовую страницу, в которой хранятся символьные поля текущей или заданной открытой таблицы, можно при помощи функции CPDBF( ).
CPDBF([<Номер_рабочей_области> I <Алиас_таблицы>])
Кодировки. Почему русский текст так ужасно выглядит?
Например, таблица Persons создана в Visual FoxPro 9 под управлением операционной системы семейства Windows с установками кодовой страницы по умолчанию (то есть специально мы кодовую страницу не задавали):
MESSAGEBOX(CPDBF("Persons"), "Кодировка")
Результат работы этой функции представлен

на рис. 3.7.
Текст, хранящийся в символьных перемен-
ных, также имеет определенную кодировку: Если	-..।
вы присвоите переменной 1с_р8 66 значение	*.... ’
поля таблицы в кодировке 866 - Russian MS DOS,
которое содержит слово "мир", а переменной Рис. 3.7 т Результат определения lc_w - значение поля таблицы в кодировке 1251 -	кодировки таблицы Persons
Russian Windows, которое также содержит слово "мир", и сравните их, то равенства не получится. Перекодировать переменную из одной кодировки в другую можно с помощью функции CPCONVERT ().
CPCONVERT(<Текущая_кодировка>, <Новая_кодировка>, <Переменная>)
Например:
lc_Strl = CPCONVERT(1251, 866, lc_Str2)
Указанная команда перекодирует переменную lc_Str2 из кодировки 1251 в кодировку 866 и помещает результат в переменную lc_Strl.
Как было сказано выше, каждый символ имеет свой код. В язык Visual FoxPro 9 включен ряд функций, позволяющих определять код символа и возвращающих символ по введенному коду. Рассмотрим их.
Функция ASC () возвращает код ANSI указанного символа.
ASC(<Символ>)
Например:
ln_ChCode =	ASC('s')	&&	В переменную	запишется	код	115
ln_ChCode =	ASC('n')	&&	В переменную	запишется	код	110
ln_ChCode =	ASC('$')	&&	В переменную	запишется	код	36
Функция, возвращающая символ, соответствующий введенному коду, -CHR().
CHR(<Код_символа>)
ГЛАВА 3 ▼ Введение в программирование
Например:
lc_Ch = CHR(115) && В переменную запишется символ 's' lc_Ch = CHR(110) && В переменную запишется символ 'п' lc_Ch = CHR(35) && В переменную запишется символ '$'
Чаще всего функцией CHR () пользуются для вставки в строки специальных символов, таких как перевод строки (CHR (13) ), конец строки (CHR(IO)) или другие подобные символы.
Кодировки, поддерживаемые в Visual FoxPro 9, приведены в табл. 3.10.
Таблица 3.10 т Кодировки, поддерживаемые в Visual FoxPro 9
Кодовая страница	Название	Идентификатор
437	U.S. MS-DOS	x01
620	Mazovia (Polish) MS-DOS	x69
737	Greek MS-DOS (437G)	x6A
850	International MS-DOS	x02
852	Eastern European MS-DOS	x64
857	Turkish MS-DOS	x6B
861	Icelandic MS-DOS	x67
865	Nordic MS-DOS	Х66
866	Russian MS-DOS	x65
874	Thai Windows	x7C
895	Kamenicky (Czech) MS-DOS	x68
932	Japanese Windows	x7B
936	Chinese Simplified (PRC, Singapore) Windows	x7A
949	Korean Windows	x79
950	Traditional Chinese (Hong Kong SAR, Taiwan) Windows	x78
1250	Eastern European Windows	xC8
1251	Russian Windows	xC9
1252	Windows ANS!	x03
1253	Greek Windows	xCB
1254	Turkish Windows	xCA
1255	Hebrew Windows	x7D
1256	Arabic Windows	x7E
10000	Standard Macintosh	x04
10006	Greek Macintosh	x98
10007	Russian Macintosh	x96
10029	Macintosh EE	x97
А даты бывают разные
А даты бывают разные
Время - важнейшая характеристика нашего мира. С древних времен существовала проблема точного измерения времени. Люди придумали часы. Люди придумали календари. Причем календарей придумали несколько. И способов записи времени и дат придумали множество. Большая часть отсеялась вместе с «песками времени», но до сих пор в мире широко применяются несколько форматов записи времени и дат. Как правило, они привязаны к странам, в которых преимущественно используются.
В базах данных в записях таблиц поля, содержащие даты, встречаются очень часто. Даже если сама хранимая информация не требует привязки ко времени, вносят, например, дату заполнения записи или дату последней корректировки.
Программы при запуске, как правило, определяют текущую дату или при помощи пользователя, или самостоятельно, по системному времени. Эта дата используется, например, чтобы записывать события, происходящие в приложении, в журнал. Часто в процессе работы программы организуют файл (обычно с расширением .log), в который записываются важные этапы работы программы для того, чтобы, например, отследить в случае сбоя или «зависания» программы, какие действия выполнены, а какие нет. Это может помочь и восстановить утерянные данные, и отыскать ошибку в программе. Как правило, записи в таких log-файлах содержат дату и время, когда произошло описываемое событие. Какие же форматы записи дат поддерживает Visual FoxPro 9?
Форматы записи дат, поддерживаемые Visual FoxPro 9:
>	AMERICAN - мм/дд/гг;
>	ANSI - гг.мм.дд;
>	BRITISH / FRANCH - да/мм/гг;
>	GERMAN - дд.мм.гг;
>	ITALIAN - дд-мм-гг;
>	JAPAN - гг/мм/дд;
>	TAIWAN-.гг/мм/дд;
>	 USA - мм-дд-гг;
>	MDY - мм/дд/гг;
>	DMY - дд/мм/гг;
>	YMD - гг/мм/дд;
>	SHORT - определяется настройками формата короткой даты в Windows;
>	 LONG - определяется настройками формата длинной даты в Windows.
ГЛАВА 3 ▼ Введение в программирование
Здесь дд - день, мм - месяц, гг - год. По умолчанию устанавливается американский формат (AMERICAN). В России используется несколько другой формат записи дат. Он совпадает с форматом GERMAN. Как же установить желаемый формат? Для этого в Visual FoxPro 9 предусмотрена команда
SET DATE ТО <Формат>
Например:
SET DATE ТО GERMAN
Сделанная таким образом установка будет, к примеру, проявляться при отображении таблиц посредством команды BROWSE. Для любой переменной типа дата будет подразумеваться именно такой формат.
А помните, сколько разговоров было о проблеме 2000 года? Предрекали чуть ли не конец света. Некоторые проблемы действительно были. И труженики информационных технологий накануне смены веков дорабатывали и тестировали программное обеспечение. В чем, собственно, была проблема?
Дело в том, что часто для экономии времени и места год записывался и хранился в виде двух цифр. Подразумевалось, что при четырехзначном представлении даты первые две цифры будут 19. Соответственно, при наступлении 2000 года первое января запишется так - 01.01.00. А на самом деле что это за дата - 01.01.2000 или 01.01.1900? Поэтому основная доработка программного обеспечения и баз данных состояла в корректном переводе хранимых дат в формат с четырехзначным годом. Коснулась эта проблема и файлов с таблицами. Несмотря на то что dbf-формат позволяет корректно работать с четырехзначным годом, некоторые версии распространенных программных средств неправильно корректировали даты. Причем, пока год в дате отображался на экране в виде двух знаков, проблема зачастую была даже не видна.
По умолчанию год в составе даты отображается именно двумя знаками. Как увидеть все четыре знака? Для этого существует команда SET CENTURY.
SET CENTURY ON I OFF I TO
> ON - включает четырехзначное представление года;
> OFF - включает двухзначное представление года;
> ТО [<Век>] - устанавливает текущий век.
Если вы, например, выполните такую команду:
SET CENTURY ТО 22
и введете, например, год 05 в датах двумя знаками, в итоге получите даты -2305.
А даты бывают разные
Обычно в программах установки формата дат делают в самом начале программы. Например, так:
SET CENTURY ON
SET DATE TO GERMAN
Без сомнения, при работе с базами данных не обойтись без полей, хранящих время. О типах таких полей мы уже говорили во второй главе.
Иногда полезно разбить дату на составляющие - выделить год, месяц, число. Иногда полезно для вывода на экран или в текстовый файл преобразовать число в строку текста. Рассмотрим функции Visual FoxPro 9, позволяющие делать такое преобразование и еще некоторые нужные действия с датами и временем.
Функция DATE () возвращает значение текущей даты (системной даты, на которую ориентируется операционная система вашего компьютера). Помните, что формат года в этой дате (двухзначный или четырехзначный) зависит от того, выполнили ли вы команду SET CENTURY. Возвращаемое функцией DATE () /Значение будет иметь тип даты. Например:
gd_SDate = DATE()
Следует помнить и то, что дата запишется в том формате, который вы установили посредством команды SET DATE ТО.
Кроме текущей даты может потребоваться узнать и текущее время. Это можно сделать, используя функцию Т1МЕ(). Эта функция возвращает символьное значение.
gc_STime = TIME О
Время записывается в переменную в формате ЧЧ:ММ:СС, где ЧЧ - часы, ММ - минуты, СС - секунды.
Если требуется получить и текущую дату и текущее время вместе, используйте функцию DATETIME (). Возвращаемое значение при этом будет типа DateTime.
Как выделить из даты отдельные компоненты?
Функция DAY (<Выражение>) возвращает число, выделенное из выражения. Выражение может быть типа Date или DateTime. В качестве выражения можно подставлять переменные или функции, например DATE () или DATETIME ().
Функция MONTH (<Выражение>) возвращает числовое значение месяца, выделенное из выражения. Выражение может быть типа Date или DateTime. В качестве выражения можно подставлять переменные или функции, например DATE () или DATETIME ( ).
ГЛАВА 3 ▼ Введение в программирование
Функция YEAR (<Выражение>) возвращает год, выделенный из выражения. Выражение может быть типа Date или DateTime. В качестве выражения можно подставлять переменные или функции, например DATE () или DATETIME ( ).
Функция HOUR (<Выражение>) возвращает час, выделенный из выражения. Выражение должно быть типа DateTime. В качестве выражения можно подставлять переменные или функции, например TIME (). Возвращаемое значение может быть от 1 до 24.
Функция MINUTE (<Выражение>) возвращает минуты, выделенные из выражения. Выражение должно быть типа DateTime. В качестве выражения можно подставлять переменные или функции, например Т1МЕ().
Функция SEC (<Выражение>) возвращает секунды, выделенные из выражения. Выражение должно быть типа DateTime. В качестве выражения можно подставлять переменные или функции, например Т1МЕ().
Неко торые команды для вывода данных на экран или в файл предпочитают работать с символьными значениями. Как совершить быстрое преобразование? Visual FoxPro 9 предоставляет в ваше распоряжение несколько функций преобразования из одного типа данных в другой.
DTOC (<Выражение>) - преобразует выражение в формате Date или DateTime в символьное выражение.
CTOD(<Выражение>) - преобразует символьное выражение в выражение в формате Date.
СТОТ (<Выражение>) - преобразует символьное выражение в выражение в формате DateTime.
TTOD (<Выражение>) - преобразует выражение в формате DateTime в выражение в формате Dale.
DTOT (<Выражение>) - преобразует выражение в формате Date в выражение в формате DateTime.
Проиллюстрируем использование функций для работы с датами на практическом примере. Создадим функцию проверки корректности введенной пользователем даты. Допустим, что введенная пользователем дата передается нашей функции в виде параметра. Будем возвращать Тгие(.Т), если проверка прошла успешно, и False(.E), если дата не удовлетворяет нашим условиям. Кроме того, будем выводить сообщение, если дата не верна. Условия для проверки примем следующие:
>	дата должна быть текущей или более ранней;
>	год должен быть больше 2000.
А даты бывают разные
Для создания функции выполните следующие действия:
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
2.	Откроется окно, в котором нужно найти созданную нами ранее папку example.
3.	Выберите из меню File (Файл) команду New (Новый) или щелкните мышью по кнопке Q на панели инструментов Стандартная. Откроется окно, представленное на рис. 3.1. Выберите пункт Program (Программа), а затем щелкните мышью по кнопке New file (Новый файл). Откроется пустое окно, предназначенное для ввода текста программы.
4.	Введите следующий ниже текст функции:
FUNCTION ALVDateTest(td_In)
DO CASE
CASE td_ln > DATED
MESSAGEBOX('Введенная дата 1 + DTOC(td_In) ;
+ 1 более поздняя, чем текущая!', 16)
11_RC = .F.
CASE YEAR(tdJn) < 2000
MESSAGEBOX('Введенная дата ' + DTOC(td_In) ,-+ ' должна быть после 2000 года!', 16)
11_RC = . F.
OTHERWISE
11_RC = .T.
ENDCASE
RETURN 11_RC
5.	Сохраните программу в файле, для чего выберите в меню File (Файл) команду Save (Сохранить) или щелкните по кнопке Q на панели инструментов Стандартная. В результате откроется стандартное окно сохранения документа, где тип файла уже будет указан, а от вас потребуется указать имя файла. Назовем наш файл с программой ALVDateTest. Щелкните мышью в поле Save Document (Сохранить документ) и введите ALVDateTest. После этого щелкните мышью по кнопке Сохранить (Save).
6.	В окне Command введите команды:
SET CENTURY ON
SET DATE GERMAN
ALVDateTest(DATE() + 1)
ГЛАВА 3 ▼ Введение в программирование
7.	В результате появится окно с сообщением о том, что введена дата больше текущей. Это произошло, потому что мы указали в качестве аргумента функции функцию DATE (), которая возвращает текущую дату, и прибавили к ней еще один день, то есть получилась завтрашняя дата. Щелкните по кнопке ОК.
Работа с файлами
Работу с записями таблиц, хранящихся в файлах с расширением .dbf, мы рассматривали во второй главе. Для этих целей в Visual FoxPro 9 существует довольно много удобных и эффективных команд. Но для работы с обычными текстовыми файлами эти команды совершенно не пригодны. А необходимость работать с текстовыми файлами возникает весьма часто. Их используют и для вывода текстовых документов (какой-либо отчетности), и для ведения журналов работы программ. Иногда требуется распознавание и ввод данных в таблицы из текстового источника.
Visual FoxPro 9 предоставляет разработчику несколько возможностей для работы с текстовыми файлами. Во-первых, можно перенаправить стандартный вывод с экрана (куда он направлен по умолчанию) в файл. Во-вторых, можно использовать набор команд для низкоуровневой работы с файлами, аналогичный наборам в других языках программирования высокого уровня. Даже имена большинства этих команд совпадают с именами команд, например, в языке С.
Рассмотрим первый способ, ориентированный только на вывод текстовой информации.
В Visual FoxPro 9 есть команда ?. Она осуществляет вывод информации, находящейся следом за ней. Например:
? "Это строка текста"
? ln_MyNum
? DATE()
По умолчанию вывод осуществляется на экран. Можете ввести указанные выше команды в окне команд Visual FoxPro 9 (Command) и посмотрите результат вывода в рабочем поле основного окна Visual FoxPro 9. Если будете это проделывать, обратите внимание, что вторая команда выводит значение переменной ln_MyNum, а значит, этой переменной надо предварительно присвоить какое-либо значение (например, ln_MyNum = 2005).
Работа с файлами
Как же направить вывод не на экран, а в файл? Способ достаточно хитрый, но часто используемый. Надо применить последовательно группу следующих команд:
SET CONSOLE OFF && Отключаем вывод на экран
SET PRINTER ON && Включаем вывод на принтер/в файл
SET PRINTER ТО <Имя_файла> && Направляет вывод в конкретный файл
После выполнения этих команд все, что выводится командой ?, будет попадать в указанный файл. Если файл не существовал, он будет создан. Если файл существовал, он будет перезаписан (все старые данные в файле будут утеряны!). Можно при вводе команды SET PRINTER ТО указать ключевое слово ADDITIVE. В этом случае файл не будет пересоздаваться, а текст в существующий файл будет дописываться. Только желательно не забыть после всех команд ? использовать группу команд, приведенных ниже.
SET PRINTER ТО && Отключаем вывод в конкретный файл
SET PRINTER OFF && Отключаем вывод на принтер/в файл
SET CONSOLE ON && Включаем вывод на экран
Чем удобен такой подход? Применять команду ? проще. Как минимум меньше набирать на клавиатуре. И часть операций по открытию, закрытию и позиционированию в файле будет за вас выполнять Visual FoxPro 9.
Когда требуется и записывать в файл, и читать из него, не обойтись без набора команд для низкоуровневой работы с файлами. Рассмотрим основные команды.
Перед записью или чтением файла его надо открыть. Для этого используется функция:
FOPEN(<Имя_файла>[, <Атрибут>])
> <Имя_файла> - имя открываемого файла. Можно указывать файл с полным путем к нему;
> <Атрибут> - позволяет указать, какие действия над содержимым файлов вы предполагаете проделывать. Варианты:
-	О - только чтение (по умолчанию);
-	1 - только запись;
-	2 - чтение и запись.
Если файл успешно открылся, то функция FOPEN () вернет указатель на файл, который непременно надо сохранить в переменную. Если при открытии файла возникли ошибки, вернется отрицательное значение. Например:
ГЛАВА 3 ▼ Введение в программирование
gn_f = FOPEN("MyFile.txt")
IF gn_f < О
MESSAGEBOX("Ошибка открытия файла", 16) ENDIF
Если файл требуется создать, имеет смысл воспользоваться командой FCREATE(<Имя_файла> [,. <Атрибут>] ). После создания файл сразу открывается автоматически. Если файл успешно открылся, то функция FCREATE () вернет указатель на файл, который надо сохранить в переменную. Если при открытии файла возникли ошибки, вернется отрицательное значение. Атрибут при использовании функции FCREATE () имеет несколько более широкое значение. Имеются в виду атрибуты файла. Он может принимать следующие значения:
>	0 - чтение и запись (по умолчанию);
>	1 - только чтение;
>	2 - скрытый;
>	3 - только чтение/скрытый;
>	4 - системный;
>	5 - только чтение/системный;
>	б - системный/скрытый;
>	7 - только чтение/скрытый/системный.
Например:
gn_f = FCREATE("MyFile.txt", 2)
IF gn_f < 0
MESSAGEBOX("Ошибка создания файла", 16)
ENDIF
Будет создан скрытый файл (при соответствующих настройках файловых менеджеров пользователи не будут видеть этот файл) с именем MyFile.txt.
Файл мы создали. Самое время научиться записывать в него какие-либо данные. Для этого предназначена целая группа функций. Рассмотрим основные.
FPUTS(<Указатель>, <Выражение>[, <Количество_символов>]) -записывает в файл, на который ссылается указатель, символьное выражение. Если указать третий параметр, то запишется не все выражение, а только указанное количество символов. Например:
FPUTS(gn_f, "Эта строка запишется в файл")
FPUTS(gn_f, lc_MySting)
FWRITE(<VKa3aTenb>, <Выражение>[, <Количество_символов>]) -записывает строку в указанный файл аналогично команде FPUTS (). Разница между этими функциями заключается в том, что FPUTS () автоматически помещает в конец
Работа с файлами
записываемой строки символ перевода строки и символ конца строки, а FWRITE() этого не делает.
FWRITE(gn_f, "Эта строка запишется в файл")
FWRITE(gn_f, lc_MySting)
Разберемся теперь с чтением записанной в файлы информации.
FGETS(<Указатель> [, <Количество_символов>]) - читает из файла, на который ссылается указатель, указанное количество символов (по умолчанию 254). Максимальное возможное количество символов - 8192. Если встретится символ перевода строки или символ конца строки, то вернутся символы с начала строки и до этого места. Функция FGETS () возвращает строковое значение. Например:
lc_MySting = FGETS(gn_f)
Есть и другая функция чтения данных из файла - FREAD ().
FREAD(<Указатель>, <Количество_символов>) - читает из файла, на который ссылается указатель, указанное количество символов. В отличие от функции FGETS (), указание количества символов является обязательным. Максимально возможное количество символов - 65535. Функция FREAD () возвращает строковое значение. Например:
lc_MySting = FREAD(gn_f, 200)
Прежде чем прочитать данные, часто требуется переместить курсор в файле на нужное место. Это действие можно осуществить с помощью команды FSEEK.
FSEEK(<Указатель>, <На_сколко_переместить>[, <Относительно_чего>])
> <На_сколко_переместить> - указывается число в байтах, на которое требуется переместить курсор. Если не указывать третий параметр, курсор будет перемещен относительно начала файла. Допускаются и положительные значения, и отрицательные. При положительных значениях курсор будет перемещаться в сторону конца файла, а в случае отрицательных значений - в сторону начала файла;
> <Относительно_чего> - позволяет задать, относительно какого места в файле совершать перемещение. Возможные варианты: 0 - начало файла, 1 - Текущее положение, 2 - конец файла.
Как определить момент, когда мы достигли конца файла? Для этого есть функция FEOF (<Указ ате ль>). Она возвращает логическое значение. Если конец файла достигнут, вернется True (.Т.).
ГЛАВА 3 ▼ Введение в программирование
Когда все действия по записи или чтению завершены и больше никаких действий с файлом не предполагается, надо закрыть файл, используя команду FCLOSE(<Указатель>).
Вы, наверное, заметили, что во всех низкоуровневых командах работы с файлами мы используем указатель на файл. Это позволяет открывать и работать сразу с несколькими файлами. Однако, если для реализации задачи этого не требуется, лучше не держать открытыми большое количество файлов.
Попробуем освоить на практике работу с файлами. Допустим, нужно составить программу, которая читает строки из многострочного исходного файла (в котором хранится текст из нескольких строк) и записывает прочитанные строки без символов перевода строки в другой файл. Получается, что мы переписываем текст, состоящий из нескольких строк, в одну длинную строку. Для этого выполните следующие действия:
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
2.	Откроется окно, в котором нужно найти созданную нами ранее папку example.
3.	Выберите из меню File (Файл) команду New (Новый) или щелкните мышью по кнопке Р| на панели инструментов Стандартная. Откроется окно, представленное на рис. 3.1. Выберите пункт Program (Программа), а затем щелкните мышью по кнопке New file (Новый файл). Откроется пустое окно, предназначенное для ввода текста программы.
4.	Ведите следующий ниже текст программы:
PARAMETERS tc_fname_from, tc_fname_to && Принимаем параметры
SET TALK OFF && Запрещаем вывод служебных сообщений
SET CENTURY ON && Год - четыре знака
SET DATE GERMAN && Дата дд.мм.гггг
SET CONSOLE OFF && Отключаем вывод на экран
SET PRINTER ON && Включаем вывод на принтер/в файл
SET PRINTER ТО alvtr.log ADDITIVE && Вывод в файл
? ТТОС(DATETIME()) + ' - Запуск программы' && Сообщение в журнал
* Если параметры пустые - запустили без указания параметров
IF EMPTY(tc_fname_from) OR EMPTY(tc_fname_to)
MESSAGEBOX("USE: ALVTR <file_from> <file_into>", 16) ? TTOC(DATETIME()) + ' - Параметры заданы с ошибкой' RETURN -1 && Завершаем программу с ошибкой
ENDIF
Работа с файиатм
ln_fp = FOPEN(ALLTRIM(tc_fname_from)) && Открываем исходный ln_fpl= FCREATE(ALLTRIM(tc_fname_to)) && Создаем результируюадлй
IF ln_fp < 0 OR ln_fpl < 0
MESSAGEBOX("Невозможно открыть или создать файл", 16)
? ТТОС(DATETIME()) + ' - Невозможно открыть файл(ы)'
RETURN -1 && Завершаем программу с ошибкой
ENDIF
? ТТОС(DATETIME()) + ' - Начало обработки'
DO WHILE !FEOF(ln_fp) && Обрабатываем, пока не конец файла lc_St = fgets(ln_fp) && Читаем строку из входного файла =FWRITE(ln_fpl, lc_St + " '') && Записываем строку в выходной файл * При записи в выходной файл вместо конца строки ставим пробел
ENDDO
? ТТОС(DATETIME()) + ' - Конец обработки’
= FCLOSE(ln_fp) && Закрываем файлы = FCLOSE(ln_fpl)
SET PRINTER TO && Отключаем вывод в файл
SET PRINTER OFF
SET CONSOLE ON && Включаем вывод на экран
MESSAGEBOX(”Обработка закончена”)
RETURN 1
5.	Сохраните программу в файле, для чего выберите из меню File (Файл) команду Save (Сохранить) или щелкните по кнопке Q на панели инструментов Стандартная. В результате откроется стандартное окно сохранения документа, где тип файла уже будет указан, а от вас потребуется указать имя файла. Назовем наш файл с программой ALVTR. Щелкните мышью в поле Save Document (Сохранить документ) и введите ALVTR. После этого щелкните мышью по кнопке Сохранить (Save).
6.	Прежде чем запускать на выполнение программу, надо заготовить текстовый файл, на котором будем проверять работу программы. Для этого откройте окно редактора файлов (File (Файл) > New (Новый), в появившемся окне выберите Text file (Текстовый файл) и щелкните мышью по кнопке New file (Новый файл)). В появившемся окне редактора введите несколько строк, нажимая для перехода на новую строку клавишу Enter.
ГЛАВА 3 ▼ Введение в программирование
Закройте это окно мышью и на запрос о сохранении файла ответьте Yes (Да). В появившемся стандартном окне сохранения файла укажите имя mytxt.txt и сохраните его в нашей папке example.
7.	В окне Command введите команду
DO ALVTR WITH "mytxt.txt", "myres.txt"
8.	В результате появится окно с сообщением о том, что обработка закончена. Щелкните по кнопке ОК.
9.	Проверьте, что на диске в папке example появился файл с результатом работы программы myres.txt. Откройте его и посмотрите его содержимое.
10.	Откройте файл alvtr.log и посмотрите, в каком виде записался протокол работы нашей программы.
Итоги главы
Подводя итог этой главы, отметим, что мы пользовались процедурным подходом к программированию. Для обучения и знакомства с азами программирования такой подход вполне годится, однако современное программное обеспечение в подавляющем большинстве основывается на объектно-ориентированном подходе к созданию приложений. Мы коснемся вопросов объектно-ориентированного программирования в четвертой главе.
Правила именования переменных, объявление массивов, конструкции циклов и ветвлений программ - все это справедливо и для объектно-ориентированного программирования. Очень многое из того, что мы изучили в теории и на практике в третьей главе, пригодится нам для создания полнофункционального приложения.
Работа
с проектом
В предыдущих главах мы обсудили вопросы, связанные с установкой Visual FoxPro 9, созданием полноценной базы данных с контролем целостности, работой с данными в базе данных. Мы ознакомились с классическими командами Visual FoxPro и возможностями, предоставляемыми встроенным языком запросов SQL. Кроме того, мы приобрели навык создания простых программ, включающих процедуры и функции Visual FoxPro 9 и созданные нами процедуры и функции.
Настало время познакомиться с Visual FoxPro 9 как с инструментальным средством создания мощных приложений, работающих и с базами данных Visual FoxPro, и с базами данных других СУБД, например Microsoft SQL Server или Oracle. Visual FoxPro 9 позволяет создавать приложения, обладающие развитым и удобным интерфейсом пользователя и формирующие разнообразные отчеты для печати, экспортирующие и импортирующие данные в формате XML.
Создание приложения начинается с создания проекта. Проект - это своеобразный контейнер для различных элементов будущего приложения. Как создать проект?
ГЛАВА 4 ▼ Работа с проектом
Как создать новый проект. Что при этом происходит
File type
; ® Project
1 О Database ;Qlable < О Query
Г.* t < -
О Form
О Report
О Label
О Prspram
' O^l^ss
О Text file
Ohlenu
Рис. 4.1 тСкно New
Создание нового проекта начинается с выбора команды New (Новый) из меню File (Файл) или с щелчка мышью по кнопке Q- Появится диалоговое окно, представленное на рис. 4.1.
В области File type (Тип файла) следует выбрать значение Project (Проект). Далее есть два варианта действий: выбрать кнопку New file (Новый файл) и писать текст основной программы и создавать все части проекта самостоятельно или воспользоваться Мастером для автоматизированного создания проекта (Wizard).
Если выбрать первый вариант действий (кнопку New file - Новый файл), то сразу появится окно создания файла, где требуется указать имя проекта (это имя будет использовано в качестве имени файла проекта с расширением .pjx и по умолчанию для итогового исполнимого файла). После того как вы введете имя проекта, появится окно проекта, где в виде дерева будут представлены разделы проекта, например Data (Данные), Code (Программный код) и так далее.
Создание при помощи Мастера
Если выбрать второй вариант действий и воспользоваться услугами Мастера (Wizard), то на экране появится первое окно Мастера приложений (Application Wizard), представленное на рис. 4.2. В этом окне следует ввести имя проекта и выбрать папку, где проект будет располагаться. Флажок Create project directory structure (Создать структуру папок проекта), установленный по умолчанию, определяет, создадутся ли автоматически в указанной вами папке проекта специализированные папки для хранения данных, программ, библиотек, графических изображений и так далее. Лучше не снимать этот флажок.
После щелчка мышью по кнопке ОК начнется процесс генерации различных компонентов приложения, о чем сигнализируют сообщения на экране. Вам в это время надо просто ждать, ничего не трогая. По окончании формирования компонентов приложения появится окно Project Manager (Менеджер проектов) и окно Application Builder (Построитель приложения), как это показано на рис. 4.3.
Как создать новый проект. Что при этом происходит
/ Application Wizard	Kd i
Select а Йе name and beaten for your new application: Project name-
: ’ InStaff
Piojgcl lite__	___
i dAaneKceftXbookXexampleXinstafNnStafl pjx
0 Create protect directory structure
| OK I [ Cancel |
Рис. 4.2 ▼ Окно определения имени и местоположения проекта
-г Microsoft Visual FoxPro
File Edit View Tools Program Window Help
Hj	j I'O^rg'aJ^ e 5?
t "dan Гпч1лП	' S
4 All | Data Ц Docs < Cis Code |5 Oth | Q
Q M
I	-(5j	Databases
|	j*=-gssJ	Free Tables
 @	Queues
let И Documents i mP *||\. Class Libraries I L-' □ Code t	H-O	Programs
• - El in«talf_app г	E) setobjrf
•	0	API Libraries
।	i*	Applications
i P Я Other г i.+! Menus
fc+ Pl T ext Files
+ Q3 Other Files
, ^1.;.^- -.............................:,
General,| CreditsDcrta ilFormsReports 1 Advanced!
Name; | InStaff
Image: 	I
/-Common Dialogs----------------—----
0 Splash screen PI Quick start
r 0 About dialog [j IJser logins
Description' iPath:

Command	О
DO d: \ алексей\Ьоок\exainple\ inscaf f\progs\ instaf f_app.prg	a(
CREATE PROJECT
Application Builder Л I-Ji
Рис.4.3т Вид экрана после создания проекта Мастером
ГЛАВА 4 ▼ Работа с проектом
Application Builder
При помощи окна Application Builder (Построитель приложения) можно задать параметры приложения. Изучим, какие именно. Рассмотрим каждую из вкладок окна.
Вкладка General
General (Общие) представлена на рис. 4.4 и включает поле Name (Имя), содержащее название проекта, поле Image (Изображение), в котором можно указать имя файла с картинкой - она станет фоновой для рабочего поля окна приложения. Например, в качестве такой картинки может быть использован логотип предприятия или ваш вензель. Конечно, к этому моменту изображение уже должно быть создано в каком-либо графическом редакторе.
^plication
Рис. 4.4 т Вид вкладки General
В группе Common Dialogs (Общие диалоговые окна) содержатся следующие флажки:
>	Splash screen (Заставка) - если установлен, то в момент загрузки приложения отображается окно с заставкой;
>	About dialog - если установить флажок, автоматически будет создано справочное диалоговое окно с краткой информацией о приложении. В русскоязычном варианте это окно обычно называется О программе. В нем автоматически отображается информация, введенная вами на вкладке Credits;
Как создать новый проект. Что при этом происходит
>	Quick start (Быстрый запуск) - позволяет при запуске приложения выводить окно для быстрого запуска какого-либо компонента приложения;
>	User logins (Идентификация пользователя) - определяет, что требуется при запуске приложения проверять имя пользователя и пароль.
Опытные программисты, как правило, не устанавливают ни один из этих флажков, а прописывают в программе вызов соответствующих окон вручную. И окна, соответственно, тоже делают сами.
Переключатель режимов Application type (Тип приложения) позволяет выбрать одно из следующих значений:
>	Normal - приложение будет запускаться в стандартном окне Visual FoxPro 9, используя стандартное окружение, включая системное меню;
>	Module - приложение добавляется к существующему проекту или будет вызываться из другого проекта;
>	Top-Level - приложение будет работать в собственном окне. Поддерживается MDI-окно, то есть окно приложения с собственным рабочим полем, в котором могут открываться несколько дочерних окон.
Еще одно свойство окна приложения, которое можно задать, - пиктограмма (значок) основного окна приложения. Эта пиктограмма должна быть предварительно создана в редакторе и иметь расширение .ico. В группе Icon (Пиктограмма) можно щелкнуть мышью по кнопке с многоточием и в появившемся стандартном диалоговом окне открытия файла выбрать файл с пиктограммой. В результате он отобразится для предварительного просмотра в группе Icon.
Вкладка Credits
Вкладка Credits содержит поля, описывающие авторские и имущественные права на создаваемое приложение и его версию. Эта информация часто отображается в окне О программе. Пример заполнения этой вкладки представлен на рис. 4.5.
Вкладка Data
Data (Данные) позволяет добавить в проект таблицы, а также создать новые таблицы, которые будут включены в проект. Список таблиц проекта отображается в виде таблицы (рис. 4.6).
На этой же вкладке присутствуют два раскрывающихся списка, определяющие стиль внешнего вида форм проекта и отчетов, - соответственно Form Style и Report Style.
ГЛАВА 4 ▼ Работа с проектом
Рис. 4.5 т Вид вкладки Credits
Genetal Credits^ Data | Forms j| Report* | Advanced	'
'__________ _________________•
I He|p 1	,	I.....GK 1 L  £*** J
Рис. 4.6 т Вид вкладки Data
Вкладки Forms и Reports
Вкладки Forms (Формы) и Reports (Отчёты) содержат перечни имеющихся в проекте форм и отчетов и при помощи флажков позволяют сделать некоторые настройки (рис. 4.7). Обычно и формы и отчеты настраивают при помощи Form Designer (Дизайнера форм) и Report Designer (Дизайнера отчетов).
Как создать новый проект. Что при этом происходит
General Cjedilsjl Data Forrns. [Reports.Advanced ,__________ _____ _____ I
«nl	л	----------------------5 |
<	" —Name: . Forml Form	’
:	Q Single instance	’
!	’ Q Use Navigation toolbar
Q Use Navigationmenu
;	Q Appear in File New dialog
!	i □ Appear in File fipen dialog	I
!  у I 11 £<м 11, a°™v» 11
J	...JI ["^Cancel::, -1
Рис. 4.7 ▼ Вид вкладки Forms
Вкладка Advanced
На вкладке Advanced (рис. 4.8) присутствует поле Help file (Файл справки) для выбора файла со справочной информацией, поле Default data directory (Папка с данными по умолчанию), позволяющее указать папку, где находятся файлы таблиц с данными. Указание папки может несколько облегчить вставку таблиц в проект.
1/Ip^SEn Йм1|<1«1Я:<аЯД	□ g
General Д Credits || Data |[ Font» r| Reports Advanced™)
Help file:	r [] j
Default data directory:	D:\INSTAFF\DArA\	| j
z Menus------------- — ..—	a-----------. i
* A Standard toolbar	'	.J	r
s 0 Favorites menu	>	j
1“
[ Help |	| OK | { Cancel |
Рис. 4.8 т Вид вкладки Advanced
ГЛАВА 4 ▼ Работа с проектом
На этой же вкладке отображена группа Menus (Меню), включающая два флажка:
> Standard toolbar - определяет, будет ли присутствовать в окне вашего приложения стандартная панель инструментов;
> Favorites menu - определяет, будет ли присутствовать в основном меню вашего приложения пункт Favorites (Избранное).
Кнопка Cleanup (Очистить) синхронизирует проект и изменения в окне Application Builder (Построитель приложения).
Окно Project Manager
Рассмотрим подробнее окно Менеджера проектов (Project Manager). Пример такого окна представлен на рис. 4.9.

* Data
А-® Documents
••• aboutftm s Reports Labels H\ Class Libraries
[ S О Cod® fa О Programs
1 "'El main
j [c] API Libraries
	-- Applications
K-j'B Other I £- ИГ Menus i 1? ismenu
’ Hl T ext Files QjQ Other Files
Description: Path:
Рис. 4.9 т Окно Project Manager
Компоненты проекта представлены в виде дерева. На вкладке АН (Все) представлены все компоненты. На других вкладках можно увидеть те же компоненты, но разбитые по назначению. В принципе, можно всегда работать с вкладкой АН (Все). Но иногда удобнее перейти, например, на вкладку Data (Данные) и поработать только с таблицами проекта, не отвлекаясь на другие части проекта.
Как создать новый проект. Что при этом происходит
На какие части разбит проект в окне Менеджера проектов? На вкладке All (Все) представлены группы:
> Data (Данные) - содержит ветви для работы с источниками данных, куда входят базы данных (Databases), свободные таблицы (Free Tables) и запросы (Queries);
> Documents (Документы) - включает в себя папки Forms (Формы), Reports (Отчеты) и Labels (Наклейки);
> Class Libraries (Библиотеки классов) - содержит папки классов для приложения;
> Code (Программный код) - включает программы (Programs), библиотеки API (API Libraries) и исполнимые приложения (Applications). Имя основной программы выделено полужирным шрифтом. Эта программа запускается первой автоматически при запуске приложения на выполнение;
> Other (Другие) - содержит папки Menus (Меню), Text Files (Текстовые файлы) и Other Files (Другие файлы). Обычно в папку Other Files (Другие файлы) включают используемые в приложении изображения.
В правой части окна Менеджера проектов располагаются кнопки. Для чего они?
> New (Новый) - создает новый объект указанного типа. Если вы, например, выделили папку Forms (Формы) и щелкнули мышью по кнопке New (Новый), откроется окно Form Designer (Дизайнера форм) для создания нового диалогового окна;
>	Add (Добавить) - добавляет существующий объект в выделенную папку;
>	Modify (Изменить) - позволяет изменить выделенный объект, открывая соответствующий редактор;
>	Run (Запустить) - запускает на выполнение исполнимые файлы;
>	Remove (Удалить) - удаляет объект из проекта, причем дает возможность выбрать, удалять ли только ссылку в проекте или еще и файл, содержащий объект, с диска;
> Build (Построить) - вызывает диалоговое окно параметров построения приложения, где можно выбрать результат построения. Можно перекомпилировать весь проект (Rebuild project), можно создать приложение (Application (арр)), исполнимый файл для ОС Windows (Win32 execu-table/COM server (exe)), динамическую библиотеку (dll) типа Single-threaded или Multi-threaded. При щелчке мышью по кнопке Version (Версия) в этом окне можно заполнить поля с описанием авторских и имущественных прав на создаваемое приложение и его версию.
ГЛАВА 4 ▼ Работа с проектом
Р Чтобы сделать программу основной, надо в окне проекта щелкнуть по ее имени правой клавишей мыши и в появившемся контекстном меню выбрать команду. Имя программы при этом выделится полужирным шрифтом.
Попробуем на практике
Создадим реальный проект. Для этого выполните следующие действия:
1.	Создайте в папке example папку InStaff.
2.	В этой папке создайте еще несколько папок, как показано на рис. 4.12.
3.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку InStaff.
4.	Выберите команду New (Новый) из меню File (Файл) или щелкните мышью по кнопке Q. Появится диалоговое окно, представленное па рис. 4.1.
5.	В появившемся окне, в переключателе File type (Тип файла) выберите значение Project (Проект) и щелкните мышью по кнопке New file (Новый файл). Появится окно, где требуется указать расположение папки с проектом и имя проекта. Укажите созданную вами папку InStaff (скорее всего, вы будете находиться в ней сразу) и в поле Enter project file (Введите файл проекта) введите InStaff. Должно получиться, как показано на рис. 4.10.
6.	Щелкните мышью по кнопке Сохранить (Save). Появится окно проекта Project Manager (Менеджера проекта).
7.	Основа проекта создана. Но какие команды будут выполняться при запуске приложения? Где они записаны? Пока нигде. Нужно создать основную программу. Для этого откройте папку Code (Программный код) и щелкните в ней мышью по папке Programs (Программы), а затем по кнопке New (Новый).
8.	В появившемся окне введите приведенный ниже текст программы:
******************************
*	Основная программа проекта *
******************************
SET TALK OFF && Отключаем вывод служебных сообщений
SET DATE ТО GERMAN && Формат даты дд.мм.гггг
Работа с формами. Красиво оформляем окно
SET CENTURY ON && Год четырьмя цифрами
SET ESCAPE OFF && Запрещаем прерывать выполнение по ESC
*	Перечислим пути, где искать файлы
SET PATH ТО LIBS, PRG, MENUS, DATA, REPORTS
ON SHUTDOWN DO ALVExitProc
PUSH MENU .MSYSMENU
DO ismenu.mpr
-SCREEN.Visible = .T.
READ EVENTS && Запускаем обработку событий
*	Восстанавливаем настройки
POP MENU _MSYSMENU
ON SHUTDOWN
*	Процедура завершения программы
PROCEDURE ALVExitProc
CLEAR EVENTS
RETURN 0
9.	После ввода текста программы сохраните ее в файле, для чего выберите команду Save (Сохранить) из меню File (Файл). В появившемся диалоговом окне выберите папку PRG, находящуюся в созданной вами папке InStaff. Введите имя файла программы. Назовем его main.
10.	Обратите внимание: имя программы main выделено полужирным шрифтом, что говорит о том, что эта программа является основной и запускается первой при запуске приложения (см. рис. 4.9).
11.	Щелкните мышью по кнопке Modify (Изменить). Откроется окно с текстом программы main (имя программы будет стоять в заголовке окна с текстом программы). Таким образом, можно вносить исправления в программу.
12.	Закройте окно программы.
Работа с формами. Красиво оформляем окно
При работе в операционной системе Windows мы постоянно сталкиваемся с диалоговыми окнами. При помощи таких окон и задаются параметры приложений и выводится оперативная информация. При помощи стандартных диалоговых окон осуществляется открытие и сохранение файлов. Диалоговые окна используются и для отображения информации, хранящейся в базе данных.
ГЛАВА 4 ▼ Работа с проектом
Рис. 4.10 ▼ Окно сохранения проекта
т Основная программа проекта '
gi SET TALK OFF	j |
gg SET DATE TO GERMAN	1 I
gg SET CENTURY ON	’ .
SET ESCAPE OFF	| j j
SET PATH TO LIBS, PRG, MENUS, DATA, REPORTS H
 ON SHUTDOWN DO	ALVExitProc
1П PUSH MENU _MSYSMENU	I	j-
ШН DO iswenu.mpr	j	i
_SCREEN.Visible = .T.
READ EVENTS	i |	|
Tj-p	* Восстанавливав и настройки	Ji
|Ц	POP MENU -KSYSMENU	'
gg ON SHUTDOWN	| |
~ Процедура завершения	программы	|
PROCEDURE ALVExitProc	|
	CLEAR EVENTS	I
RETURN 0	> !
<1.T!	..":	'	:' 3'
Рис. 4.11 ▼ Текст основной программы
Работа с формами. Красиво оформляем окно
Файл Главка Вид Избранное Сервис ^правка
Рис. 4.12 ▼ Структура папок проекта
Создание новых окон
Вы можете включать диалоговые окна в свой проект. Из окна Project Manager (Менеджер проектов) можно вызывать специальный редактор для создания форм (термин для обозначения диалоговых окон в Visual FoxPro 9) -Form Designer (Дизайнер форм). Это можно сделать щелчком мышью по папке Forms (Формы), а затем по кнопке New (Новый). Появится диалоговое окно, представленное на рис. 4.13.
При щелчке по кнопке New Form (Новая форма) появляется окно Form Designer (Дизайнер форм), показанное на рис. 4.14.
Рис. 4.13т Окно для выбора способа создания формы
Рис. 4.14 т Окно Form Designer
ГЛАВА 4 ▼ Работа с проектом
В этом окне размещается заготовка формы с линиями сетки для удобства ориентации при размещении элементов диалогового окна. При отображении созданной формы в работающем приложении эти линии показаны не будут.
Панель инструментов Form Designer
Для создания новых элементов в форме используется панель инструментов, на которой размещены следующие кнопки:
А статический текст;
ЁЫ1 текстовое поле;
Д область редактирования;
Г~1 кнопка;
группа кнопок;
(7 переключатель режимов;
флажок режима;
3 раскрывающийся список;
список;
Ц] числовые кнопки (увеличение и уменьшение числовых значений);
та таблица (элемент Grid);
Щ изображение;
@ таймер;
вкладки;
Щ элемент ActiveX (OLE-объект);
связанный элемент ActiveX (OLE-объект);
\ линия;
графическая фигура;
|д] контейнер для элементов;
□С разделитель;
гиперссылка.
Чтобы воспользоваться инструментом для создания элемента формы, надо щелкнуть мышью по соответствующей кнопке на панели инструментов, а затем установить указатель мыши в то место на форме, где должен оказаться левый верхний угол создаваемого элемента. После этого надо нажать левую кнопку мыши и, удерживая ее в нажатом состоянии, переместить указатель мыши в то
Работа с формами. Красиво оформляем окно
место на форме, где должен находиться правый нижний угол создаваемого элемента. Например, мы хотим разместить в форме кнопку. Для этого надо щелкнуть по кнопке । 1 на панели инструментов, а затем выделить мышью область в форме, где должна быть размещена кнопка, как показано на рис. 4.15.
Рис. 4.15 т Размещение кнопки в форме
Вокруг элемента появятся черные квадратики. Если навести указатель мыши на квадратик (указатель мыши при этом поменяет свое изображение), нажать левую клавишу мыши и, не отпуская ее, передвигать указатель мыши, размер элемента будет меняться. Если вы решили изменить размеры элемента, когда квадратиков уже не видно, щелкните по элементу, и они появятся вновь.
Для перемещения элемента окна в другое место просто перетащите его мышью с нажатой левой клавишей.
Более точного, чем мышью, перемещения элемента можно добиться, щелкнув по элементу мышью, чтобы вокруг него появились квадратики, а затем нажимая кнопки со стрелками на клавиатуре.
Для более точного задания размера элемента щелкните по нему мышью и, нажав и удерживая клавишу Shift на клавиатуре, нажимайте кнопки со стрелками.
Свойства элементов окна
Для каждого элемента окна формы и для самого окна формы существует определенный набор свойств. Они отображаются в отдельном окне. Такое окно со свойствами окна формы показано на рис. 4.16.
ГЛАВА 4 ▼ Работа с проектом
Properties - aboulfrm.sr х
fill Form!___________________fxL
АН, |_Dala Meth| Layut. * 0 thef Fave*
X a __________________7й--------
7;> Activate [Default] * Ж
; ~___________________________~
г U^AtWhject [Default]_______
£ ^Ad^tqperty. [Default]____
i p AfterDock (Default]_____
^'l3?jAlGw0utput ^Т^Лгие [Defat и
:	Aiwa^nBo ,F. - False (Defa
? !>УAlwaysOnfo .F. False [Defa p
7	AutoCenter .F. • Fajse (Dela
ign BackCdor 22*223.227	‘
; ^J^$eOa$£__ Fcvm___________ i
:	BeforeDock; [Default]
- t*1 BndCorirds_.Tp_True (Defat I |ЁУ В orders tyteii 3-Sizable (Dek J p^Bcx[Default][vj
References the active control on an : I object	-------“
Имя файла формы
Объект, чьи свойства перечислены
Выбор возможных значений текущего свойства
Свойства объекта
Пояснение текущего свойства
Рис. 4.16v Свойства окна формы
Свойств перечислено в окне достаточно много. Кроме свойств для каждого элемента перечислены методы и события. В чем разница? Свойствам вы можете присваивать определенные значения. Методы являются своеобразными функциями, связанными с объектом, их можно запускать на выполнение с параметрами или без них. События - это своего рода сигнал, по которому выполнятся указанные вами действия. Разберемся для начала с частью свойств, которые пригодятся нам для создания наших первых окон форм:
> Caption - текст, который будет написан в заголовке окна;
> AutoCenter - если значение .T.-True, окно автоматически разместится в центре экрана;
> BackColor - цвет фона окна;
> BorderStyle - стиль кромки окна. Может быть Sizeable (Позволяет пользователю изменить размер окна), Fixed (Не позволяет пользователю изменить размер окна) и No border (Нет кромки);
> ControlBox - выводит (.T.-True) или убирает (.F.-False) пиктограмму в заголовке окна и вызываемое щелчком мыши по ней системное меню;
Работа с формами. Красиво оформляем онио
>	FontCharSet - определяет стиль шрифта, которым отображается текст в окне по умолчанию;
>	FontBold - определяет жирность шрифта, которым отображается текст в окне по умолчанию;
>	Fontltalic - определяет наклон шрифта, которым отображается текст в окне по умолчанию;
>	FontName - определяет шрифт, которым отображается текст в окне по умолчанию;
>	FontSize - определяет размер шрифта, которым отображается текст в окне по умолчанию;
>	ForeColor - определяет цвет, которым отображается текст или графические изображения в окне по умолчанию;
>	Icon - позволяет задать пиктограмму, которая будет отображаться в заголовке окна. К этому моменту пиктограмма должна быть уже создана и лежать в виде файла с расширением .ico на диске;
>	MaxButton - выводит (.T.-True) или убирает (.E-False) кнопку Развернуть в правой части заголовка окна;
>	MinButton - выводит (.T.-True) или убирает (.F.-False) кнопку Свернуть в правой части заголовка окна;
>	Name - имя объекта в проекте (менять не рекомендуется!);
>	TitleBar - выводит (On) или убирает (Off) заголовок окна;
> WindowState - определяет состояние окна в первый момент. Варианты: О - Normal (Нормальный вид), 1 - Minimized (Свернутое на панели задач), 2 - Maximized (Развернутое на весь экран).
Попробуем на практике
Мы получили достаточно информации, чтобы создать наше первое окно формы. Попробуем добавить в проект окно со справкой о версии и создателе приложения. Для этого выполните следующие действия.
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку InStaff.
2.	Если окно проекта не открыто, выберите команду Open (Открыть) из меню File (Файл). В появившемся окне открытия файла выберите файл проекта, который мы создали ранее.
ГЛАВА 4 ▼ Работа с проектом
3.	Щелкните мышью по папке Forms (Формы), находящейся в папке Documents (Документы), а затем по кнопке New (Новый). Появится диалоговое окно, представленное на рис. 4.13.
4.	Выберите кнопку New Form (Новая форма). Появляется окно Form Designer (Дизайнер форм), показанное на рис. 4.14.
5.	В появившемся окне свойств окна формы (таком, как показано на рис. 4.16) установите следующие настройки:
-	AutoCenter - .T.-True;
-	BorderStyle - 1-FixedSingle;
-	Caption - О программе;
-	MaxButton - .F.-False;
-	MinButton - .F.-False.
Для установки соответствующей настройки щелкните по ней в списке настроек и введите значение или выберите из списка в поле над списком свойств.
6.	Пользуясь инструментами на панели инструментов Form Designer (Дизайнер форм), разместите на поле формы название нашего приложения -Список сотрудников, - версию приложения - 1.0.0 - и вслед за знаком защиты авторских прав (©) напишите ваше имя, а затем поставьте запятую и текущий год. Для нанесения надписей используйте инструмент
7.	Создайте кнопку ОК, пользуясь инструментом i i
8.	Если есть желание, разместите в форме картинку, созданную заранее в каком-либо графическом редакторе и сохраненную в папку GRAPHICS в формате BMP.
9.	В результате форма должна быть похожа на представленную на рис. 4.17.
10.	Сделайте двойной щелчок по созданной вами кнопке ОК. Появится окно, показанное на рис. 4.18.
11.	В этом окне введите команду
Thisform.Release
12.	Закройте это окно. Если при закрытии окна появится запрос на сохранение файла, ответьте Да (Yes).
13.	Опробуйте созданную форму в работе, для чего запустите ее на выполнение щелчком по кнопке с восклицательным знаком на панели инструментов Стандартная. Если при этом возникнет вопрос о сохранении файла, ответьте Да (Yes), а в появившемся стандартном окне сохранения файла выберите папку PRG и задайте имя файла - AboutFrm.
14.	При успешном запуске форма появится в середине экрана и на ней не будет видно пунктирных линий сетки.
Работа с формами. Красиво оформляем окно
15.	Для того чтобы закрыть форму, щелкните по кнопке ОК.
16.	Закройте Form Designer щелчком по стандартной кнопке закрытия в заголовке его окна.
17.	Обратите внимание, что в папке Forms (Формы) появилось имя созданной нами формы AboutFrm.
Рис. 4.17 т Вид формы О программе
Рис. 4.18 тОкно процедуры, выполняемой при щелчке по кнопке ОК
ГЛАВА 4 ▼ Работа с проектом
Процедуры, запускаемые событиями в форме
Во время создания формы в предыдущем подразделе мы делали двойной щелчок мышью по созданной нами кнопке, и открывалось окно. В это окно мы вводили команду. Для чего все это? И как работает?
Дело в том, что одной из особенностей программирования приложений в современных операционных системах является возможность связывать вызов программных процедур с событиями в системе. Программные средства, созданные таким образом, и называют соответственно приложениями, управляемыми событиями. Событием в системе считается и нажатие кнопки, и выбор пункта в списке, и открытие окна, и изменение его размера, и завершение работы приложения, и другие подобные действия. При возникновении события, если есть процедура, привязанная к этому событию, то она вызывается на выполнение. В практическом примере предыдущего подраздела мы создали процедуру, состоящую из одной команды, которая вызывается при щелчке по кнопке. Введенная нами команда Thisform.Release закрывает текущее окно формы.
При создании формы в Form Designer (Дизайнере форм) для того, чтобы попасть в окно ввода процедуры для какого-либо элемента окна, достаточно сделать двойной щелчок мышью по этому элементу, размещенному в форме. В верхней части открывшегося окна, справа от слова Object (Объект) показан элемент, для которого вы пишете процедуру, а справа от слова Procedure (Процедура) показано событие, при возникновении которого будет вызвана ваша процедура. Оба этих поля являются раскрывающимися списками, а значит, позволяют сменить установленные в них значения. Таким образом, мы можем написать процедуру реакции на событие одного элемента, а затем, пользуясь раскрывающимся списком, перейти к написанию процедуры для другого элемента или выбрать событие, по которому будет выполняться процедура, отличное от того, которое вам предлагалось вначале. Например, если вы хотите, чтобы выдавалось сообщение при щелчке по вашей кнопке правой клавишей мыши, выберите соответствующее событие (рис. 4.19), а затем введите команду вывода сообщения на экран (рис. 4.20).
Из таких процедур обработки событий можно обращаться к различным элементам окна формы и менять их свойства. Когда вы вводите ключевое слово ThisForm, а затем точку, Visual FoxPro 9 выдает список свойств, методов (процедур управления) и элементов текущей формы. Когда вы щелкаете по тому или иному пункту этого списка, появляется сообщение с пояснениями. Если, выбрав какой-либо элемент окна формы, ввести точку, имя выбранного элемента появится после ключевого слова ThisForm через точку, а после этого появится
Процедуры, запускаемые событиями в форме
			
. Object [еЭ Commandl	PpiceduiK	pHtfiCkk 2 1." ’’’*	»	Fdie if r r- J	
	р OLEScart-Drag ^ReadExp cess ion sbReadMethod -^Refresh j^ResetToDefaulC		Ы	
	r—) xurs when the user presses and then releases the right (secondary) 1		
	^SetFocus j^ShouWhatsThis /7 UIEnable PValid P When Лвг iCeExpression iteMethod	0 ...^ZOrdec	[Ц	дар	
Рис. 4.19 т Выбор события, по которому выполняется процедура
Рис. 4.20 т Окно процедуры, выполняемой при щелчке правой кнопкой мыши
список свойств элемента. При вводе знака равенства выбранное свойство элемента или окна формы появится после ключевого слова ThisForm через точку, а после этого появится введенный вами знак равенства. Следом за знаком равенства можно ввести значение, которое вы хотите присвоить свойству. Например, если мы хотим динамически изменить заголовок окна формы, например хотим вывести в заголовке текст «Новый документ», надо ввести следующую команду:
ГЛАВА 4 ▼ Работа с проектом
ThisForm.Caption = ’Новый документ?
Если хочется вывести значение в текстовое поле, надо применить следующую конструкцию:
ThisForm.<Имя_поля>.Value = <3начение>
Например:
ThisForm.Textl.Value = ’Петров?
Можно динамически запретить или разрешить редактирование поля. Например, так:
ThisForm.Textl.Readonly = .Т. && Запрещаем редактирование
ThisForm.Textl.Readonly = .F. && Разрешаем редактирование
Рассмотрим некоторые события формы:
> Load - в момент возникновения события ни один объект формы еще не создан, поэтому задавать какие-либо свойства элементов формы еще рано. Для чего выгодно использовать это событие? Например, можно открыть необходимые для формы базы данных и свободные таблицы;
> Init - элементы формы уже созданы. Самое время задать начальные свойства для объектов формы и, например, заполнить списки значениями;
> Activate - активирование формы. Может происходить многократно в ответ на действия пользователя. Размещение команд, отрабатывающих в ответ на возникновение этого события, надо производить крайне осторожно, а лучше избегать этого;
> Deactivate - событие, обратное предыдущему. Рекомендации по использованию те же;
> Unload - событие при уничтожении формы. В этот момент все элементы формы уже уничтожены.
Таким образом, мы прикоснулись к вопросу объектно-ориентированного программирования. Объектно-ориентированное программирование (ООП) - способ программирования, отличный от традиционного процедурного подхода в программировании, позволяющий воспринимать приложение как набор объектов, взаимодействующих друг с другом. Объекты имеют свойства, реагируют на события и имеют набор методов для управления объектом. В объектно-ориентированном программировании широко распространено понятие класса. Класс - поименованная совокупность объектов, методов, свойств и обработчиков событий определенного назначения. Например, к какому классу принадлежит любой объект вашей формы, да и сама форма, можно увидеть
Процедуры, запускаемые событиями в форме
в окне свойств объекта, если посмотреть значение свойства Class. Глубоко вникать в технологию работы с классами, наследованием и прочими «штучками» объектно-ориентированного программирования мы не будем. К большому сожалению, объем книги не позволяет это сделать. Некоторые сведения о классах и библиотеках классов содержатся в разделе «Использование классов» (см. далее).
Попробуем на практике
Попытаемся выполнить создание окна формы для отображения содержимого записей созданных нами таблиц. Будем показывать следующие сведения для каждого сотрудника: табельный номер, имя, адрес, дату рождения, должность, оклад. Выполним следующие действия:
1.	Скопируйте из созданной нами во второй главе папки example в папку DATA (находящуюся в папке InStaff) файлы Persons.dbf, Persons.cdx, Staff.dbf, Id_staff.idx.
2.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку InStaff.
3.	Если окно проекта не открыто, выберите команду Open (Открыть) из меню File (Файл). В появившемся окне открытия файла выберите файл проекта, который мы создали ранее.
4.	Щелкните мышью по папке Forms (Формы), находящейся в папке Documents (Документы), а затем по кнопке New (Новый). Появится диалоговое окно, представленное на рис. 4.13.
5.	Выберите кнопку New Form (Новая форма). Появляется окно Form Designer (Дизайнера форм), показанное на рис. 4.14.
6.	В появившемся окне свойств окна формы (таком, как показано на рис. 4.16) установите следующие настройки:
-	BorderStyle - 1-FixedSingle;
-	Caption - Информация о сотруднике;
-	MaxButton - .F.-False;
-	MinButton - .F.-False.
Для установки соответствующей настройки щелкните по ней в списке настроек и введите значение или выберите из списка в поле над списком свойств.
7.	Пользуясь инструментами на панели инструментов Form Designer (Дизайнера форм), разместите на поле формы названия полей Имя, Адрес,
ГЛАВА 4 V Работа с проектом
Таб. номер, Дата рождения, Должность, Оклад. Для нанесения надписей используйте инструмент А.
8.	Пользуясь инструментами на панели инструментов Form Designer (Дизайнера форм), разместите на поле формы поля, куда будут выводиться значения. Для нанесения надписей используйте инструмент g§|. Установите значение свойства Readonly для всех полей в .T.-True.
9.	Создайте кнопки Предыдущий, ОК, Следующий, пользуясь инструментом («д. Должно получиться, как на рис. 4.21.
10.	Сделайте двойной щелчок по свободному месту' созданной вами формы  (то есть не по какому-либо элементу, а по самой поверхности формы).
11.	Проверьте, что в появившемся окне справа от слова Object (Объект) стоит значение Forml, а справа от слова Procedure (Процедура) - значение Init. В противном случае поменяйте значения на указанные.
12.	В окне введите команды:
CD SYS (5) + CURDIRO + "\DATA"
USE Staff IN 0 INDEX Id_staff.idx
USE Persons IN 0
SELECT Persons
SET RELATION TO id INTO Staff && Связь между таблицами по полю Id GO TOP
*	Выводим в соответствующие поля формы
*	значения полей таблиц
ThisForm.Textl.Value = Persons.Name
ThisForm.Text2.Value = Persons.Address
ThisForm.Text3.Value = Persons.TabNum
ThisForm.Text4.Value = Persons.Birthday
ThisForm.Text5.Value = Staff.Whois
ThisForm.Text6.Value = Staff.Sum
13.	Закройте это окно. Если при закрытии окна появится запрос на сохранение файла, ответьте Да (Yes).
14.	Сделайте двойной щелчок по созданной вами в форме кнопке ОК.
15.	В появившемся окне введите команды:
SELECT Persons
USE && Закрываем таблицу Persons
SELECT Staff
USE && Закрываем таблицу Staff
CD .. && Возвращаемся в основную папку приложения
Thisform.Release && Закрываем окно формы
16.	Закройте это окно. Если при закрытии окна появится запрос на сохранение файла, ответьте Да (Yes).
Процедуры, запускаемые событиями в форме
17.	Сделайте двойной щелчок по созданной вами в форме кнопке Предыдущий.
18.	В появившемся окне введите команды:
IF RECNO() о 1 && Проверяем не первая ли запись SKIP -1 && Отходим на одну запись назад ThisForm.Textl.Value = Persons.Name ThisForm.Text2.Value = Persons.Address ThisForm.Text3.Value = Persons.TabNum ThisForm.Text4.Value = Persons.Birthday ThisForm.Text5.Value = Staff.Whois ThisForm.Text6.Value = Staff.Sum ELSE
MESSAGEBOX("Это первая запись", "Сообщение") ENDIF
19.	Закройте это окно. Если при закрытии окна появится запрос на сохранение файла, ответьте Да (Yes).
20.	Сделайте двойной щелчок по созданной вами в форме кнопке Следующий.
21.	В появившемся окне введите команды:
IF RECNO() о RECCOUNT() SKIP && Переходим на следущую запись таблицы ThisForm.Textl.Value = Persons.Name ThisForm.Text2.Value = Persons.Address ThisForm.Text3.Value = Persons.TabNum ThisForm.Text4.Value = Persons.Birthday ThisForm.Text5.Value = Staff.Whois ThisForm.Text6.Value = Staff.Sum ELSE
MESSAGEBOX("Это последняя запись”, "Сообщение") ENDIF
22.	Закройте это окно. Если при закрытии окна появится запрос на сохранение файла, ответьте Да (Yes).
23.	Опробуйте созданную форму в работе, для чего запустите ее на выполнение щелчком по кнопке с восклицательным знаком на панели инструментов Стандартная. Если при этом возникнет вопрос о сохранении файла, ответьте Да (Yes), а в появившемся стандартном окне сохранения файла выберите папку PRG и задайте имя файла ViewP.
24.	При успешном запуске форма должна иметь вид, как на рис. 4.22.
25.	Щелкайте по кнопкам Предыдущий и Следующий. Данные во всех полях должны изменяться.
ГЛАВА 4 V Работа с проектом
26.	Для того чтобы закрыть форму, щелкните по кнопке ОК.
27.	Закройте Form Designer (Дизайнер форм) щелчком по стандартной кнопке закрытия в заголовке его окна.
28.	Обратите внимание, что в папке Forms (Формы) появилось имя созданной нами формы ViewP.
При помощи созданного нами окна можно просматривать данные, но редактировать их нельзя. Попробуйте создать еще одно окно формы самостоятельно.
Рис. 4.21 v Вид формы после размещения всех элементов

Имя [Петров Анатолий Иванович
Адрес | ул. Академика Ушакова, 10. кв.112
Таб. номер I 700011 Дата рождения 112Д0ДЭ70 I
Доджнрсд>)[фД1|1Д|иИ11Д
«Предыдущий
Следующий >»
Рис. 4.22 т Окно формы после запуска на выполнение
Оно должно быть аналогично окну формы ViewP по составу и наименованиям полей и, соответственно, делается точно, как указано в пунктах 4-22. Но в новой форме будут присутствовать некоторые отличия.
Во-первых, значение свойства ReadOnly для всех полей должно быть .F.-False. Это нужно для обеспечения возможности редактирования данных в полях.
Во-вторых, в начало процедур для каждой из трех кнопок надо вставить приведенные ниже команды для того, чтобы сохранять введенные изменения в таблицах. Будем вносить изменения при переходе от одной записи к другой.
Иногда действуют по другой схеме и создают временную таблицу, куда вносятся сделанные пользователем изменения, а при щелчке по кнопке ОК все изменения переносятся в основную таблицу. Такой подход позволяет отменить внесение изменений, сделанных пользователем, например, если пользователь закрыл окно формы по окончании работы не щелчком мышью но кнопке ОК, а щелчком мышью по кнопке Отмена.
Название новой формы пусть будет EdPer.
Итак, вот команды, которые нужно вставить в начало процедур, для каждой из трех кнопок вашей формы (окно с процедурой появляется при двойном щелчке мышью по кнопке):
REPLACE Persons.Name WITH ThisForm.Textl.Value
REPLACE Persons.Address WITH ThisForm.Text2.Value
REPLACE Persons.TabNum WITH ThisForm.Textl.Value
REPLACE Persons.Birthday WITH ThisForm.Textl.Value
REPLACE Staff.Whois WITH ThisForm.Text5.Value
REPLACE Staff.Sum WITH ThisForm.Text6.Value
После ввода команд попробуйте запустить па выполнение получившуюся форму. Если в этот момент появится запрос на сохранение формы в файле, перейдите в папку PRG и задайте имя файла для формы EdPer.
После запуска формы на выполнение попробуйте просмотреть записи по различным сотрудникам, отредактируйте какую-либо запись. Закройте окно щелчком по кнопке ОК. Запустите форму на выполнение снова и посмотрите, сохранились ли исправленные вами данные о сотруднике.
Использование элемента Grid
В предыдущем подразделе мы научились создавать окна форм с. различными элементами. На практике довольно часто для отображения табличных данных используют элемент под названием Grid.
ГЛАВА 4 ▼ Работа с проектом
Элемент Grid добавляется в окно формы при помощи кнопки № на панели инструментов Form Designer (Дизайнера форм). Для дальнейшей настройки отображаемой таблицы удобно воспользоваться Мастером (Grid Builder).
Мастер Grid Builder
Grid Builder вызывается в контекстном меню, появляющемся при щелчке правой клавишей мыши по элементу Grid в окне формы. Окно Grid Builder показано на рис. 4.23.

Available fields:
^elected fields:
1. Grid Hems |JL,Stylg]| J3.
Which fields do you want in youi grid?
Select a database oc free table, and then select fields ftom one table.
i Name
। Birthday
• Address :id
Рис. 4.23 т Окно Grid Builder. Вкладка Grid Items
databases and tables:
Открытые в данный момент таблицы появятся в списке Databases and Tables (Базы данных и таблицы). Можно принудительно выбрать еще не открытую таблицу, щелкнув мышью по кнопке с многоточием. Поля выбранной таблицы, показанные в списке Available Fields (Доступные поля), можно переносить в список Selected Fields (Выбранные поля) при помощи кнопок со стрелками. Обратите внимание на порядок полей в списке Selected Fields (Выбранные поля). В таком же порядке будут стоять столбцы в отображаемой в форме таблице. Поменять местами поля можно, перетаскивая их мышью за прямоугольники слева от имен полей. Когда поля для отображения в таблице выбраны, пора переходить ко второй вкладке - Style (Стиль), - показанной на рис. 4.24.
Эта вкладка определяет внешний вид вашей таблички. Возможные стили перечислены в списке Style (Стиль). В центре вкладки показан образец внешнего вида таблицы.
Использование элемента Grid
L Grid Items 1.2. S^te I 3. Layout 4. Reiatiqnshp I
Select a style lot your grid Each style is illustrated in the example grid shown.
Рис. 4.24 ▼ Окно Grid Builder. Вкладка Style
Третья вкладка - Layout (Расположение) - позволяет задать заголовки столбцов таблицы (до этого момента названия заголовков совпадают с названиями полей). Это можно сделать, щелкая по соответствующим заголовкам полей и вводя значения в поле Caption (Заголовок). Раскрывающийся список Control type (Тип управления) позволяет выбрать способ отображения данных в ячейках таблицы.
Если вы хотите, чтобы в таблице в форме отображались поля не только одной таблицы, а нескольких связанных таблиц, имеет смысл обратиться к вкладке Relationship (Связь). В раскрывающемся списке Key field in parent table (Ключевое поле в родительской таблице) выбирается поле главной таблицы, по которой строится список отображаемых строк. В раскрывающемся списке Related index in child table (Связанный индекс в дочерней таблице) выбирается индекс дочерней таблицы, по которому произойдет связь.
Редактирование в элементе Grid
Удобной особенностью использования элемента Grid является то, что интерактивно изменяемые в отображаемой таблице поля изменяются и в соответствующей таблице на диске. Можно запретить редактирование полей элемента Grid, если для свойства ReadOnly установить значение .T.-True.
В Visual FoxPro 9 по сравнению с предыдущими версиями введено новшество при работе с элементом Grid. Появилось свойство Optimize, установка которого в значение .T.-True позволяет использовать технологию Rushmore, что значительно ускоряет обновление информации в таблице.
ГЛАВА 4 Т Работа с проектом
Попробуем на практике
Из данного описания работы с элементом Grid не все, наверное, очевидно и понятно. Разобраться в этом может помочь практический пример. Создадим еще одно окно формы для нашего проекта. Выполните следующие действия:
1.	Смените текущую папку, выполнив в окне Command команду-
СО ?
Откроется окно, в котором нужно найти созданную нами ранее папку InStaff.
2.	Если окно проекта не открыто, выберите команду Open (Открыть) из меню File (Файл). В появившемся окне открытия файла выберите файл проекта, который мы создали ранее.
3.	Щелкните мышью по папке Forms (Формы), находящейся в папке Documents (Документы), а затем по кнопке New (Новый). Появится диалоговое окно, представленное на рис. 4.13.
4.	Выберите кнопку New Form (Новая форма). Появляется окно Form Designer (Дизайнера форм), показанное на рис. 4.14.
5.	В появившемся окне свойств окна формы (таком, как показано на рис. 4.16) установите следующие настройки:
-	BorderStyle - 1-FixedSingle;
-	Caption - Список сотрудников;
-	MaxButton - .F.-False;
-	MinButton - .F.-False.
Для установки соответствующей настройки щелкните по ней в списке настроек и введите значение или выберите из списка в поле над списком свойств.
6.	Пользуясь инструментом g| на панели инструментов Form Designer (Дизайнера форм), разместите на поле формы табличный элемент Grid.
7.	Щелкните правой клавишей мыши по размещенному элементу Grid и из появившегося контекстного меню выберите команду Builder (рис. 4.25).
8.	В окне Grid Builder на вкладке Grid Ite'ms щелкните мышью по кнопке с многоточием рядом со списком Databases and tables.
9.	В появившемся окне открытия файла перейдите в папку DATA и выберите файл Persons и щелкните по кнопке ОК. Должно получиться, как на рис. 4.26.
10.	Щелкайте мышью по именам полей Tabnum, Name, Birthday и Address в списке Available fields (Доступные поля) и вслед за щелчком по каждому из полей щелкайте по расположенной справа от списка кнопке с треугольной
Использование элемента Grid
^F'rmD'Hgner view, sex ‘
Рис. 4.25 v Вызов Grid Builder
t 1, Grid Items | 2. Stytejj 3 Layout H 4. Relationship ;
| Which fields do you want in your grid?
j Select a database or free table, and then select fields from one table.
[ Help I	f OK ] Cancel |
Рис. 4.26 » Пример вкладки Grid Items
стрелкой вправо. Поля должны перейти в список Selected fields (Выбранные поля), как показано на рис. 4.27.
11.	Перейдите на вкладку Style (Стиль) и выберите стиль Embossed.
12.	Перейдите на вкладку Layout и, последовательно щелкая мышью по полям в таблице на показанном образце, введите в поле Caption (Заголовок) наименование для каждого из них, как показано на рис. 4.28.
ГЛАВА 4 V Работа с проектом

1 Grid hems |j> Styie ][з Laycutjj 4. Relationship j
Which fields do you want in your grid?
Select a database or free table, and then select fields from one table.
*	Г ok ] [ CancieJ |
Рис. 4.27 ▼ Пример выбора отображаемых полей

Т о specify a caption and control type for a column, first click the column, then specify your changes.
Control type: I Т exlbox	[<* .
. . . .....Адресу......„...„Н
ул. Академика Ушакова, 10, кв.; I dl :ул. Петровская,3, КВ.10	: I.^]|
:ул Резинстроя, 20, кв .77	; '—п
:ул. Пушкина, 1, кв.1	।
ул. Петровская, З.кв.10 i |y.[j
Caption: i Адрес!	।
: Tab. № ; Имя ; Датарожд, =70001	’Петро» АнатоИ 2/30/70
70002	:Семенов И гср05/31/50
=70003	। Балашова Зин07/15/50
70004	Феоктистова £08/22/71
=70005	Семенов Паве05/22/75
|<1.
I Н1* 1
|	~| [ Cancel |
Рис. 4.28 т Пример ввода заголовков для таблицы
13.	После ввода заголовков для всех полей щелкните мышью по кнопке ОК.
14.	В окне свойств для элемента Grid установите для свойства ReadOnly значение .T.-True. Этим действием мы запретим редактирование отображаемой таблицы.
15.	Добавьте в ваше окно формы кнопку ОК. Окно должно выглядеть, как на рис. 4.29.
16.	Сделайте двойной щелчок по созданной вами в форме кнопке ОК.
17.	В появившемся окне введите команды:
CLOSE TABLES && Закрываем таблицы Thisform.Release && Закрываем окно формы
Создание я вызов основного меню приложения
Рис. 4.29 ▼ Вид окна формы после добавления всех элементов
18.	Закройте это окно. Если при закрытии окна появится запрос на сохранение файла, ответьте Да (Yes).
19.	Опробуйте созданную форму в работе, для чего запустите ее на выполнение щелчком по кнопке с восклицательным знаком на панели инструментов Стандартная. Если при этом возникнет вопрос о сохранении файла, ответьте Да (Yes), а в появившемся стандартном окне сохранения файла выберите папку PRG и задайте имя файла - ViewS.
20.	Для того чтобы закрыть форму, щелкните по кнопке ОК.
21.	Закройте Form Designer (Дизайнер форм) щелчком по стандартной кнопке закрытия в заголовке его окна.
22.	Обратите внимание, что в папке Forms (Формы) появилось имя созданной нами формы ViewS.
Создание и вызов основного меню приложения
Ранее мы уже рассмотрели создание основной программы приложения. С помощью одной из команд основной программы отображается меню (команда DO ismenu.mpr в практическом задании). При этом на момент запуска основной программы на выполнение меню должно быть уже создано и сохранено в файле (в нашем примере в файле ismenu.mpr). Как создать меню?
I
ГЛАВА 4 ▼ Работа с проектом

Menu j J ; Shortcut
Рис. 4.30 т Окно для выбора типа меню
Для создания меню необходимо в окне Project Manager (Менеджер проектов), в папке Other (Другие), щелкнуть мышью по папке Menus (Меню), а затем по кнопке New (Новый). Появится окно, показанное на рис. 4.30.
Если мы создаем главное меню приложения, в окне следует выбрать кнопку Menu (Меню). В результате появится окно Menu Designer (Дизайнера меню), показанное на рис. 4.31.
В столбце Prompt вводится название пункта меню или команды. Его вы придумываете сами. При этом надо стремиться дать название краткое, но емкое.
В столбце Result задается тип действия. Вы можете организовать подменю (Submenu), задать выполняемую при выборе пункта меню процедуру (Procedure) или определить команду, выполняемую при выборе пункта меню (Command).
Если вы выбрали тип действия Submenu (Подменю), появится кнопка Edit (Редактировать). При щелчке мышью по этой кнопке в окне Menu Designer (Дизайнера меню) будет показано меню, которое появится при выборе вашего пункта главного меню (более низкий уровень меню). Пункт главного меню, при выборе которого появится редактируемое вами в данный момент подменю, показано в раскрывающемся списке в правом верхнем углу окна Menu Designer (Дизайнера меню). При помощи этого раскрывающегося списка можно быстро переходить от редактирования одного уровня меню к редактированию другого. Таким образом, можно создавать меню любой вложенности и любого уровня. Конечно, лучше не увлекаться большим количеством уровней меню. Иначе вы запугаете пользователя, и он состарится в поисках нужной команды меню.
Создание и вызов основного меню приложения
Если вы выбрали тип действия Command (Команда), справа от раскрывающегося списка типа действия появится поле, где можно ввести команду. Чаще всего вводят команду DO и затем - через пробел - что именно надо выполнить.
Например, надо выполнить процедуру MyAction с параметрами ? 1 ? и 7100?. Команда, вводимая при этом, будет иметь следующий вид:
DO MyAction WITH ?!?, 7100?
Когда надо при выборе команды меню вывести на экран окно формы, команда будет:
DO FORM MyDialog
Если надо вызвать формирование отчета, то команда будет соответственно:
REPORT FORM MyReport
Но о создании и запуске на формирование отчетов поговорим позже.
«Г
Если вы хотите сделать в вертикальном меню разделитель между группами команд в виде горизонтальной линии, введите вместо имени пункта меню в соответствующей строке символы \-.
Попробуем на практике
Попытаемся создать главное меню нашего приложения. Для начала определимся, какие функции будет выполнять приложение и в каком объеме. В результате выполнения упражнений второй главы мы имеем две таблицы с данными о сотрудниках и справочной информацией о должностях и окладах сотрудников. Для нужд отдела кадров требуется отображать информацию о сотрудниках, сгруппированную в таблицу, например, для сравнительного анализа. Кроме того, желательно реализовать отображение данных о каждом сотруднике персонально. Конечно, нужно предусмотреть возможность печати отчетности о каждом сотруднике в отдельности или сводную по предприятию. Необходим пункт меню для вызова справочной информации. Из дополнительных, но весьма полезных функций приложения следует отметить возможность импорта и экспорта данных в формат XML, который используется в данный момент весьма широко и позволит обмениваться данными с другими приложениями.
Таким образом, обозначились четыре пункта главного меню:
> Файл, где собраны функции просмотра и редактирования списка сотрудников, импорт и экспорт данных в формате XML, команда для завершения работы с приложением;
> Отчеты, где помещаются команды вызова создания печатных форм;
ГЛАВА 4 ▼ Работа с проектом
> Справочники, где будет содержаться команда вызова справочника должностей;
> Справка, где собраны команды вызова справочной информации и краткой справки о наименовании, версии и авторских правах на данное приложение.
Возможное дерево команд главного меню нашего приложения представлено на рис. 4.32.
Файл_______
Отчеты_____
Справочники Справка
ZZJ__________,
Сотрудники___________
Работа с XML_________
Выход
—I___________
Персональная карточка Список сотрудников
~----------1_______
Справочник должностей
/......... 1-----------
Просмотр персонально Просмотр списком
Редактирование
" ........~~1
Экспорт в XML
Импорт из XML
I
Вызов справки О программе...
Рис. 4.32 т Дерево главного меню приложения
Кое-что для создания приложения уже нами сделано, а именно:
> главная программа приложения;
> окно формы краткой справки о наименовании, версии и авторских правах на данное приложение;
> окно просмотра персональных данных сотрудника;
> окно просмотра списка сотрудников;
> окно редактирования персональных данных сотрудника.
Создадим главное меню проекта, для чего выполним следующие действия:
1. Смените текущую папку, выполнив в окне Command команду
CD ?
2. Откроется окно, в котором нужно найти созданную нами ранее папку InStaff.
Создание и вызов основного меню приложения
3.	Если окно проекта не открыто, выберите команду Open (Открыть) из меню File (Файл). В появившемся окне открытия файла выберите файл проекта, который мы создали ранее.
4.	Щелкните мышью по папке Menus (Формы), находящейся в папке Other (Другие), а затем по кнопке New (Новый). В появившемся диалоговом окне щелкните мышью по кнопке Menu (Меню).
Появляется окно Menu Designer (Дизайнера меню), показанное на рис. 4.31.
В появившемся окне заполните столбцы, как это показано на рис. 4.33.
5.	Щелкните мышью по пункту' Файл, а затем по кнопке Create (Создать) справа от него. Menu Designer (Дизайнер меню) покажет вам список пунктов меню, которое откроется при выборе пункта меню Файл. Первоначально список будет пустой. Надо заполнить столбцы в окне (рис. 4.34).
Menu}evet_____ I
[MenuBai I v-1
'Hem-------— * -=
 I. fo81* I , I
I f ►•C	। '
I . I
| Mojteham... |
|  Pjeview }
Рис. 4.33 т Пример создания пунктов главного меню

Prompt____________Result
Сотрудники	Submenu
Q Работа c XML	Submenu
Д	Submenu
Д Выход	Command
; EL_ _______________I
Рис. 4.34 т Пример создания пунктов меню Файл
ГЛАВА 4 т Работа с проектом
6.	Обратите внимание, что при выборе пункта меню Выход вызывается на выполнение процедура ALVExitProc, уже введенная нами в теле основной программы нашего проекта.
7.	Щелкните мышью по пункту Сотрудники, а затем по кнопке Create (Создать) справа от пего. Введите информацию по пунктам меню, как показано на рис. 4.35.

Prompt______________Result___________________Opfora
Просмотр персонал	Command	DO FORMViewP
Г~~Просмотр списком	Command	DOFORMViewS
Q Редактирование	Command	DO FORM EdPer
Menu |evel
| Сотрудники
Рис. 4.35 ▼ Пример создания пунктов меню Сотрудники
8. Обратите внимание, что при выборе пункта меню Просмотр персонально вызывается на выполнение форма ViewP, уже созданная нами ранее.
9. В раскрывающемся списке Menu level (Уровень меню), в правом верхнем углу окна Menu Designer (Дизайнер меню), выберите пункт Файл. Благодаря этому действию мы снова поднимемся на один уровень вверх и вернемся к редактированию меню Файл.
10. Щелкните мышью по пункту Работа с XML, а затем по кнопке Create (Создать) справа от него. Введите информацию по пунктам меню, как показано на рис. 4.36.
11. В раскрывающемся списке Menu level (Уровень меню), в правом верхнем углу окна Menu Designer (Дизайнер меню), выберите пункт Menu Ваг. Благодаря этому действию мы поднимемся на верхний уровень и вернемся к редактированию главного меню приложения.
12. Щелкните мышью по пункту Отчеты, а затем по кнопке Create (Создать) справа от пего. Введите информацию по пунктам меню, как показано на рис. 4.37. Как видите, наименования пунктов меню мы вводим в точном соответствии с деревом меню, спроектированного нами заранее и представленного на рис. 4.32.
Создание и вызов основного меню приложения
Рис. 4.36 т Пример создания пунктов меню Работа с XML
Рис. 4.37 ▼ Пример создания пунктов меню Отчеты
13.	В раскрывающемся списке Menu level (Уровень меню), в правом верхнем углу окна Menu Designer (Дизайнер меню), выберите пункт Menu Ваг. Благодаря этому действию мы поднимемся на верхний уровень и вернемся к редактированию главного меню приложения.
14.	Щелкните мышью по пункту Справочники, а затем по, кнопке Create (Создать) справа от него. Введите информацию по пунктам меню, как показано на рис. 4.38.
15.	В раскрывающемся списке Menu level (Уровень меню), в правом верхнем углу окна Menu Designer (Дизайнера меню), выберите пункт Menu Ваг. Благодаря этому действию мы поднимемся на верхний уровень и вернемся к редактированию главного меню приложения.
ГЛАВА 4 ▼ Работа с проектом
16.	Щелкните мышью по пункту Справка, а затем по кнопке Create (Создать) справа от него. Введите информацию по пунктам меню, как показано на рис. 4.39.
Рис. 4.38т Пример создания пунктов меню Справочники
Рис. 4.39 т Пример создания пунктов меню Справка
17.	Во время работы в Menu Designer (Дизайнере меню) постоянно есть возможность просмотреть, как будут выглядеть результаты ваших трудов. Если щелкнуть по кнопке Preview (Предварительный просмотр), появится окно, как на рис. 4.40, и главное меню Visual FoxPro 9 заменится меню, созданным вами. Можно щелкать мышью по пунктам меню, будут открываться подменю. Правда, окна, которые должны появляться при выборе той или иной команды, появляться не будут. Когда вы просмотрите
Создание и вызов основного меню приложения
Pieviewhfj. ismenumnx
Prompf. is:
Command is-
t o k: ~ 1
Рис. 4.40 v Окно предварительного просмотра меню
созданное меню и будете готовы продолжать корректировать меню или переходить к работе с другими компонентами проекта, щелкните по кнопке ОК в окне, представленном на рис. 4.40.
18.	Мы создали главное меню нашего приложения. Сохраним его в файле, для чего выберем команду Save (Сохранить) из меню File (Файл). В появившемся диалоговом окне сохранения файла укажите папку MENUS и введите имя файла - ismenu. Щелкните по кнопке Сохранить (Save).
19.	Закройте окно Menu Designer (Дизайнера меню), щелкнув по стандартной кнопке закрытия в заголовке окна.
20.	Обратите внимание, что в окне проекта, в папке Menus (Меню) появилось имя созданного нами меню - ismenu.
21.	В окне проекта щелкните мышью по имени основной программы main. Она расположена в папке Programs (Программы).
22.	Щелкните по кнопке Run (Выполнить) в окне проекта. Если будут появляться сообщения вида, как на рис. 4.41, щелкайте мышью по кнопке Ignore (Игнорировать), пока такие сообщения не перестанут появляться. Это бывает оттого, что Visual FoxPro 9 не всегда адекватно воспринимает русские буквы для обеспечения быстрого выбора пунктов меню при помощи комбинации клавиш АИ+<буква_в_имени_пункта_меню>. И все же меню с использованием русских букв работать будет не менее успешно, чем на любом другом языке.
кг
Если вы хотите, чтобы ошибка не появлялась, в Menu Designer (Дизайнере меню) последовательно щелкайте мышью по кнопкам в столбце Options (справа от соответствующего пункта основного меню) и затем в появившемся окне щелкните мышью в поле Key Label. После этого нажмите комбинацию клавиш АН+<символ>, где <символ> - это любая буква из названия соответствующего пункта меню. Важно, чтобы комбинации клавиш не повторялись. После этого щелкните по кнопке ОК. В результате при запуске на выполнение вашего приложения выбирать пункты основного меню пользователь сможет и мышью, и нажатием соответствующих комбинаций клавиш.
23.	Основная программа запустится и отобразит созданное вами меню.
В данный момент будут работать пять пунктов меню:
-	Файл > Сотрудники > Просмотр персонально;
-	Файл > Сотрудники > Просмотр списком;
Г ЛАВА 4 ▼ Работа с проектом
SET SYSMENU ТО
SET SYSMENU AUTOMATIC
DEFINE PAD liflclvfl OF MSYSMENU PROMPT "Файл" COLOR SCHEME 3 ; KEY ALT+Ф, "	... "
DEFINE PAD _llflclvf2 OF _MSYSME KEY ALT+O, ""
DEFINE PAD _llflclvf3 OF _MSYSME.' KEY ALT+C, ""
DEFINE PAD _liflcLvf4 OF _MSYSME: KEY ALT+C, ""
ON PAD	OF __M5YSMENU A
ON PAD _liflclvf3 OF -MSYSMENU A
ON PAD -liflclvi* OF _MSYSMENU A
Шн DEFINE POPUP файл MARGIN RELATIVE SHADOW COLOR SCHEME 4

Рис. 4.41 ▼ Сообщение об ошибке при запуске программы на выполнение
-	Файл > Сотрудники > Редактирование;
-	Справка > О программе;
-	Файл > Выход.
24.	После того как попробуете первые два из перечисленных пунктов меню, выберите третий (Файл > Выход), чтобы завершить работу приложения.
Что сделать, чтобы форма появилась при запуске приложения
Иногда требуется сделать так, чтобы окно формы появилось при запуске приложения. Это может потребоваться для запроса имени пользователя и пароля, для запроса даты, на которую будут запрашиваться данные, для вывода справки о версии и изготовителе программной системы.
Способ запуска формы при старте приложения довольно прост. Надо вставить в основную программу до вызова главного меню приложения вызов на выполнение нужной вам формы.
Что сделать, чтобы форма появилась при запуске приложения
Например:
DO FORM <Имя_формы>
Таким образом, тело основной программы, вызывающей при запуске, например, форму MyForm, будет выглядеть так:
* Основная программа проекта *
SET TALK OFF
SET DATE TO GERMAN
SET CENTURY ON
SET ESCAPE OFF
SET PATH TO LIBS, PRG, MENUS, DATA, REPORTS
ON SHUTDOWN DO ALVExitProc PUSH MENU _MSYSMENU
* Вызываем на выполнение форму DO FORM MyForm
DO ismenu.mpr .SCREEN.Visible = -T. READ EVENTS
* Восстанавливаем настройки POP MENU .MSYSMENU
ON SHUTDOWN
* Процедура завершения программы
PROCEDURE ALVExitProc
CLEAR EVENTS
RETURN 0
Однако надо иметь в виду, что при запуске приведенного выше примера, если вызываемая форма не модальная (свойство Windowlype не установлено в положение Modal), появится окно формы, а следом появится основное меню приложения. По этой причине такой подход не годится для окон с запросами имени пользователя и пароля. Как же быть в этом случае? Можно сделать форму, запрашивающую имя пользователя и пароль, модальной и проверять возвращаемое ей значение, а можно воспользоваться способом, рассмотренным в примере ниже.
Попробуем на практике
Информация о сотрудниках, которую предоставляет наше приложение, является конфиденциальной информацией, поэтому доступ к ней должен быть
ГЛАВА 4 > Работа с проектом
ограничен. Одним из средств разграничения доступа к данным является идентификация пользователя при запуске приложения Создадим для нашего проекта форму для запроса имени пользователя п пароля. Пусть при запуске нашего приложения появляется созданная форма, и, если имя пользователя и пароль введены неправильно, приложение будет незамедлительно завершать работу.
В коммерческих системах, как правило, данные таблиц и информация об именах пользователей и паролях хранятся в зашифрованном виде. Для ввода пароля предоставляется три попытки, после чего запуск приложения блокируется до ввода имени и пароля администратора приложения для снятия блокировки. Информация о попытке несанкционированного входа непременно вносится в журнал работы приложения. При помощи Visual FoxPro 9 вы вполне можете реализовать и такой подход, причем сообщение о попытке несанкционированного входа может посылаться и по электронной почте, и при помощи SMS на мобильный телефон, хотя для этого уже требуется некоторое дополнительное аппаратное обеспечение.
Выполните следующие действия:
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
2.	Откроется окно, в котором нужно найти созданную нами ранее папку InStaff.
3.	Если окно проекта не открыто, выберите команду Open (Открыть) из меню File (Файл). В появившемся окне открытия файла выберите файл проекта, который мы создали ранее.
4.	Щелкните мышью по папке Forms (Формы), находящейся в папке Documents (Документы), а затем по кнопке New (Новый). Появится диалоговое окно, представленное на рис. 4.13.
5.	Выберите кнопку New Form (Новая форма). Появляется окно Form Designer (Дизайнер форм), показанное на рис. 4.14.
6.	В появившемся окне свойств окна формы (таком, как показано на рис. 4.16) установите следующие настройки:
-	AutoCenter - .T.-True;
-	BorderStyle - 1-FixedSingle;
-	Caption - Идентификация пользователя;
-	MaxButton - .F.-False;
-	MinButton - .F.-False.
Что сделать, чтобы форма появилась при запуске приложения
Для установки соответствующей настройки щелкните по ней в списке настроек и введите значение или выберите из списка в поле над списком свойств.
7.	Пользуясь инструментами на панели инструментов Form Designer (Дизайнер форм), разместите на поле формы элементы, как это показано на рис. 4.42.
Рис. 4.42 ▼ Окно запроса информации о пользователе
8.	Для поля ввода пароля (Text2) найдите свойство PasswordChar в окне свойств и установите для него значение *. Этими символами будут заменяться символы вводимого пароля. Свойство поля PasswordChar специально предусмотрено для таких случаев.
9.	Сделайте двойной щелчок по созданной вами кнопке ОК.
10.	В появившемся окне введите команды:
IF FILE("InStaff.log") && Существует ли файл протокола?
f = FOPENCInStaff.log", 1) && Вывод в файл ELSE
f = FCREATECInStaff.log") && Создаем файл протокола
ENDIF
FPUTSff, ТТОС(DATETIME()) + " - Запуск программы") && Сообщение в журнал
ГЛАВА 4 ▼ Работа с проектом
IF ALLTRIM(ThisForm.Textl.Value) == "Admin" && Проверяем имя пользователя IF ALLTRIM(ThisForm.Text2.Value) <> "Password" && Проверяем пароль MESSAGEBOX("Пароль не зарегистрирован!", 16, "Нарушение") * Сообщение в журнал FPUTS(f, ТТОС(DATETIME()) + " - Ошибочный пароль") * Закрываем файл протокола = FCLOSE(f) Thisform.Release && Закрываем окно формы DO ALVExitProc && Вызываем процедуру завершения ENDIF
ELSE
MESSAGEBOX("Имя пользователя не зарегистрировано!", 16, "Нарушение") FPUTS(f, ТТОС(DATETIME ( ) ) + " - Ошибочный пароль") * Закрываем файл протокола = FCLOSE(f) Thisform.Release &.& Закрываем окно формы DO ALVExitProc && Вызываем процедуру завершения ENDIF
* Закрываем файл протокола
= FCLOSE(f)
Thisform.Release && Закрываем окно формы
DO ismenu.mpr && Вызываем меню
11.	Закройте это окно. Если при закрытии окна появится запрос на сохранение файла, ответьте Да (Yes).
12.	Сохраните форму в файле (File > Save). В окне сохранения файла выберите папку PRG. Имя файла введите Passin.
13.	Закройте окно Form Designer (Дизайнер форм), щелкнув по стандартной кнопке закрытия в заголовке его окна.
14.	В окне проекта щелкните мышью по имени основной программы main. Она расположена в папке Programs (Программы).
15.	Щелкните мышью по кнопке Modify в окне проекта.
16.	В открывшемся окне скорректируем текст основной программы. Вместо строки
DO ismenu.mpr
введите
DO FORM Passin
17.	Проверьте текст основной программы. Он должен быть таким: *********************************
*	Основная программа проекта *
Что сделать, чтобы форма появилась при запуске приложения
SET TALK OFF
SET DATE TO GERMAN
SET CENTURY ON
SET ESCAPE OFF
SET PATH TO LIBS, PRG,
MENUS, DATA, REPORTS
ON SHUTDOWN DO ALVExitProc PUSH MENU „MSYSMENU DO FORM Passin „SCREEN.Visible = . T. READ EVENTS
* Восстанавливаем настройки
POP MENU „MSYSMENU
ON SHUTDOWN
*	Процедура завершения программы PROCEDURE ALVExitProc
CLEAR EVENTS
RETURN 0
18.	Закройте окно с программой.
19.	В окне проекта (рис. 4.43) щелкните мышью по имени основной программы main. Она расположена в папке Programs (Программы).
“1 Project Manager Instar!	12
ill j Data Docs ) Os || Codr JI Oth J Q
Г® Daa aa Documents
J	Й - ® Forms
' ipp aboutfrm i k gg) edper
. • Й51 passin viewp
•• [fU views ’" SI Reports - Labels
| Class Libraries
Г~ □ Code
- Q Programs
i ; © API Libraries i	Applications
: QQ Other
i	t-i Menus
ismenu £) 1 ext riles
;	Cth^ Files
.Description:
 Pain: d\aneKce£\book\exampleWtatf\prg\m&n pig
Рис. 4.43тОкнопроекта
ГЛАВА 4 ▼ Работа с проектом
20.	Щелкните по кнопке Run (Выполнить) в окне проекта.
21.	Появится окно для ввода имени пользователя и пароля. Мы в форме (в процедуре, вызываемой щелчком по кнопке ОК) задали единственно верное имя пользователя - Admin - и единственно правильный пароль -Password. Введите их в соответствующие поля, как показано на рис. 4.44.
22.	После заполнения полей щелкните по кнопке ОК.
23.	Обратите внимание, что появилась строка меню нашего приложения.
24.	Для завершения работы приложения выберите в меню Файл команду Выход.
Рис. 4.44т Заполненные поля запроса информации о пользователе
Работаем с XML
XML (extensible Markup» Language) - расширяемый язык разметки, формат описания структурированных данных, разработанный для Internet и получающий все большее распространение как универсальное средство обмена данными.
Краткое описание XML
Язык XML был разработан группой XML Working Group (первоначально называемой SGML Editorial Review Board), сформированной в 1996 году под патронажем World Wide Web Consortium (W3C).
Тело документа XML состоит из элементов разметки (markup) и непосредственно содержимого документа - данных {content). Инструкции, заключенные в угловые скобки, называются тегами и служат для разметки основного текста документа. В XML существуют открывающие, закрывающие и пустые теги. Между открывающим и закрывающим тегом находится содержимое элемента - данные. Элемент является структурной единицей XML-документа.
Работаем с XML
Например, в элементе
<Мате>Петров И.А.</Name>
Name - имя тега,
Петров И. А. - хранящиеся данные.
По аналогии с таблицами Visual FoxPro, имя тега - это имя поля, а содержимое элемента - это данные, хранящиеся в поле.
Если провести аналогию с таблицами дальше, то такой пример группы тегов:
<Worker>
<Tabnum> 010012</Tabnum>
<Мате>Петров M.A.</Name>
<Id>01</Id>
</Worker>
<Worker>
<Tabnum> 010015</Tabnum>
<Мате>Гришин n.B.</Name>
<Id>02</Id>
</Worker>
можно рассматривать как две записи таблицы с набором полей, в которых хранятся данные.
Пустой тег можно записать так:
<MyTAGx/MyTAG>
а можно так:
<MyTAG />
При определении элементов можно задавать параметры элемента, уточняющие его характеристики. Для этого используют атрибуты элемента. Атрибут состоит из названия, знака равенства и значения, указанного в кавычках или апострофах после знака равенства. Например:
<Worker зех=?таг.?>Иванов С.И. </Worker>
<Worker sex= ?woman?>’&iTpo<iiaKOBa 3.A. </Worker>
В приведенных примерах атрибут sex своим значением уточняет характеристики работника, описываемого элементом Worker.
Хотя XML является не языком программирования, а языком разметки данных, как и в языке программирования Visual FoxPro, в нем могут присутствовать комментарии, которые делают более удобным просмотр и анализ
ГЛАВА 4 ▼ Работа с проектом
XML-файла, но совершенно не влияют на его обработку программными средствами. Комментарии выделяются следующим образом:
<!- Текст комментария -->
Тем, кто пробовал свои силы в работе с HTML, многие правила и конструкции языка XML покажутся знакомыми. Однако при этом надо помнить, что хоть в XML имена тегов придумываете вы сами, но следуете при оформлении XML-документа более строгим правилам, чем при работе с HTML.
Таким образом, язык описания данных XML представляет собой удобный инструмент для передачи данных как в глобальных сетях (Internet), так и в локальных корпоративных сетях. XML-файлы являются достаточно универсальным и гибким средством представления информации, которому специалисты предвещают весьма радужные перспективы.
Новшества Visual FoxPro версии 9 в части работы с XML
Visual FoxPro 9 поддерживает обработку данных в формате XML. Основные новшества версии 9, связанные с XML:
> улучшения, касающиеся кодовых страниц XML-файлов;
> метод LoadXML позволяет получить доступ к любым XML-документам, а не только к удовлетворяющим формату Visual Studio, как это было в версии 8;
> возможность использования выражений XPath.
Visual FoxPro 9 обрабатывает так называемые «well-formed» XML-документы, то есть правильно сформированные (иногда употребляют термин «валидные»). Правильные - значит удовлетворяющие определенным правилам. Какие же это правила?
Требования к XML-документам
Основные правила для XML-документов:
1.	Каждый XML-документ должен иметь уникальный корневой элемент (уникальный внутри одного XML-файла).
2.	Все элементы должны иметь открывающий и закрывающий теги.
3.	Имена открывающего и закрывающего тега должны в точности совпадать; при этом необходимо учитывать, что XML чрезвычайно чувствителен к
Работаем с XML
регистру (если открывающий тег - <МуТад>, а закрывающий - </MYtag>, то это ошибка).
4.	Если внутри одного тега открылся другой, то сначала должен закрыться внутренний тег, а затем внешний.
.5. Существуют запрещенные для использования символы (они являются служебными в XML), заменяемые в XML-документах специальными последовательностями (точка с запятой в конце тоже относится к заменяющему выражению):
& заменяется на &ашр;
< заменяется на &lt ;
> заменяется на &gt ;
? заменяется на &quot ;
? заменяется на &apos;
Пример правильно сформированного XML-документа:
<?xml version='1. О ' encoding='windows-1251'?>
<persons>
<Rec deleted='no 1>
<NAME type='С'>Петров Анатолий Иванович</ЫАМЕ>
<ADDRESS type='C>yn. Академика Ушакова, 10, кв. 112</ADDRESS>
</Rec>
<Rec deleted=1 no ' >
<NAME type='С’>Семёнов Игорь Степанович</ЫАМЕ>
<ADDRESS type=’C>yn. Петровская, 3, кв. 10</ADDRESS>
</Rec>
<Rec deleted='no’>
<NAME type=1 С'>Балашова Зинаида Дмитриевна</ЫАМЕ>
<ADDRESS type='C’>yn. Резинстроя, 20, кв.77</ADDRESS>
</Rec>
<Rec deleted='no’>
<NAME type='С 1 Феоктистова Елена Михайловна</ЫАМЕ>
<ADDRESS type='C'>yn. Пушкина, 1, кв.1</ADDRESS>
</Rec>
<Rec deleted='no ' >
<NAME type='С'>Семёнов Павел Игоревич</ЫАМЕ>
<ADDRESS руре='С'>ул. Петровская, 3, кв.10</ADDRESS>
</Rec>
</persons>
Для проверки правильности структуры XML-документа часто используют схемы XML. Visual FoxPro 9 поддерживает работу с XML Schema Definition (XSD).
ГЛАВА 4 ▼ Работа с проектом
Импорт и экспорт данных в формате XML
Мы уже несколько раз говорили о легкости импорта и экспорта данных в формате XML при помощи средств Visual FoxPro 9. Как практически реализовать обмен данными? Рассмотрим один из возможных путей. В Visual FoxPro 9 присутствуют следующие полезные функции для конвертирования данных таблиц в формат XML и обратно: CURSORTOXML (), XMLTOCURSOR () и XMLUPDATEGRAM (). Есть один нюанс при работе с этими функциями - для их успешной работы необходимо, чтобы в вашей системе был установлен MSXML 3.0 или выше. Если у вас установлен Internet Explorer 5.5 или выше, MSXML у вас точно есть. Познакомимся с каждой из функций в отдельности. Следующая функция экспортирует данные таблицы в формат XML.
CURSORTOXML(<Рабочая_область> I <Имя_таблицы>, <Путьлля_результата>
[, <Формат_результата> [, <Флаги> [, <Выводимые_записи> [, <Имя_схемы>
[, <Местоположение_схемы> [, <Пространство_имен> ]]]]]])
> <Рабочая_область> I <Имя_таблицы> - указывается рабочая область или имя таблицы, данные которой будут помещены в XML-файл;
> <Путь_для_результата> - определяет путь к XML-файлу и имя XML-файла или имя символьной переменной, куда будет выведен результат преобразования;
> <Формат_результата> - задает формат вывода данных. Возможные варианты:
1	- элементы (поля таблицы станут элементами в формате XML);
2	- атрибуты (поля таблицы станут атрибутами в формате XML);
3	- ориентированный на строки формат (поля таблицы станут атрибутами в формате XML);
>	<Флаги> - определяет особенности трансформации данных и форматирования выходного результата. Возможные значения приведены в табл. 4.1;
>	<Выводимые_записи> - задает количество выводимых записей исходной таблицы. Если задать 0, то будут выведены все записи таблицы;
>	<Имя_схемы> - указывается имя используемой схемы XML. Если вы желаете включить схему в XML-файл, укажите в качестве этого параметра ?1?;
>	<Местоположение_схемы> - определяет при использовании внешнего файла схемы дополнительный путь, где нужно искать файл со схемой;
> <Пространство_имен> - задает пространство имен XML.
Работаем с XML
Если вы задали имя выходного XML-файла, а он не создается, проверьте, ука-"Т* зали ли вы флаг, например, 512.
Таблица 4.1 тВозможные значения флагов cursortcxml( )
Флаг	Двоичное представление	Описание
0	0000	Записывает XML-данные в переменную в формате UTF-8
1	0001	Записывает не форматированные XML-данные в переменную
2	0010	Создает пустые элементы в виде двух тегов - открывающего и закрывающего (<alvx/alv>), в противном случае такие элементы описываются одним тегом с символом закрытия (<alv />)
4	0100	Сохраняет пробелы в полях данных
8	1000	Устанавливает перенос в memo-полях, в секции CDATA
16	10000	Настраивает кодировку символьных полей в соответствии с кодировкой исходной таблицы
32	100000	Настраивает кодировку символьных полей в UTF-8 (параметр encoding = "UTF-8")
512	1000000000	Определяет, что XML-данные выводятся в файл. Если файла не существует, он буден создан
4096	1000000000000	Запрещает экспорт memo-полей на основе base64. По умолчанию memo-поля (Binary) экспортируются как xsd:base64binary
32768		Показывает, что кодовая страница используется
Например:
CURSORTOXML("Persons", "alvfile", 3, 512+60, 0)
Рассмотрим следующую функцию из нашего списка, обратную предыдущей. Она импортирует данные в формате XML в таблицу.
XMLTOCURSOR (<Виражение> I <ХМЬ-файл> [, <Курсор> [, <Флаг>]])
>	<Выражение> I <ХМЬ-файл> - задает либо переменную, содержащую данные в формате XML, либо имя файла с данными в формате XML;
>	<Курсор> - определяет имя курсора, в который помещается результат. Если курсор уже существует, он закроется и будет создан новый. Если указано имя существующей открытой таблицы и установлен флаг 8192, данные из XML-файла будут добавлены в таблицу;
>	<Флаг> - указывает дополнительные параметры преобразования xml-дан-ных. Возможные варианты флагов приведены в табл. 4.2.
Если XML-данные не «well-formed», Visual FoxPro 9 выдает ошибку, подобную приведенной на рис. 4.45.
ГЛАВА 4 ▼ Работа с проектом
Рис. 4.45 ▼ Ошибка при импорте XML-данных
Таблица 4.2 т Возможные значения флагов XMLTOCURSOR ()
Флаг	Двоичное представление	Описание
0	0000	Указывает, что первый параметр является строковой переменной
4	0100	Сохраняет пробелы в полях данных
512	1000000000	Определяет, что XML-данные импортируются из файла
1024	10000000000	Создает в результирующей таблице символьные или memo-поля с добавлением пробелов
2048	100000000000	Применяется в случае использования XML schema definition (XSD) для преобразования элементов, содержащих числовые данные с 19 разрядами целой части и 4 разрядами десятичной, в поля типа Currency
4096	1000000000000	Запрещает импортдвоичных полей на основе base64
8192	1100000000	Указывает, что данные из формата XML импортируются в существующую таблицу или курсор и должны быть добавлены к уже имеющимся записям
32768	0x8000	Показывает, что кодовая страница используется
65536	0x10000	Преобразует символьные данные XML в формат Varchar
131072	0x20000	Преобразует двоичные данные XML в поля типа Varbinary, если они меньше 255 байт, и в поля типа Blob. В противном случае такие данные преобразуются в memo-поля
Например:
XMLTOCURSORf "alvxrtil" , "Persons" ,8192 + 512)
И последняя функция нашего списка - XMLUPDATEGRAM{). Она служит для отражения операций изменения в таблице или курсоре. В XML-файле сохраняется состояние записи или ключевого поля до внесения изменений и после. Два главных условия для применения этой функции - использование режима SET MULTILOCKS ON и включенная буферизация таблицы, например, посредством команды CURSORSETPROP ("Buffering" , 5). Формат функции:
XMLUPDATEGRAM( [ <Список_таблиц> [, <Флаги> [,<Имя_схемы>]]])
Работаем с XML
231
> <Список_таблиц> - список контролируемых таблиц;
> <Флаги> - аналогично используемым в функции CURSORTOXML (), исключая флаги 512 и 4096;
> <Имя_схемы> - указывается, если используется XML Schema Definition (XSD).
Пример файла, созданного при помощи XMLUPDATEGRAM ():
<?xml version = "1.0" encoding="Windows-1252" standalone="yes"?>
<root xmlns:updg=“urn:schemas-microsoft-com:xml-updategram">
<updg:sync>
<updg:before>
<persons>
<tabnum>70010</tabnum>
<пате>Перец Теодор Петрович</пате> <birthday>1970-12-30</birthday> <address>Capaft l</address> <id>01005</id>
</persons>
</updg:before>
<updg:after>
<persons>
<tabnum>70010</tabnum>
<пате>Перец Теодор Митрофанович</пате> <birthday>1970-12-30</birthday>
<address>Capait l</address>
<id>01005</id>
</persons>
</updg:after>
</updg:sync>
</root>
Соответственно, в секции updg:before содержатся данные до внесения изменений, а в секции updg: after - после внесения изменений. Что называется, «найдите десять отличий». А отличие в нашем случае одно: изменено отчество в поле Name.
Попробуем на практике
Создавая меню для нашего приложения, мы предполагали снабдить пользователя возможностью импорта данных из XML-формата и экспорта данных в XML-формат. Для этой цели мы заготовили пункты меню Файл > Работа с XML > Экспорт в XML и Файл > Работа с XML > Импорт в XML. Взяв на вооружение только что рассмотренные функции, попробуем
ГЛАВА 4 ▼ Работа с проектом
реализовать обещанные пользователю возможности. Для этого выполните следующие действия:
1.	В папке с нашим проектом InStaff создайте две папки - IN и OUT. Мы будем использовать их так: в папку IN будет помещаться XML-файл, данные из которого будут импортироваться, а в папке OUT будет создаваться XML-файл после экспорта данных.
2.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку InStaff.
3.	Если окно проекта не открыто, выберите команду Open (Открыть) из меню File (Файл). В появившемся окне открытия файла выберите файл проекта, который мы создали ранее.
4.	Щелкните мышью по папке Programs (Программы), находящейся в папке Code (Программный код), а затем по кнопке New (Новый). Появится окно для ввода тела программы.
5.	Введите в окне следующие команды:
USE (SYS(5) + CURDIR() + "\DATA\Persons. dbf "<) IN 0
*	Выгружаем данные в xml-файл CURSORTOXML (" Persons “ , ;
(SYS(5) + CURDIRO + "\OUT\PersExp”), 1, 512, 0)
*	Проверяем, создан ли файл
IF FILE(SYS(5) + CURDIRO + "\OUT\PersExp.xml") MESSAGEBOX("Экспорт таблицы успешно завершен",;
64, "Экспорт в XML")
ELSE
MESSAGEBOX("В процессе экспорта возникли проблемы!",;
16, "Экспорт в XML")
ENDIF
USE && Закрываем таблицу
6.	Сохраните программу (File > Save) в папке PRG под именем alvexpxml.
7.	Закройте окно с программой.
8.	В окне проекта щелкните мышью по папке Programs (Программы), находящейся в папке Code (Программный код), а затем по кнопке New (Новый). Появится окно для ввода тела программы.
Работаем с XML
9.	Введите в окне следующие команды:
USE (SYS(5) + CURDIRO + "\DATA\Persons.dbf") IN 0 ln_RecN = RECCOUNT() && Фиксируем количество записей
*	Проверяем наличие файла в папке IN
IF !FILE(SYS(5) + CURDIRO + "\IN\PersImp.xml")
MESSAGEBOX("В папке IN отсутствует файл Perslmp.xml! ",;
16, "Экспорт в XML")
RETURN -1
ENDIF
★	Добавляем в таблицу Persons данные из xml-файла
XMLTOCURSOR ( (SYS (5) + CURDIR() + "\IN\PersImp") , "Persons", 8192 + 512)
*	Проверяем увеличилось ли количество записей в таблице
IF RECCOUNT() > ln_RecN '
MESSAGEBOX("Импорт в таблицу успешно завершен",;
64, "Импорт из XML")
ELSE
MESSAGEBOX("Ни одна запись не добавлена!", 16, "Импорт из XML") ENDIF
USE && Закрываем таблицу
10.	Сохраните программу (File > Save) в папке PRG под именем alvimpxml.
11.	Закройте окно с программой.
12.	В результате в окне проекта в папке Programs (Программы) кроме основной программы main должны появиться еще две программы (рис. 4.46).
13.	Вызов программ на выполнение в основном меню нашего приложения уже реализован.
14.	В окне проекта (см. рис. 4.46) щелкните мышью по имени основной программы main. Она расположена в папке Programs (Программы).
15.	Щелкните по кнопке Run (Выполнить) в окне проекта.
16.	Появится окно для ввода имени пользователя и пароля. Введите имя пользователя - Admin и пароль - Password.
17.	После заполнения полей щелкните по кнопке ОК. Появилась строка меню нашего приложения.
18.	В основном меню приложения выберите пункт Файл, в появившемся подменю выберите пункт Работа с XML, а затем команду Экспорт в XML. Если вы не забыли создать папку OUT и ввели текст программ правильно, появится сообщение, представленное на рис. 4.47.
ГЛАВА 4 ▼ Работа с проектом
.3 Project Мвмчег-’пйЛ	U
| Al |.Da,a_L.Do.c.s-Jb_.ftMi„c.od’_.0
i±j-E£ Data
FI EID Documents E ID Forms
sa aboutfrm
: gg edper r im passin ;...US viewp
- IS views
• S Reports
- • {==? Labels
jf\ Class Libraries
E □ Code E-Q Programs
Q alvexpxml
» CfcZ] : I.......1
 CZS&ZD
j . .. Run,“Jn [Remote... ] I w I
; Description:
i Path: d.\aneKceA\book\exampte\in$taff\pf g\main. prg
Рис. 4.46 ▼ Окно проекта с добавленными программами
Рис. 4.47 ▼ Сообщение об успешном завершении экспорта
19.	Убедитесь, что в папке OUT действительно возник файл PersExp.xml. Просмотрите его в любом текстовом редакторе. Сравните записанные в него данные с информацией в таблице Persons.
20.	В основном меню приложения выберите пункт Файл, в появившемся подменю выберите пункт Работа с XML, а затем команду Импорт из XML. Появится сообщение, представленное на рис. 4.48.
21.	Сообщение совершенно справедливо указывает на отсутствие xml-файла с добавляемыми данными. Файл мы действительно еще не создали. В окне сообщения щелкните мышью по кнопке ОК.
Выборка данных из удаленной базы данных
Рис. 4.48 т Сообщение об отсутствии файла
22.	В любом текстовом редакторе (например, в Блокноте) создана е в папке IN (созданной вами ранее в папке проекта InStaff) файл с им-, чем :'<'rslinp.xml следующего содержания:
<?xml version = "1.0" enccdir,q = "Windows-1252"?->
<VFPData>
<persons>
<tabnuni>70011</tabnum>
<пате>Полупанев Илья Семенович</паше.> <birthday>1969-10-12</birthday>
<address>yn. Академика Ушакова, 3, кв.2</address ' <id>01005</id>
</persons>
</VFPData>
23.	В основном меню приложения выберите пункт Файл, в появившемся подменю выберите пункт Работа с XML, а затем команду Импорт из XML.
24.	Если вы правильно ввели содержимое xml-файла, появится сообщение об успешном завершении импорта. Щелкните мышью по кнопке ОК в этом сообщении и просмотрите данные о сотрудниках. Это можно сделат ь и посредством команды Просмотр персонально (Файл > Сотрудники > Просмотр персонально) и команды Просмотр списком (Файл > Сотрудники > Просмотр списком).
25.	Для завершения работы приложения выберите из меню Файл команду Выход.
Выборка данных из удаленной базы данных
Мы рассмотрели возможности работы приложения с таблицами Visual FoxPro, а как быть, если нужные нам данные находятся в базах данных под управлением других СУБД? Отчасти ответ на этот вопрос был дан в главе 2.
ГЛАВА 4 ▼ Работа с проектом
Рассмотрим практическое использование команд, описанных в разделе «SQl-запросы. Грамотное решение» (глава 2), в приложении для получения данных их удаленной БД.
Попробуем на практике
Добавим в наше приложение возможность импорта данных из БД, созданной Microsoft Access. Для того чтобы опробовать добавляемую нами возможность, придется создать в Microsoft Access базу данных AcsBase с таблицами AcsPers и AcsStaff и набором полей, аналогичным набору полей в таблицах Persons и Staff нашего практического примера. Введите в эти таблицы данные по нескольким новым сотрудникам и новым должностям. Кроме того, требуется создать настройку на созданную базу данных AcsBase, как это описано в разделе «Настройка ODBC» (глава 2).
Далее выполните следующие действия:
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку InStaff.
2.	Если окно проекта не открыто, выберите команду Open (Открыть) из меню File (Файл). В появившемся окне открытия файла выберите файл проекта, который мы создали ранее.
3.	В окне проекта щелкните мышью по имени нашего меню ismenu, находящегося в папке Menus (Меню). После этого щелкните в окне проекта по кнопке Modify (Изменить).
4.	В Menu Designer откройте содержимое подменю Файл щелчком мышью по этому пункту, а затем по кнопке Edit, появившейся справа от него. После этого добавьте в открывшееся меню Файл при помощи кнопки Insert (Вставить) новый пункт - Импорт из Access, как это показано на рис. 4.49.
5.	Закройте окно Menu Designer и на запрос о сохранении изменений ответьте Yes (Да).
6.	Как видите на рис. 4.49, новый пункт нашего меню вызывает на выполнение форму ImpAcs. Соответственно, эту форму нам предстоит создать. Для этого щелкните мышью по папке Forms (Формы), находящейся в папке Documents (Документы), а затем по кнопке New (Новый).
7.	В появившемся окне выберите кнопку New Form (Новая форма). Появится окно Form Designer (Дизайнер форм).
Выборка данных из удаленной базы данных

Рис. 4.49 » Вставка нового пункта меню
8.	В появившемся окне свойств окна формы установите следующие настройки:
-	Caption - Импорт данных из Access:
-	MaxButton - .E-False.
Для установки соответствующей настройки щелкните по ней в списке настроек и введите значение или выберите из списка в поле над списком свойств.
9.	Добавьте в окно элементы, как показано на рис. 4.52. Combol - это раскрывающийся список, он создается кнопкой И- Listl и List2 - это списки, они создаются с помощью кнопки Щ. Переключатель режимов создается следующим образом: щелкаем по кнопке (• и выделяем мышью место под два режима (рис. 4.50), при этом свойство переключателя ButtonCount будет равно 2. Если это не так, установите это значение вручную. Чтобы убрать рамку вокруг области переключателя, установите свойство BorderStyle для переключателя в значение 0 - None. Нажав и удерживая кнопку Ctrl на клавиатуре, щелкаем мышью по созданному переключателю режимов. Вокруг области переключателя режимов появится цветная рамка. Отпускаем кнопку Ctrl на клавиатуре. Затем щелкаем по названию одного из режимов в переключателе, например Option 1 (таким образом, мы переходим к редактированию отдельного режима) и меняем в окне свойств значение свойства Caption со значения Optionl на значение Все записи (рис. 4.51). Проделываем ту же процедуру со вторым режимом, но задаем значение свойства Caption - Выбрать из списка.
ГЛАВА 4 ▼ Работа с проектом


ЯМ^МЯМММШММПВШИ1 v Импорт данмыхммДОШ
Баи данных ;	1
Таблица _i::‘
".   :ТЫ±J ....
. ®Option1
' OOption2
| ..'usl2
Рис. 4.50 ▼ Размещение переключателя режимов
Рис. 4.51 ▼ Настройки свойств режима
Выборка данных из удаленкой базы дзнкых


База данных ; И Combo!
Таблица lust!
; ® Все записи
; О Выбрать из списка
Ust2
Form
[ый
А И И
[Добавить |
Отмена
опа в'
В Ju а
<-]»!
Рис. 4.52» Вид созданного окна формы
10.	В окне свойств для элемента List2 установите свойство MultiSelect в значение .T.-True. Этим действием мы разрешаем пользователю выбирать в списке сразу несколько записей. Для выбора нескольких записей надо нажать клавишу Ctrl.
11.	В окне свойств для элемента List2 установите свойство ColumnCount в значение 2. Это нужно для того, чтобы показывать в списке две колонки. В первой будем выводить табельный номер, а во второй - имена сотрудников.
12.	Мы построили окно формы. Теперь пора создать процедуры, чтобы наполнить форму жизнью. Во-первых, создадим процедуру, вызываемую при инициализации формы. Для этого сделайте двойной щелчок по свободному месту формы (не по какому-либо элементу).
13.	Проверьте, что в появившемся окне справа от слова Object (Объект) стоит значение Forml, а справа от слова Procedure (Процедура) -- значение Init. В противном случае поменяйте значения на указанные.
14.	Введите указанный текст:
*	Глобальная переменная для
*	хранения указателя на удаленную ЗД
PUBLIC gn_hndl
ГЛАВА 4 ▼ Работа с проектом
*	Добавим в раскрывающийся список Combol
*	элемент "AcsBase"
ThisForm.Combol.Addltem("AcsBase")
*	Отобразить первый элемент списка
ThisForm.Combol.Value = 1
*	Добавим в список Listl
*	элемент "AcsPers”
ThisForm.Listl.Additem("AcsPers")
*	Добавим в список Listl
*	элемент "AcsStaff"
ThisForm.Listl.Addltem("AcsStaff")
*	Сделать текущим первый элемент списка
ThisForm.Listl.Value = 1
15.	Закройте окно. Сделайте двойной щелчок мышью по переключателю режимов.
16.	Проверьте, что в появившемся окне справа от слова Object (Объект) стоит значение Optiongroupl, а справа от слова Procedure (Процедура) - значение InteractiveChange. В противном случае поменяйте значения на указанные.
17.	В окне введите следующий текст:
*	Проверяем, какой режим выбран
IF ThisForm.optiongroupl.Value = 2
*	Если режим отбора записей,
*	отображаем записи выбранной таблицы
* Номер выбранного элемента в списке таблиц
ln_TblNum = ThisForm.Listl.Value
* Имя таблицы
lc_TblName = ALLTRIM(ThisForm.List 1.List(ln_TblNum))
* Соединяемся с удаленной БД
gn_hndl = SQLCONNECT("AcsBase")
IF gn_hndl > 0 && Проверяем, успешно ли соединились
* Составляем SQL-запрос к таблице
lc_StrSel = "SELECT * FROM " + lc_TblName
* Выполняем SQL-запрос к таблице
SQLEXEC(gn_hndl, lc_StrSel)
* Тип источника данных для списка List2 - поля таблицы ThisForm.List2.RowSourceType = 6
* Количество столбцов в списке
ThisForm.List2.ColumnCount = IIF(ln_TblNum = 1, 2, 1)
* Источник данных для заполнения списка - результат запроса ThisForm.List2 .RowSource := IIF(ln_TblNum = 1, "SQLRESULT", ;
"SQLRESULT.Whois")
ELSE
Выборка данных из удаленной базы данных
MESSAGEBOX("Связь с БД Access не установлена!", 16, "Ошибка") ENDIF
ELSE
*	Очищаем список List2
ThisForm.List2.RowSource = ""
ENDIF
18.	Закройте окно. Сделайте двойной щелчок мышью по созданному вами списку Listl.
19.	Проверьте, что в появившемся окне справа от слова Object (Объект) стоит значение Listl, а справа от слова Procedure (Процедура) - значение InteractiveChange. В противном случае поменяйте значения на указанные.
20.	Нам нужно предусмотреть случай, когда выбран режим Выбрать из списка и пользователь выбрал другую таблицу. В этот момент нужно заполнить список List2 данными из другой таблицы. Для этого в окне введите следующие команды:
*	Проверяем, какой режих-t в optiongroupl выбран
IF ThisForm.optiongroupl.Value = 2
*	Если режим отбора записей,
*	отображаем записи выбранной таблицы
Очищаем список
ThisForm.List2.RowSource =
* Номер выбранного элемента в списке таблиц ln_TblNum = ThisForn.Listl.Value
★ Имя таблицы
lc_TblName = ALLTRIMfThisForm.Listl.List(ln_TblNum))
* Соединяемся с удаленней БД
gn__hndl = SQLCONNECT("AcsBase")
IF gn_hndl > С && Проверяем, успешно ли соединились
* Составляем SQL-запрос к таблице lc_StrSel = "SELECT * FROM " + IcJTbiName
* Выполняем SQL-запрос к таблице SQLEXEC(gn_hndl, lc_StrSel)
" Тип источника данных для списка List2 - поля таблицы ThisForm.List2.RowSourceType = 6
* Количество столбцов в списке
ThisForm. List2 .ColumnCount = I IF (InJTblNum = 1, 2, 1)
* Источник данных для заполнения списка - результат запроса ThisForm.List2.RowSource = IIF(ln_TblNum = 1, "SQLRESULT”, ;
"SQLRESULT.Whois")
ГЛАВА 4 V Рабата с проектом
K"..":?A3SBOX (' 'Связь с БД Access не установлена!", 16, "СмжА )
21.	Закройте окно. Сделай те двойной щелчок мышью по созданной вами кп опке Отмена.
22.	В окне введен.: следующий текст:
USE ы:1 сакр:.:: л.ос соСа су
'ihisSorr,!. keleasc s_ Б ,sq Исаем окно ф^рмы
23.	Закройте окно, ('делайте двойной щелчок мышью по созданной вами гнопкеДобавить.
24.	При наступлении событ ия Click (щелчок по кнопке Добавить) и должны осуществляться дейсииы но добавлению в соответствующую таблицу данных из БД Access. Будем проверять, какая таблица выбрана, и в зависимости от этого добавлять данные выборки либо в таблицу Persons, либо в т аблицу Stall. В с'кве введите следующий текст:
*	переходит е папку <. и-’.•лицами
СГ> SYS (5) - CUH'DI?.'; С .у ; д '
*	Проверяем, как'и уежи’з ве:бра:: IF Thi sl-orin. opr ionaroupl .Value - ?.
* Если ::ei;a , Д-'-са записей,
* к -'.-a-?- л ' кеа i: .'писке записи
-е таблиц
.List (In. Pl Ijuin) ) trs,
/ I-er sons
..-a :n. всем элеменпам списка
. = _ It, EhisForii. List?. ListCount
II' Tn isForm. Li st. 2 . Selected (ln_i)
*	Если текущий элемент выделен пользователем,
*	вставим в таблицу Persons запись
*	из таблицы выборки SQLRESULT
INSERT INTO Persons SELECT * FROM "SQLRESULT" ;
WHERE '-’abnuiil " VAL (LEFT (ALLTRIM;
(ThiaFarm.List2.1,ist(ln_i)) , 5) )
Выборка данных из удаленной базы данных
ENDIF
ENDFOR
USE && Закрываем таблицу Persons
MESSAGEBOX("Данные добавлены”, 48, "Результат обработки"! ELSE
*	Если не выбрана таблица AcsPers,
*	значит выбана таблица AcsStaff и
*	следует добавить данные в таблицу Staff
USE Staff IN 0 INDEX Id_staff.idx SELECT Staff
*	Пройдем по всем элементам списка
FOR ln_i = 1 TO ThisForm.List2.ListCount
IF ThisForm.ListZ.Selected!ln_i)
* Если текущий элемент выделен пользователем, * вставим в таблицу Staff запись
* из таблицы выборки SQLRESULT
INSERT INTO Staff SELECT * FROM "SQLRESULT” ; WHERE ALLTRIM(Whois) == ALLTRIM;
(ThisForm.List2.List(ln_i)) ENDIF
ENDFOR
USE && Закрываем таблицу Staff
MESSAGEBOX("Данные добавлены", 48, "Результат обработки") ENDIF
ELSE
*	Номер выбранного элемента в списке таблиц ln_TblNum = ThisForm.Listl.Value
*	Имя таблицы
lc_TblName = ALLTRIM(ThisForm.Listl.List(ln_TblNum))
*	Соединяемся с удаленной БД gn_hndl = SQLCONNECT!"AcsBase")
IF gn_hndl > 0 && Проверяем, успеино ли соединились
*	Составляем SQL-запрос к таблице lc_StrSel = "SELECT * FROM " + lc_TblName
*	Выполняем SQL-запрос к таблице SQLEXEC(gn_hndl, lc_StrSel) ENDIF IF IcJTblName == "AcsPers"
*	Если выбрана таблица AcsPers,
*	добавляем данные в таблицу Persons USE Persons IN О SELECT Persons
*	Вставим в таблицу Persons записи
*	из таблицы выборки SQLRESULT
INSERT INTO Persons SELECT * FROM "SQLRESULT” USE && Закрываем таблицу Persons
ГЛАВА 4 V Работа с проектом
MESSAGEBOX("Данные добавлены", 48, "Результат обработки") ELSE
*	Если не выбрана таблица AcsPers,
*	значит выбана таблица AcsStaff и
*	следует добавить данные в таблицу Staff
USE Staff IN 0 INDEX Id_staff.idx
SELECT Staff
*	Вставим в таблицу Staff записи
*	из таблицы выборки SQLRESULT
INSERT INTO Staff SELECT * FROM "SQLRESULT"
USE Закрываем таблицу Staff
MESSAGEBCXf"Данные добавлены", 48, "Результат обработки") ENDIF
ENDIF
SQLDISCONNECT(gn_hndl) && Обрываем связь с удаленной БД
IF USED("SQLRESULT") && Если открыта таблица с выборкой
SELECT "SQLRESULT"
USE && Закрываем таблицу с выборкой
ENDIF
CD .. && Возвращаемся в основную папку
ThisForm.Release && Закрываем окно формы
25.	Закройте окно.
26.	Закройте окно Form Designer (Дизайнер форм).
27.	В окне проекта щелкните мышью по имени основной программы проекта main, а затем по кнопке Build (Построить). Откроется диалоговое окно Build Options (Параметры построения), где следует выбрать режим Rebuild project (Перестроить проект), а затем щелкнуть мышью по кнопке ОК. Это нужно для обновления связей между компонентами создаваемого приложения.
28.	В окне проекта щелкните мышью по имени основной программы проекта main, а затем по кнопке Run (Выполнить).
29.	Появится окно для ввода имени пользователя и пароля. Введите имя пользователя - Admin и пароль - Password.
30.	В появившемся основном меню приложения выберите команду Импорт из Access из меню Файл.
31.	Проверьте работу созданного вами окна в различных режимах. Не забывайте, что выделить мышью несколько записей сразу можно, если нажать и не отпускать кнопку Ctrl.
32.	После нажатия кнопки Добавить окно закроется. Выберите одну из команд просмотра записей о пользователях (Просмотр персонально или Просмотр списком) и убедитесь, что появились новые записи.
Если требуется вывести данные на печать
33.	Завершите работу приложения, выполнив команду Выход из меню Файл. Мы создали инструмент, работающий с таблицами СУБД Access. Этот инструмент при соответствующей настройке ODBC будет работать и с другими источниками данных, например с Microsoft SQL Server.
Если требуется вывести данные на печать
Мы уже рассматривали вопросы вывода информации на экран, где ее можно просматривать и редактировать. Но иногда требуется вывести информацию на бумажный носитель. Так говорят официально. А попросту: надо иметь возможность напечатать отчет на принтере. Если учесть, что принтеры бывают разные и, соответственно, меняется и способ подготовки данных для печати, задача получается непростая. Как можно ее решить с минимальными затратами?
Способы печати без применения генератора отчетов
В FoxPro для MS DOS широко применялась технология переназначения вывода информации (например, посредством команды ?) на принтер. Мы рассматривали применение комбинации команд для этого способа, когда обсуждали работу с файлами в третьей главе. Эти команды достаточно хорошо работают в Visual FoxPro 9. Причем переназначать вывод, используя команду SET PRINTER ТО, можно и в сетевую очередь печати.
Еще один традиционный вариант подготовки отчета - вывод его предварительно в текстовый файл, а затем уже отправка этого файла на печать.
Однако приведенные выше способы не годятся для сложных отчетов, где применяются графические изображения, линии или требуется точное (буквально до миллиметра) расположение полей. В таких случаях пользуются генератором отчетов. Такой генератор был и в версиях FoxPro для MS DOS, но его возможности были ограничены использованием текстового режима.
Альтернативой при создании отчетов, приобретающей все большую популярность, является использование html-файлов (Web-страничек). О Мастере, помогающем создать такой отчет, можно прочитать в пятой главе, а сейчас рассмотрим функции, которые выполняет генератор отчетов Visual FoxPro 9. Кстати, в версии 9 он был значительно доработан.
Создание печатных форм при помощи Дизайнера отчетов
Visual FoxPro 9 обладает весьма мощным генератором отчетов. Причем при запуске отчета можно осуществить предварительную подготовку данных.
ГЛАВА 4 V Работа с проектом
Как создать в проекте новый отчет? Для этого следует выделить мышью в панке Documents панку Reports, а затем щелкнуть по кнопке New (Новый). В появившемся окне можно выбрать один из двух вариантов: Мастер отчетов (Report Wizard) или сразу Дизайнер отчета (New Report).
Если выбрать кнопку New Report (Новый отчет), появится окно Дизайнера отчета (Report Designer), показанное на рис. 4.53.
В окне присутствует панель инструментов, кнопки на которой имеют следующее назначение:
А статический текст;
И1 поле для вывода данных;
1“ линия;
□ прямоугольник;
О прямоугольник со скругленными углами;
изображение или OLE-объект.
В рабочей облас isi Дизайнера отчета (Report Designer) размещается макет печатного листа. Он разделен на три части: Page Header (Заголовок листа), Detail (Детали) и Page Footer (Нижняя часть страницы). Это деление условное.
Если требуется вывести данные на печать
Никаких видимых разделителей на листе не появится. Для чего предпринято такое разделение? В области Detail (Детали) размещаются собственно сами данные отчета, например, строкой перечисляются поля таблицы. При запуске формирования отчета вместо строки имен полей будут выведены значения полей. Если не задавать ограничений, то будут выведены все значения в столбик.
То, что вы разместите в областях Page Header (Заголовок листа) и Page Footer (Нижняя часть страницы), будет отображаться на каждой странице соответственно вверху и внизу страницы.
Обратите внимание, что в основном меню Visual FoxPro 9 появился еще один пункт меню - Report. Здесь собраны команды для подготовки и запуска отчета.
Наверняка в отчете вам потребуется создать наименование, заголовок отчета, который будет присутствовать только вверху на первой странице. Для этой цели надо добавить еще одно поле под названием Title (Заголовок). Для этого в меню Report (Отчет) выберите команду Optional Bands (Дополнительные области). Появится окно, представленное на рис. 4.54.
Установите флажок Report has title band (Отчет имеет область заголовка). После этого щелкните мышью по кнопке ОК, и появится область заголовка. Все, что вы внесете в эту область, будет появляться при формировании отчета в его верхней части на первой странице.
Рис. 4.54 ▼ Вид окна для настройки заголовка отчета
ГЛАВА 4 ▼ Работа с проектом
Добавление полей в отчет
Рассмотрим подробнее способ добавления полей в отчет. Чтобы добавить поле с данными, надо щелкнуть мышью по кнопке БИ, а затем установить указатель мыши в то место в макете отчета, где должен быть левый верхний угол поля с данными, нажать левую клавишу мыши и, не отпуская ее, перевести указатель мыши в то место^где должен быть правый нижний угол поля. Откроется окно Field Properties (Свойства поля), отображенное на рис. 4.55.
Рис. 4.55 т Вид окна Field Properties
В поле Expression (Выражение) вводится наименование поля или функции, принимающие в качестве входных параметров поля таблиц или переменные и возвращающие значения, которые отобразятся в отчете. Visual FoxPro 9 помогает вам слегка автоматизировать этот процесс. Чтобы воспользоваться предоставленной возможностью, щелкните по кнопке с многоточием.
Откроется окно Expression Builder, представленное на рис. 4.56. В нем можно выбрать в раскрывающихся списках функцию в группе Functions. Для удобства функции разделены на группы: String (Строковые), Logical (Логические), Math (Математические) и Date (Работа с датами). В списке в нижней части окна можно выбрать объявленные переменные (из правого списка) или поля таблицы (в левом списке). Таблицу, поля которой перечисляются, можно выбрать из раскрывающегося списка From table.
Если требуется вывести данные на печать
Если в этом окне щелкнуть по кнопке Options (Дополнительно), появится окно для задания дополнительных условий оформления выражения. Например, можно задать обязательную простановку алиаса таблицы перед именем поля (Always add alias) или, наоборот, никогда не ставить алиас (Never add alias).
После того как вы сделали все установки в Expression Builder, щелкните мышью по кнопке ОК, и результат ваших трудов появится в поле Expression (Выражение).
Продолжим рассматривать вкладку General (Общие). Пользуясь переключателем Object position (Позиция объекта), можно задать привязку поля к верхней границе области (Fix relative to top of band), к нижней границе области (Fix relative to bottom of band) или оставить поле без привязки, то есть плавающим (Float).
Если установить флажок Stretch with overflow (Растягивать при переполнении), поле будет раздвигаться автоматически в случае, когда значение, которое в него выводится, длиннее, чем отведенное поле. В противном случае выводимое значение будет обрезано.
Группа числовых полей Size and position in layout (Размер и позиция размещения) позволяет точно установить размер поля по вертикали (Height) и горизонтали (Width), позицию относительно верха страницы (From page top) и левой границы страницы (From left).
ГЛАВА 4 ▼ Работа с проектом
Вкладка Style (Стиль) отвечает за внешний вид отображаемой информации. В группе Font (Шрифт) присутствуют настройки шрифта. Можно задать цвет (группа Color) и прозрачность фона (Opaque - непрозрачный, Transparent -прозрачный).
Вкладка Format (Формат) позволяет задать, если это требуется, формат вывода данных в поле.
Сохранение макета отчета в файл
Макеты отчетов (обычно говорят просто «отчеты») хранятся в файлах с расширением .frx. Сохранение отчета происходит стандартным образом - с помощью команды Save (Сохранить) из меню File (Файл).
Формирование отчета
Запустить отчет на формирование можно, либо воспользовавшись пунктом меню Report (Отчет) основного меню Visual FoxPro 9 и выбрав в нем команду Run Report (Запустить Отчет), либо набрав в окне Command команду REPORT FORM. Если отчет формируется из программы, также следует использовать команду REPORT FORM.
REPORT FORM <Имя_файла> I ? [ENVIRONMENT] [Scope] [FOR <Условие1>] [WHILE <Условие2>] [NOOPTIMIZE] [RANGE <Первая_страница> [,<Последняя_страница>]] [HEADING <Текст_заголовка>] [SUMMARY] [NORESET] [PLAIN] [NOCONSOLE I OFF] [PDSETUP] [NAME <Имя_объекта>] [OBJECT <Список_отчетов> I TYPE <Выражение>] [TO <Путьлля_вывода> [NODIALOG]] [PREVIEW [<Путьлля_предпросмотра>] [NOWAIT] [WINDOW <Имя_окна>]]
>	<Имя_файла> - задается имя файла с отчетом (.frx);
>	? - выводится диалоговое окно открытия файла для выбора файла с отчетом (.frx);
>	ENVIRONMENT - обеспечивается открытие всех таблиц и установление всех связей между таблицами, ассоциированных с отчетом, даже если свойство AutoOpenTables имеет значение False (.Е);
>	Scope - определяет диапазон записей, включаемых в отчет;
>	FOR <Условие1> - на печать выводятся только записи, удовлетворяющие условию;
>	[WHILE <Условие2>] - выводит на печать данные, пока выполняется условие;
Если требуется вывести данные на печать
>	NOOPTIMIZE - запрещает использование оптимизации Rushmore;
>	RANGE <Первая_страница> [, <Последняя_страница>] - устанавливает диапазон выводимых па печать страниц;
>	HEADING <Текст_заголовка> - задает текст, который нужно дополнительно выводить в заголовке каждой страницы;
>	SUMMARY - сжимает область Detail (Детали) так, что на печать выводятся только итоги;
>	NORESET - указывает, что значения системных переменных _PAGENO и _PAGETOTAL не инициализируются заново для нового отчета, а их значения изменяю гея с учетом текущих значений (нумерация страниц продолжается) ;
>	PLAIN - подавляет вывод заголовков в начале отчета;
>	NOCONSOLE I OFF - подавляет вывод содержимого отчета в основное окно при печати или выводе в файл;
>	PDSETUP - загружает драйвер для печати отчетов в символьном режиме, например, если вы печатаете отчеты, созданные в FoxPro для MS DOS;
>	NAME <Имя_объекта> - задает имя объекта, ассоциированного с отчетом;
>	OBJECT <Список_отчетов> I TYPE <Выражение> - используется в случае объектно-ориентированного подхода к выводу отчета;
>	ТО <Путь_для_вывода> - указывает путь для вывода отчета;
>	PREVIEW - показывае т сформированный отчет в окне предварительного просмотра. Следующее за этим ключевым словом параметр <Путь_для_-предпросмотра> может либо указывать на окно (IN WINDOW <Имя_окна>), и тогда предпросмотр будет организован в этом окне, либо может указывать на экран (IN SCREEN), и тогда предпросмотр состоится в рабочей области главного окна;
> NOWAIT - указывает, что после открытия окна предварительного просмотр ра выполнение программы продолжается без ожидания закрытия окна.
Например, команда
REPORT FORM ПЮ FOR nor=dok3 PREVIEW
сформирует отчет из файла mo.frx, включив в него данные, удовлетворяющие условию, с предварительным просмотром. Отчет не сразу выведется на принтер, а появится на экране.
Кроме того, на экране появится панель инструментов, как на рис. 4.57. Хитрость в том, что дальнейшие действия по просмотру готовой печатной формы, печати отчета и завершения работы в режиме предпросмотра производятся
ГЛАВА 4 ▼ Работа с проектом
именно с использованием панели инструментов. А назначение элементов на этой панели следующее:
[4 переход на первую страницу отчета;
4 переход на предыдущую страницу отчета;
переход на заданную страницу отчета (по номеру);
переход на следующую страницу отчета;
>| переход на последнюю страницу отчета;
масштаб отображения отчета (на размер при печати не влияет);
ф* завершение работы в режиме предпросмотра;
печать отчета.
100% [у

И < ' чь I ► Н
Рис. 4.57т Панель инструментов режима предварительного просмотра
Когда мы создавали основное меню приложения, мы добавили два пункта меню для формирования отчетности: Персональная карточка и Список сотрудников. Попробуем реализовать задуманные отчеты при помощи генератора отчетов Visual FoxPro 9. Для этой цели выполните следующие действия:
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку InStaff.
2.	Если окно проекта не открыто, выберите команду Open (Открыть) из меню File (Файл). В появившемся окне открытия файла выберите файл проекта, который мы создали ранее.
3.	Щелкните мышью в окне проекта по папке Reports (Отчеты), находящейся в папке Documents (Документы), а затем щелкните мышью по кнопке New (Новый).
4.	В появившемся окне выберите кнопку New Report (Новый отчет).
5.	Появится окно Дизайнера отчета (Report Designer), показанное на рис. 4.53.
6.	Чтобы создать заголовок отчета, нужно добавить еще одну область под названием Title (Заголовок). Для этого из меню Report (Отчет) выберите
Если требуется вывести данные на печать
команду Optional Bands (Дополнительные области). Появится окно, представленное на рис. 4.54.
7.	В появившемся окне установите флажок Report has title band (Отчет имеет область заголовка). После этого щелкните мышью по кнопке ОК. Должна появиться область заголовка.
8.	В области заголовка при помощи инструмента сделайте надпись «СПИСОК СОТРУДНИКОВ ПРЕДПРИЯТИЯ». Для этого надо щелкнуть мышью по инструменту на панели инструментов, а затем щелкнуть в области Title (Заголовок) в том месте, где должен начинаться текст. Должен появиться мигающий курсор. Введите с клавиатуры указанный текст.
9.	Чтобы отцентрировать введенный текст (названия отчетов обычно пишут по центру), щелкните мышью по кнопке со стрелкой на панели инструментов Дизайнера отчета (Report Designer), а затем по сделанной надписи. По углам надписи должны появиться квадратики, как показано на рис. 4.58.
10.	В меню Format (Формат) выберите подменю Align (Выравнивание), а в нем команду Center Horizontally (Центрировать по горизонтали). Надпись должна встать по центру.
11.	В области Page Header (Заголовок страницы) разместим «шапку» нашей таблицы. Она будет состоять из следующих столбцов: Табельный номер, Сотрудник, Должность, Оклад. Между столбцами сделайте разделители
ГЛАВА 4 ▼ Работа с проектом
при помощи линий (инструмент ф-). Должно получиться, как на рис. 4.59. Обратите внимание, что нижние границы разделительных линий должны доходить до разделителя области (линия с надписью Page Header), иначе в готовом отчете получится разрыв линии.
12.	Щелкните правой клавишей мыши по свободному полю отчета (не по какому-либо элементу отчета), как показано на рис. 4.60, и выберите команду' Data Environment. Откроется пустое окно. Для чего мы открыли это окно? Оно позволяет настроить сеанс автоматического открытия таблиц, нужных нам для выборки данных для отчета. Можно не только указать, какие таблицы открыть, но и установить связи между ними, что мы и сделаем.
13.	Щелкните правой клавишей мыши по свободному нолю внутри окна Data Environment. В появившемся контекстном меню выберите команду Add. При этом, если не открыта никакая база данных, открывается окно для выбора файла таблицы. Выберите таблицу Persons (она хранится в папке DATA). В окне Data Environment появится выбранная нами таблица. На экране при этом будет присутствовать окно Add Table or View (Добавить окно или представление). Щелкните в нем по кнопке Other (Другие) и в появившемся окне для выбора файла таблицы выберите таблицу Staff (она также хранится в папке DATA). Этим действием мы добавили в окно Data Environment еще одну таблицу. Закройте окно Add Table or View (Добавить окно или представление) щелчком мышью по кнопке Close (Закрыть). Получаем вид окна, как на рис. 4.61.
Если требуется вывести данные на печать
Рис. 4.61 т Окно Data Environment с добавленными таблицами
14.	Создадим связь между таблицами. Это нужно, поскольку в каждой строке формируемого нами отчета должны присутствовать данные и из таблицы Persons, и из таблицы Staff. При этом выводимый список сотрудников берется из таблицы Persons, а значения, соответствующие каждому сотруднику по полю Id, из таблицы Staff. Связь создается довольно простым способом. В списке полей таблицы Persons, в окне Data Environment, найдите поле Id, наведите на него указатель мыши, нажмите левую клавишу мыши и, не отпуская ее, перетащите указатель на поле Id в таблице Staff. При этом, поскольку при открытии таблицы Staff мы никаким образом не указали индекс для нее, а для создания связи требуется проиндексированная
ГЛАВА 4 ▼ Работа с проектом
таблица, появится запрос на автоматическое создание индекса. В ответ на запрос щелкните по кнопке ОК. В результате в окне Data Environment в конце списка полей таблицы Staff появится созданный индекс. Кроме того, графически обозначится связь таблиц, как показано на рис. 4.62.
15.	Закройте окно Data Environment.
16.	В области Detail (Детали) создайте поля для вывода данных из наших таблиц. Для этого воспользуйтесь инструментом gbj. При появлении окон Field Properties (Свойства поля) в поле Expression (Выражение) введите для первого поля Persons.Tabnum, для второго - Persons.Name, для третьего - Staff.WhoIs, а для четвертого - Staff.Sum. Для поля Staff.Sum в окне Field Properties (Свойства поля) на вкладке Format (Формат) установите переключатель на значение Numeric. Должно получиться, как на рис. 4.63.
Рис. 4.62 ▼ Отображение связи между таблицами
Рис. 4.63тДобавление полей с данными
Если требуется вывести данные на печать
17.	В области Page Footer (Нижняя часть страницы) введите текст Начальник отдела кадров.
18.	Отчет готов. Следует не забыть сохранить его в файл. Сохранение происходит стандартным для всех файлов способом - при помощи команды Save (Сохранить) из меню File (Файл). Для хранения отчетов мы заготовили специальную папку - REPORTS. Имя файла отчета задайте 12.
19.	В Visual FoxPro 9 есть возможность предварительного просмотра созданного отчета. Для этого выберите команду Print Preview (Предпросмотр печати) из меню Report (Отчет). Если вы не видите пункта меню Report (Отчет), щелкните в любом месте окна Дизайнера отчета (Report Designer). Вид отчета должен быть похож на то, что показано на рис. 4.64.
				
н ч I tjfe I ► Н !				'	v ,?н
Табельный номер	СПИСОК СОТРУДНИКОВ ПРЕДПРИЯТИЯ		Оклад	
	Сотрудник	Должность		
70001	Петров Анатолий Иванович	Водитель	10000.0000	
70002	Семёнов Игорь Степанович	Заместитель директор	20000.0000	
70003	Ильин Иван Исаевич	Главный бухгалтер	20000.0000	
70004	Феоктистова Елена	Ведущий специалист	15000.0000	
70005	Семёнов Павел Игоревич	Ведущий специалист	15000.0000	
70006	Семипятный Андрей Львович	Директор	25000.0000	
70007	Смоленская Лидия Павловна	Секретарь-референт	12000.0000	
70008	Гаврилов Иван Савельевич	Начальник отдела	18000.0000	
70011	Полупанов Илья Семенович	Ведущий специалист	15000.0000	
70012	Петрушкин Иван Михайлович	Специалист 1 категор	12500.0000	
70014	Михайлов Сергей Петрович	Водитель	10000.0000	
70015	Серов Алексей Леонидович	Начальник отдела	18000.0000	
				
а	:: ‘	га			2Е
Рис. 4.64 т Вид отчета в режиме предпросмотра
ГЛАВА 4 ▼ Работа с проектом
20.	Попробуйте поменять масштаб отчета. По окончании работы с предпро-смотром отчета щелкните по кнопке Д1* на панели инструментов предпро-смотра. Если панель куда-то пропала или ее не было изначально, установите флажок Print Preview (Предпросмотр печати) в окне настройки панелей инструментов Toolbars, вызываемого командой Toolbars (Панели инструментов) из меню View (Вид).
21.	Один отчет мы изготовили и проверили. Закройте окно Дизайнера отчетов.
22.	Для вызова следующего отчета нам потребуется создать диалоговое окно, где пользователь должен будет выбирать, о каком сотруднике нужно печатать отчет. Создайте новую форму по образцу, представленному на рис. 4.65.
Рис. 4.65 т Образец для создания формы настройки отчета
23.	Находясь в Дизайнере форм (Form Designer), сделайте двойной щелчок мышью по свободному полю формы (не по какому-либо элементу). Проверьте, что в появившемся окне, в раскрывающемся списке справа от слова Object (Объект) стоит значение Forml, а в раскрывающемся списке Procedure (Процедура) - значение Init.
24.	Организуем заполнение раскрывающегося списка (Combo 1) данными из поля Tabnum таблицы Persons. Введите следующий текст:
USE SYS(5) + CURDIRO + "DATA\Persons"
* Тип источника данных для списка - поле таблицы
Если требуется вывести данные на печать
ThisForm.Combol.RowSourceType = б
★ Данные брать из поля Tabnum таблицы Persons ThisForm.Combol.RowSource = "Persons.Tabnum" ThisForm.Combol.Value = 1
25.	Закройте окно с введенными командами.
26.	Сделайте двойной щелчок мышью по созданной вами кнопке Выход.
27.	В случае выбора этой кнопки нужно разорвать связь раскрывающегося списка с таблицей, закрыть таблицу и закрыть окно. Введите следующий текст:
ThisForm.Combol.RowSource = "" && "Отпускаем" таблицу USE && Закрываем таблицу Persons ThisForm.Release && Закрываем окно
28.	Закройте окно с введенными командами.
29.	Сделайте двойной щелчок мышью по созданной вами кнопке Печать.
30.	Когда пользователь щелкает по этой кнопке, он должен увидеть готовый к печати отчет. Значит, нужно распознать выбранный пользователем табельный номер и запустить формирование отчета с условием совпадения табельного номера (поле Tabnum) в записи из таблицы Persons с выбранным пользователем значением. Введите следующий текст:
* Определяем номер выбранного пункта ln_SelLine = ThisForm.Combol.Value * Определяем выбранное значение lc_SelTabN = ThisForm.Combol.List(ln_SelLine) * Вызываем формирование отчета
REPORT FORM SYS(5) + CURDIRO + "REPORTS\fl" ;
FOR Persons.Tabnum = VAL(lc_SelTabN) ;
PREVIEW
31.	Закройте окно с введенными командами.
32.	Закройте окно Дизайнера форм (Form Designer).
33.	Создадим отчет с информацией о конкретном сотруднике, которая будет отображаться на отдельной странице отчета. Таким образом, по окончании формирования отчета на каждой странице отчета будет информация о сотруднике, а количество страниц будет совпадать с числом сотрудников на предприятии. Щелкните мышью в окне проекта по папке Reports (Отчеты), находящейся в папке Documents (Документы), а затем щелкните мышью по кнопке New (Новый).
34.	Поскольку титульного листа не будет и все страницы будут однотипны, область Title (Заголовок) нам не нужна.
35.	Выполните для создаваемого отчета п.12-15.
ГЛАВА 4 ▼ Работа с проектом
36.	Пользуясь инструментами панели инструментов Дизайнера отчетов (Report Designer), создайте отчет по образцу на рис. 4.66. Обратите внимание, что в области Page Footer (Нижняя часть страницы) в поле справа от слов По состоянию на... выводятся не данные из какого-либо поля таблицы, а результат выполнения функции DATE (). В результате работы этой функции определится текущая дата. Не забывайте в именах полей таблиц указывать префиксы (Persons, или Staff.).
Рис. 4.66 т Макет отчета
37.	Закройте окно Дизайнера отчетов (Report Designer). Два отчета и форму для настройки одного из них мы создали. Настало время испытать новые возможности нашего приложения.
38.	В окне проекта щелкните мышью по имени основной программы проекта main, а затем по кнопке Run (Выполнить).
Отладчик. Как и для чего им пользоваться
39.	В ответ на запрос имени пользователя и пароля введите соответственно Admin и Password.
40.	В основном меню нашего приложения выберите из меню Отчеты команду Список сотрудников. На экране появится сформированный отчет в режиме предпросмотра. Можете его распечатать или сразу щелкнуть по кнопке завершения работы в режиме предпросмотра.
41.	В основном меню нашего приложения выберите в меню Отчеты команду Персональная карточка. В появившемся на экране диалоговом окне выберите в раскрывающемся списке любой табельный номер и щелкните мышью по кнопке Печать. На экране появится сформированный отчет в режиме предпросмотра. Можете его распечатать или сразу щелкнуть по кнопке завершения работы в режиме предпросмотра.
42.	Завершите работу приложения, выбрав в меню Файл команду Выход.
Отладчик. Как и для чего им пользоваться
Если вам удается писать программы совершенно без ошибок, если они после ввода запускаются без проблем, скорее всего, или это не очень сложные программы, или вы обладаете особым даром.
На практике весьма часто приходится отлавливать ошибки в процессе тестирования создаваемого приложения, и довольно часто возникают моменты, когда вроде бы все команды записаны правильно, логика тоже верна, а программа во время работы либо «виснет», либо выдает неожиданные результаты. Разработчики FoxPro еще с давних времен озаботились созданием средства, помогающего в отладке программ. Он называется Отладчиком (Debugger).
Отладчик входит в поставку Visual FoxPro 9 и вызывается из основного меню с помощью команды Debugger (Tools > Debugger).
Настройки для работы Отладчика мы рассматривали в первой главе. Они производятся при выборе команды Options (Параметры) из меню Tools (Инструменты). За настройки Отладчика в появившемся окне отвечает вкладка Debug (Отладка). Раскрывающийся список Environment (Окружение) служит для определения окна, в котором будет работать Отладчик. Если указано Debug frame, все окна Отладчика открываются в одном окне, внешнем по отношению к основному окну Visual FoxPro 9. Если указано значение FoxPro frame, окна размещаются внутри основного окна Visual FoxPro 9.
По умолчанию Отладчик при запуске появляется в отдельном окне. Окно отладчика представлено на рис. 4.67.
ГЛАВА 4 ▼ Работа с проектом
£й Ecft £ebug Tools Window Не^э
Ctject : ® opliongroupl
.inierac...
Procedure j i Interactr/eChange tv
* Проверяем, какой режим выбран IF ThisForni.optiongroupl. Value ~ 2
* Если режим отбора записей, * отображаем записи выбранной
| lc__TblNaine
HESSAGEBOX(lc_TblName)
ENDIF
ThisForm.List2.Selected()
Watch
-IDI x|

I

Watch:
Name
! VaLe ;
\ Type |
Call Stack	Jol Xl
Ф formtoptiongroupl.interactivechange ta.]
Debug Output
Jal xi
: Locals
Locals for	.optiongroupl inter activechange
-jaixj
Name
Г+1 impacs
I Value (Object]
1 Type
Рис. 4.67т Окно Отладчика
В окне Отладчика присутствует панель инструментов. Рассмотрим назначение кнопок на этой панели.
ggr открытие файла программы, которую будем отлаживать;
> запуск программы на выполнение в режиме отладки;
 завершение работы программы;
{I} выполняет следующую команду программы;

Отладчик. Как и для чего им пользоваться
{р- выполняет следующую команду программы. Если следующая команда вызывает на выполнение функцию, метод или процедуру, они выполняются в фоновом режиме;
{fp продолжает выполнение команд процедуры без остановок, то есть без пошагового режима. Следующая остановка выполнения происходит, когда процедура или функция, где находился указатель (засветка), заканчивает выполнение и управление переходит команде, следующей за командой, вызвавшей процедуру или функцию;
-•{} выполняет команды без остановок до команды, на которой находится курсор. Перед выбором этой кнопки щелкните мышью по команде, на которой вы хотите сделать остановку;
[Ijp] включает/выключает окно Trace; включает/выключает окно Watch; включает/выключает окно Locals; включает/выключает окно Call Stack;
и включает/выключает окно Debug Output;
отмечает точку останова;
4^ убирает все точки останова;
вызывает диалоговое окно настройки останова;
Щ вызывает диалоговое окно (рис. 4.68), где можно задать имя log-файла и способ записи в него: Append (Добавить) или Overwrite (Переписать); вызывает диалоговое окно (рис. 4.69), позволяющее выбрать события, наступление которых будет отмечено в окне Debug Output и если задан log-файл, то и в нем.
Давайте разберемся с окнами в окне Отладчика. Описывая кнопки панели инструментов, мы упомянули кнопки, включающие и выключающие вывод этих окон. Для чего эти окна?
i File:	‘
(^уу:9_______________________________1Q j I Cance| I
(^fepperaj ч О Overwrite	•
Рис. 4.68 ▼ Окно настройки log-файла
ГЛАВА 4 ▼ Работа с проектом

Г~1 Turn event backing on
Avaiabte events:
Deactivate
Deleted
Everts to back:
BeforeRowColChang^j г? Befotellpdate ar Command! arjetE«ec : Command! argetQueiH^
' S end output to-----------------------
413 Debugger Output Window
I О Append 0 Overwrite;
Рис. 4.69 ▼ Окно для выбора событий, выводимых в окно Debug Output
Окно Trace отображает текст выполняемой программы или процедуры (функции) в процессе их выполнения. Если отображается процедура (функция), то в раскрывающемся списке Procedure будет показано ее название. Стрелка слева от строк программы показывает, какая команда выполнится в следующий момент.
Если есть необходимость просмотреть значение переменной или выражения в данный момент или видеть в динамике, как это значение изменяется, надо в окне Watch ввести в поле Watch имя переменной или выражение, значение которого нужно вывести, а затем нажать на клавиатуре кнопку Enter. Введенное вами имя добавится в таблицу, расположенную ниже поля Watch, а в графе Value этой таблицы отобразится значение, присвоенное в данный момент указанной вами переменной или выражения (рис. 4.70). Если переменная еще не инициализирована, то есть ей еще не присвоено никакое значение, в графе Value появится надпись Expression could not be evaluated. Удалить строку из этой таблицы можно, просто щелкнув мышью по соответствующей строке и нажав на клавиатуре клавишу Delete.
В окне Call Stack отображается имя выполняемой в данный момент программы, процедуры, метода или функции.
Окно Debug Output показывает сообщения Отладчика в процессе работы программы, процедуры, метода или функции.
При помощи окна Locals мы можем увидеть список всех переменных, массивов и объектов, с которыми работает выполняемая в данный момент программа,
Компилируем проект
процедура, метод или функция. В отображаемой в этом окне таблице приводятся имена переменных, массивов и объектов, их значения на данный момент и их тип.
Если вы хотите пометить в тексте программы, процедуры, метода или функции точку останова, то есть место, где безостановочное выполнение программы прервется и Отладчик, остановив выполнение программы, будет ждать от вас дальнейших указаний, надо щелкнуть по соответствующей команде в тексте программы, а затем по кнопке Д) на панели инструментов. Есть и другой, более быстрый вариант действий, - сделать двойной щелчок мышью на поле слева от текста программы напротив соответствующей команды.
Таким образом, мы выяснили, что Отладчик - это мощное и необходимое в практике создания и отладки приложений средство. Представление о тонкостях работы с Отладчиком Visual FoxPro 9 вы получите, когда начнете активно использовать его на практике.
Рис. 4.70 т Окно Watch, отображающее значения переменной и функции
Компилируем проект
Мы создали все запланированные компоненты приложения. Все работает замечательно и без видимых ошибок. Хорошо бы теперь создать исполнимый файл, чтобы пользователю для работы с приложением не надо было запускать Visual FoxPro 9, открывать окно проекта и искать в нем основную программу для запуска ее на выполнение. Пользователь должен в конце концов получать пункт меню в главном меню ОС Windows или значок на рабочем столе, по которому он должен щелкать мышью для запуска приложения, а лучше и то и другое. Но об этом поговорим позже, когда будем обсуждать создание дистрибутива (установочного комплекта), а для начала создадим исполнимый файл. Чтобы создать исполнимый файл, необходимо скомпилировать проект. Как это делается в Visual FoxPro 9?
Для того чтобы скомпилировать проект, надо в окне проекта щелкнуть мышью по кнопке Build (Построить). Откроется окно, представленное на рис. 4.71.
ГЛАВА 4 ▼ Работа с проектом

[ Cancel j
О Application (epp)
О WW2 executable ) COM serve, (exo)
О Single-threaded COM server (dll)
О Мий-в*eaded COM server (ей)
r Options-..................  -..........  ,
: 0 Resonate Al Fie»	’
| 0 display Enas	<
Рис. 4.71 vOkho Build Options
В этом окне предоставляется возможность выбрать результат построения исполнимого кода. Кроме уже упоминавшейся перестройки проекта (Rebuild project) можно построить исполнимое приложение (арр), приложение Win32 или COM-сервер, а также два вида библиотек DLL - Single-threaded и Multithreaded.
Если нужно поставлять приложение в виде исполнимого ехе-файла, выбирайте пункт Win32 executable/COM server (exe).
В этом же окне присутствуют флажки режимов:
>	Recompile All Files (Перекомпилировать все файлы) - компилирует заново все файлы проекта;
>	• Display Errors (Показать ошибки) - отображает возникшие в процессе компиляции ошибки;
>	• Run After Build (Запустить после построения) - по окончании компиляции проекта запускает полученное приложение на выполнение;
>	Regenerate Component Ids (Перегенерировать идентификаторы компонентов) - осуществляет повторную генерацию идентификаторов каждого из компонентов проекта.
В правом нижнем углу' этого же окна присутствует кнопка Version (Версия). При щелчке мышью по ней появляется окно для ввода информации о приложении (рис. 4.72). Какую информацию и как можно ввести?
В верхней части окна находятся поля для ввода номеров версий. Если установить флажок Auto Increment, значение в поле Revision будет автоматически увеличиваться при каждой компиляции проекта.
В группе Version Information размещен список информационных полей (Туре) и поле для ввода значения выбранного в этом списке параметра (Value).
Компилируем проект
Рис. 4.72 ▼ Окно для ввода информации о приложении
После того как вы выбрали параметры компиляции, в окне Build Options щелкните мышью по кнопке ОК. Откроется окно для ввода имени и выбора местоположения создаваемого исполнимого файла. Когда имя задано и папка для расположения файла выбрана, щелкните мышью по кнопке Сохранить (Save). В этот момент на экране начнут появляться окна с индикаторами выполнения («градусниками»). Как они сами появились, так сами и пропадут, а перед вами, если вы устанавливали флажок Display Errors (Показать ошибки), появится окно с перечнем ошибок, если Visual FoxPro 9 считает, что они есть.
Если ошибок не возникло, в строке состояния появится сообщение Build executable completed (Компиляция завершилась успешно).
Чтобы просмотреть и изменить информацию о проекте, воспользуйтесь окном Project Information (Информация о проекте), появляющимся при выборе команды Project Info в меню Project (Проект).
На вкладке Project (Проект) этого окна можно просмотреть и ввести информацию о производителе приложения. На этой же вкладке, в поле Ноте, отображается путь к основной папке проекта. В поле Last Built отражаются дата и время последней компиляции проекта. Флажки режимов имеют следующее назначение:
> Debug Info (Отладочная информация) - позволяет в откомпилированный файл включать отладочную информацию. Пока ваше приложение работает в режиме опытной эксплуатации, есть смысл оставить этот флажок включенным, а когда приложение передается в промышленную
ГЛАВА 4 V Работа с проектом
эксплуатацию или делается коммерческий дистрибутив, можно бы и выключить его;
> Encrypted (Шифрование) - включает функцию защиты приложения от анализа;
> Attach icon (Присоединить значок) - определяет, что при выполнении приложения в его заголовке должен отображаться указанный значок. Окно для выбора файла со значком (.ico) открывается при установке флажка автоматически пли может быть открыто (например, если надо сменить значок другим) при щелчке мышью по кнопке Icon.
На вкладке Files (Файлы) в виде таблицы приводится список файлов проекта. В виде значков показаны типы файлов, отображаются имена файлов с расширениями, дата и время последней модификации каждого файла. В столбце Included находятся флажки, позволяющие определить, должен ли файл входить в проект. Столбец Code Page показывает кодовую страницу для каждого файла проекта.
Если в каком-либо компоненте приложения русские символы отображаются неправильно, откройте окно Project Information (Информация о проекте) и на вкладке Files (Файлы) щелкните мышью по кнопке Update Native Code Pages. При этом автоматически актуализируются установки кодировки для каждой компоненты проекта.
Практика
1.	Смените текущую папку, выполнив в окне Command команду
CD ?
Откроется окно, в котором нужно найти созданную нами ранее папку InStaff.
2.	Если окно проекта не открыто, выберите команду Open (Открыть) из меню File (Файл). В появившемся окне открытия файла выберите файл проекта, который мы создали ранее.
3.	В окне проекта щелкните мышью по кнопке Build (Построить). Откроется окно, представленное на рис. 4.73.
4.	Построим приложение в виде исполнимого ехе-файла. Выберите пункт Win32 executable/COM server (ехе). Щелкните мышью по кнопке ОК.
5.	Укажите в появившемся окне папку нашего проекта InStaff, имя исполнимого файла пусть совпадает с именем проекта - InStaff.
Использование классов
BuiidAchQrt ”	-- - --------- -	— ---------- ।
* О fiebuid protect	‘ <——I ।
I • OAppbcah'onJappl	[ Caned] I
| , ©bf«32 executable/COM »MvK(exe)	---------I
j ; OS^e-thieadedCOM serve* (tfl)	L-fe!?____J
i o MuW-thi eacted COM server (<Я|	I
'-------------------------------------. I
, Options-— - — — -	--------------
। ’QResewpieAlFte»	:l
lObispl^Enors
, □RynAftefBuld
, □Reaweie Component IDs	Г V^aonZ I
Рис. 4.73 т Окно Build Options с настройками для создания исполнимого файла
6.	После завершения компиляции проверьте, что исполнимый файл с расширением ехе появился в папке InStaff.
7.	Проверьте работоспособность скомпилированного приложения, запустив на выполнение InStaff.exe.
Использование классов
Создавая окна форм, мы использовали некоторые понятия объектно-ориентированного программирования. Окно формы - это объект, элементы, расположенные на нем, - это тоже объекты. У каждого объекта есть набор свойств -его характеристик. Например, у каждого окна есть высота и ширина, цвет окна, текст, отображаемый в заголовке окна, и тому подобное. Все это его свойства. Есть также группа определенных процедур и функций, которые работают с этим окном. В объектно-ориентированном программировании эту группу процедур и функций называют методами.
Итак, мы определились с тем, что есть объекты с присущими им свойствами и методами. Кроме того, в системе происходят события, которые затрагивают объект. Можно заранее позаботиться, как отреагировать на то или иное событие.
Получается, что в процессе создания приложения мы можем наплодить достаточно большое количество объектов. Что же, каждый раз создавать объект заново? Заново придумывать для него свойства и методы? Можно выйти из положения, если создать для однотипных объектов образец с полным набором свойств, методов и событий, которые могут с ним произойти, а дальше для конкретного нужного нам объекта делать с образца копию и в ней менять те свойства, которые нам требуются. Так и поступают. А образец называют классом.
ГЛАВА 4 ▼ Работа с проектом
А конкретный объект, скопированный с образца для ваших нужд, называют экземпляром класса.
Разработчики Visual FoxPro 9 создали довольно много стандартных классов. Например, создавая окно формы, мы пользуемся классом Form. Он дает нам сразу богатый набор свойств, методов и событий для нашей формы.
На основе стандартных классов можно порождать свои классы с измененными по сравнению с исходными классами характеристиками. Как это сделать?
Программное объявление класса
Рассмотрим на примере:
DEFINE CLASS SuperFrm AS Custom
Name = "SuperFrm"
PROCEDURE PutMsg
"Это моя форма!" ENDPROC
ENDDEFINE
lo_Wnd = CREATEOBJECT("SuperFrm")
lo_Wnd.PutMsg()
Команда DEFINE CLASS объявляет класс, имя которого ставится за этими ключевыми словами, на основе класса, имя которого ставится после ключевого слова AS. Класс, на основе которого делается другой класс, называют родительским классом, базовым классом или суперклассом.
До ключевого слова ENDDEFINE располагается описание класса. В нашем примере мы объявили свойство Name (получается, как обычная переменная) и метод PutMsg (как видите, ничем не отличается от записи процедуры).
Создается объект (lo_Wnd) на основе класса (SuperFrm) при помощи команды CREATEOBJECT.
Для использования метода мы указали его через точку после имени объекта. Если никакие параметры методу не передаются, можно скобки не ставить, однако хороший стиль программирования подразумевает, что вы будете использовать скобки при указании метода, чтобы явно его отличать от свойств объекта.
Создание класса при помощи Class Designer
Разработчики Visual FoxPro 9 побеспокоились о том, чтобы облегчить вашу участь по созданию новых классов, и включили в среду Visual FoxPro 9 специальное средство - Class Designer (Дизайнер классов).
Использование классов
Class Designer (Дизайнер классов) вызывается следующим образом. Выберите из меню File (Файл) команду New (Новый). В появившемся окне выберите режим Class и щелкните мышью по кнопке New file (Новый файл). Появится окно New Class (Новый класс), как показано на рис. 4.74. В поле Class Name (Имя класса) введите название класса, который вы хотите создать. Из раскрывающегося списка Based on (Основан на) выберите родительский класс для вашего класса.
Class Ijarne: UHyClass	| [ QK "]
gasodOn: i Fo.m _____________ _________________{Х,| Q | Cancel |
I Front
Store In: i dAexampleSjns’afftlibsVnyclass vck I . ]
Рис. 4.74т Окно New Class
Классы часто хранят в файлах библиотек с расширением VCX. Можно сохранить ваш класс в библиотеке, путь к которой и имя которой можно указать в поле Store In (Хранить в) или выбрать, если щелкнуть по кнопке с многоточием справа от этого поля.
После щелчка мышью по кнопке ОК в окне New Class (Новый класс) появится окно Class Designer (Дизайнер классов). Оно показывает вам базовый объект, который вы можете менять по своему усмотрению.
По окончании редактирования надо сохранить класс. Сохранение выполняется стандартным способом: File (Файл) > Save (Сохранить).
Добавление класса в проект
Вы можете пользоваться созданным классом для написания компонентов вашего проекта. Но для этого нужно будет включить его в проект. Как это сделать?
В окне проекта присутствует папка Class Libraries (Библиотеки классов). Щелкните мышью по этой папке и затем по кнопке Add (Добавить) в окне проекта. Откроется стандартное окно для выбора файла библиотеки, содержащей ваш класс.
После выбора файла библиотеки в папке Class Libraries (Библиотеки классов) появится папка с именем библиотеки, содержащая значки и имена классов, входящих в библиотеку (рис. 4.75).
ГЛАВА 4 ▼ Работа с проектом
:J Итога Manager-ImUlF
q i Pal3 ,L	jl C'asses : Cede ’; Othei^ S p~|
: О viewp -Esj views ’> О Reports
i • • Я H а к
!	Labels
• R Class Libraries
( S МЧ myciass
: 3- □ Code
j S~O Programs
;	* О alvexpxml
□ Slvifnpxml □ htmtou □ main
• [c| API Libraries
!	Applications
й Г~ы»	I
; i. . •	>
[ мошу |
I-J
I '4 f- Refn°.ye- ~~j H L.^O
a!
‘Description: Path.
Рис. 4.75 ▼ Окно проекта с добавленной библиотекой классов
Если вы сделаете двойной щелчок мышью по имени библиотеки, откроется специальное средство для работы с библиотеками классов под названием Class Browser.
Если вы сделаете двойной щелчок мышью по имени класса, откроется Class Designer.
Так, мы убедились, что Visual FoxPro 9 предоставляет разработчикам замечательные возможности для работы с классами и полностью поддерживает объектно-ориентированный подход к созданию приложений.
К большому сожалению, Объем этой книги не позволяет в достаточной мере осветить вопросы объектно-ориентированного программирования. Но основы для дальнейшего развития у вас есть.
Итоги главы
Таким образом, если вы внимательно все прочитали и выполнили практические задания, у вас должно сложиться представление о компоновке проекта Visual FoxPro 9, создании его компонентов, их отладке и компиляции проекта. Сведений, содержащихся в этой главе, должно хватить, чтобы создать работающее приложение. Пусть оно не будет образцом высокого стиля программирования, но его функции будут достаточно разнообразными.
Итоги главы
Если на протяжении всей книги вы выполняли все практические задания, у вас должно получиться приложение, которое при желании можно доработать и использовать для собственных нужд или нужд вашей организации.
Объем книги, к большому сожалению, не позволил нам уделить внимания объектно-ориентированному подходу в программировании, работе с классами и библиотеками, но построить основу приложения вы сможете, а дальше в вашей власти совершенствовать свои знания. На основе полученных сведений и навыков, изучая справочную информацию, предоставляемую справочной системой Visual FoxPro 9, экспериментируйте, приобретайте опыт. И тогда вы станете настоящим специалистом в области создания современных приложений, работающих эффективно и с максимальным удобством для пользователей.
I лша
Полезные дополнения
Из предыдущих глав мы узнали, как работать с базами данных Visual FoxPro 9, как пишут программы и как создать проект, который воплотится в конце концов в приложение, готовое для использования.
В этой главе мы изучим способ создания комплекта для установки нашего откомпилированного приложения на компьютер пользователя. Кроме того, в этой главе содержится обзор основных Мастеров, предоставляемых разработчиками Visual FoxPro 9 нам в помощь.
Дополнительные приложения, поставляемые с Visual FoxPro 9
В комплект поставки Visual FoxPro 9 кроме собственно самой среды Visual FoxPro 9 включены несколько дополнительных компонентов. Они устанавливаются отдельно, и происходит это не автоматически. Для установки каждого из дополнений надо предпринять определенные действия. Что это за компоненты и для чего?
Перечислим их:
> InstallShield Express 5.0 for Microsoft Visual FoxPro - приложение компании InstallShield Software Corporation. Оно служит для создания установочных комплектов (дистрибутивов) созданных вами приложений;
Готовим дистрибутив созданного приложения
> Microsoft SOAP Toolkit 3.0 Samples - дополнительные примеры работы с Microsoft SOAP Toolkit 3.0, который устанавливается перед установкой Visual FoxPro 9 (см. главу 1) и служит для обеспечения работы Web служб XML;
> Microsoft SQL Server 2000 Desktop Engine (MSDE) - персональная версия Microsoft SQL Server 2000. Весьма удобно пользоваться ей для отладки приложений, создаваемых в Visual FoxPro 9 и работающих с базой данных под управлением СУБД Microsoft SQL Server.
Готовим дистрибутив созданного приложения
Мы создали работающий проект. Скомпилировали его, получив в результате исполнимый файл. Однако наше приложение еще не является полноценным программным продуктом. Если вы сами используете свое приложение или устанавливаете на компьютер пользователя и сопровождаете свой продукт сами, то можно не создавать специального установочного комплекта. Flo если вы передаете свой программный продукт на сопровождение другим людям и тем более если выставляете его в открытую продажу, создание дистрибутива просто необходимо.
Неподготовленном}- пользователю довольно сложно объяснить в описании к программе различные тонкости настройки, местоположение системных файлов и тому подобные вещи. Он и не должен утруждать себя лишними действиями, которые за него вполне может выполнить программа. Пользователь должен по прилагаемой инструкции найти файл setup.exe, запустить его на выполнение, а далее ответить на ряд нехитрых вопросов. После этого он получает вполне работоспособное и вызываемое одним из стандартных способов приложение.
В Visual FoxPro 9 для создания дистрибутива, то есть комплекта для установки приложения на компьютер пользователя, используется дополнительно поставляемое с Visual FoxPro 9 программное средство под названием InstallShield Express Visual FoxPro Limited Edition. Это средство разработано компанией InstallShield Software Corporation и используется для создания дистрибутивов различной степени сложности. Оно поставляется корпорацией Microsoft с рядом ее инструментальных программных продуктов по лицензии.
Как видно из названия (Limited Edition), программное средство поставляется в несколько урезанном виде, но того, что есть, должно вам вполне хватить. В результате работы InstallShield Express получается полноценный коммерческий дистрибутив. Многие разработчики программного обеспечения в мире отдали свое предпочтение именно продуктам компании InstallShield Software Corporation.
ГЛАВА 5 ▼ Полезные дополнения
При использовании InstallShield вы получаете установку программного продукта в соответствии с международными стандартами и с возможностью стандартного обновления программного продукта и его удаления в случае необходимости.
Установка InstallShield Express 5.0 for Microsoft Visual FoxPro
Для начала установим InstallShield Express 5.0 for Microsoft Visual FoxPro. Поскольку устанавливается это приложение не автоматически при установке Visual FoxPro 9, надо немного потрудиться. Что надо сделать и в какой последовательности?
Если вы устанавливали Visual FoxPro 9 с компакт-диска, вставьте его в устройство чтения дисков. Если вы не отключили функцию автозапуска для компакт-дисков, автоматически появится окно, где можно щелкнуть по ссылке Install InstallShield Express. Если ставили Visual FoxPro 9 не с компакт-диска или функция автозапуска по каким-то причинам не срабатывает, найдите папку InstallShield. В этой папке должен находиться файл isxfoxpro.exe или, может быть, файл setup.exe. Запустите тот, который обнаружите в папке InstallShield.
Сначала появятся последовательно два окна, сообщающих о подготовке программы установки к работе. Ничего трогать не надо. Надо просто подождать.
Появится окно с лицензионным соглашением, показанное на рис. 5.1.
License Agreement
Please read the following license agreement carefully
END-USER LICENSE AGREEMENT FOR InstallShield© <3 SOFTWARE
II IMPORTANT-READ CAREFULLY: This End-User License Agreement (“EULA”) is a i legal contract between you (either (a) an individual user or (b) a business j organization and the user designated in accordance with Part D below) and I Installation Software Technologies, Inc., an Illinois corporation doing business ae I InstallShield Software Corporation (“InstallShield”) for the InstallShield software I' that accompanies this TULA, including any associated media, printed materials and | electronic documentation (the “Software"). The Software also includes any । updates, add-on components, web services and supplements that InataHShield
Ofycept the terms in the kense agreement!
| Ol£onot accept the terms in the license agreementMyOvy^^^

Рис, 5.1 тОкно с лицензионным соглашением InstallShield
Готовим дистрибутив созданного приложения
Ознакомьтесь с соглашением, выберите в переключателе режимов пункт I accept the terms in the license agreement, а затем щелкните мышью по кнопке Next.
Следующее появившееся окно (рис. 5.2) предназначено для ввода имени пользователя (поле User Name - Имя пользователя) и расположения компьютера, на который производится установка (поле Organization - Организация). В этом же окне можно выбрать масштаб установки: при работе нескольких пользователей делать ли установку для всех пользователей (Anyone who uses this computer (all users)) или только для пользователя, под которым вы работаете сейчас (Only for me). Сделав нужные установки, щелкните мышью по кнопке Next (Далее).
Customer InFormation
Please enter your information.
.User
Organization: i; |лом
Instal this appkatton for:
0 finyone who uses this computer (aB users)
О Only for me (Феликс)
-------—------------------:-----1---------------------:
1 lL.a^>.............I1 I
Рис. 5.2 ▼ Идентификация пользователя
На следующем этапе выбирается папка для установки InstallShield. Можно согласиться с предлагаемым расположением, а можно задать свое, щелкнув мышью по кнопке Change (Изменить). Для перехода к следующему этапу щелкните мышью по кнопке Next (Далее).
Начнется процесс установки. За ходом процесса можно следить по индикатору в окне на рис. 5.4.
По завершении установки появится окно, показанное на рис. 5.5. Установка единственного в этом окне флажка (Yes, check for program updates after the setup completes - Да, проверьте обновления программ после завершения
ГЛАВА 5 ▼ Полезные дополнения
Рис. 5.3 ▼ Выбор папки для установки
I Installing InstallShield Express S.o Visual FoxPro Limited Edition The program features you selected are being installed.
BPIease wait while the InstalSbidd Wizard instate InstalSHeld Express S.O Visual FoxPro limited Edition. This may take several rrinutes.
1||||ИИ|ЗмЛВ1|вВ|||И^
—777——- —
Рис. 5.4-v Процесс установки
установки) включает режим проверки «свежести» всех компонентов вашей версии InstallShield. Дело в том, что с момента формирования дистрибутива Visual FoxPro 9, полученного вами, прошло какое-то время, за которое в компании InstallShield Software Corporation могли успеть исправить какие-то
Готовим дистрибутив созданного приложения
ошибки в программном обеспечении или улучшить показатели его работы. Установка флажка позволяет автоматически обратиться на сайт производителя в Internet и проверить соответствие компонентов InstallShield последним их версиям. Конечно, чтобы это сделать, у вас должен быть подключен Internet. Устанавливать этот флажок совсем не обязательно.
l^taUSM^ld Ех”рге» 5.0	Йтыкм.ш7.. @
Ш InstallShield Wizard Completed
Setup has finished installing InstallShield Express 5.0 Visual FoxPro Limited Edition.
i Some program files might have been updated since you
I purchased your copy of InstallShield Express 5.0 Visual FoxPro
I limited Edition.
| Your Internet connection can be used to make sure that you have the latest updates.
[7] Yes, check for program updates (Recommended) after the setup completes.
. Рис. 5.5 ▼ Завершающее окно Мастера установки
Установите или снимите флажок Yes, check for program updates after the setup completes, а затем щелкните мышью по кнопке Finish (Готово).
На этом установка InstallShield завершена, а в подменю Программы (Programs) главного меню, вызываемого щелчком мышью по кнопке Пуск (Start), появится новая папка InstallShield, содержащая команду для вызова установленного нами приложения.
Кроме того, автоматически будет осуществлен первый запуск приложения InstallShield.
Создание дистрибутива
при помощи InstallShield Express 5.0
Основное окно InstallShield Express представлено на рис. 5.6.
Если вы уже пользовались InstallShield Express для создания дистрибутивов своих приложений, названия проектов и даты последнего формирования дистрибутивов появятся в таблице в центре основного окна.
ГЛАВА 5 ▼ Полезные дополнения
PtijartT
з euHti Kip । '
a ‘^jriniep
Upcoming Webinar*
Getting Started
• Express 5 0 Product
. Overview for Evaluators
: How to use the different mechanisms in Express to eate an Upgrade for an
' Express based setup
| Not sure where to begin?
| Click the Getting Started link to enter the world of instsliation
I creation technology using InstallShield Express
Q104371 -MFC Recfistributable Files
Top Knowledge Sase Article*
 Click an article Ю to read : that article.
• 0104962-INFO-The BDE
51 1 Met ge Module
Were can I find help fa error or warning codes?
I с о "4.0 иО'~'
Рис. 5.6 т Окно InstallShield Express
I J> Support central
*>TecSrfcaiFAChs

Чтобы начать создание дистрибутива, щелкните мышью по ссылке Create а new project (Создать новый проект) в левой части окна или выберите команду New (Новый) в меню File (Файл). Появится окно, представленное на рис. 5.7.
При всем богатстве выбора типов проектов остановимся на Express Project. ' Остальные для проектов Visual FoxPro 9 не годятся.
В поле Project Name (Имя проекта) введите название вашего проекта.
В раскрывающемся списке Project Language (Язык проекта) выберите пункт Russian, если, конечно, вы делаете дистрибутив для русских пользователей.
В поле Location (Расположение) введите или, нажав кнопку Browse, выберите папку, в которой будут размещены файлы проекта и дистрибутив.
Готовим дистрибутив созданного приложения
Когда вы заполнили все описанные выше поля, щелкните мышью по кнопке ОК. Окно New Project (Новый проект) пропадет, а в основном окне InstallShield Express откроется вкладка Project Assistant (Ассистент проекта). На этой вкладке наглядно представлен процесс создания дистрибутива (рис. 5.8).
Все центральное поле окна неактивно. Это просто картинка. Переход к дальнейшим действиям осуществляется при помощи щелчка мышью по кнопке со стрелкой вправо (она расположена в правом нижнем углу окна).
На первом этапе (рис. 5.9) - Application Information (Информация о приложении) - заполняется поле Specify your company name (Введите название своей организации). Следом заполняются поля Specify your application name (Введите название своего приложения) и Specify your application version (Введите версию своего приложения). Конечно, при заполнении этих полей указывается название и версия созданного вами приложения, дистрибутив для которого вы формируете.
Если у вашей организации или у вас лично есть сайт в Internet, можно его адрес ввести в поле Specify your company web address (Введите адрес сайта в Internet).
Г» »?л‘.е даяог.иензп
: ъг- InStaff - InstallShield Express Visual FoxPro Limited Edition
•j hie Left V-ew Project gufid Tools H^P
i J - . П Л V V V e ' ! Ь О *• .3 «>
Рис. 5.8 т Вкладка Project Assistant
Если есть желание поместить в окнах установки не стандартный значок, а значок своего приложения или выдуманный вами значок, введите путь к нему в поле Browse for your application icon (Выбратр пиктограмму вашего приложения), щелкнув мышью по кнопке Browse.
Когда нужные поля заполнены, пора переходить к следующему этапу. Это можно сделать при помощи щелчка мышью по кнопке со стрелкой вправо (она расположена в правом нижнем углу окна).
На этапе Installation Requirements (Требования к установке) - рис. 5.10 -определяются особенности, связанные с конкретными операционными системами и дополнительными приложениями. Можно ограничить круг операционных систем, в которых возможна установка вашего приложения. Для этого надо в переключателе режимов Does your application require any specific operating system? (Требует ли ваше приложение определенной операционной
» «товига дистрибутив созданного приложения
Рис. 5,9» Эгап Application Information
системы?) выбрать значение Yes (Да). После этого установите флажки возле названий тех операционных систем, в которых разрешается работа вашего приложения. По умолчанию установка приложения не ограничивается зависимостью от операционной системы.
На этом же этапе можно установить функцию обязательной проверки наличия установленных приложений из списка при установке вашего приложения. Для этого надо предварительно выбрать в переключателе режимов Does your application require any software to be installed on the machine? (Требуется ли для работы вашего приложения, чтобы какое-либо программное обеспечение было предвари тельно установлено?) значение Yes (Да), а затем отметить в списке ниже те приложения, предварительная установка которых требуется.
По окончании заполнения нужных полей щелкните мышью по кнопке со стрелкой «вправо» (опа расположена в правом нижнем углу окна).
ГЛАВА 5 V Полезные дополнения

Рис. 5.10тЭтап Installation Requirements
Этап Installation Architecture (Архитектура установки) - рис. 5.11 - позволяет вам определить варианты установки вашего приложения. Что имеется в виду? Либо при установке у всех пользователей всегда ставится один и тот же комплект компонентов вашего приложения, либо пользователю при установке предоставляется право выбирать устанавливаемые компонент ы. Например, один пользователь будет обладать полными правами на редактирование данных и их печать, а другой будет только просматривать данные на экране. Второму пользователю, возможно, и не стоит устанавливать модули, отвечающие за печать и редактирование.
Этап Application Files (Файлы приложения) - рис. 5.12 - служит для выбора файлов, входящих в дистрибутив, и мест для их установки на компьютере пользователя. К работам на этом этапе надо отнестись со всей ответственностью. Если вы поместите файлы не в ту папку, мало того что ваше приложение
Готовим дистрибутив созданного приложения
t. -*.>«^-4»- -г—, -S »	>	>♦	• Т -*	,	*» У-х «► *r—f - Z»-A 1 -	t ------------- - —Ч’„Х2'|
* lirtt Jf lMtftl>Shield I xprcst Visual FoxPro Limited Edition	£ Щ
h @e &* gew go Protect guid Tools Help
Start Page I Project Assistant
| '"ln'stallot>on Designer
Project Assistant P
r.itallac-cn.
"eatures ars ccracteiedthe end us® s perspective of your tnsUllAion. и» an rotation that «slows users to select if-fiat is instated, the object the user turns on and eft is de feature;
Installation Architecture
•y ^etfritefeahresinclucfedin your 1пагЛ&мп.
►ou .vent to customs your InstsUtw Architecture"'
nJtipte features’-"	i
(ji	troulij I create in i>ist.blk#t>i<n	j
luftipietearures?	p
irj	»hat is the purpose of the de? «л	Г
sat jrs>	’
yr	-4rat is the best way to definf a	F
mature Iwra.hy7	(i
- -J Instalation Architecture
Всегда устанавливать
Обычная установка
Vo ансвка для Администратора
О Э
 Appkatt^i >; Installation . Infcrma-’ion Requirements
’ w "	; 'V.
InstaRMton	Арркжгзл	Awatnn
Architecture F«es	Shortcuts
Application	InstaHabon	Butt
Registry	Interview	Instafiation

{Ready
7 -’|М> I
Рис. 5.11т Этап Installation Architecture
может не работать, вы можете испортить работу других установленных приложений (например, если имена ваших файлов совпадают с именами файлов, используемых в другом приложении).
В раскрывающемся списке в верхней части окна можно указать, для какой конфигурации выбирается набор файлов. Имеются в виду конфигурации, заданные на предыдущем этапе Installation Architecture (Архитектура установки).
Дерево, показанное в центральной части окна, служит для выбора места, куда файлы будут помещены. Имена папок, заданные в квадратных скобках, обозначают папки на компьютере пользователя, реальные имена которых будут подставлены автоматически в зависимости от конкретных путей и названий на машине пользователя. Например, вместо папки, обозначенной [ProgramFilesFolder], на машине конкретного пользователя может быть подставлено c:\Program Files\. Список таких «подставляемых» имен довольно
ГЛАВА 5 Т Полезные дополнения
jt
i «*“ InStaff - InstaltShwld Express Visual FoxPro Limited Edition
Г”^4е £d£ £iew Project gufid Joois Help
| -J Atl Application Data
i Destination Computer
0 [AppDatdFoirie'J
[CommoriFi>sFolder]
[DrogramFiiesFi'jlder]
- £_j ALV
- InStaff [INSTAtlOIP]
a data
СЙ Database lDATabASEDIR]
...О
-j out
О REPORTS
Uame ~ | See | Lir<k To j Mo  ‘ C-ie^tiffcat'cin
Oinstarf.exe 1ESKB D \Але*:сей\. . 29 .. [JNSTALID1P]
Рис. 5.12 т Этап Application Files
длинный, и по умолчанию только часть из них выводится в дереве сразу. Как вывести требуемые имена системных папок? Надо щелкнуть правой клавишей мыши по папке Destination Computer и выбрать в появившемся контекстном меню команду Show Predefined Folder (Показать предопределенные папки). Появится подменю в виде списка папок. Показанные в дереве папки будут помечены гало чками.
Папки, имена которых помещены в дереве без квадратных скобок, будут помещены в указанные папки со своими именами.
Поскольку мы создали наше приложение в Visual FoxPro 9, для его работы на компьютере пользователя потребуется установка нескольких динамических библиотек (DLL) в системную папку операционной системы или другую папку, путь для которой гарантированно определен па компьютере пользователя.
Готевии дистрибутив созданного приложения
Какие же это библиотеки? Вот список необходимого минимума, составленный разработчиками Visual FoxPro 9:
> vfp9r.dll;
>• vfp9t.dll;
> vfp9renu.dll;
> insvcr71.dll:
> gdiplus.dll.
Но вам не надо на данном этапе беспокоиться о выделении каким-то образом этих файлов. Для этого есть способ, специально «предусмотренный конструкцией». Ниже мы рассмотрим способ выбора файлов библиотек дал поддержки нормального функционирования вашего приложения.
А сейчас, после определения всех файлов вашего приложения, которые должны входить в дистрибутив, перейдем к следующему этану, для чего щелкнем мышью по кнопке со стрелкой.
На следующем этапе, называемом Application Shortcuts (Ярлыки приложения) - рис. 5.13, - вы можете выбрать способ, которым пользователь будет запускать ваше приложение. Можно осуществлять запуск через главное меню, вызываемое щелчком по кнопке Пуск (Start), или при помощи значка на Рабочем столе. В первом случае надо ус тановить флажок Create shortcut in Start Menu (Создать ярлык в меню Пуск), а во втором случае - флажок Create shortcut on Desktop (Создать ярлык па Рабочем столе). Или можно установить оба флажка. Тогда ярлыки появятся и и меню Пуск, и на Рабочем столе.
Название ярлыка первоначально формируется автоматически, но вы можете его изменить (и, скорее всего, захотите эго сделать), щелкнув по кнопке Rename (Переименовать). Можно <делать несколько разных ярлыков при помощи кнопки New (Новый).
Кроме того, есть воз.можпость создать ассоциации вашего приложения с файлами определенного । ипа. Что это значит? Если вы создадите такую ассоциацию, при двойном ще «что мышью по файлам с определенным расширением будет запускаться ваий притожение, и имя файла будет передаваться в качестве параметра. Как создать ассоциатп • Установите флажок режима Associate a file extension with the shortcut (Ассоциировать расширение файла с ярлыком). При этом откроется для редактировапия поле под флажком. В это поле надо ввести расшире"';''. тыпример. !' ! Можно ввести и несколько расширений, разделяя их запятыми.
Следующий этап - Application Registry (Создание реестра для работы приложений) - рис. 5.14 - потребуется вам, если для работы вашего приложения необходимо хранить какие-либо настройки в реестре. Если внесение данных в
ГЛАВА 5 ▼ Полезные дополнения
padr   Г~~	 ~	; Midi
Рис. 5.13 ▼ Этап Application Shortcuts
системный реестр действительно нужно, выберите в области Do you want to configure the registry data that your application will install? (Хотите ли вы кон-фигурировать системный реестр для работы вашего приложения?) значение Yes (Да). В результате станет доступным дерево папок реестра, в котором можно выбрать папку, где должны храниться нужные вашему приложению настройки. Можно создавать свои папки (например, соответствующие имени вашего приложения). Для этого надо щелкнуть правой клавишей мыши по папке, в которую должна входить ваша папка, а затем в появившемся контекстном меню надо выбрать пункт меню New (Новый), а в нем команду Key (Ключ). Появится новая папка с именем, выделенным цветом. В этот момент можно ввести нужное вам имя папки и нажать клавишу Enter.
Готовим дистрибутив созданного приложения
InStaff - InstaliShield Express Visual FoxPro Limited Edition	GMQ
{£4e	View So Project &лИ Jools ЦеЬ 		 i,U J H ПП V & •> W ‘ ta 4  ! ‘A * I*»>;	
Installation Designer
Project Assistant
Start Page
Project Assistant ;
I Application Registry
M Enter your eppfeatm’s registry ri^mw^hera.
ntr--4-pit itio *. ( trft t г I» । rrr h г e tored in the Windows R cfevs ctfentteir f'odetet an* \h3k tn>“ 11 pplicabortmayre>?.iite.
a ttyr rt uet eif b oate*hatyourapphcationwilliristail?
Г f
'iff) How do 1 I-dcw what registry data my Ш application requires’-'	r’J
gf) How can I associate registry data With a feature other than the default	Ц
feature?
jg) How can I enter vat table data types Ц into rny registry information?
Destmation computer’s Registry vi^
Destination Computer
Ld HkEY_CLA5SES_ROOT
'Tj HKEY_CURRENT_U5ER
:-J HKEY_LOCAL_MACHINE
-Ъ InStaff
О HKEYJJ5ER5
О HKEY_l)SER„SELECTABLE
Destination computer’s registry d
tore | Data jj^PathOut i \Out\User01\
{
•-0 W# 1
•:-г-/фрйсаПоа.;-: Instalation installation ; Application / Application - Appfcetion< Installation Information Requirements AicNterture Files Shortcuts Registry Interview
Рис. 5.14 т Этап Application Registry
Как создать переменную в папке и присвоить ей значение? Для этого в правой части окна, где расположено дерево папок, надо выбрать папку, в которой должна быть размещена переменная. После этого в правой части окна в таблице, озаглавленной Destination computer’s registry data (Данные регистра целевого компьютера), надо щелкнуть правой клавишей мыши и в появившемся контекстном меню выбрать команду New <тип_переменной> Value. Появится обозначение соответствующей переменной с именем, выделенным цветом. В этот момент следует ввести требуемое имя переменной и нажать клавишу Enter. Для ввода значения переменной сделайте по ее имени двойной щелчок. Откроется окно, в котором в поле Value data можно ввести значение переменной. Когда все установки для реестра сделаны, перейдем к следующему этапу.
ГЛАВА 5 ▼ Полезные доп (
На следующем этапе - Installation Interview (Информация об установке) -рис. 5.15 - вы увидите пять переключателей, отвечающих за информацию, которую пользователь увидит в процессе установки вашего приложения.
Первый переключатель режимов - Do you want to display a License Agreement Dialog? (Хотите ли вы отобразить диалоговое окно с лицензионным соглашением?) - определяет, появится ли перед пользователем текст лицензионного соглашения и будет ли ему предоставлен выбор, согласиться с соглашением или нет. Конечно, в случае несогласия пользователя процесс установки вашего приложения на компьютере пользователя прервется.
InStaff - InstallShield Express Visual FoxPro Limited Edition

|j £ile Edt View Go Project Butld Tools Help
|j □ Н СП' f 4- » m

9
"start Page |"'	• ^r~Q'^^''^'^K"rn'm-rT'Tn'Tir11Tni-y--InstaHation Designer
Project Assistant Г*
Installation Interview
Speofy the dialogs that are shown by your xetafahoa
The Installation Interview is the collection of dialog:- the
common elements of the Installation Interview,
More Option*
Do you want to display a License Agieement Dialog’
Use custom images on dialog-
Specify the path to your End User License Agreement file: | О:\Алексей\Ьо ok\Example\InStaff\license.rtf
Browse... |
other Plain	|
Do you want to prompt users to enter their Company Name and User Name)
Do you want your users to be prompted to modify the installation location of your; application'
Do you want users to be able to selectively install only certain parts of your application!
fj) Should I let users modify the installation location'
W) What is a license agreement dialog:
ti) What is a "selectively installable"
о ®
В
Appteattan	Installation	Installation
Infcrmaten	Requirements	Architecture
-W'-”'Л- -	 j- 4g™
Application	Appfcation	Appkcabon	Installation Вий
Fifes	Shortcuts	Reentry	Interview	InstaXa^on
©
(Ready
Г num"
Рис. 5.15 т Этап Installation Interview
Готовим дистрибутив созданного приложения
Если вы установите в переключателе Do you want to display a License Agreement Dialog? значение Yes (Да), ниже откроется поле, где можно ввести путь к файлу в формате RTF с лицензионным соглашением между пользователем и производителем, составленным вами.
Второй переключатель - Do you want to prompt users to enter their Company Name and User Name? (Хотите ли вы запросить у пользователей ввод имени пользователя и названия организации пользователя?). - если установлено значение Yes (Да), выведет в процессе установки окно, где пользователь должен будет ввести свое имя и название своей организации.
Третий переключатель - Do you want your users to be prompted to modify the installation location of you application? (Хотите ли вы, чтобы пользователь имел возможность выбирать путь для установки приложения?), - установленный в значение Yes (Да), выводит в процессе установки диалоговое окно, где показан путь для установки по умолчанию и пользователю предоставляется право его изменить.
Переключатель Do you want users to be able to selectively install only certain parts of your application? (Хотите ли вы предоставить пользователю возможность выборочно устанавливать только отдельные части вашего приложения?) позволяет вывести в процессе установки диалоговое окно с перечнем компонентов приложения, среди которых пользователь может отметить нужные ему.
Последний переключатель - Do you want to give users the option to launch your application when the installation completes? (Хотите ли вы разрешить пользователю автоматически запустить ваше приложение па выполнение по окончании установки?), - установленный в значение Yes (Да), выводит во время установки в последнем окне флажок, установив который пользователь инициирует автоматический запуск вашего приложения после того, как установка успешно завершится. Если вы включили этот режим, необходимо щелкнуть мышью по кнопке Browse, расположенной ниже, и в появившемся окне выбрать исполнимый файл для запуска вашего приложения.
И последний этап - Build Installation (Построение дистрибутива) - рис. 5.16 -собственно и производит построение дистрибутива вашего приложения. Перец выполнением построения можно выбрать, в каком виде вы хотите получить образ дистрибутива. Какие есть варианты? А варианты следующие:
> Single Executable - позволяет получить дистрибутив в виде одного исполнимого файла setup.exe;
> Internet - установка, оптимизированная для загрузки через Internet. В результате пользователи будут запускать установку при помощи Web-странички с именем Install.htm, которая также будет сформирована;
Г ЛАВА 5 V Полезные дополнения
> CD-ROM- создаст образ с установочным комплектом для записи на компакт-диск. Если объем вашего дистрибутива превышает 650 Мб, автоматически будет создано нужное количество образов дисков.
InStaff - InstallShield Express Visual FoxPro Limited Edition
|;File Edit View £o Project guild Tools Help
! Й h *> W! j
|Ready
I've finished tne Project Assistont
Й"
Information
1*7 ^in5e Executable)
A Single Executable installation is an installation that contains aS of your application files and settings,; as well as a8 of the subordinate ins’-aWinn-relsM files in a single Setup exe.
- Optional distrihЛюп settings pjtj Open release folder
Г internet
An Internet installation is optimized for Internet downloading. Your users will launch it from a Web page called Install fitm, ^ch is ger erated for you.
Й1 Optional distribution settings Open release fukfet
Г CD POM
A CD-RW	in which all cf the tnstaHatron and application files ore left uncompressed on
< the disk image. The build engine automatically creates multiple disk images fa CD-ROM installations that are larger than 650 MB.
Optional distribution settings Open release folder
М1П51а1^ОП5:|:
; w &	i£’ Ji
Instafetion	Installation	Appbcauon	Appbcabon	Application	Installation	a Build
Requirements	Architecture' Files	Shortcuts	Registry	Interview Installation
Г NUM'1
Рис. 5.16 т Этап Build Installation
Когда выбор сделан, для запуска построения дистрибутива вашего приложения надо щелкнуть мышью по кнопке Build Installations. Однако НЕ ТОРОПИТЕСЬ!
При обсуждении этапа Installation Architecture (Архитектура установки) мы упоминали перечень динамических библиотек (DLL), установка которых

Я) Distribe
О ©
©
Гшевим дистрибутив созданного приложения
потребуется для обеспечения нормальной работы вашего приложения. Вам не надо сильно задумываться, где у вас на диске находятся эти файлы и в какую папку их надо поместить па компьютере пользователя. InstallShield «подумает» об этом за вас. А что же надо сделать вам для указания, какая именно поддержка нужна вашем}- приложению? Действовать надо по следующей схеме.
Перейдите на вкладку Installation Designer - Мастер установки (рис.5.17). В левой части вкладки щелкните по пункту Redistributables (Передаваемые компоненты), расположенному' в папке Specify Application Data. В правой части
|V? InStafff - ins’allShield Express Visual FoxPro Limited Edition
J I) Fte Efft jjew £o Project guild Tools Help	;
'‘Э H И _ - V V > **
I ' Start Pdgc~~ "T'^ ' prciect Assistant
I it; Organize Your Setup
£ ф Specify Application Data
Q Files
Files Features
| .	ф Redistributables
I	J Д Dependencies
I <0 Cunfigure the Target System
I	’’.Q Shortcuts/Folders
Registry
ODBC Resources INI File Changes xj File Extensions KK Environment Vanables (*♦. IIS Virtual Directories Component Services
£ ф Customize the Setup Appearance Dialogs
IH Billboards
,	Text and Messages
Enable Automatic Updates ф Update Service
Й-ф Define Setup Requirements and Actions Requirements Custom Actions
Setup Files о Prepare for Release ifoj Build Your Release
Test Your Release
F) Distribute Your Release
Й * , ! S ' J? W '
Organize Your Setup (Г:
Organize Your Setup
Describe your setup, and organize it to allow your users to customize which parts of your application they install,
ТТГ	Information
i  * И Enter your product name, version, company name, and otner information.
Pead more about General Information.
Create features to organize your setup for your users. If you allow your users to customize their installation, they will see the features you create.
Read more about Features.
a.etup-TyjE>es
Create setup types to provide different groups of features to your users. Your users can select the installation version that best suits their needs.
Read more about Setup Types,
Upgrade Paths
Specify information about the previous • versions of year product you want this setup to upgrade.
Pead more about Upgrade Paths.

Рис. 5.17 v Вкладка Installation Designer
ГЛАВА 5 V Полезные дополнения
вкладки, в списке InstallShield Objecls/Merge Modules 01 метьте флажками следующие пункты (рис. 5.18-
>	GDI Plus Redist module;
>	- Microsoft C Runtime Library 7.1;
>	 Microsoft Visual FoxPro 9 Report Applications yu ..nt используете отчеты);
>	Microsoft Visual FoxPro 9 HTML Help Support Library (если используете справочную систему, основанную на HTML);
>	- Microsoft Visual FoxPro 9 Runtime Libraries;
>	MSXML 4.0 (надо добавить оба пункта с таким названием);
>	MSXML 3.0 (если в приложении вы используете функции CURSORTOXML).
j £ile Edit View  £o Project guild lools ttelp
OH cn	ca x ! 'S L : Wi
Start'page™* "1**"*""'installation
Redistributables «
Organize Your Setup
Specify Application Data
□ F‘,e5
Files and Features
S ф RedfetrftmtaWes
Dependencies
Configure the Target System
Ir aflShield Obiecls/Merge Modules
S*i $ GDI Plus Reoist ггц-dule i i ф Installs!lield Update Se-rvn e
Conditional IrtftdHstton
Всегда устанавливать
Registry
ODBC Resources
jx) File Extensions
|3| Environment Variables tllS Virtual Directories
Component Services
Г-: • Customise the Setup Appearance
Й Dialogs
Billboards
ate Text and Messages
E 0 Enable Automatic Updates
ф Update Service
Й 0 Define Setup Requirements and Actions Requirements
Custom Actions
Setup Files
Prepare for Release
;*f| Build Your Release
Test Your Release
i*) Distribute Your Release
i$ MFC 7.0
J ф MFC Europe an Resources 7 0
. J $ MFC Far Eastern Resources 7.U
1 $ MFC Unicode 6.0
i.2 $ Microsoft C Runtime I iLi a, у 6 0 IJ 3 Microsoft C Runtime Libiary 7.0
$ Microsoft C Runtime library 7.1 t J $ Microsoft O< Runtime Library 6 । Cd $ Microsoft C F+ Runtime Library 7 J ;.J $ Microsoft C-+ Runtime l.ibnary I/C
Description of Microsoft Visual FoxPro 9 Rep<
Name
Microsoft Visual FcxPr о 9 Report
Applications
Destination
(Use merge гы destination)
File hame
C:\Progi am Fiies\C.ori(rr.o-n
Files\Merge
Modules\VFP9RptApps.rri$m'
Help
Hect which
feature, or
attires, you want ...
Ready
allows you to create your own merge modules,
• ’num

о
Рис. 5.18 ▼ Выбор библиотек для приложения
Готовим дистрибутив созданного приложения
Installation Designer
InstallShield Objects/Merge Modules
L_i 3 Microsoft Tabbed Dialog Control 6.0 iJ Microsoft Typelib Information Library i..J	Microsoft Visual Basic Virtual Machine 6 0
L..j Microsoft Visual FoxPro 9 HTML Help Support Librar §5 $ Microsoft Visual FoxPro 9 Report Applications . LJ 3 Microsoft Visual FoxPro 9 Resource
L : $ Microsoft Visual FoxPro 9 Resource f i $ Microsoft Visual FoxPro 9 Resource Lu Microsoft Visual FoxPro 9 Resource LJ § Microsoft Visual FoxPro 9 Resource LJ Microsoft Visual FoxPro 9 Resource I. \ Microsoft Visual FoxPro 9 Resource □ Microsoft Visual FoxPro 9 Resource
$ Microsoft Visual FoxPro 9 Runtime Libraries
C $ Microsoft Visual FoxPro OLE DB Provider
Lj 9 Microsoft WebClass Library 1.0
Г..! $ Microsoft Windows Common Controls (5.0)
C 9 Microsoft Windows Common Controls (6.0)
C $ Microsoft Windows Common Controls-2 (5.0)
U $ Microsoft Windows Common Controls-2 (6.0)
.J $ Microsoft Windows Common Controls-3 (6.0)
L.J $ Microsoft Winsock Control 6.0'
5? $ MSXML 3.0
Й $ MSXML 4.0
*3 $ MSXML 4.0
L.I Msxml3 Exception INF Merge Module
□	$ OLE DB2.1
C $ SOAP SDK Files
□	$ SOAP SDK ISAPI Files
LJ VBScriptRunbme l~] $ WebData std library □ $ Windows Scripting Host 5.6 J 3 WmHTTP QFE Installer (platform-specific) <L ______________________________’ ____________________
Рис. 5.19тВыбор библиотек для приложения (продолжение)
Мы готовы к формированию дистрибутива. Как это правильно сделать?
Выберите в меню Build одноименную команду или щелкните мышью по кнопке (Щ на панели инструментов. В нижней части окна по мере выполнения операций по формированию дистрибутива будут появляться сообщения. До ждитесь, пока сообщения не перестанут появляться и не появится сообщение Setup.exe created, говорящее о том, что исполнимый фай л дистрибутива сформирован (рис. 5.20).
Можно протестировать создаваемый дистрибутив, выбрав команду Test из меню Build или щелкнув мышью по кнопке на панели инструментов.
Есть еще один этап - Distribute Your Release (Оформить в виде дистрибутива ваше приложение со всеми компонентами). Выполнив его, вы из образов создаете на сети или на диске дистрибутив (рис. 5.21). Однако этот этап можно и опустить и записывать дистрибутив прямо из образов.
ГЛАВА 5 ▼ Полезные дополнения
J51 Language Russian built '	^а|
-J building СДЭ tiles ..
Dalal cab built r'les built |Media table successfully built
Performing Upgrading and Patching Validation
Setup exe created
E'.presstSingietmage - 0 error($j, C warnings) ; i Log file has been created. D илекс?и'>Ьс>С'к'£х jmp!e',JnStaf''D4riSt&fT,Evpr e; sXStnqlelmaqeH oc,Ffes\5-z9-2iX‘5 02-3b-49 txt
Ready,__	^ ----- ---	-	~	p- -
Рис. 5.20 т Сообщения при окончании формирования дистрибутива
•»*<&> t	*	**	-	»	ч »	Л у "> о-о.	I >	*	-4S*	V У	3	y^-ttninnyiM
-<4n$idff -InstallShield Express Visual FoxPro Limited Edition	I» iLQ
p File gdC View go Project guM loots Help
|i □ -J H D и I V » >S'L-» W>
ф Configure the Target System i*»1
-9 Sbortcuts/Folders
Registry
Vp ODBC Resources
INI File Changes
]X} Pile Extensions	• i
|g| Environment Variables
tllS Virtual Directories	
Component Services
Customice the Setup Appearance	H
gJ Dialogs
Й Billboards	.
S3 Text and Messages	• I
ф Enable Automatic Updates	_ 
Update Service	s ~ [
Define Setup Requirements and Action j
Requirements	<
5Й Custom Actions	I
i^| Setup Files	i
-ф Prepare for Release	. i
✓ |>*| Build Your Release	1 i
V, Test Your Release	i
•/ Д) Distribute Your Release
Vrojert Assistant1 Г ~ n" InTt'allatm
Distribute Your Release U
Builds
i ^CD_ROM
;• '	Custom
DVD-10
:	DVD-18
DVD-5
> DVD-9
• WebDeployment
Distribute View
{* Folder.
iD^LAn^ce^lbook'iExample'iJnStaffl growse... J
f FTP location:	r
User name.
Password'
Г~ Distribute after every build
^Language Russian built	pv]
-Jpuilding CaB files .	’
h |Data1 .cab built
F)le$ built
a Mediatable successfully built
! Performing Upgrading and Patching Validation
L Setup exe created
i i ExpresstSinglelmage - 0 error(s), 0 warning(s)
; Log file has been created. D U»'ne<ceH‘bool(liExompleVnStafTD4nStaff>Ey.pi ess'Ginqielrr.aqelLoqFilestB-Zg-lOOS 02-47-06 txt
I i________________________________________________________________________________________________________________M
j: \C>UtpUt /
Readv	~i	'	z.
Рис, 5.21 ▼ Этап Distribute Your Release
Мастера Visual FoxPro 9
К сожалению, записывать компакт-диски InstallShield Express 5.0 for Microsoft Visual FoxPro сам не умеет. Подготовленные им наборы файлов вам надо самостоятельно записать на компакт-диски с помощью какого-нибудь специального приложения. Например, можно воспользоваться популярным программным средством Ahead Nero.
Дистрибутив вашего приложения готов. Вы создали полноценный программный продукт начального уровня сложности. Можно устанавливать его у пользователей или передавать службам сопровождения для установки. Конечно, программный продукт полагается сопроводить документами, оформленными в соответствии со стандартами. В нашей стране пользуются стандартами на документацию ГОСТ 19.106-78.
Главное при написании Руководства пользователя не демонстрация своих филологических способностей, а понимание и учет возможностей неподготовленного человека воспринимать новый материал. Побольше иллюстраций, побольше пошаговых инструкций. По возможности надо пояснять в тексте, что происходит, когда пользователь задействует ту или иную функцию приложения.
Мастера Visual FoxPro 9
Мастер - программа, помогающая выполнить сложное действие, для чего вам просто нужно отвечать на поставленные вопросы. Мастера часто помогают сэкономить время. Иногда для неопытных пользователей они являются единственной возможностью осуществить задуманное действие.
Рассмотрим Мастера, предлагаемые Visual FoxPro 9 в меню Tools (Инструменты). Список Мастеров появляется при выборе команды Wizards (Мастера). Можно сразу выбрать из списка нужный Мастер или команду All Wizards (Все Мастера). При этом появится окно со списком Мастеров. Если щелкнуть мышью по какому-нибудь из них, внизу этого окна появится краткое пояснение назначения Мастера.
Application Builder и Wizard Builder нам уже знакомы, и их мы рассматривать не будем.
Cross-Tab-Wizard служит для представления данных нескольких пересекающихся таблиц в виде одной таблицы.
Database Wizard предназначен для автоматизированного создания базы данных.
Documenting Wizard анализирует и форматирует текст ваших программ. Довольно полезный Мастер для тех. кто ленится сразу грамотно оформлять исходный текст программ, но хочет, чтобы он выглядел достойно.
ГЛАВА 5 Т Полезные дополнения
Первое окно этого Мастера представлено на рис. 5.22. В этом окне выбирают программу или даже целый проект (надо выбрать файл проекта .pjx).
Во втором (рис. 5.23) окне задают условия замены символов слов в программе. В переключателе режимов Keywords (Ключевые слова) выбирают регистр символов при написании ключевых слов Visual FoxPro 9. В переключателе режимов Symbols (Символы) выбирают регистр символов, которыми пишутся имена переменных.
Рис. 5.22 т Выбор источника с программой
। Keywords:
; ©UPPERCASE
; О lowercase.:;
i QMrxedCase
i QNoghange
; Symbols—---- ~
‘ О UPPERCASE
1 Q lowercase
i 0 M^tch fest occurrence
LO No change
[ НФ ~~~]	[ Cancelj [<~jack ||„, Xjext > | { finish ~~~1
Рис. 5.23 т Выбор регистра символов ключевых слов
Мастера Visual FoxPro 9
На третьем шаге (рис. 5.24) определяют автоматическую расстановку отступов. Тип отступа выбирается в раскрывающемся списке Type of Indent. Отступы могут формироваться при помощи пробелов и при помощи символов табуляции.
Следующий шаг Мастера (рис. 5.25) предлагает автоматически сформировать заголовки перед блоками программного кода, такими как файлы, процедуры, определения классов и методы.
I Cancel j I < f ack || Nent> | | finish j l'
Рис. 5.24т Условия автоматической расстановки отступов
Рис. 5.25 т Формирование заголовков перед блоками программного кода
ГЛАВА 5 ▼ Полезные дополнения
В следующем окне Мастера (рис. 5.26) можно выбрать отчеты, которые вы получите по окончании работы Мастера.
| Step 5 • Select Reports	[v> |
Do you want to create reports about you code?	I
The reports ' are text fles that are created from tables that the k И Ш4 buMsfr omyour code..
 ....	I
Рис. 5.26 ▼ Выбор отчетности
.J:? - J Step 6- Finish	v
Setect an option and click Fmh
О fiverwrte existing files
.; О Race Hes n a single directory
•• • files hTnew^ectoty tree-
j I Cross-reference keywords
: [ Help J fyttf- [ E^h ]
Рис. 5.27т Местоположение исправленных файлов
Мастера Visual FoxPro 9
Последнее окно перед началом активных действий Мастера предлагает выбрать, как поступать с файлами программ, которые подлежат обработке. Возможные варианты:
>	Overwrite existing files - переписать существующие файлы;
>	Place files in single directory - все измененные файлы будут помещены в одну папку;
>	Place files in a new directory tree - будет создана новая папка со структурой папок внутри, аналогичной структуре папок в проекте, и измененные файлы будут помещены во вновь созданную папку в папки, соответствующие положению файлов в проекте.
В случае выбора одного из последних двух пунктов после щелчка мышью по кнопке Finish (Iotobo) появится запрос имени папки, в которой появятся скорректированные файлы.
Form Wizard помогает создать простую форму для отображения данных одной таблицы.
Graph Wizard создает графическое представление данных из указанной таблицы при помощи Microsoft Graph. Результат работы этого Мастера весьма похож на результаты работы Мастера построения диаграмм в Microsoft Excel. Это и не удивительно, потому что он также использует для создания диаграмм Microsoft Graph.
Import Wizard позволяет импортировать в существующую или в новую таблицу данные из другого источника.
Label Wizard - Мастер для быстрого создания почтовых наклеек.
Local View Wizard создает представление локальных данных.
Mail Merge Wizard позволяет получить источник данных для слияния в текстовом процессоре (например, Microsoft Word) при почтовых рассылках.
One-To-Many Form Wizard помогает создать окно формы, отображающей данные нескольких таблиц, связанных по какому-либо полю. Форма отображается с набором кнопок для перемещения по записям таблиц и некоторых действий над записями. Сформированную форму можно сохранить на диске и добавить к своему проекту.
One-To-Many Report Wizard помогает создать отчет, отображающий данные нескольких таблиц, связанных по какому-либо полю.
Pivot Table Wizard - Мастер, передающий данные из таблиц СУБД Visual FoxPro 9 в Microsoft Excel.
ГЛАВА 5 ▼ Полезные дополнения
Query Wizard - этот Мастер создает стандартные запросы для выбора данных по заданным условиям из указанных таблиц.
Remote View Wizard создает представление данных удаленных таблиц.
Report Wizard позволяет создать отчет, отображающий данные одной таблицы.
Table Wizard помогает создать таблицу.
Web Publishing Wizard - Мастер, создающий html-страиичку для публикации в Internet данных из ваших таблиц. Довольно неплохо реализованный конвертер. Содержимое html-файла получается весьма грамотно сформированным. Такой файл не стыдно показать и опытным Web-мастерам. Как работать с этим Мастером?
На первом шаге, окно которого представлено на рис. 5.28, выбираются таблица и поля, которые будут отображаться.
Рис. 5.28 т Выбор таблицы и полей для отображения на html-странице
На втором шаге (рис. 5.29) выбираются поля, по которым будет осуществляться сортировка, и направление сортировки.
Следующий шаг (рис. 5.30) - определение внешнего вида странички и размещения на ней данных. Возможные варианты расположения полей на странице приводятся в списке Data layouts (Расположение данных). При выборе можно ориентироваться на образец в левом верхнем углу окна. Кроме того, если сделать двойной щелчок мышью по пункту списка, появится окно с описанием этого пункта.
Мастера Visual FoxPro 9
)Йп=	[ < Remove ]
i	= ©Ascending
|	.... О Descending '
[ Help ]	| Cancel ] [ < fieck ; ] [j  £iext > „., j] [ F-nish ]
Рис. 5.29 т Условия сортировки отображаемых записей
ВЕЗ ИД &
| Step 3 - Choose Style
Which Layout and styles do you want for your web page?
Double-click on a layout to view mote details. Right-click on the Styles 1st box to change generation order of styles. Cfck the Preyiew button to view a subset of .your data n the web browser.
Data layouts
(Static List View i Static Detail View	t
; Tabular List	i
.Tebula Defeat., ; Tabular Hierarchical и* г
|.Options... ] [Advanced... j
Visual styles:
□ arble background '** J □ andstone backgrour; . h 0 ock background □ risen background *»•
<r V'
[" gteview"
[ Jjelp j	[ Cancel ] [~ <~5ack j