Информационные системы

Информационные системы

Электронный учебник

Лабораторная работа №3

 

 

Модификация структуры таблицы

 Visual FoxPro предоставляет средства для исправления ошибок:

·         Изменение наименования поля и / или его типа

·         Вставка пропущенного поля

·         Удаление ошибочно введенного поля

·         Изменение порядка следования полей в таблице

·         Переопределение полей

Для модификации структуры таблицы, входящей в базу данных, необходимо установить в окне проекта курсор на модифицируемую таблицу и нажать правую кнопку мыши. Из появившегося на экране контекстного меню выбрать команду Modify. В качестве альтернативного способа можно открыть окно конструктора базы  данных и воспользоваться кнопкой Modify Table панели инструментов «Database Designer». В результате на экране появится окно диалога  «Table Designer», содержащее структуру выбранной таблицы.

Для открытия окна конструктора базы данных и модификации таблиц созданной ранее базы данных можно воспользоваться командой  MODIFY DATABASE, которая имеет следующий синтаксис:

MODIFY DATABASE [ имяБазыДанных  |   ? ] [NOWAIT]  [NOEDIT]

Эта команда может быть использована в программе или в командном окне.

Изменение наименования поля и / или его типа. Установить курсор на наименование поля или тип, которые требуются изменить. Для удаления в имени поля неправильно введенных символов следует использовать клавишу  Backspace или Del. После этого необходимо ввести правильное имя поля.

Вставка и удаление поля. Если необходимо ввести поле в середине таблицы, нужно воспользоваться кнопкой Insert.  Для вставки поля, с помощью клавиш-стрелок необходимо установить курсор на строку, перед которой требуется вставить пропущенное поле, и нажать кнопку Insert. Курсор при этом может находиться в любом столбце. Visual FoxPro вставит пустую строку и присвоит полю имя NewFld. После этого можно ввести требуемое имя поля и его тип. Для удаления поля нужно установить с помощью клавиш-стрелок курсор на поле и нажать кнопку Delete.

Изменение порядка следования полей. Для изменения порядка следования полей в таблице, необходимо воспользоваться кнопкой, расположенной слева от наименования поля. Для этого следует установить курсор на поле, местоположение которого требуется изменить. На кнопке появится пиктограмма.  Необходимо установить курсор мыши на пиктограмму, нажать кнопку мыши и, удерживая ее в нажатом состоянии, перенести пиктограмму на нужное место.

Переопределение полей. Необходимо открыть конструктор таблиц, выделить нужное поле и увеличить его длину. Файл DBF при этом будет переписан, размер его увеличится, к символьным полям добавятся пробелы, а в числовых полях можно будет использовать больше знаков. Можно также увеличить длину индексных полей – Visual FoxPro автоматически перепишет индексные файлы при выходе из конструктора таблиц. Уменьшение размеров полей может вызвать потерю данных. Преобразование числового поля в символьное возможно всегда, если для получившейся строки отводятся достаточное число символов. Visual FoxPro просто переписывает таблицу, используя для нужного поля функцию STR(). Аналогично, преобразование символьных полей в числовые производится с помощью функции VAL() и возможно только в том случае, если строка начинается с цифры или пробелов, иначе получившееся числовое поле будут содержать нулевое значение.

 

Сортировка таблиц

Для изменения порядка следования записей в таблице используется команда SORT. Она использует текущую таблицу и создает новую, отсортированную по одному полю или комбинации полей. Например:

 SORT TO Custsort ON cLastNane

 создает новую таблицу Custsort , отсортированную по полю cLastNane  – фамилия покупателя. Сортировка полезна, если используется только одна сравнительно редко изменяемая копия таблицы. В других случаях предпочтительнее использовать индексацию. Поскольку одна таблица может иметь несколько индексов, для разных целей можно использовать различные индексы.

  Индексы

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

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

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

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

Для того чтобы создать индекс, необходимо выбрать таблицу, открыть для нее окно конструктора таблиц «Table Designer» и выбрать вкладку «Indexes» (рис. 1). Каждый индекс в Visual FoxPro имеет имя, на которое в дальнейшем можно ссылаться при упорядочении отображения данных в соответствии с данным индексом. Имя индекса содержится в поле Name. С левой стороны имени индекса располагается переключатель, определяющий порядок упорядочивания значений индексного выражения. Для установки одного из возможных вариантов используется клавиша Spacebar.

 

    Кнопка    

Назначение

   

Индекс, в котором значения упорядочены по возрастанию

   

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

                       Рис. 1 Вкладка «Indexes» конструктора таблицы для создания индекса

 Список Type  используется для установки типа создаваемого индекса. Описание значений данного списка  представлено в табл. 1

 Табл. 1. Типы создаваемых индексов

Тип индекса

Описание

Regular

Хранятся значения индексного выражения для  всех записей таблицы. Если несколько записей имеют одинаковое значение индексного выражения, то каждое значение хранится отдельно и содержит ссылку на связанную с ней запись

Unique

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

Candidate

Создается уникальный индекс, который не содержит полей с пустыми значениями. Этот индекс обладает всеми качествами первичного ключа и не является им только по той причине, что таблица не может содержать более одного первичного ключа

Primary

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

 

 Можно ввести имя индексного выражения непосредственно в поле ввода Expression или же выбрать кнопку, расположенную правее поля ввода, для формирования выражения используя окно диалога «Expression Builder» (Конструктор выражений), представленное на рис. 2.

 


                                  Рис.2. окно диалога «Expression Builder»

 

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

STR (icdCustomer) + DTOC (dDoc)

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

В зависимости от способа хранения в Visual FoxPro различают одинарные и составные индексы. Каждый одинарный индекс хранится в отдельном файле. Все составные индексы хранятся в одном файле.

В качестве индексных полей не могут быть использованы поля типа Memo и General.

 

Определение отношений между таблицами

 

 В Visual FoxPro можно устанавливать постоянные отношения между таблицами, которые будут поддерживаться при создании форм, отчетов и запросов. При определении отношений одна из таблиц является родительской, а другая – дочерней. Для родительской таблицы должен быть определен первичный ключ или ключ – кандидат, а для дочерней – индекс для связи с родительской таблицей. Например, при задании отношений между таблицами Customer и Ordsale, для таблицы Customer определен первичный ключ, а таблица Ordsale содержит индекс, не являющийся уникальным, индексное выражение которого состоит из кода покупателя, по которому осуществляется связь между таблицами. 

Для определения отношений между таблицами необходимо открыть окно конструктора базы данных и выполнить следующие действия:

1.       Выбрать родительскую таблицу.

2.       Установить курсор мыши на первичный ключ таблицы.

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

4.       Отпустить кнопку мыши. В окне конструктора базы данных между таблицами появиться линия (рис.3), отображающая отношение между таблицами.

 


                                          Рис. 3 Отображение связей между таблицами

 

5.  Для изменения отношения между таблицами нужно установить курсор мыши на линию, соединяющую таблицы, и дважды нажать курсор мыши. На экране откроется окно диалога «Edit Relationship» (рис. 4), в котором слева приведены наименование и раскрывающийся список индексов родительской таблицы, а справа аналогичная информация о дочерней таблицы. В этом же окне диалога приведен тип отношений между таблицами. Для сохранения отношения следует нажать кнопку ОК, а для отказа – кнопку Cancel.

   


                                                     Рис. 4 Окно диалога «Edit Relationship»

 

 Для удаления установленного отношения между таблицами нужно установить курсор на линию, соединяющую связываемые таблицы, и нажать правую кнопку мыши. Линия при этом увеличится в толщине и на экране появиться контекстное меню. Необходимо выберать из этого меню команду Remove Relationship и описание отношения будет удалено из словаря базы данных.  

 

Определение условий целостности данных

Установленные отношения между таблицами могут быть использованы для задания условий целостности данных. Целостность данных является одним из самых важных требований, предъявляемых к базам данных. В качестве примера нарушения целостности данных предположим, что в таблице заказов  Ordsale из базы данных магазина оптовой торговли содержаться коды покупателей, которые отсутствуют в таблице  Customer, содержащей список покупателей. В этом случае нельзя определить, кому был отпущен товар.

Проверка целостности данных может осуществляться программными средствами. Например, при добавлении в таблицу Ordsale кода  покупателя можно проверить, имеется ли указанный покупатель в таблице Customer. Однако более правильным является определение условия целостности данных на уровне базы данных, так как в этом случае ни одно приложение не может нарушить целостность данных.

Для определения условия целостности данных в окне конструктора базы данных следует выбрать команду контекстного меню  Referential Integrity или нажать соответствующую ей кнопку панели инструментов «Database Designer». В результате откроется окно конструктора условий целостности данных «Referential Integrity Builder» (рис. 5), которое содержит перечень всех установленных отношений между таблицами.  Таблица описания условий содержит наименования родительской и дочерней таблиц, наименования индексов, используемых для связи, а также типы действий, выполняемых при модификации данных, добавлении и удалении записей.

 


Рис. 5 Окно диалога «Referential Integrity Builder» для определения условий целостности данных

В верхней части окна диалога отображаются три переключателя, предназначенные для установки типа выполняемого действия. Также можно выбрать тип действия из раскрывающегося списка непосредственно в полях Update, Delete и  Insert.

При изменении значения первичного ключа или  ключа-кандидата в родительской таблице возможны следующие варианты  действий:

Наименование

Описание

Cascade

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

Restrict

Не позволяет изменять значения полей первичного ключа или ключа-кандидата в родительской таблице, если в дочерней таблице имеется хотя бы одна запись, содержащая ссылку на изменяемую запись. Данное правило можно применить к отношению между таблицами Customer и Ordsale, если в созданном приложении коды покупателя определяются на этапе ввода нового покупателя и в дальнейшем не редактируются

Ignore

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

 

При удалении записи в родительской таблице возможны следующие варианты действий:

Наименование

Описание

Cascade

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

Restrict

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

Ignore

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

          При  добавлении новой записи в дочернюю таблицу или редактировании в ней существующей записи возможны следующие варианты действий:

Наименование

Описание

Restrict

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

Ignore

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

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

Задание.

1.       Откройте проект Sales.

2.       Добавьте в таблицу Ordsale поле icdOrder (код заказа) типа Integer.

3.       В таблице Customer создайте первичный индекс, выбрав в качестве индексного выражения значение поля icdCustomer.

4.       Для таблицы Ordsale создайте первичный индекс по полю icdOrder.

5.       Создайте простой индекс, который будет упорядочивать таблицу Ordsale по коду покупателя.

6.       Создайте составной индекс, упорядочивающий таблицу Ordsale по коду заказа, а внутри заказа – по коду товара. При создании составного индекса все входящие в индексное выражение поля должны быть преобразованы в текстовый вид. Поэтому следует воспользоваться функцией Visual FoxPro STR(), которая преобразует число в текстовую строку. При использовании нескольких полей, в индексном выражении необходимо использовать знак +. Например: STR(icdCustomer)+STR(icdOrder)

7.       Установите отношение между таблицами по коду покупателя.

8.       Укажите для таблиц критерии соблюдения целостности.

9.       Просмотрите и отметьте изменения, произведенные системой, после установки соблюдения целостности данных. Что изменилось в базе данных? Что изменилось в таблицах?

10.    Удалите из базы данных таблицу Ordsale.

11.    Создайте  несколько новых таблиц со следующими структурами:

Таблица PHONCUST, содержащая в себе информацию о телефонах заказчика.

№ поля

Наименование

Тип

Описание

1

icdCustomer

Integer

Код покупателя

2

cPhone

Character(10)

Телефон покупателя

Первичный ключ (icdCustomer, cPhone).

Таблица ORDSALEM, содержащая информацию о дате и менеджере заказа.

№ поля

Наименование

Тип

Описание

1

icdOrder

Integer

Номер заказа

2

icdCustomer

Integer

Код покупателя

3

dOrderDate

Date

Дата заказа

4

icdManager

Integer

Код менеджера, продавшего товар

Первичный ключ (icdOrder).

Таблица MANAGER, включающая информацию о менеджерах.

№ поля

Наименование

Тип

Описание

1

icdManager

Integer

Код менеджера

2

cnmManager

Character(40)

Имя менеджера

Первичный ключ (icdManager).

Таблица ORDSALED, содержащая информацию о товаре и его количестве.

№ поля

Наименование

Тип

Описание

1

icdOrder

Integer

Номер заказа

2

icdGoods

Integer

Код товара

3

nOrderQuant

Numeric(10)

Заказанное количество товара

4

mOrderNotes

Memo

Примечание к заказу

Первичный ключ (icdOrder, icdGoods).

Таблица GOODS, хранящая информацию о товарах.

№ поля

Наименование

Тип

Описание

1

icdGoods

Integer

Код товара

2

cnmGoods

Character(60)

Наименование товара

3

cnmGoodsGrp

Character(40)

Группа товара

4

nUnitPrice

Numeric(10.2)

Цена

Первичный ключ (icdGoods).

12.    Для каждой таблицы создайте первичные индексы.

13.    Создайте необходимые дополнительные индексы и установите связи между таблицами. Обратите внимание! В приведенной структуре допущена одна логическая ошибка. Вам необходимо найти ее, обосновать ваше утверждение и исправить ошибочную связь.

 14.    Установите для таблиц обеспечение целостности данных, выбрав для вставки записей значение Ignore.

15.    Внесите в каждую таблицу необходимые данные, таким образом, чтобы было зарегистрировано не менее 5 заказчиков, каждый из которых сделал не менее 2-х заказов из 4 изделий. Количество менеджеров должно превышать половину количества заказчиков. В справочнике изделий должны быть изделия, не вошедшие ни в один заказ.

16.    Закройте проект и выйдите из Visual FoxPro.