Лабораторная работа № 11. Работа с несколькими БД. Цель: Научиться работать с несколькими базами данных. В FoxPro можно обрабатывать сразу несколько баз данных. Каждый такой файл типа .DBF и все вспомагательные файлы (например, индексные) открываются в своей отдельной рабочей области.Переход из области в область осуществляется командой: SELECT <номер рабочей области/буквенное обозначение области> Псевдонимом области по умолчанию является само имя находящегося в ней файла базы данных.В качестве псевдонима можно указать и любое другое слово в команде USE. Использование псевдонима позволяет при работе с разными базами называть их одним именем (псевдонимом).Это делает программу независимой от имени конкретной базы. Область в которой мы находимся в данный момент, называется активной рабочей областью. Одновременно можно обратиться из активной рабочей области к полям других баз. В этом случае имя поля из неактивной области должно быть составным: <рабочая область>< псевдоним>< имя поля> или <рабочая область>< псевдоним>< имя поля> <Рабочая область> в составном имени может указываться буквой, именем её базы данных, псевдонимом, но не номером. Номер может быть указан в команде SELEKT и в функциях. Ни одно из полей записи базы данных KOLLEK.DBF не идентифицирует слушателя курсов вполне однозначно, т.е. могут быть совпадающие фамилии, специальности и т.п. Введём в структуру записи ещё одно поле – идентификационный номер слушателя(IDENT). Рассмотрим задачу организации отъезда слушателей по окончании курсов. База данных будет со держать информацию о заказанных билетах и выполненных заказах. Структура этой БД, назовём её ZAKAZ.DBF, следующая: Содержание и имя поля 1.Идентификатор (IDENT) 2.Дата заезда (DATAZ) 3.Дата выбытия (DATAV) Тип поля Размерность Numeric 5 Data 8 Data 8 Длина дробной Части 3 4.Вид транспорта (TRANS) 5.Наличие билета (YESNO) Character 5 Logical 1 Установим связь между БД вида одна-запись-с-одной.Для этого файл, с которым устанавливается связь, должен быть проиндексирован по общему полю-ключу. Формат команды: SET RELATION TO <ключ> INTO <область> [,<ключ> INTO<область>…] [ADDITIV] Пример.По идентификационному номеру слушателя найти его фамилию и информацию о наличии билета. В нашем случае поле-ключ –– это идентификационный номер слушателя.В основной базе-KOLLEK.DBF ищем по номеру фамилию. База, с которой устанавливается связь –– ZAKAZ.DBF. SELE A USE KOLLEK && открытие старшей базы в обл. А SELE B USE ZAKAZ && открытие младшей базы в обл. В INDEX ON IDENT TO ZAKAZ * установление связи одна-с- одной базы KOLLEK.DBF с базой ZAKAZ.DBF SELE A SET RELATION TO IDENT INTO B BROWSE FIELDS A.FAMIL:H = 'Фамилия ', A.IDENT : H = 'Номер ', B.IDENT :; H = 'Номер/Заказ ', B.YESNO : H = ' Взят билет',B.DATAV : H = 'Дата_отъезда ' SET RELATION TO && отмена всех связей В FoxPro можно устанавливать связи с несколькими базами одновременно. Если со старшим файлом, который уже связан с другим, необходимо связать некоторый третий (четвёртый и т. д.), следует во все последующие команды SET RELATION включать слово ADDITIVE , которое обеспечит сохранение связей, установленных ранее. Связь вида одна-запись-со-многими. Следующая команда устанавливает связь такого типа между двумя или несколькими базами данных: SET SKIP TO [<область1>[,<область2>]…] 4 При этом с каждой записью из старшей базы могут быть сцеплены несколько записей из младшей базы.Связь м.б. установлена сразу с несколькими младшими базами, находящимися в указанных областях. Прежде чем использовать команду SET SKIP, необходимо выполнить начальное сцепление вида одна-запись-с-одной командой SET RELATION. Для рассмотрения организации связи одной базы с несколькими по схеме одна-запись-со-многими, создадим ещё одну базу данных, которая будет содержать результаты тестирования слушателей курсов по трем различным направлениям, и поэтому в такой БД одному и тому же идентификационному номеру будет соответствовать несколько записей. Структура базы данных, назовём её TEST.DBF, следующая Имя поля Тип поля Размерность 1.Идентификат ор IDENT 2.Рез-ат теста TEST Numeric 5 Длина дробной части –– Numeric 3 –– Пример Требуется для заданного (введённого с клавиатуры) идентификационного номера и фамилии из базы данных KOLLEK.DBF предъявить результаты по всем трём тестам из базы TEST.DBF, которая проиндексирована по полю IDENT. SELE A USE KOLLEK.DBF INDEX ON IDENT TO KOLLEK SELE B USE TEST.DBF INDEX ON IDENT TO TEST SELE A SET RELATION TO IDENT INTO B && Установление связи одна-с-одной SET SKIP TO B && Установление связи одна-со-многими NOM=00000 @ 2,2 SAY "Введите нужный идентиф.номер" GET NOM READ SEEK NOM BROWSE FIELDS A.FAMIL:H='Фамилия', A.IDENT:H='Идентифик.', 5 B.TEST:H='Рез-ат 1-го теста', B.TEST:H='Рез-ат 2-го теста'.; B.TEST:H='Рез-ат 3-го теста' SET RELATION TO && Отмена всех связей Выполнить самостоятельно 1.Использовать БД Kadr.dbf и БД Sprav.dbf для расчёта почасовой оплаты труда работника, табельный номер которого и количество отработанных часов вводятся с клавиатуры.Запись БД Sprav.dbf содержит два поля – разряд (Razr) и тариф (Tarif), всего 16 записей (по числу разрядов).На экран вывести фамилию работника, рассчитанную зарплату и тарифную ставку. 2.Написать программу поиска по введённому табельному номеру сотрудника в БД Kadr.dbf и вывода из связанной с ней БД Adress.dbf информации об адресе, по которому проживает сотрудник. Контрольные вопросы. 1. Объясните понятие –– “Рабочая область”. 2. Какие связи могут быть установлены между файлами баз данных? 6