АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

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

Читайте также:
  1. Access. Базы данных. Определение ключей и составление запросов.
  2. BRP открывает новый виток инновационного развития с выпуском платформы Ski-Doo REV
  3. C_EOBASE (Б. Образцы запросов хозопераций)
  4. I.5.5. Просмотр и анализ результатов решения задачи
  5. II Формы общения, к вампиризму не относящиеся
  6. II этап: запуск программы PowerPoint и выбор режима отображения.
  7. II. ЦЕЛИ И ФОРМЫ ДЕЯТЕЛЬНОСТИ ПРИХОДА
  8. II.4.4. Основные формы психокоррекционной работы с детьми и подростками
  9. III. Анализ результатов психологического анализа 1 и 2 периодов деятельности привел к следующему пониманию обобщенной структуры состояния психологической готовности.
  10. III. Методические указания для студентов заочной формы обучения по выполнению контрольной работы
  11. III. ПРЕДЕЛЫ ПОЛНОМОЧИЙ ПРАВИТЕЛЬСТВ, ФОРМЫ ПРАВЛЕНИЯ ВОЗВРАЩЕНИЕ ПРАВИТЕЛЬСТВ НА ПРАВИЛЬНЫЙ КУРС
  12. IV. Далее в этой лабораторной работе необходимо создать и сохранить запрос для отображения средних цен на все товары по таблице «Товары».

ВВЕДЕНИЕ

 

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

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

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

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


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

 

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

1.1.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.1.2. Компонент 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.1.3. Компонент TQuery

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

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

 

1.1.4. Компонент 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.1.5. Компонент 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.1.6. Сходства и различия компонентов 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.2. Визуальные компоненты Delphi

 

1.2.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.2.2. Компонент TDBEdit

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

 

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

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

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

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

 

1.2.4. Компонент 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.2.5. Компонент 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.3. Создание простых клиентских приложений с использованием базовых компонентов Delphi для работы c базами данных.

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

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

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

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

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

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


 

 

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

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

 

 

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

 

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

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


 

 

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

 

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

 

 

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

 

- В четвертом диалоге Database Form Wizard (рис. 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.3.2. Для того, чтобы создать шаблон приложения, работающего с двумя таблицами, следует:

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

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

- Выбрать в первом открывшемся диалоге Database Form Wizard (рис. 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 шаг


 

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

 

 

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

 

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

 


 

 

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

2.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. – схема данных

 

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

2.2.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 – домены для базы данных «Пароходства Украины»

 

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

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 – Таблицы базы данных «Пароходства Украины»

 

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

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

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

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

CREATE [UNIQUE] [ASC[ENDING] | DESC[ENDING]]INDEX index ON table (col [, col...]);

 

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

 

 

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

 

 

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

 

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

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

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

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

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

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

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

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

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

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

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 TRIGGER trigger_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 – триггеры в базе данных «Пароходства»

 

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

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 – Заполненная таблица «Перевозки»


1 | 2 | 3 | 4 | 5 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.121 сек.)