Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КонспектЛекций.doc
Скачиваний:
71
Добавлен:
14.05.2015
Размер:
1.26 Mб
Скачать

2. Microsoft Visual FoxPro. Обзор.

История Visual FoxPro и основные особенности шестой версии.

FoxPro – реляционная однопользовательская СУБД (с возможностью сетевого доступа), ориентированная на широкий класс пользователей. Производитель: Fox Software. Первая разработка датируется 1984 годом. FoxBase был задуман как улучшенный вариант dBASE, т.е. если dBASE умел что-то делать, то FoxBase должен был делать это лучше и быстрее.

С появлением на рынке FoxPro 2.0 был совершен переворот в области разработки баз данных на персональных компьютерах. Ускорение работы оказалось просто поразительным. В персональной системе базы данных стала возможной работа с таблицами, содержащими миллионы записей. Впервые разработчики Fox использовали в этой версии SQL-инструкции. FoxPro 2.0 представил разработку экранов и отчетов с помощью «мастеров». При этом мастер генерировал программный код, позволяя использовать и модифицировать его в основной программе. В версию FoxPro 2.5 была добавлена поддержка Windows, хотя по сути это было DOS-приложение, лишь внешне приняв облик Windows-продукта.

Компания Microsoft выкупила фирму Fox Software в период разработки FoxPro для Windows, и «совместная» версия 3.0 обогатилась множеством дополнительных возможностей: появилась поддержка хранимых процедур, правил привязки данных к таблицам, а также новых функций. Visual FoxPro стал первой персональной СУБД с возможностью доступа к удаленным данным. Версия 5.0 обрела возможность использовать и создавать серверы COM, но радикально не отличалась от версии 3.0.

На рубеже веков в основном использовалась шестая версия (Visual FoxPro 6 вошёл в состав пакета разработчика Microsoft Visual Studio 6, 1999 год), хотя все позиции и притязания FoxPro уже можно было трактовать как весьма умеренные.

Основа: интегрированная среда разработчика, позволяющая как конструировать программы из набора модулей (экраны, меню, отчёты), так и осуществлять запросы к БД из самой среды. Основной режим выполнения программ – интерпретация с возможностью создания исполняемых EXE-файлов (для работы которых требуется отнюдь не маленькая по размеру файла библиотека FoxPro). По быстродействию FoxPro всегда занимает лидирующее место среди однопользовательских СУБД. Язык программирования базируется на языке dBASE, плюс собственный набор команд и функций (FoxBASE) плюс поддержка некоторых SQL-инструкций и плюс набор ООП-классов в основном для конструирования пользовательских интерфейсов. Улучшенная поддержка COM является, по-видимому, наиболее значительным усовершенствованием, упростившим создание и реализацию OLE-серверов.

Проект является основным средством объединения отдельных элементов приложения, собирающий файлы, на которые есть ссылки, и осуществляющий их взаимодействие. Для каждого из элементов в СУБД создаётся отдельный файл:

Объект

Расширения

Проект

PRG, FPC, CAT, PGX, PJT

База данных (для организации таблиц и индексов)

DBC

Таблица (число записей в файле – до 1 млрд., максимальный размер записи – 4000 байт, число полей в записи – до 255)

DBF

Индексный файл (бывают простые и составные)

CDX, IDX

Поля типа Memo и Genegal

FPT

Форма

SCX

Запрос

QPR

Отчёт

FRX, FRM

Почтовая наклейка

LBX, LBL

Меню

MNX

Библиотека класса

VCX

Программа

PRG, SPR, MPR, QPR

Рисунок

BMP

Звук

WAV

Откомпилированный проект (наиболее быстрое выполнение команд)

APP

Автономный файл проекта

EXE

Типы данных (полей в таблицах), которые поддерживаются FoxPro:

  • Character – текстовый (254 символа максимум)

  • Integer, Numeric, Float, Double – числовые

  • Currency – денежный

  • Date – дата

  • DateTime – дата и время

  • Logical – логический

  • Memo – текстовое поле произвольной длины

  • General – двоичное поле произвольной длины

Язык программирования FoxBASE

Язык является строко-зависимым и регистронезависимым. Содержит большое количество команд и функций, часто дублирующих друг друга (в основном в целях совместимости с другими СУБД). Некоторые команды одинаковы даже по названию (например, SELECT). Язык истинно структурный, поддерживает аппарат процедур и функций, а также механизм макроподстановок. Использует многомерные массивы и функции массового копирования данных, однако не работает с множествами. Областью вывода по умолчанию является фон главного окна программы (как продолжение традиции DOS-версии).

Некоторые правила языка:

1) кириллица может быть использована лишь в символьных строках и примечаниях;

2) ограничителями строковых констант могут быть как кавычки, так и апострофы;

3) символ примечаний &&или * ;

4) оператор вывода на главное окно – команда ? или ?? (в первом случае вывод с новой строки, во втором – с текущей позиции);

5) Ввод и вывод даты:

MyBirthDate={^1969-08-23}

Set date german

? MyBirthDate

6) Использование макроподстановок

N = ”Date()”

M = ”&N+7”

? M && выводится текст Date()+7

? &M && выводится текущая дата, увеличенная на 7 (дней)

? ”&M” && выводится текст Date()+7

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

<Имя команды> [<границы>] [<список выражений>] [ FOR <условие>] [ WHILE <условие>]

Здесь:

<границы> – область действия команды – ключевые слова: ALL (все записи), REST (вниз от текущей), NEXT <n> (следующие n записей, начиная с текущей), RECORD <n> – только для записи с номером n.

FOR <условие> – выполнение команды только для записей, отвечающих условию.

WHILE <условие> – выполнение команды до тех пор, пока не перестанет выполняться условие.

Пример программы поиска:

Clear ALL && очистка экрана, удаление пользовательских переменных и массивов, окон и меню

Use Phonebook && выбираем уже созданную базу данных со списком телефонов

nRec=Reccount() && подсчитываем число записей в базе (переменную объявлять не надо)

? nRec && выводим полученную цифру на экран

for i=1 to nRec do && организуем цикл по записям

goto i && прямое позиционирование на запись с номером i

if Alltrim(phone)=’555555’ && сравниваем поле с именем phone со строковой константой

display && если условие выполнено, показываем запись на экране

endif

endfor

Описание основных команд FoxBASE

1) Выбор таблицы. В среде FoxPro только одна таблица может быть активной.

USE <имя таблицы> – открытие таблицы в текущей рабочей области

USE без параметров – закрывает таблицу

SELECT <i> – переход в рабочую область с индексом i

CLOSE ALL – закрытие всех файлов и переход в рабочую область 1

2) Перемещение по таблице и контроль перемещения.

GO {TOP | BOTTOM | <n>} – переход к первой, последней или записи с номером n

SKIP [<n>] – переход к записи, отстоящей на n от текущей или на следующую запись

Recno([<i>]) – функция, возвращающая номер текущей записи в области i

Reccount([<i>]) – выдаёт общее число записей в таблице (включая помеченные на удаление)

Eof([<i>]), Bof([<i>]) – функции, отмечающие конец и начало таблицы

3) Вставка и удаление записей

APPEND [BLANK] – дополнение таблицы интерактивное (открывается окно ввода данных) или пустой записью

INSERT [BEFORE] – вставка новой записи после (или до) текущей (открывается окно ввода данных)

DELETE – пометка к удалению записей в указанных границах или отвечающих указанным условиям

PACK – физическое удаление помеченных ранее записей и сжатие файла.

USE Peoples

GO BOTTOM

SKIP -3

DELETE NEXT 3

PACK

Просмотр содержимого таблицы

LIST – выводит записи активной таблицы на главное окно

CHANGE <параметры> – вызывает окно редактора отдельных записей таблицы с возможностью интерактивного или предварительного задания параметров редактирования (в т.ч. ввод значений по умолчанию).

BROWSE <параметры> – мощное средство представления данных в табличном виде, позволяющее осуществлять просмотр и редактирование (ввод) записей в одной или нескольких таблицах. Параметры представления данных могут указываться интерактивно или с помощью параметров. Перечислим некоторые параметры команды:

  • [FIELDS <поле>[:<ключ>],…] – перечень предъявляемых полей (по умолчанию – все). Примеры ключей: :<n> – видимый размер поля в символах :R – разрешён только просмотр поля, :H=<имя> – указание собственного заголовка поля; :W=<выражение> – условие для входа в поле;

  • [FOR <условие>] – фильтр для записей;

  • [VALID <условие> [ERROR <сообщение>]] – контроль выхода из текущей записи (т.е. если <условие> истинно, запись покинуть разрешается, иначе появится <сообщение> об ошибке;

  • [WHEN <условие>] – контроль доступа к записи (если false, запись только для чтения)

  • [NOEDIT] – редактирование невозможно для всей таблицы

  • [NODELETE] – удаление записей невозможно

  • [NOAPPEND] – дополнение базы невозможно

  • [NOWAIT] – после открытия окна управление сразу передаётся программе

  • [LOCK <n>] – разделение окна по вертикали: линия раздела проходит за первыми n полями

  • [LEDIT | REDIT] – левая или правая части окна превращаются в CHANGE

USE Students

BROWSE

BROWSE NOEDIT LOCK 3 REDIT FIELDS new=Family + Lastname + Left(Firstname,1) + ’.’ +;

Left(Patronymic,1) + ’.’ :25:H=’ФИО’, BirthDate:H=’Дата рождения’ FOR group=21402

Индексирование таблицы

Индекные файлы в FoxPro бывают нескольких видов:

1) одноиндексные – индекс по одному полю, высший приоритет. Файл с расширением .idx.

2) мультииндексный структурный. Имя совпадает с именем таблицы, автоматически открывается для своей таблицы, и не указывается в списке индексных файлов. Расширение файла .cdx.

3) мультииндексный обычный. Может создаваться и подключаться к таблицам программно. Низший приоритет.

INDEX <параметры> – команда создания индексных файлов

SER INDEX TO [<список индексных файлов>] [ORDER <ведущий индекс>] – открывает индексные файлы для активной таблицы.

SER INDEX TO без параметров – закрывает все индексные файлы кроме структурного. Синоним – CLOSE INDEX

REINDEX – обновляет все индексные файлы, открытые в текущей рабочей области. По умолчанию при редактировании и добавлении данных индексы отключаются. И если их по окончанию редактирования не перестроить, возникает фатальная ошибка обработки данных в базе.

Поиск и упорядочение информации в таблице

SET FILTER TO <условие> – установка условия для всех следующих команд обработки данных

SET FILTER TO без параметров – отмена ранее поставленных условий

LOCATE FOR <условие> [<границы>] [WHILE <условие>] – последовательный поиск. Предварительное индексирование не требуется. При успешном поиске функция Found() выдает значение True, а функция Recno() указывает на номер искомой записи с первым вхождением заданного условия поиска. Продолжение поиска осуществляется командой CONTINUE.

USE Students

SET FILTER TO Group=21402

LOCATE FOR Name=”Екатерина”

DISPLAY

CONTINUE

SORT ON <список полей с ключами> TO <имя новой таблицы> [<границы>][<условия>] – создание новой таблицы, в которой физическое размещение записей соответствует заданному принципу. Первое поле в списке считается главным. Ключи: /A – сортировка по возрастанию, /D – сортировка по убыванию.

SEEK <выражение> – быстный поиск по ведущему индексу. Если поиск удачен, Found() возвращает True, а Recno() – номер первой записи, удовлетворяющей условию (при этом остальные искать не надо, они находятся ниже по соседству). Помимо команды SEEK и её синонима FIND существует аналогично работающая функция Seek(<выражение>), возвращающая True, если поиск удачен.

Пример программы изменения данных в таблице: откроем БД Streets, найдём запись со значением «Урицкого» (считаем, что запись уникальная) и заменим её на «Александра Невского».

Clear ALL

Set near off && включаем нежёсткий режим поиска

Use Streets

Set index to && закрываем все дополнительные индексные файлы

INDEX on street_nam to ind_name && создаём новый индексный файл по полю street_nam

SEEK ”Урицкого” && быстрый поиск возможен только с использованием индекса

If Found()

Replace street_nam WITH ”Александра Невского”

else

? ”Нет такого имени”

endif

BROWSE && проверим, что сейчас таблица упорядочена по алфавиту по полю street_nam

Set index to

Связи между таблицами

SET RELATION TO <ключевоеполе> INTO <область>, …[ADDITIVE] – связывает указатель записей в активной рабочей области с указателями записей из других рабочих областей по заданному полю. Дочерние таблицы должны быть открыты, и в обязательном порядке проиндексированы по ключевым полям. Создаётся связь вида 1:1.

SET RELATION TO без параметров – разрывает связи между всеми таблицами.

SET SKIP TO <область> – преобразует связь 1:1 к связи 1:М

JOIN <параметры> – альтернативный вариант команды для связывания таблиц

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

clear

select 1

use streets

index on id_street to id_1 unique && совершенно очевидно, что код улицы уникален

pathind=ndx(1) && функция возвращает путь к индексному файлу

select 2

use phones_flat

set relation to id_street into streets && связь один-к-одному

var_name=Space(30) && определим переменную текстового типа

@ 4,4 SAY "Введите имя для дальнейшего поиска:"

@ 5,4 GET var_name PICTURE "@!" && воспользуемся простыми средствами ввода данных

READ

set filter to Alltrim(Upper(name))==AllTrim(m.var_name) && можно и так ...

i=1

FormatFont="FONT 'Courier',12 " && эта переменная будет использована как макроподстановка

@ 6,1 && всего лишь начало области вывода

do while not eof()

&& самая простая команда вывода при желании может обрести неожиданный вес

? i PICTURE "@L 9999 " &FormatFont STYLE 'BI',;

Padr(Substr(surname,1,At(" ",surname)),20," ") &FormatFont ,;

house PICTURE "@R дом 9999 " FONT 'Tahoma',14 STYLE 'B',;

" по ",;

AllTrim(streets.street_typ) &FormatFont,;

streets->street_nam &FormatFont

i=i+1

skip

enddo

set filter to

set relation to

close indexes

close tables

erase "&pathind"

Разработка форм в FoxPro 6.

Вызов редактора форм из командной строки с целью создания формы: create form <имя формы> При этом создаётся файл <имя формы>.scx.

Редактирование формы: modify form <имя формы> При этом открывается окно Form Designer с панелями Form Controls и Properties. Прежде всего необходимо сформировать среду окружения (выпадающее меню Data Environement при клике на окне формы) для формы: добавить таблицы и связать их между собой.

Созданная форма сразу готова для выполнения (меню Form / Run Form иликнопка«!»).Запуск формы на выполнение из командной строки:

do form <имя формы>

read events

Обращение к объектам текущей формы:

thisform.<имя объекта>.<имя свойства> = <значение>

Основные поля, методы или свойства формы и связанные с ними типичные реакции:

Unload Event

закрытие формы

clear events

Init Event

инициализация формы

устанавливаются нач. знач. объектов формы

Caption

заголовок формы

уже установлен

Основные объекты формы:

мастер помогает установить параметры объектов

1. Поле комментария (Label)

текстовая информация (заголовки)

2. Текстовое поле (Text Box)

поле ввода и вывода данных с форматом и маской

3. Поле редактирования (Edit Box)

поле для редактирования символьных полей большого размера и memo-полей

4. Кнопка (Command Button)

одиночная кнопка с надписью или рисунком

5. Группа кнопок (Command Group)

заданное количество кнопок в одном контейнере*

6. Группа переключателей (Option Group)

Кнопки с зависимой фиксацией*

7. Флажок (Check Box)

Принимает значение 0 или 1

8. Поле со списком (Combo Box)

Данные вводятся или выбираются из вып. списка

9. Список выбора (List Box)

Отображение многостолбцовых данных со скролл.

10. Катушка (Spinner)

инкремент/декремент с заданным шагом

11. Табличное представление (Grid)

если не хочется использовать BROWSE

12. Изображение (Image)

поддерживаются все известные графич. форматы

13. Таймер (Timer)

отображение системных часов или обновление данных через заданный интервал

14. Рамка вкладок (Page Frame)

составной объект из заданного числа страниц*

15. Элем. отображения ActiveX (ActiveX Bound Control, OLE Bound Control)

подключение внешних элементов управления для отображения значений поля типа General

16. Элем. управления ActiveX

создание ActiveX-объекта

17. Линия, Контур (Line, Shape)

линия, прямоугольник, эллипс, окружность

18. Контейнер (Container)

собирает объекты для однотипного управления

19. Разделитель (Separator)

разделитель кнопок

20. Гиперссылка (Hyperlink)

* чтобы проникнуть внутрь контейнера для редактирования его объектов следует выбрать в выпадающем меню опцию «Edit», щёлкнув по объекту-контейнеру правой кнопкой мыши.

С помощью команд меню Format (/Align, /Size) можно сделать объекты одинакового размера, выровнять их относительно друг друга или формы, сделать равными расстояния между ними и т.п.

Для каждого объекта существуют свойства и методы, управляющие его внешним отображением (вкладка Layout в окне Properties), взаимодействием с источником данных для этого объекта (вкладка Data), методами обработки событий от других элементов или связанных с действиями пользователя (вкладка Methods), прочие свойства (вкладка Other).

В выделенном на рисунке окне может работать построитель выражений (кнопка fx) для определения значения свойства (если в этом есть необходимость). Если для метода указано [Default], то выполняются действия по умолчанию для каждого из методов. Если требуется ввести собственные действия, после двойного щелчка открывается окно для ввода программы, назначаемой данному методу, помимо действий, выполняемых по умолчанию.

Основные методы объектов формы и связанные с ними типичные реакции:

Caption

текст для Label и Button

конечно, можно менять программно, например this.caption = time()

Name

имя объекта (уникальное)

зная его, программно управляем объектом

Value

текущее значение объекта

можем устанавливать и читать, например:

Thisform.Text1.Value = Date()

Picture

изображение для Button и Image

вводится имя файла изображения

Click Event

нажатие – прежде всего для Button

пример для кода кнопки «К началу таблицы»:

if !bof()

go top

endif

_screen.ActiveForm.Refresh()

Format, InputMask

для полей ввода

такие же опции форматирования, что и для команд SAY/GET с шаблоном PICTURE

RowSource

для списков – источник данных

совместно с полем RowSourceType

Пример кода для кнопки «Выход из формы»:

if MessageBox(“Выходить из формы ?”, 4+32+256, ”Выход”) = 6

_screen.ActiveForm.Release()

else

_screen.ActiveForm.Refresh()

EndIf

Если переменную или массив намечается использовать вне формы или при взаимодействии нескольких форм, создавайте её как Public.

Разработка отчётов в FoxPro 6.

Под отчётом понимается форматированное представление данных, выводимое на экран, принтер или в файл.

Вызов редактора отчётов из командной строки с целью создания нового отчёта:

create report <имя отчёта>. При этом создаётся файл <имя отчёта>.frx. На экране появляется окно Report Designer и панель инструментов Report Controls. Редактирование отчёта: modify report <имя отчёта>.

Создание исполняемых модулей в FoxPro 6.

  1. Создаём главную программу :

  1. ВокнеProject ManagerнажимаемкнопкуBuildивыбираемBuild Executable: