Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пример ПЗ по БД.docx
Скачиваний:
3
Добавлен:
03.03.2016
Размер:
1.79 Mб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА ПРИКЛАДНОЙ МАТЕМАТИКИ И ИНФОРМАТИКИ

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту

по дисциплине «Программирование систем с серверами баз данных»

по теме «Пароходства Украины»

Разработал

ст.гр. ІПЗ-12а

А.К. Комаров

_______________ ____________

(дата) (подпись)

Руководитель

проф. Е.А. Башков

_______________ ____________

(дата) (подпись)

КРАСНОАРМЕЙСК – 2015

РЕФЕРАТ

Пояснительная записка к курсовой работе содержит 101 стр., 5 прил., 35 рисунков, 9 таблиц.

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

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

Реализованы запросы, которые дают возможность получать разнообразную информацию по базе данных. В качестве инструментария разработки клиент-серверного приложения были использованы среда разработки Delphi 7 и СУБД Interbase.

ПАРОХОДСТВА, ПЕРЕВОЗКИ, СУДНА, ПОРТЫ, ГОРОДА, СУБД, БАЗА ДАННЫХ, РЕЛЯЦИОННАЯ МОДЕЛЬ ДАННЫХ, DELPHI 7, INTERBASE.

Содержание

ВВЕДЕНИЕ 3

1.КОМПОНЕНТЫ СРЕДЫ DELPHI 7 ДЛЯ РАБОТЫ С БД 3

1.1.Невизуальные компоненты Delphi: 3

1.2. Визуальные компоненты Delphi 16

1.3. Создание простых клиентских приложений с использованием базовых компонентов Delphi для работы c базами данных. 20

2.СОЗДАНИЕ БАЗЫ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ СУБД INTERBASE 30

2.1.Проектирование схемы БД 30

2.2. Создание таблиц, доменов, индексов. 34

Синтаксис команды CREATE TABLE 37

2.3. Разработка триггеров 39

2.4. Заполнение записями таблиц баз данных 43

2.5.Создание видов 48

3.Разработка клиентского приложения в среде Delphi 7 50

3.1. Формы и компоненты для работы с основными таблицами 51

3.2. Формы и компоненты для работы со справочниками 53

3.3.Формы и компоненты для отображения результатов запросов 54

ЗАКЛЮЧЕНИЕ 56

ПРИЛОЖЕНИЕ А. ТЕХНИЧЕСКОЕ ЗАДАНИЕ 57

ПРИЛОЖЕНИЕ Б. ЛИСТИНГ ПРИМЕРОВ (ЯЗЫК DELPHI) 59

Б1. Пример №1 60

Б2. Пример №2 64

ПРИЛОЖЕНИЕ В. ЛИСТИНГ СЕРВЕРНОЙ ЧАСТИ (ЯЗЫК SQL) 72

ПРИЛОЖЕНИЕ Д. ЛИСТИНГ КЛИЕНТСКОЙ ЧАСТИ (ЯЗЫК DELPHI)] 89

ПРИЛОЖЕНИЕ Е. РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ 95

Введение

Предпосылкой создания базы данных являлось огромное количество накопленной информации, которую необходимо было хранить в памяти компьютера и обрабатывать наиболее удобным способом. Исторически сложилось так, что СУБД берет свое начало с середины 60-х годов, когда компания IBM совместно с фирмой North American Aviation (NAA) разработали первую СУБД – иерархическую систему Information Management System.

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

Учитывая современное развитие технологий, все вышеперечисленные проблемы может разрешить информационная система, а именно СУБД. Это доказывает незаменимость баз данных в вопросах, касающихся сбора и накопления информации.

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

  1. КОМПОНЕНТЫ СРЕДЫ DELPHI 7 ДЛЯ РАБОТЫ С БД

    1. Невизуальные компоненты Delphi:

      1. Класс TDataSet

Класс TDataSet является базовым для TTable, TQuery И TStoredProc. Многие свойства, методы и события, используемые указанными классами, на самом деле определены в TDataSet. Из-за наследования производными классами большого количества элементов TDataSet, я сначала перечислю основные свойства, методы и события TDataSet, а затем перейду к свойствам, методам и событиям, специфическим для каждого производного класса.

Наиболее часто используемые свойства, методы и события класса TDataSet приведены в таблицах 1.1, 1.2 и 1.3.

Таблица 1.1. Основные свойства TDataSet

Свойство

Описание

Active

Открывает (True) и закрывает (False) набор данных

AutoCalcFields

Определяет способ вычислений с использованием полей

Bof

Возвращает True, если курсор находится на первой записи базы данных, и False в противном случае

CachedUpdates

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

 

CanModify

Определяет, может ли пользователь редактировать данные

DataSource

Имя компонента DataSource, связанного с набором данных

DatabaseName

Имя базы данных, используемой в настоящий момент

Eof

Возвращает True, если курсор находится на конце файла, и False в противном случае

FieldCount

Количество полей в наборе данных Поскольку набор данных может быть динамическим (например, результат запроса), количество полей может варьироваться от запроса к запросу

Fields

Массив объектов TFields, которые содержат информацию о полях базы данных

FieldValues

Возвращает значение указанного поля текущей записи Значение имеет тип Variant

Filter

Выражение, используемое для фильтрации записей

Filtered

Если установлено значение True, фильтрация набора данных осуществляется в зависимости от свойства Filter или события OnFilter-Record В противном случае возвращается весь набор данных

FilterOptions

Управляет работой фильтров

Found

Показывает, была ли успешной операция поиска

Handle

Дескриптор курсора BDE Используется только при прямых обращениях к BDE

Modified

Показывает, была ли текущая запись изменена

RecNo

Номер текущей записи в наборе данных

RecordCount

Возвращает количество записей в наборе данных

State

Возвращает текущее состояние набора данных (dsEdit, dsBrowse, dslnsert и т д )

UpdateOb^ect

Указывает компонент TUpdateOb^ect, используемый для кэшируе-мых изменений

Updates Pending

Значение True указывает, что буфер кэшируемых изменений содержит данные, не сохраненные в базе данных

Таблица 1.2. Основные методы TDataSet

Метод

Описание

Append

Создает пустую запись и добавляет ее в конец набора данных

AppendRecord

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

ApplyUpdates

Указывает базе данных на необходимость сохранения всех кэширован-ных изменений Реальное обновление базы данных не происходит до вызова метода CommitUpdates

Cancel

Отменяет все изменения в текущей записи, если они еще не были сохранены

CancelUpdates

Отменяет отложенные изменения, занесенные в кэш

ClearFields

Очищает все поля текущей записи

CommitUpdates

Сохраняет в базе данных все изменения и очищает буфер кэшируемых изменений

Close

Закрывает набор данных

Delete

Удаляет текущую запись

DisableControls

Запрещает ввод из всех компонентов, связанных с набором данных

Edit

Разрешает редактирование текущей записи

EnableControls

Разрешает ввод из всех компонентов, связанных с набором данных

FetchAll

Считывает и локально сохраняет все записи от курсора до конца набора данных

FieldByName

Возвращает указатель TField по заданному имени поля

FindFirst

Осуществляет поиск первой записи, удовлетворяющей текущему критерию фильтрации

PindNext

Осуществляет поиск следующей записи, удовлетворяющей текущему критерию фильтрации

FindLast

Осуществляет поиск последней записи, удовлетворяющей текущему критерию фильтрации

FindNext

Осуществляет поиск предыдущей записи, удовлетворяющей текущему критерию фильтрации

First

Перемещает курсор на первую запись набора данных

FreeBookmark

Удаляет закладку, установленную с помощью GetBookmark, и освобождает память, выделенную для закладки

GetBookmark

Устанавливает закладку на текущей записи

GetFieldNames

Возвращает список имен полей набора данных

GotoBookmark

Устанавливает курсор на запись, отмеченную закладкой

Insert

Вставляет запись и переводит набор данных в режим редактирования

InsertRecord

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

Last

Устанавливает курсор на последнюю запись набора данных

Locate

Осуществляет поиск записи в наборе данных

Lookup

Осуществляет поиск записи в наборе данных самым быстрым методом и возвращает значения ее полей

MoveBy

Перемещает курсор на заданное количество строк

Next

Перемещает курсор на следующую запись

Open

Открывает набор данных

Post

Записывает измененную запись в базу данных или в буфер кэшируемых изменений

Prior

Перемещает курсор на предыдущую запись

Refresh

Обновляет набор данных

RevertRecord

При использовании кэширования этот метод отменяет все ранее сделанные изменения, еще не сохраненные в базе данных

SetFields

Устанавливает значения для всех полей записи

UpdateStatus

При использовании кэширования возвращает текущий статус изменений

Таблица 1.3. Основные события TDataSet

Событие

Описание

AfterCancel

Генерируется после отмены редактирования записи

AfterClose

Генерируется при закрытии набора данных

AfterDelete

Генерируется после удаления записи из набора данных

AfterEdit

Генерируется после редактирования записи

Afterlnsert

Генерируется после вставки записи

AfterOpen

Генерируется после открытия набора данных

AfterPost

Генерируется после отправления изменений в базу данных или кэш

BeforeCancel

Генерируется перед отменой редактирования

BeforeClose

Генерируется перед закрытием набора данных

BeforeDelete

Генерируется перед удалением записи

BeforeEdit

Генерируется перед переходом набора данных в режим редактирования

Beforelnsert

Генерируется перед вставкой записи

BeforeOpen

Генерируется непосредственно перед открытием набора данных (между установкой Active в True и действительным открытием)

BeforePost

Генерируется перед тем, как изменения будут отправлены в базу данных (или кэш изменений)

OnCalcField

Генерируется при выполнении вычислений с использованием полей

OnDeleteError

Генерируется при ошибке удаления записи

OnEditError

Генерируется при ошибке редактирования записи

OnFilterRecord

Генерируется при доступе к новой записи, если для свойства Field установлено значение True

OnNewRecord

Генерируется при добавлении новой записи к набору данных

OnPostError

Генерируется при ошибке сохранения изменений

OnUpdateError

Генерируется при ошибке во время сохранения кэшированных изменений в базе данных

      1. Компонент TTable

Компонент Table, представленный классом TTable, обеспечивает самый быстрый и простой доступ к таблице. Использования таблиц более чем достаточно для большинства приложений, работающих с одноярусными базами данных. Обычно вы будете использовать компонент Table для локальных баз данных, а компонент Query — для работы с SQL-серверами.

Класс TTable имеет большое количество дополнительных свойств и методов по сравнению со своим предком, TDataSet. В таблице 1.4 перечислены важнейшие свойства компонента ТТаblе, а в таблице 1.5 — методы. Помните, что это свойства и методы, специфичные для ТТаblе; в их число не входят те, которые этот класс наследует от TDataSet.

По большей части смысл свойств и методов ТТаblе интуитивно понятен. Иными словами, вам достаточно взглянуть на имя свойства или метода, чтобы определить его назначение. Не требуется затрачивать больших умственных усилий, чтобы понять, что метод LockTable блокирует таблицу, используемую в приложении, а метод UnLockTable снова ее разблокирует. Точно так же, вам не обязательно иметь IQ в 150 единиц, чтобы догадаться о назначении методов CreateTable, DeleteTable И RenameTable. По этой Причине я не собираюсь подробно рассматривать все свойства и методы, перечисленные здесь. Вместо этого давайте остановимся на некоторых более интересных аспектах компонента Table.

Таблица 1.4. Основные свойства ТТаblе

Свойство

Описание

Exclusive

Блокирует локальную таблицу, позволяя использовать ее только данному приложению

IndexDefs

Содержит информацию об индексах таблицы

IndexFieldCount

Число полей, составляющих текущий ключ

IndexFieldNames

Используется для установки текущего ключа путем спецификации имен полей для индекса

IndexFields

Используется для извлечения информации конкретного поля в индексе

IndexName

Используется для указания вторичного индекса для таблицы

KeyFieldCount

Число полей, используемых при поиске по частичному ключу

MasterFields

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

MasterSource

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

Readonly

Определяет, должна ли таблица использоваться только для чтения

TableName

Имя таблицы базы данных

TableType

Тип таблицы (Paradox, dBase или ASCII)

Таблица 1.5. Основные методы ТТаblе

Метод

Описание

Addlndex

Создает новый индекс таблицы

ApplyRange

Применяет к набору данных заданный диапазон Для просмотра или редактирования будут доступны только записи, попадающие в этот диапазон (определяемый с помощью SetRangeStart и SetRangeEnd)

BatchMove

Перемещает данные из набора данных в таблицу

CancelRange

Отменяет все диапазоны, действующие в таблице на данный момент

CreateTable

Заново создает таблицу, используя новую информацию

Deletelndex

Удаляет вторичный индекс

DeleteTable

Удаляет таблицу

EmptyTable

Удаляет из таблицы все данные

GetIndexNames

Возвращает список всех индексов таблицы

GotoKey

Перемещает курсор на запись, указываемую текущим ключом

GotoNearest

Перемещает курсор на запись, наиболее близко соответствующую текущему ключу

LockTable

Блокирует таблицу, запрещая доступ к ней другим приложениям

RenameTable

Переименовывает таблицу

"SetKey

Позволяет вам устанавливать ключи для набора данных

SetRange

Устанавливает начало и конец диапазона, после чего применяет его к таблице Результат вызова SetRange эквивалентен вызовам SetRangeStart, SetRangeEnd и ApplyRange

SetRangeEnd

Устанавливает конец диапазона

SetRangeStart

Устанавливает начало диапазона

UnlockTable

Разблокирует таблицу, блокированную методом LockTable

      1. Компонент TQuery

Использование компонента Query является предпочтительным способом доступа к базам данных клиент/сервер. В этом разделе описаны основные свойства и методы класса TQuery.

Компонент Query, в отличие от компонента Table, не имеет свойства TableName Это означает, что во время проектирования вы не можете увидеть список таблиц текущей базы данных Для просмотра списка таблиц можно сделать одно из двух Во-первых, можно временно поместить на форму компонент Table и установить его свойство DatabaseMame, после чего список свойства TableName будет содержать доступные таблицы Во-вторых, можно выделить компонент Query на форме, щелкнуть на нем правой кнопкой мыши и выбрать в контекстном меню пункт Explore Вы окажетесь либо в SQL Explorer (версия Client/Server), либо в администраторе BDE (версии Standard и Professional) Для просмотра таблиц базы данных можно использовав любой из этих инструментов

      1. Компонент TField

Класс TField представляет поле (столбец) базы данных. Через этот класс вы можете установить атрибуты поля. К атрибутам поля относятся тип данных (строковый, целый, с плавающей точкой и т. д.), размер поля, индекс, используется ли это поле в вычислениях и т. п. Вы можете получить или установить значение поля через свойства AsString, AsVariant И AsInteger.

TField является базовым классом для специализированных классов полей. К потомкам TField относятся TStringField, TIntegerField, TSmallIn-tField, TWordField, TFloatField, TCurrencyField, TBCDField, TBooleanFi-eld, TDateTimeField, TDateField, TBIobField, TBytesField, TVarBytesFi-eld, TMemoField и TGraphicField. Эти производные классы расширяют базовый класс, добавляя новые функциональные возможности. Например, классы числовых полей имеют свойство DisplayFormat, которое определяет способ отображения чисел, а также свойство EditFormat, которое определяет вид чисел во время редактирования. Каждый потомок TField соответствует определенному типу поля базы данных. Класс TIntegerField используется для полей целого типа, класс TTimeField — для полей, содержащих дату или время (или дату/время), класс TBIobField — для полей, содержащих большие двоичные объекты, и т. д.

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

Доступ к полям

Чтобы получить или установить значение поля, необходимо иметь к нему доступ. Это можно сделать по крайней мере тремя способами:

    • По имени указателя

    • Через свойство Fields класса TDataSet

    • Через метод FieldByName класса TDataSet

Доступ к полю по имени указателя используется, по-видимому, реже всего. Он работает только в том случае, если вы предварительно добавили поля к проекту с помощью редактора полей. Когда вы добавляете поля через редактор полей, Delphi создает для каждого поля указатель, имя которого составляется из имени таблицы и имени поля. Если у вас есть таблица Table! и строковое поле FirstName, указатель на объект TStringField получит имя TablelFirstName. Вы можете использовать этот указатель для доступа к полю:

Table1.FirstName.Value := 'Per';

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

Свойство Fields предлагает другой способ доступа к полю — по его положению в таблице. Если вы знаете, что поле LastName стоит в таблице первым, можно сделать примерно следующее:

Edit1.Text := Table1.Fields[0].Value;

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

Из трех способов доступа к полям наиболее распространенным и надежным является использование метода FieldByName. Для доступа к полю через FieldByName вы должны знать только имя этого поля:

Table1.FieldByName('LastName').AsString := Edit1.Text;

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

var

Field : TField;

begin

Field := Table1.FieldByName('LastName');

Field.AsString := Edit1.Text;

end;

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

Извлечение и установка значений полей

После получения указателя на конкретное поле вы можете изменять его значение с помощью свойства value или любого из свойств As. Под свойствами As Я имею В виду AsString, Aslnteger, AsDateTime, AsBoolean и т. д. Эти свойства выполняют преобразования между разными типами данных. Естественно, преобразование возможно не во всех случаях. Например, если вы попытаетесь преобразовать строковое поле со значением Smith к целому типу, будет возбуждено исключение.

Установка значения поля очень проста, если вы знаете секрет FieldByName:

Table1.Edit;

Table1.FieldByName('LastName').AsString := Edit1.Text;

Table1.Post;

Сначала вызывается метод Edit, который переводит таблицу в режим редактирования. Если вы не вызовете Edit, то получите исключение при попытке изменения значения поля. После того, как таблица переведена в режим редактирования, устанавливается новое значение поля. В данном случае я использую AsString вместо свойства Value. Для строкового поля это в любом случае одно и то же. В завершение вызывается метод Post, который отправляет изменения в базу данных (или кэш изменений, если включено свойство СасhedUpdates). Вот и все. Извлечение значения поля выполняется еще проще:

int AcctNo := Tablel.FieldByName('ACCT NBR').Value;

      1. Компонент TDataSource

Компонент DataSource обеспечивает механизм для связи компонентов доступа к данным (Table, Query или StoredProc) с визуальными компонентами, которые отображают данные (DBGrid, DBEdit, DBListBox и т. д.). Основное назначение DataSource состоит в том, чтобы облегчить внесение изменений в приложения. Все визуальные компоненты данных на форме связаны с DataSource, который, в свою очередь, связан с набором данных.

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

TDataSource имеет очень мало свойств. Как вы уже видели, свойство Data-Set используется для связи DataSource с набором данных. Свойство Enabled определяет, будут ли интерфейсные компоненты, связанные с DataSource, отображать данные. Когда это свойство имеет значение True, данные отображаются. В противном случае компоненты отображения данных остаются пустыми.

Методы TDataSource по большей части несущественны, поэтому не имеет смысла их здесь рассматривать. Событие OnDataChange генерируется при перемещении курсора с редактировавшейся записи на любую другую. Событие OnStateChange происходит в момент изменения состояния набора данных (например, когда пользователь переключается из режима редактирования в режим просмотра).

      1. Сходства и различия компонентов TTable и TQuery

Хотя компоненты TTable и TQuery и являются потомками класса TDataSet и во многом, методика работы с объектом TQuery похожа на методику работы с TTable, однако есть свои особенности.

Поскольку в ряде случаев компоненты TTable и TQuery в приложениях

взаимозаменяемы, то возникает вопрос – какой же из них использовать?

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

Этот недостаток отсутствует в компоненте Query. Если запрос SQL сводится к просмотру таблицы (запрос Select), то результат этого запроса (а не сама исходная таблица) помещается во временном файле на компьютере пользователя. Правда, в отличии от набора данных, создаваемого Table, это таблица только для чтения и не допускает каких-то изменений.

Впрочем, это ограничение можно обойти. Если же запрос SQL связан с какими-то изменениями содержания таблицы, то никаких временных таблиц не создается. BDE передает запрос на сервер, там он обрабатывается и в приложение возвращается информация о том, успешно ли завершена соответствующая операция. Благодаря такой организации работы эффективность Query при работе в сети становится намного выше, чем эффективность Table. К тому же язык SQL,позволяет формулировать сложные запросы, которые не всегда можно реализовать в Table.

С другой стороны при работе с локальными данных эффективность Query заметно ниже эффективности Table. Замедление вычислений получается весьма ощутимым.

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

    1. Визуальные компоненты Delphi

      1. Компонент TLable

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

Таблица 1.6. Свойства компонента Label

Свойство

Описание 

AutoSize

 

Если установлено значение True, метка будет изменять свой размер в соответствии с текстом, содержащимся в свойстве Caption. При значении False текст будет отсекаться по правому краю метки

FocusControl

 

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

ShowAccelChar

 

Установите для этого свойства значение True, если вы хотите, чтобы символ & отображался на метке, а не служил обозначением клавиши быстрого доступа

Transparent

 

Когда это свойство имеет значение True, свойство Colorигнорируется, и через метку видно то, что находится под ней Это свойство используется, например, для размещения меток на фоне растровых изображений

Wordwrap

 

Если установлено значение True, то текст метки переносится на новую строку по достижении правого края метки

      1. Компонент TDBEdit

Компонент DBEdit представляет собой элемент редактирования, который связан с полем набора данных. Компонент DBEdit имеет только те свойства, методы и события, которые являются общими для всех компонентов данных.

      1. Компонент TDBNavigator

Компонент DBNavigator предоставляет пользователю возможность просматривать набор данных. Навигатор содержит кнопки для перехода на первую, последнюю, предыдущую и следующую записи, вставки, удаления и редактирования записи, отмены и сохранения изменений, а также обновления данных. Этот компонент практически полностью автоматизирован, поэтому все, что вам остается сделать в большинстве случаев — это поместить его на форму, связать с DataSource и забыть о нем.

Свойство ConfirmDelete, будучи установлено в True, вызывает отображение диалоговой панели при каждом нажатии на кнопку Delete. Установкой значения True для свойства Hint включаются всплывающие подсказки для кнопок. Свойство VisibleButtons представляет собой множество и позволяет вам управлять отображением кнопок на панели навигатора. Вы можете добавлять и удалять кнопки как на этапе проектирования, так и во время выполнения программы.

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

      1. Компонент TDBImage

Компонент DBImage используется для вывода больших двоичных объектов (BLOB — binary large object), имеющих формат изображения. Этот компонент не обязательно будет предназначен только для чтения. Вы можете изменить изображение, вставив его из буфера обмена или используя свойство Picture для загрузки файла с диска. В следующем примере изображение меняется в процессе выполнения программы:

DBImage1.Picture.LoadFromFile('peregrine.bmp');

Основные свойства DBImage управляют выводом изображения. Свойство AutoDisplay работает точно так же, как и для компонента DBMemo. Метод loadPicture может использоваться для загрузки изображения, когда AutoDisplay имеет значение False. Свойство picture разрешает доступ к изображению и выполняет те же функции, что и в стандартном компоненте Image. Свойство Center определяет, будет ли изображение центрировано относительно окна DBImage. Свойство Stretch определяет, будет ли изображение растянуто до размеров окна DBImage или сохранит свой исходный размер. Если Stretch имеет значение False, а изображение не помещается в окне, то оно будет обрезано. От свойства QuickDraw зависит, будет ли применяться палитра при выводе изображения. Если QuickDraw имеет значение False, палитра используется. Это улучшает качество изображений, но несколько снижает скорость вывода на экран.

К методам компонента DBImage относятся CutToClipboard, CopyToClipboard и PasteFromClipboard. Их назначение полностью соответствует названиям.

      1. Компонент TDBGrid

Компонент DBGrid отображает набор данных в формате электронной таблицы. Одним из важнейших свойств DBGrid является свойство columns. Оно позволяет вам изменять номера и порядок столбцов, которые появляются в таблице. Вы можете добавить, удалить или упорядочить столбцы с помощью редактора столбцов (Columns Editor). Для вызова редактора столбцов щелкните правой кнопкой мыши на таблице и выберите пункт Columns Editor в контекстном меню. Вы можете также щелкнуть на кнопке с многоточием рядом со свойством Columns в инспекторе объектов. Используя редактор столбцов, вы можете добавлять и удалять столбцы, или изменять порядок их расположения. Например, набор данных может содержать десятки полей, но вам требуется просматривать в DBGrid только половину из них. С помощью редактора столбцов вы можете скрыть те поля, которые не должны отображаться.

.Не путайте свойство Columns компонента DBGrid (модифицируемое через редактор столбцов) со свойством FieldDefs компонента Table (которое модифицируется с помощью редактора полей) Свойство FieldDefs определяет, какие столбцы реально находятся в наборе данных Свойство columns влияет только на видимость полей в сетке DBGrid.

Свойство DefaultDrawing определяет, будут ли ячейки сетки нарисованы VCL, или их будет рисовать пользователь. Если для DefaultDrawing установлено значение False, вы должны реагировать на события OnDrawColumnCell и OnDrawDataCell, чтобы обеспечить рисование ячеек.

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

Свойство Title Font позволяет вам задать шрифт для заголовков столбцов, а свойство Font определяет шрифт для ячеек таблицы.

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

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

    1. Создание простых клиентских приложений с использованием базовых компонентов Delphi для работы c базами данных.

Самый простой способ создания формы для работы с базами данных – это использование мастера Form Wizard. Этот мастер позволяет создавать шаблоны формы полностью работающегоприложения для:

- просмотра и редактирования одной таблицы базы данных;

- просмотра и редактирования двух таблиц, соединенных отношением родительская-дочерняя.

      1. Для того, чтобы создать шаблон приложения, работающего с одной таблицей, следует:

  • Создать новый проект.

  • Запустить мастер Form Wizard, выполнив команду меню Database |Form Wizard.

  • Выбрать в первом открывшемся диалоге Database Form Wizard (рис. 1.1) тип создаваемой формы:

- simple- форма для построения и редактирования одной таблицы.

Рисунок 1.1 – Диалог Database Form Wizard – 1 шаг

  • Выбрать тип объекта набора данных: TTable. В этом случае для работы с таблицей будет использован компонентTTable. После определения всех параметров нажатьNext.

  • Выбрать во втором диалоге DatabaseFormWizard(рис. 1.2) каталог расположения базы данных (в данном примере это каталог стандартной базы данныхDBDEMOS) и необходимую таблицу (в данном примере -animals.dbf).

Рисунок 1.2 – Диалог Database Form Wizard – 2 шаг

  • В третьем диалоге DatabaseFormWizard(рис. 1.3) все поля из левого списка поместить в создаваемую форму, щелкнув по кнопке >>.

Рисунок 1.3 – Диалог Database Form Wizard – 3 шаг

  • В четвертом диалоге DatabaseFormWizard(рис. 1.4) определить порядок следования элементов на форме, как горизонтальный или вертикальный.

Рисунок 1.4 – Диалог Database Form Wizard – 4 шаг

  • В пятом диалоге Database Form Wizard (рис. 1.5) укажите, является ли создаваемая форма главной формой приложения.

  • Тут же следует выбрать место расположения невизуальных компонентов: набора данных (TTable или TQuery) и источника данных (TDataSourse). Они могут быть расположены на форме или в отдельном модуле данных. Во втором случае этот модуль данных может быть использован для нескольких форм. Нажать Finish. Запустить проект, нажав F9.

.

Рисунок 1.5 – Диалог Database Form Wizard – 5 шаг

      1. Для того, чтобы создать шаблон приложения, работающего с двумя таблицами, следует:

  • Создать новый проект.

  • Запустить мастер FormWizard, выполнив команду менюDatabase|FormWizard.

  • Выбрать в первом открывшемся диалоге DatabaseFormWizard(рис. 1.6) тип создаваемой формы:

  • Master/detail- форма для построения и редактирования двух таблиц, связанных отношением родительская-дочерняя.

Рисунок 1.6 – Диалог Database Form Wizard – 1 шаг

  • Выбрать тип объекта набора данных: TQuery.

  • После определения всех параметров нажать Next.

  • Выбрать во втором диалоге DatabaseForm Wizard(рис. 1.7) каталог расположения базы данных (в данном примере это каталог стандартной базы данных DBDEMOS) и родительскую таблицу. В данном примере родительская таблица – customer.db.

Рисунок 1.7 – Диалог Database Form Wizard – 2 шаг

  • В третьем диалоге DatabaseForm Wizard(рис. 1.8) все поля из левого списка поместить в создаваемую форму, щелкнув по кнопке >>

Рисунок 1.8 – Диалог Database Form Wizard – 3 шаг

  • В четвертом диалоге Database Form Wizard (рис. 1.9) определить порядок следования полей, как горизонтальный или вертикальный

Рисунок 1.9 – Диалог Database Form Wizard – 4 шаг

  • В пятом диалоге Database Form Wizard (рис. 1.10) выберите имя дочерней таблицы.

Рисунок 1.10 – Диалог Database Form Wizard – 5 шаг

  • В шестом диалоге Database Form Wizard (рис. 1.11) все поля из левого списка поместить в создаваемую форму, щелкнув по кнопке >>.

Рисунок 1.11 – Диалог Database Form Wizard – 6 шаг

  • В седьмом диалоге Database Form Wizard (рис. 1.12) выделите третий пункт, чтобы дочерняя таблица отображалась в созданной форме в виде таблицы.

Рисунок 1.12 – Диалог Database Form Wizard – 7 шаг

  • В восьмом диалоге Database Form Wizard(рис. 1.13) определите поле, по которому будет устанавливаться связь между таблицами. Выберите на панели Detail Field поле дочерней таблицы (внешний ключ), а на панели Master Field – поле родительской таблицы (первичный ключ), затем щелкните по кнопке Add. В результате в создаваемой форме будут отображаться только те записи из дочерней таблицы, в которых значение выбранного в качестве ключа поля совпадает со значением поля из родительской таблицы в активной записи.

Рисунок 1.13 – Диалог Database Form Wizard – 8 шаг

  • В девятом диалоге DatabaseFormWizard(рис. 1.14) укажите, является ли создаваемая форма главной формой приложения.

Рисунок 1.14 – Диалог Database Form Wizard – 9 шаг

  • Тут же следует выбрать место расположения невизуальных компонентов: набора данных (TTable или TQuery) и источника данных (TDataSourse). Они могут быть расположены на форме или в отдельном модуле данных. Во втором случае этот модуль данных может быть использован для нескольких форм. Нажать Finish. Запустить проект, нажав F9.

  1. СОЗДАНИЕ БАЗЫ ДАННЫХ С ИСПОЛЬЗОВАНИЕМ СУБД INTERBASE

    1. Проектирование схемы БД

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

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

Реляционная модель данных (РМД) – логическая модель данных, в которой для хранения данных об объектах предметной области и для воссоздания взаимосвязей между ними используется набор таблиц. Термин «реляционный» означает, что теория основана на математическом понятии «отношение». Часто понятие «отношение» заменяют словом таблица. «Таблица» является нестрогим понятием и часто обозначает не «отношение», как абстрактное понятие, а визуальное представление отношения на бумаге или экране. Следует также помнить, что РМД является логической моделью, то есть отношения являются логическими(абстрактными), а не физическими (хранимыми) структурами.

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

В данной базе данных (далее БД) объекты предметной области представлены 4-мя базовыми таблицами:

  • Shipping (табл. 2.1);

  • Transportations (табл. 2.2);

  • Ships (табл. 2.3);

  • Ports (табл. 2.4).

Таблица 2.1 – Пароходства

ТАБЛИЦА SHIPPING

НАЗВАНИЕ ПОЛЯ

ИНФОРМАЦИЯ О ПОЛЕ

ТИП ДАННЫХ

SHIPPINGID

ПОЛЕ-СЧЕТЧИК

ЧИСЛО

TITLE_SHPNG

НАЗВАНИЕ ПАРОХОДСТВА

ТЕКСТ(100)

DATE_BD

ДАТА НАЧАЛА РАБОТЫ

ДАТА

PROPERTY_TYPECODE

ВК ДЛЯ ТАБЛИЦЫ «ТИП_СОБСТВЕННОСТИ»

ЧИСЛО

SHIPPING_TYPECODE

ВК ДЛЯ ТАБЛИЦЫ «ТИП_ПАРОХОДСТВА»

ЧИСЛО

Таблица 2.2 – Перевозки

TABLE TRANSPORTATION

НАЗВАНИЕ ПОЛЯ

ИНФОРМАЦИЯ О ПОЛЕ

ТИП ДАННЫХ

TRANSPORTATIONID

ПОЛЕ-СЧЕТЧИК

ЧИСЛО

TYPE_TPCODE

ТИП ПЕРЕВОЗКИ

ЧИСЛО

DATE_TP

ДАТА ПЕРЕВОЗКИ

ДАТА

PASSENGERS_CNT

КОЛИЧЕСТВО ПАССАЖИРОВ

ЧИСЛО

TICKET_PRICE

ЦЕНА БИЛЕТА

ЧИСЛО

SHIPPINGCODE

ВК ДЛЯ СВЯЗИ С ТАБЛИЦЕЙ «ПЕРЕВОЗКИ»

ЧИСЛО

SHIPCODE

ВК ДЛЯ СВЯЗИ С ТАБЛИЦЕЙ «СУДНА»

ЧИСЛО

Таблица 2.3 – Судна

TABLE SHIPS

НАЗВАНИЕ ПОЛЯ

ИНФОРМАЦИЯ О ПОЛЕ

ТИП ДАННЫХ

SHIPID

ПОЛЕ-СЧЕТЧИК

ЧИСЛО

TITLE_SHP

НАЗВАНИЕ СУДНА

ТЕКСТ(100)

DATE_BD

ДАТА СПУСКА НА ВОДУ

ДАТА

SHIP_TYPECODE

ВК ДЛЯ СВЯЗИ С ТАБЛИЦЕЙ «ТИП_СУДНА»

ЧИСЛО

PORTCODE

ВК ДЛЯ ТАБЛИЦЫ «ПОРТ»

ЧИСЛО

Таблица 2.4 – Порты

TABLE PORT

НАЗВАНИЕ ПОЛЯ

ИНФОРМАЦИЯ О ПОЛЕ

ТИП ДАННЫХ

PORTID

ПОЛЕ-СЧЕТЧИК

ЧИСЛО

TITLE_PRT

НАЗВАНИЕ ПОРТА

ТЕКСТ(100)

CITYCODE

ВК ДЛЯ ТАБЛИЦЫ «ГОРОДА»

ЧИСЛО

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

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

В данной системе разработаны такие таблицы-справочники:

  • Cities (табл. 2.5);

  • Shipping_type (табл. 2.6);

  • Property_type (табл. 2.7);

  • Transportation_type (табл. 2.8);

  • Ship_type (табл. 2.9);

Таблица 2.5 – Города

TABLE CITIES

НАЗВАНИЕ ПОЛЯ

ИНФОРМАЦИЯ О ПОЛЕ

ТИП ДАННЫХ

CITYID

ПОЛЕ-СЧЕТЧИК

ЧИСЛО

TITLE_CT

НАЗВАНИЕ ГОРОДА

ТЕКСТ(100)

Таблица 2.6 – Тип_пароходства

TABLE SHIPPING_TYPE

НАЗВАНИЕ ПОЛЯ

ИНФОРМАЦИЯ О ПОЛЕ

ТИП ДАННЫХ

TYPE_SHPGID

ПОЛЕ-СЧЕТЧИК

ЧИСЛО

TITLE_ST

ТИП ПАРОХОДСТВА

ТЕКСТ(100)

Таблица 2.7 – Тип_собственности

TABLE PROPERTY_TYPE

НАЗВАНИЕ ПОЛЯ

ИНФОРМАЦИЯ О ПОЛЕ

ТИП ДАННЫХ

TYPE_PRPRTID

ПОЛЕ-СЧЕТЧИК

ЧИСЛО

TITLE_PRPT

ТИП СОБСТВЕННОСТИ

ТЕКСТ(100)

Таблица 2.8 – Тип_перевозки

TABLE TRANSPORTATION_TYPE

НАЗВАНИЕ ПОЛЯ

ИНФОРМАЦИЯ О ПОЛЕ

ТИП ДАННЫХ

TYPE_TPID

ПОЛЕ-СЧЕТЧИК

ЧИСЛО

TITLE_TT

ТИП ПЕРЕВОЗКИ

ТЕКСТ(100)

Таблица 2.9 – Тип_судна

TABLE SHIP_TYPE

НАЗВАНИЕ ПОЛЯ

ИНФОРМАЦИЯ О ПОЛЕ

ТИП ДАННЫХ

TYPE_SHPID

ПОЛЕ-СЧЕТЧИК

ЧИСЛО

TITLE_SHPT

ТИП СУДНА

ТЕКСТ(100)

На основе разработанных таблиц была спроектирована схема данных,

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

Схема данных представлена на рис. 2.1.

Рисунок 2.1. – схема данных

    1. Создание таблиц, доменов, индексов.

      1. Создание доменов

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

Инструкция CREATE DOMAIN создает наследуемое определение столбца, оно используется как шаблон при определении столбцов в инструкциях CREATE TABLE или ALTER TABLE. Определение домена содержит установки характеристик, которые включают:

  • Тип данных.

  • Факультативно значение по умолчанию.

  • Факультативно недопустимость значения NULL.

  • Факультативно CHECK ограничения.

  • Факультативно порядок сортировки.

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

Синтаксис команды CREATE DOMAIN

CREATE DOMAIN domain [AS] <datatype>

[DEFAULT {literal | NULL | USER}]

[NOT NULL] [CHECK (<dom_search_condition>)]

[COLLATE collation];

На рисунке 2.2 содержатся домены:

  • DNDB – для хранения даты;

  • DNNUM– для хранения числовых значений;

  • DNTITLE– для хранения текстовых полей.

Рисунок 2.2 – домены для базы данных «Пароходства Украины»

      1. Создание таблиц

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

CREATE TABLE поддерживает несколько опций для определения столбцов:

Локальные столбцы определяющие имя и тип данных для данных введенных в столбец.

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

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

Описание типа данных для столбца типа CHAR, VARCHAR или BLOB-техт может включать предложение CHARACTER SET определяя специфическую кодировку для одиночного столбца. Иначе столбец использует определенную по умолчанию для базы данных кодировку. Если кодировка базы данных изменена, все столбцы впоследствии определенные имеют новую кодировку, но существующие столбцы не изменяются.

Предложение COLLATE позволяет указать специфический порядок сортировки для типов данных CHAR, VARCAHR и BLOB-текст. Выбор порядка сортировки ограничен теми которые поддерживаются для данной кодировки столбца, это или кодировка по умолчанию для базы данных в целом или другая установленная в предложении CHARACTER SET как часть определения типа данных. Смотри Language Reference, чтобы получить полный список возможных сортировок.

Атрибут NOT NULL предотвращает ввод NULL или неизвестного значения в столбец. Атрибут NOT NULL проявляется во всех INSERT и UPDATE операциях над столбцом.

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

PRIMARY KEY (первичный ключ) - уникально идентифицирует каждую строку таблицы. Значение в этом столбце либо в упорядоченном наборе столбцов не могут повторятся в более чем одной строке. Столбец PRIMARY KEY должен быть определен только с атрибутом NOT NULL. Таблица может иметь только один PRIMARY KEY, который может быть определен на одном или более столбцов.

UNIQUE (уникальные) ключи гарантируют, что не существует двух строк имеющих одно и тоже значение в специфическом столбце или упорядоченном наборе столбцов. Уникальный столбец должен быть определен с атрибутом NOT NULL. Таблица может иметь один или более UNIQUE ключей. UNIQUE ключ может быть использован как FOREIGN KEY (внешний ключ) в другой таблице.

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

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

Для не именованных ограничений, система создает уникальное имя сохраненное в системной таблице RDB$RELATION_CONSTRAINTS. Ограничения не допустимы на выражениях!

Синтаксис команды CREATE TABLE

CREATE TABLE table [EXTERNAL [FILE] "<filespec>"]

(<col_def> [, <col_def> | <tconstraint> ...]);

<col_def> = col {datatype | COMPUTED [BY] (<expr>) | domain}

[DEFAULT {literal | NULL | USER}]

[NOT NULL] [<col_constraint>]

[COLLATE collation]

На рисунке 2.3 содержатся таблицы базы данных «Пароходства Украины»:

Рисунок 2.3 – Таблицы базы данных «Пароходства Украины»

      1. Создание индексов

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

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

Синтаксис команды CREATE INDEX

CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]]

INDEX index ON table (col [, col ...]);

На рисунках2.4 и 2.5содержатся все индексы базы данных.

Рисунок 2.4 – индексы базы данных «Пароходства Украины»

Рисунок 2.5 – индексы базы данных «Пароходства Украины»

    1. Разработка триггеров

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

Триггеры могут обеспечивать следующие возможности:

  • Автоматическое ограничение ввода данных, что бы гарантировать, что пользователь ввел только допустимые значения в поля столбцов.

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

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

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

  • Завершения операции, возможно с сообщением об ошибке.

  • Установки значений в записи к торой вы обращаетесь.

  • Добавления, изменения или удаления строк в других таблицах.

CREATE TRIGGER определяет новый триггер в базе данных.

Триггер никогда не вызывается непосредственно. Наоборот, когда приложение или пользователь пытаются выполнить инструкцию INSERT, UPDATE или DELETE над строкой в таблице, любые триггеры связанные с этой таблицей и операцией автоматически выполняются, or fier. Триггер, определенный для UPDATE на не модифицируемых видах fire, даже если никакая модификация не происходит.

Триггеры состоят из заголовка и тела.

Заголовок триггера содержит:

  • Имя триггера уникальное внутри базы данных, которое отличает триггер от всех остальных.

  • Имя таблицы, определяющие таблицу, с которой связан триггер.

  • Инструкции, которые определяют, когда триггер fires.

Тело триггера содержит:

  • Факультативный список локальных переменных и их типов данных.

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

Важно: Так как каждая инструкция в теле сохраненной процедуры должна завершатся точкой с запятой, вы должны определить отличный символ для завершения инструкции CREATE TRIGGER в ISQL. Используйте SET TERM пред CREATE PROCEDURE чтобы определить терминатор отличный от точки с запятой. После инструкции CREATE TRIGGER, включите SET TERM, что бы изменить терминатор обратно к точке с запятой.

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

Триггеры могут быть наделены привилегиями на таблицу, точно так же, как пользователи или процедуры могут быть наделены привилегиями. Используйте инструкцию GRANT, но вместо использования TO username, используйте TO TRIGGERtrigger_name. Привилегии триггеров могут быть отменены аналогичным использованием REVOKE.

Когда пользователь выполняет действия, которые fires триггер, триггер будет иметь привилегии на выполнение этих действий, если одно из следующих условий истино:

  • Триггер имеет привилегии для этого действия.

  • Пользователь имеет привилегии для этого действия.

Язык процедур и триггеров InterBase это полный язык программирования для сохраненных процедур и триггеров. Он включает:

  • Инструкции SQL манипулирования данными: INSERT, UPDATE, DELETE и singleton SELECT.

  • Операторы и выражения SQL, включая UDF's связанные с базой данных и генераторы.

  • Мощно расширяет SQL, включая инструкции присвоения, control-flow инструкции, контекстные переменные, even-posting инструкции, исключительные ситуации и инструкции обработки ошибок.

Синтаксис команды CREATE TRIGGER

CREATE TRIGGER name FOR table

[ACTIVE | INACTIVE]

{BEFORE | AFTER}

{DELETE | INSERT | UPDATE}

[POSITION number]

AS <trigger_body> terminator

<trigger_body> =

[<variable_declaration_list>] <block>

<variable_declaration_list> =

DECLARE VARIABLE variable <datatype>;

[DECLARE VARIABLE variable <datatype>; ...]

<block> =

BEGIN

<compound_statement>

[<compound_statement> ...]

END

<compound_statement> = {<block> | statement;}

<datatype> = {

{SMALLINT | INTEGER | FLOAT | DOUBLE PRECISION}

| {DECIMAL | NUMERIC} [(precision [, scale])]

| DATE

| {CHAR | CHARACTER | CHARACTER VARYING | VARCHAR}

[(1...32767)] [CHARACTER SET charname]

| {NCHAR | NATIONAL CHARACTER | NATIONAL CHAR}

[VARYING] [(1...32767)]}

На рисунке 2.6 содержатся созданные в базе данных триггеры

Рисунок 2.6 – триггеры в базе данных «Пароходства»

    1. Заполнение записями таблиц баз данных

INSERT добавляет одну или более новых строк данных к существующей таблице или виду. INSERT - одна из привилегий базы данных, которая контролируется инструкциями GRANT и REVOKE.

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

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

Чтобы вставить одну строку данных, должно присутствовать предложение VALUES и содержать определенный список значений.

Чтобы вставить несколько строк данных, определите <select_expr>, которое возвращает уже существующие данные из другой таблицы. Выбранные строки должны соответствовать списку столбцов.

Синтаксис команды INSERT

INSERT INTO <object> [(col [, col ...])]

{VALUES (<val> [, <val> ...]) | <select_expr>};

<object> = tablename | viewname

<val> = {

<constant> | <expr>| <function> | NULL | USER

} [COLLATE collation]

На рисунках 2.7 – 2.17 содержатся заполненные командой INSERTтаблицы.

Рисунок 2.7 – Заполненная таблица «Города»

Рисунок 2.8 – Заполненная таблица «Порт»

Рисунок 2.9 – Заполненная таблица «Типы_собственности»

Рисунок 2.10 – Заполненная таблица «Типы_пароходства»

Рисунок 2.11 – Заполненная таблица «Типы_суден»

Рисунок 2.12 – Заполненная таблица «Типы_перевозок»

Рисунок 2.13 – Заполненная таблица «Судна»

Рисунок 2.14 – Заполненная таблица «Судна»

Рисунок 2.15 – Заполненная таблица «Пароходства»

Рисунок 2.16 – Заполненная таблица «Перевозки»

Рисунок 2.17 – Заполненная таблица «Перевозки»

    1. Создание видов

Вид (view) это виртуальная таблица, которая не сохранена физически в базе данных, но ведет себя точно также как "реальная" таблица. Вид может содержать данные из одной или более таблиц или других видов и используется для хранения часто используемых запросов (queries) или множества запросов в базе данных.

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

CREATE VIEW описывает вид данных основанный на одной или более основной таблицы в базе данных. Возвращаемые строки определены инструкцией SELECT, который перечисляет столбцы исходных таблиц. Только определение вида существует в базе данных; вид непосредственно не представляет, из себя, сохраненные данные. Это позволяет выполнять операции выбора, project, join и union над видами, как если бы они были таблицами.

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

  • Вид только для чтения требует SELECT привилегиями на основные таблицы.

  • Модифицируемый вид требует ALL привилегий на основные таблицы.

Опция view_col гарантирует, что вид всегда содержит те же самые столбцы и, что столбцы имеют те же самые, определенные видом, имена. Имена столбцов вида соответствуют порядку и количеству столбцов перечисленных в <select>, по этому определите все столбцы вида или ни одного.

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

Предложение инструкции SELECT не должно включать предложение ORDER BY.

WITH CHECK OPTION позволяет InterBase проверить, что строка добавлена к или модифицирована в виде... (not understand*). Не используйте WITH CHECK OPTION для видов предназначенных только для вида.

Вид модифицируем если:

  • Он подмножество одиночной таблицы или другого модифицируемого вида.

  • Все столбцы базовой таблицы исключенные из определения вида допускают значения NULL.

  • Инструкция SELECT вида не содержит подзапросов, предикат DISTINCT, предложение HAVING, агрегатных функций, joined таблиц, определенных пользователем функций или сохраненных процедур.

Если определение вида не удовлетворяет этим условиям, он рассматривается, как только для чтения.

Синтаксис команды CREATE VIEW

CREATE VIEW name [(view_col [, view_col ...])]

AS <select> [WITH CHECK OPTION];

Рисунок 2.16 – Представления в базе данных «Пароходства»

  1. Разработка клиентского приложения в среде Delphi7

Для того, чтобы создать приложение баз данных с нуля следует:

  • Создать новый проект (созданное приложение должно работать как минимум с двумя таблицами и двумя справочниками).

  • Расположить в модуле данных компонент TDateBase. Установить необходимые значения свойствам этого компонента. Этот компонент должен быть связан с базой данных InterBase, созданной в предыдущих лабораторных работах. Создать псевдоним для базы данных можно с помощью утилиты BDE Administrator (bdeadmin.exe), для запуска этой программы зайти в меню Database| Explore среды Delphi7.

  • Расположить в форме(-ах) (или в модуле данных) компоненты источников данных TDateSource и компоненты для наборов данных TTable(или TQuery).

  • Компоненты наборов данных связать с базой данных InterBase через компонент TDateBase. Для этого при использовании компонента TTable установить значения его свойств DatabaseName и TableName. При использовании компонента TQuery установить значение его свойства SQL. Значением этого свойства является строка, содержащая SQL-оператор SELECT.

  • С помощью редактора полей добавить необходимые поля в компонент набора данных.

  • Добавить на форму визуальные компоненты для отображения значений полей таблиц (TLabel, TDBEdit, TDBGrid) и компоненту TDBNavigator. Связать эти компоненты с полями таблиц.

  • Для отображения и редактирования значений полей справочников использовать поля ввода TDBEdit, а для отображения значений полей таблиц использовать TDBGrid с подстановочными полями.

  • Запустить приложение.

  • Заполнить и отредактировать таблицы базы данных InterBase.

    1. Формы и компоненты для работы с основными таблицами

Для работы с основными таблицами используются компоненты:

  • TTable;

  • TDataSource;

  • TDBGrid;

  • TDBNavigator;

Данные компоненты изображены на рисунке 3.1.

Рисунок 3.1. – компоненты для работы с основными таблицами

    1. Формы и компоненты для работы со справочниками

Для работы со справочниками используются такие компоненты:

  • TTable;

  • TDataSource;

  • TDBGrid;

  • TDBNavigator;

  • TIBQuery;

  • TDBEdit;

  • TLabel;

  • TButton;

Их использование изображено на рисунках 3.2 и 3.3.

Рисунок 3.2 – компоненты для работы со справочниками

Рисунок 3.3 – компоненты для работы со справочниками