Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопрос 13-18.docx
Скачиваний:
4
Добавлен:
01.05.2025
Размер:
157.89 Кб
Скачать

Вопрос 14

Вычисляемые поля. Примеры использования, создание вычисляемых полей в приложении Delphi.

Вычисляемые поля

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

procedure TForml.TablelCalcFields(DataSet: TDataSet)

; begin

with Tablel do

TabielCalcFieldl.Value := Fields[0].Value + Fields[1].Value;

 with Queryl do 

begin

Params[0].AsInteger := Tablel.Fields[0].Aslnteger;

 Open;

TabielCalcFieldl.Value := Fields[0].AsString; 

Close;

 end;

 end;

Метод OnCalcFields выполняется при открытии набора данных, при переходе в режим редактирования, при передаче фокуса между компонентами отображения данных или колонок сетки, при удалении записи. Но для этого нужно, чтобы свойство AutoCaicFields набора данных было равно значению True.

Примечание

Необходимо учитывать, что сложные вычисляемые поля могут существенно замедлить работу набора данных (особенно при использовании при этом запросов SQL). Кроме того, в процессе редактирования набора данных (при изменении значения поля, сохранении изменений и переходе на следующую запись) вычисляемые поля рассчитываются несколько раз подряд. Для уменьшения числа автоматических обращений к методу OnCalcFields нужно использовать свойство AutoCaicFieids := False.

Для создания вычисляемого поля достаточно в диалоге создания нового поля Редактора полей в качестве типа поля задать "вычисляемое", в остальном процесс совпадает с созданием поля данных.

В выражениях вычисляемых полей можно использовать другие вычисляемые поля, но они обязательно должны быть определены в методе OnCalcFields до этого.

Вычисляемые поля нельзя использовать при фильтрации набора данных при помощи метода-обработчика onFilterRecord, т. к. он вызывается до метода-обработчика OnCalcFields, а вычисляемые поля не сохраняются.

Внутренние вычисляемые поля

Помимо простых вычисляемых полей существуют внутренние вычисляемые поля (FieidKind = fkinternaicaic). Они используются в клиентских наборах данных (компоненты TCiientDataSet) и отличаются тем, что их значения сохраняются в наборе данных.

Внутренние вычисляемые поля могут быть использованы для фильтрации методом - обработчиком OnFilterRecord

Вопрос 15

Типы связей между таблицами. Установка связей между таблицами в приложениях Delphi . Необходимость связывания таблиц, примеры.

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

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

Между таблицами можно установить связи одного из трех видов: один-ко-многим (one-to-many), многие-ко-многим (many-to-many) и один-к-одному (one-to-one).

  • Один-ко-многим (one-to-many). Является наиболее часто употребляемым видом связи. В этом случае каждой записи таблицы А может соответствовать много записей таблицы Б (или ни одной). В свою очередь, каждой записи таблицы Б соответствует в точности одна запись таблицы А. Таблица А в такой связи называется главной, а таблица Б — связанной илиподчиненной.

  • Многие-ко-многим (many-to-many). Многим записям из таблицы А может соответствовать много записей из таблицы Б (и наоборот). Такую связь в Microsoft Access можно организовать при помощи третьей вспомогательной таблицы, в которой каждому первичному ключу из таблицы А сопоставлен первичный ключ из таблицы Б. Такой тип связи используется реже, но существуют ситуации, когда без нее не обойтись. В учебной базе данных Борей (Northwind) примером связи многие-ко-многим (many-to-many) является связь между таблицами Заказы (Orders) и Товары (Products), организованная при помощи таблицы Заказано (Order Details).

  • Один-к-одному (one-to-one). Одной записи таблицы А соответствует в точности одна запись таблицы Б и наоборот. Этот тип связи практически никогда не применяется. Для любого из перечисленных выше типов связей существует три способа объединения. Установленный тип объединения влияет на результаты выборки данных из связанных таблиц.

  • Внутреннее объединение (Inner Join). Объединяются только те записи из таблиц, связанные поля которых совпадают. Остальные записи в итоговую выборку не попадут. Например, таблицы Товары (Products) и Типы (Categories) связаны между собой по полям КодКатегории (CategoryW). При выборке записей из этих таблиц в итоговую выборку попадут только те записи из таблицы Типы (Categories), ссылка на которые есть в таблице Товары (Products). Этот тип объединения используется в подавляющем большинстве случаев.

  • Левое внешнее объединение (Left Join). Объединяются все записи таблицы со стороны один (one) и только те записи таблицы со стороны многие (many), значения связанного поля которых совпадают со значениями соответствующего поля первой таблицы. Попросту говоря, к результатам выборки по внутреннему объединению добавятся все записи из таблицы со стороны один (one), первоначально в нее не вошедшие. Соответствующие поля этих записей второй таблицы в выборке будут иметь пустое (Null) значение.

  • Правое внешнее объединение (Right Join). Аналогично левому внешнему объединению, но таблицы со стороны один (one) и со стороны многие (many) меняются ролями, т.е. к результатам выборки по внутреннему объединению добавятся не вошедшие в нее записи из таблицы со стороны многие (many).

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

Постоянные связи между таблицами устанавливаются в диалоговом окне Схема данных (Relationships). Доступ к этому окну можно получить, выбрав одноименный пункт в меню Сервис(Tools) (см. рис. 3.20). Прежде чем приступить к установлению связей, необходимо закрыть все открытые таблицы. Это нужно сделать для того, чтобы можно было задать обеспечение целостности данных — для открытых таблиц этого сделать не удастся.

Рисунок 3.20. Диалоговое окно Схема данных (Relationships).

Прежде всего, нужно добавить в диалоговое окно Схема данных (Relationships) те таблицы, между которыми предполагается установить связь. Для этого можно выбрать пункт Отобразить таблицу (Show Table) меню Связи (Relationships) или щелкнуть на соответствующей кнопке панели инструментов ( ). В появившемся окне нужно дважды щелкнуть на именах связываемых таблиц и закрыть окно. Можно также, используя клавиши <Shift> и <Ctrl>, выделить мышью несколько таблиц и нажать кнопку Добавить (Add). Для того чтобы установить связь между полями, необходимо перетащить мышью поле из одной таблицы на соответствующее поле другой таблицы. На экране появится диалоговое окно Изменение связей (Edit Relationships) (см. рис. 3.21).

Рисунок 3.21. При помощи диалогового окна Изменение связей (Edit Relationships)  можно задать свойства выбранной связи.

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

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

Флажок Обеспечение целостности данных (Enforce Referential Integrity). Целостностью данных или ссылочной целостностью (Referential Integrity) называют набор правил, которые Microsoft Access использует для поддержания допустимых межтабличных связей и запрета на случайное изменение или удаление связанных данных. Этот флажок можно устанавливать при выполнении всех следующих условий: связываемое поле из главной таблицы является полем первичного ключа или имеет уникальный индекс; связанные поля имеют один и тот же (или совместимый) тип данных; обе таблицы содержатся в одной и той же базе данных Microsoft Access. Снимите этот флажок, чтобы допустить изменения в связанных таблицах, которые приводят к нарушению условий целостности данных.

Флажок Каскадное обновление связанных полей (Cascade Update Related Fields). Установите этот флажок для того, чтобы Microsoft Access автоматически обновлял соответствующие значения в связанной таблице при любом изменении значения первичного ключа в главной таблице. Для предотвращения изменений значения первичного ключа в главной таблице, если существуют соответствующие записи в связанной таблице, нужно установить флажок Обеспечение целостности данных (Enforce Referential Integrity) и снять флажок Каскадное обновление связанных полей(Cascade Update Related Fields).

Флажок Каскадное удаление связанных записей (Cascade Delete Related Records). Флажок нужно установить для автоматического удаления связанных записей в связанной таблице при удалении записи в главной таблице. Для предотвращения удаления записей из главной таблицы, если имеются соответствующие записи в связанной таблице, нужно установить флажокОбеспечение целостности данных (Enforce Referential Integrity) и снять флажок Каскадное удаление связанных записей (Cascade Delete Related Records).

Для того чтобы определить способ объединения связываемых таблиц, нажмите кнопку Объединение (Join Type). На экране появится диалоговое окно Параметры объединения (Join Properties) (см. рис. 3.22). Здесь можно выбрать подходящий вариант объединения (различные способы объединения (внешние и внутренние) были описаны чуть выше).

Рисунок 3.22. Диалоговое окно Параметры объединения (Join Properties).

Если флажок Каскадное удаление связанных записей (Cascade Delete Related Records) установлен, любое удаление записи в главной таблице приведет к автоматическому удалению связанных записей во всех подчиненных таблицах. Например, при удалении из таблицы Клиенты (Customers) записи о конкретном клиенте будут автоматически удалены все связанные с ним записи из таблицы Заказы (Orders) и, как следствие, соответствующие записи из таблицы Заказано (Orders Details). При этом, если записи удаляются при помощи запроса на удаление, Microsoft Access даже не выдает предупреждающего сообщения.