Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка. Базы данных (ПОВТ) 2009

.pdf
Скачиваний:
54
Добавлен:
14.02.2015
Размер:
2.1 Mб
Скачать

ORDER [TAG] <имя тега> OF <CDX-<файл> - главный индекс задается именем тега. ASCENDING/DESCENDING - определяет порядок использования индекса (по

возрастанию/убыванию), даже если при его создании был использован противоположный закон.

ADDITIVE - открытие новых индексов не закрывает старые.

Команда SET INDEX TO без параметра закрывает все индексные файлы, кроме структурного, для текущей базы. Такое же действие осуществляет команда

CLOSE INDEX

Ускоренный поиск

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

SEEK <выражение>

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

При наличии индекса сначала именно в нем, а не в самой базе Ждется поиск номера записи с указанным в команде SEEK значением выражения в индексном поле. При этом поиск в индексе выполняется не последовательно, а скачками (так называемый двоичный поиск), что позволяет быстро локализовать номер нужной записи. Только после этого указатель записей устанавливается на искомую запись в основной базе данных.

Команда SEEK разыскивает только одну первую запись, в которой в индексном поле наблюдается <выражение>, т.е. когда <поле>=<выражение>, и устанавливает на нее указатель записей.

Работа с несколькими таблицами

В FoxPro допускается работа сразу с многими базами данных и при этом возможно установление разнообразных связей между ними. Указатели записей в таких связанных базах будут двигаться синхронно. База, в которой указатель движется, произвольно, считается старшей, а база/базы, в которой указатель следует за указателем старшей базы, - младшей. В старшей и младших базах должны быть поля, несущие какой-то общий признак, иначе, хотя связь и возможна, она будет бессмысленна. Допускается сцепление одной базы с несколькими другими. Младшие базы, в свою очередь, могут быть связаны с базами следующего уровня и т.д.

Возможно установление двух типов связей между записями двух сцепленных баз данных. Связь типа одна-запись-к-одной перемещает указатель в младшей базе таким образом, что он всегда устанавливается на первую встреченную им запись с совпадающим признаком. Остальные такие записи (если есть) остаются "не замеченными". Эта связь устанавливается просто командой SET RELATION. Связь типа одна-запись-ко-многим позволяет обратиться ко всем записям младшей базы с совпадающим признаком (команды

SET RELATION и SET SKIP TO).

Оба типа связей могут быть распространены на несколько баз сразу.

Понятие о рабочих областях

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

SELECT <рабочая область/псевдоним>

Первые десять рабочих областей идентифицируются номерами 1-10 или буквами А - J. Области с 11-й по 25-ю обозначаются номерами или буквенно-цифровыми именами W11 - W25. Если в качестве параметра указать цифру 0, произойдет переход в первую свободную рабочую область. Кроме того, рабочие области и файлы базы данных могут

21

идентифицироваться так называемыми псевдонимами. Псевдонимом области по умолчанию является само имя находящегося в ней файла базы данных. В качестве псевдонима можно указать и любое другое слово в команде USE. Использование псевдонима позволяет при работе с разными базами называть их одним именем (псевдонимом). Это делает программу независимой от имени конкретной базы.

Область, в которой мы находимся в данный момент, называется активной рабочей областью и в ней можно работать с находящейся зхдесь базой данных, используя все допустимые команды системы. одновременно даже в одной команде можно иметь доступ (с некоторыми ограничениями) к полям других баз. В этом случае имя поля из неактивной области - составное. Собственно имени поля тогда предшествует имя рабочей области или псевдоним, разделенные знаками "->" или (что более удобно) точкой:

<рабочая область/псевдоним> -> <имя поля> или <рабочая область/псевдоним>.<имя поля>

Например, следующие составные имена для поля FAM из базы KADR.DBF идентичны, если эта база открыта в области А или 1:

KADR.FAM, A.FAM, KADR->FAM, A->FAM.

Рабочая область в составном имени указывается любым разрешенным образом (буквой, именем ее базы данных, псевдонимом), но не номером. Номер может быть указан в команде SELECT и в функциях. В каждой области поддерживаются свои указатели записей, на положение которых не влияют переходы между областями.

При входе в СУБД активизируется область 1 (или А), и, если вы работаете только с одной базой, заботиться об открытии областей ненужно.

П р и м е р. В файле KADR среди прочих содержатся сведения о фамилиях и табельных номерах работников, а в файле BRIG1 - о табельных номерах TAB и выработке VIR. Необходимо по фамилии (например, МИРОНОВ) из файла KADR найти его выработку

из файла BRIG1.

 

CLOSE DATA

 

USE kadr

- открытие файла KADR.DBF

USE brigl IN 0

- открытие BRIG1.DBF в свободной области

LOCATE FOR fant='МИРОНОВ' - поиск записи с фамилией МИРОНОВ

SELECT brigl

- переход в область BRIG1

LOCATE FOR tab=b.tab - поиск записи в файле BRIG1 с

 

- табельным номером МИРОНОВА

? a.fam, tab, vir

- выдача данных из обеих баз

МИРОНОВ Р.И. 468 204000

Замечание. Как уже говорилось, в команде USE можно одновременно указывать и область, в которой открывается база данных. Однако переход в указанную область при этом не происходит. Так, после выполнения команд USE brig I IN 0 мы все равно остаемся в текущей области А.

Очевидно, что такой способ связи файлов очень трудоемок, в особенности, если требуется установить связь не с одной, а с несколькими записями (здесь фамилиями). В FoxPro имеется команда, упрощающая эту задачу.

Связь вида одна-запись-с-одной

Команда

SET RELATION TO <ключ> INTO <область> [,<ключ> INTO <область>...] [ADDITIVE]

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

22

Пример. Связать файлы KADR.DBF и BRIG1.DBF по полю TAB. Вывести для каждого табельного номера файла BRIG1.DBF соответствующую фамилию и выработку.

USE brigl IH •

USE kadr INDEX kadi-tab IN Ь SET RELATION TO tab INTO b

LIST tab,vir,b.fam

 

 

Record #

TAB

VTR

B.FAM

1

98

446000

ПОТАПОВ Д.П. .

2

6

480072

КУЛАКОВА М.И.

3

13

120000

СИДОРОВ П.С.

4

468

204000

МИPOHOB P.И.

Здесь выведены записи файла BRIG1.DBF, в которые включено поле

соответствующих им фамилий KADR.DBF (B.FAM).

В FoxPro имеется возможность устанавливать связи с несколькими базами одновременно. Если со старшим файлом, который уже связан с другим, необходимо связать некоторый третий (четвертый и т.д.), следует во все последующие команды SET RELATION включить слово ADDITIVE, которое обеспечит сохранение связей, установленных ранее.

Связь между всеми файлами разрывается командой SET RELATION TO без параметров. Связь с отдельным файлом в заданной <области> - командой

SET RELATION OFF INTO <область>

Связь вида одна-запись-со-многими. Следующая команда устанавливает связь такого типа между двумя или несколькими базами данных:

SET SKIP TO [<область1> [,<область2>]... ]

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

Прежде чем использовать команду SET SKIP TO, необходимо выполнить начальное сцепление вида одна-эапись-с-одной командой SET RELATION.

Удаление связи одна-запись-со-многими осуществляется командой SET SKIP TO без параметров.

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

Положим, что в бригадных файлах BRIG3.DBF и BRIG5.DBF некоторые табельные номера могут встречаться несколько раз (например, если фиксируются выработки каждого работника по отдельным нарядам). Допускаем также, что рабочие могут работать сразу в нескольких бригадах. Требуется для каждой фамилии и табельного номера из базы KADR.DBF предъявить все выработки данного работника из баз BRIG3.DBF и BRIG5.DBF, которые проиндексированы по полю TAB (индексы BRIG3.IDX и BRIG5.IDX). BROWSE-ОКНО показано на рис. 10.1, решение приведено ниже:

SELECT a

 

USE kadr IN a

&& Открытие старшей базы области А

USE bng3 IN b INDEX brig3

&& Открытие младшей базы области В

USE brig5 IN с INDEX brig5

&& Открытие другой младшей базы в С

*Установление связи одна-с-одной базы KADR.DBF с

*базами BRIG3.DBF, BROG5.DBF

SET RELATION TO tab INTO b, tab INTO с

* Установление связи одна-со-многими базы KADR.DBF с

SЕТ SKIP TO b,c

&& базами BRIG3.DBF и BRIG5.DBF

BROWSE FIELDS

a.fam :Н='Фамилия',;

 

a.tab :Н='Табель',;

23

 

b.tab :Н='Таб/БригЗ',;

 

b.vir :Н='Выр/БригЗ', ;

 

с. tab : Н=' Таб/Бриг5',;

 

с.vir : Н=' Выр/Брит'5 '

SET RELATION TO

&& Отмена всех связей

Порядок выполнения работы

1.В командном окне укажите рабочий каталог (Set default to ?).

2.Создайте проект.

3.Создайте базу данных в проекте (DataDatabases).

4.Нажмите правую кнопку мыши и выберите New Table, чтобы добавить таблицу в базу данных.

5.Во вкладке Fields: введите названия полей, тип, проиндексируйте необходимые поля, укажите заголовки полей на русском языке (Caption), значения по умолчанию (Default value).

6. Во вкладке Indexes установите первичный ключ для таблицы (Primary).

7. Во вкладке Table выполните проверку значений полей на уровне записи. Например, кличка животного не может быть пустым полем.

24

8. Свяжите таблицы от первичного ключа к индексу по внешнему ключу.

9. Установите ссылочную целостность.

Для этого встаньте правой кнопкой на связь и выберите Edit Referential Integrity.

При этом следует помнить, что операция Insert рассматривается с позиции дочерней таблицы, а Update и Delete - с позиции родительской.

25

10. Сделать локальные представления (для выполнения запросов, использующих данные из нескольких таблиц).

Для этого на свободном месте щелкните правой кнопкой мыши и выберите New local

view.

Добавьте необходимые таблицы и сформируйте локальное представление из необходимых полей.

26

Отфильтруйте данные с использованием вкладки Filter, сортировку выполните с использованием Order by.

Локальное представление может быть обновляемым (Update Criteria).

27

Установите в Send SQL updates и выберите Key fields only.

Дайте имя локальному представлению. 11. Заполните базу данных (7-10 записей).

Перед заполнением закройте все таблицы и локальные представления, выполнив команду Clear all.

Войдите в меню ToolsOptionsDataСвойства Buffering.

Установите в Multiple record locks и пессимистическую буферизацию (Record (Pessimistic)).

Для того чтобы вносились пустые значения в командном окне выполнить команду Set null on.

28

12. Создайте форму ввода с использованием мастера.

Вкладка DocumentsFormsNewFormWizard.

13.В командном окне связать таблицы между собой с использованием индексов.

14.Выполнить команду Browse с условиями отбора записей.

Контрольные вопросы:

1.Типы данных в VFP.

2.Сущность и назначение триггеров.

3.Установка ссылочной целостности в VFP.

4.Командыустановки в VFP.

5.Работа с константами в VFP.

6.Команды для открытия и закрытия базы данных.

7.Дополнение базы данных.

8.Команда Browse.

9.Перемещение по базе данных.

10.Контроль положения указателя и наличия записи.

11.Удаление данных.

12.Изменение данных.

13.Фильтрация данных.

14.Последовательный поиск, ускоренный поиск.

15.Типы индексов в VFP.

16.Виды индексных файлов, их преимущества и недостатки.

17.Установка активного индекса.

18.Понятие рабочей области, нумерация рабочих областей. Выбор рабочей области.

19.Работа с несколькими таблицами в VFP.

20.Для чего устанавливается пессимистическая буферизация на уровне записи при работе с таблицами в VFP?

21.Как указать заголовки полей и значение по умолчанию при создании таблиц в VFP?

22.Опция Null.

3.5 Лабораторная работа №5

Задание:

Разработать программу, автоматизирующую работу в предметной области, описанной

впервой лабораторной работе. В программе необходимо предусмотреть следующее:

удобный пользовательский интерфейс для ведения базы данных, разработанной в четвертой лабораторной работе;

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

29

способами: средствами Visual FoxPro, средствами Microsoft Office, в графическом виде (диаграммы);

корректную работу в сети2;

средства восстановления базы данных в случае сбоя.

Теоретический материал

Создание командных файлов

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

MODIFY COMMAND/FILE <имятекстовогофайла/маска> [NOEDIT]

[NOWAIT] [WINDOW <окно>]

Если используется вариант MODIFY COMMAND, по умолчанию вновь создаваемый файл считается командным (программным) файлом иему присваивается расширение PRG, если ононезаданоявно. Повторныйвызовкомандногофайлаосуществляетсятойжекомандой.

Созданная в редакторе программа запоминается в указанном в команде файле и может бытьвдальнейшемвызвананаисполнениекомандой

DO <имякомандногофайла>

РасширениеPRG указыватьнеобязательно.

Исполнение программы может быть прервано в любой момент нажатием клавиши Escape, есликомандой

SET ESCAPE ON/OFF

установлено ON (действует по умолчанию). В готовой программе эта возможность должнабытьподавленапараметромOFF.

Взаключениерассмотримоднуспецифическуюкомандукомандувыполнениявнешнихпо отношениюкFoxPro программ

!/RUN <программа>

РАБОТА С ПЕРЕМЕННЫМИ Эффективное программирование возможно только при наличии аппарата временных

переменныхимассивовпеременных.

ВFoxPro разрешается иметь переменные тех же типов (кроме мемо), что и поля. Однако символьные переменные допускают гораздо большую длину - до 64 Кбайт, а числовые - представление и с плавающей точкой. Переменным и массивам переменных даются имена по темжеправилам, чтоиполям.

Кроме обычных переменных в FoxPro введены так называемые системные переменные, которые являются резидентными и не могут быть уничтожены. Такие переменные имеют специальные имена, начинающиеся с символа "_". Системные переменные предназначены для запоминания некоторых установок среды FoxPro (в основном по управлению печатью). Из них мы рассмотримлишьнекоторые.

Командаприсваивания

Следующаякомандасоздаетпеременные иприсваиваетимзначения:

<переменная>=<выражение> или

STORE <выражение> ТО<именапеременных> Сохранениепеременных

2 Выполняется только студентами специальности «Комплексная защита объектов информатизации»

30