Основы проектирования реляционных баз данных
Особенность системы управления базами данных. Основная характеристика связей и языка моделирования. Сущность первичных и внешних ключей. Методика построения и проектирования инфологической модели. Главный анализ манипулирования реляционной информацией.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курс лекций |
Язык | русский |
Дата добавления | 10.03.2015 |
Размер файла | 569,7 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Методы добавляются в public - части описания класса формы, следующим образом:
public
procedure Add; virtual; abstract;
procedure Edit; virtual; abstract;
procedure Print; virtual; abstract;
procedure Delete; virtual; abstract;
Последний штрих - это присвоим свойству WindowState значение wsMaximized, чтобы дочернее окно при отображении сразу занимало всю рабочую часть главного окна приложения. Дочерние формы для работы с таблицами будут наследоваться от данной формы.
Создание форм для работы с клиентами и телефонами, направлениями и трафиком
Для создания потомка от формы fmMDIChild, необходимо выбрать пункт меню «File»\ «New». В появившемся диалоговом окне на вкладке «Traffic» выберем форму fmMDIChild и нажмем кнопку «ОК». Дадим этой форме имя fmClients и заголовок - «Клиенты и телефоны». Сохраним форму в файле uClients.pas.
Т. к. наша форма наследуется от формы TMDIChild, то она содержит абстрактные методы. Эти методы необходимо здесь переопределить. Для этого в public - части определения класса TfmClients переопределим абстрактные методы:
procedure Add; override;
procedure Edit; override;
procedure Print; override;
procedure Delete; override;
А в implementation - части модуля uClients реализуем эти методы (пока с пустым телом процедур ):
procedure TfmClients.Add;
begin
//----
end;
Точно таким же образом реализуем методы Edit, Print, Delete.
Данная форма должна отображать данные из таблиц Clients и Phones. Для этого применяется визуальный компонент TDBGrid, находящийся на вкладке «Data Controls» палитры компонентов. Расположим на форме 2 компонента TDBGrid, один в верхней части окна, другой - в нижней, назовем их gdClients и gdPhones. Между ними необходимо расположить компонент TSplitter, чтобы можно было динамически менять размеры TDBGrid-ов. Кроме того, над компонентом gdPhones расположим панель TPanel, на которой будет отображаться количество телефонов по текущему клиенту.
Для каждого компонента TDBGrid присвоим свойству ReadOnly значение True, а также значение False для элементов dgEditing и dgTabs свойства Options.
Для того, чтобы в gdClients и gdPhones отображалась информация, необходимо назначить свойству DataSource ссылку на компонент dsClients и dsPhones соответственно. Эти источники данных находятся в модуле uMainDM, поэтому в модуле uClients пропишем ссылку на модуль uMainDM. Для этого выберем пункт меню «File»\ «Use Unit».
Как известно, между таблицами Clients и Phones существует связь «один ко многим». Визуально это должно выглядеть следующим образом: в gdPhones отображаются телефоны только текущего клиента. При смещении указателя записи в gdClients в dgPhones должно произойти обновление данных и отображаться телефоны нового клиента. Для реализации такого функционала необходимо вернуться к модулю данных. У компонента tbPhones присвоим ссылку на dsClients у свойства MasterSource, а в качестве значения свойства MasterFields укажем поле Id таблицы Clients, по которому у нас производится связь между Clients и Phones.
Теперь мы можем активизировать таблицы, установкой свойства Active в значение True для данных таблиц, и, перейдя на форму fmClients, наблюдать, как работает связь «один ко многим».
Последнее, что мы сделаем для формы fmClients, это назначим заголовки полей для отображения. Для этого в модуле данных дважды щелкнем на компоненте tbClients. В появившемся окне щелкнем правой кнопкой мышки и из меню выберем пункт «Add All Fields». При этом в окне появятся все поля, имеющиеся в таблице Clients. Выбирая каждое поле и переходя в «Object Inspector», установим свойства DisplayLabel и DisplayWidth. Повторим эту операцию для оставшихся полей таблицы Clients и всех полей таблицы Phones. После этого перейдем на форму fmClients и дважды щелкнем мышкой на компоненте gdClients. Используя те же приемы работы, что и при редактировании свойств полей в модуле данных, указываем, какие поля необходимо отображать в gdClients. Делаем то же самое и для gdPhones.
Таким же образом мы создаем формы fmDirections и fmTraffic для работы с таблицами БД Directions и Traffic соответственно. Разница лишь в том, что мы будем использовать только один компонент TDBGrid на форму.
Реализация реакции выбора пунктов меню и кнопок панели инструментов. Реализация необходимого функционала дочерних форм
После того, как мы создали все необходимые дочерние окна, необходимо реализовать механизм реакции на выбор пунктов системы меню и нажатие кнопок панели инструментов главного окна и отображения дочерних окон. Т. к. при создании панели инструментов мы связали кнопки с соответствующими пунктами меню, то достаточно реализовать обработчики выбора пунктов меню, при нажатии на кнопки панели инструментов эти обработчики будут автоматически вызываться.
Первое, что мы сделаем, это реализуем реакцию на выход из приложения. Для этого откроем окно генератора меню, и дважды щелкнем на пункте меню «Работа» \ «Выход». При этом Delphi сгенерит обработчик на событие OnClick данного пункта меню . В этом обработчике введем код закрытия главного окна и прекращения приложения:
procedure TfmMain.mnExitClick(Sender: TObject);
begin
// -- закрытие приложения
Close;
Application.Terminate;
end;
Следующим этапом будет реализация обработчика на пункт меню «Работа» \ «Клиенты и телефоны» и реализация всех процедур, необходимых для корректного отображения формы fmClients. В этом обработчике наберем код вызова процедуры Clients, которая будет находиться в модуле uClients. Чтобы при линковании проекта модуль главной формы приложения мог найти этот модуль его необходимо в нем прописать с помощью пункта меню «File»\ «Use Unit». Перейдем в модуль uClients и в interface - части этого модуля опишем процедуру Clients, а в implementation - части реализуем эту процедуру следующим образом:
procedure Clients;
begin
if not Assigned (fmClients) then fmClients:=TfmClients.Create (fmMain);
fmClients.Show;
end;
После того, как форма создана, но еще до ее отображения нам необходимо активизировать соответствующие таблицы и активизировать необходимые пункты меню и кнопки панели инструментов. Таблицы активизируются в обработчике события создания формы OnCreate. В этом же обработчике мы реализуем отображение информации о количестве номеров телефонов у текущего клиента - вызов метода GetPhoneCount. Но информация о количестве телефонов у клиента должна обновляться всякий раз, когда смещается указатель записи в таблице tbClients. Для решения этой задачи у набора данных имеется специальное событие - AfterScroll. Мы просто назначаем этому событию метод GetPhoneCount. Ниже приведен код обработчика события OnCreate:
procedure TfmClients.FormCreate(Sender: TObject);
begin
inherited;
with dmMain do begin
tbClients.Active:=True;
tbPhones.Active:=True;
tbClients.AfterScroll:=GetPhoneCount;
end;
GetPhoneCount (nil);
end;
Метод формы GetPhoneCount очень прост :
procedure TfmClients.GetPhoneCount (DataSet: TDataSet);
begin
pnPhones. Caption: = 'Телефонов: '+IntToStr (dmMain. tbPhones. RecordCount);
end;
Пункты меню и кнопки панели инструментов активизируются в обработчике события OnActivate. Это событие «срабатывает», когда данная форма получает фокус ввода:
procedure TfmClients.FormActivate(Sender: TObject);
begin
inherited;
with fmMain do begin
mnAdd.Enabled:=True;
mnEdit.Enabled:=True;
mnDelete.Enabled:=True;
btAdd.Enabled:=True;
btEdit.Enabled:=True;
btDelete.Enabled:=True;
end;
Когда форма теряет фокус ввода соответствующие пункты меню и кнопки панели инструментов должны деактивизироваться. Это реализуется в обработчике события OnDeativate. Код этого обработчика подобен коду обработчика OnActivate, только свойству Enabled присваивается значение False.
И последнее, что мы сделаем, это реализуем финальные действия, которые должны произойти при закрытии формы. Эти действия будут включать в себя закрытие таблиц БД, строки которых отображаются на форме, и деактивизацию пунктов меню и кнопок панели инструментов. Реализуем обработку события OnClose:
procedure TfmClients.FormClose(Sender: TObject; var Action: TCloseAction);
begin
inherited;
FormDeactivate (Self);
with dmMain do begin
tbClients.Active:=False;
tbPhones.Active:=False;
tbClients.AfterScroll:=nil;
end;
fmClients:=nil;
Повторяем все описанные выше действия для оставшихся двух дочерних форм.
Лабораторная работа
Используя действия, описанные выше, реализуйте приложение, работающее с БД, спроектированной и реализованной в пункте 3.4.3.
6.6 Работа с полями - TField
Применение TField
Компонент TField позволяет обращаться к полям таблиц БД.
Каждый НД - TTable или TQuery - состоит из записей, а те, в свою очередь, состоят из полей. Таким образом, в составе записи имеется минимум одно поле.
Существует 2 способа задания полей для НД.
Первый состоит в том, что после создания НД не предпринимается никаких дополнительных действий по уточнению состава полей. Тогда:
для компонента TTable - будет разрешен доступ ко всем полям, определенным в данный момент в таблице БД, связанной с компонентом TTable;
для компонента TQuery - будет разрешен доступ ко всем полям, указанных в списке возвращаемых полей в операторе SELECT.
К полю в этом случае можно обращаться с помощью метода FieldByName компонентов TTable и TQuery:
function FieldByName (const FieldName: String): TField;
или через свойство Fields [Index], которое возвращает указатель на тип TField.
Второй способ определения состава полей заключается в том, что для данного НД поля, как компоненты TField, добавляются в форму с помощью редактора полей Delphi. Работа с ним объясняется ниже.
К таким полям можно обращаться через его имя, определяемое в свойстве Name компонента TField, соответствующего данному полю.
Если хотя бы для одного поля НД создан с помощью редактора полей компонент TField первый принцип задания состава полей отвергается. В НД будут считаться определенными только те поля, для которых созданы компоненты TField, а иные поля - отвергаться как несуществующие. При обращении к таким полям из НД будет возвращаться ошибка.
Определить во время работы приложения, используются для НД все поля по умолчанию или только их часть, определенная с помощью редактора полей, можно при помощи свойства НД DefaultFields. Значение True указывает, что используются поля по умолчанию; False - что используются поля, определенные с помощью редактора полей.
Если нужно иметь доступ к полю, но не показывать его значений в визуальных компонентах, то можно установить свойство Visible данного поля в значение False.
Использование редактора полей
Для того, чтобы определить один или несколько компонентов TField в проекте, используя второй способ определения состава полей, нужно:
Выбрать необходимый НД (TQuery или TTable), который, как правило, находится в модуле данных;
Дважды щелкнуть по пиктограмме НД, для открытия окна редактора полей;
Нажать правую кнопку мышки и во всплывающем меню выбрать «Add Fields»;
В появившемся списке всех полей НД , выбрать необходимые и нажать кнопку «ОК». Для каждого выбранного поля будет создан компонент, наследуемый от TField, как свойство класса модуля данных;
Если необходимо изменить свойства конкретного поля или написать обработчик для какого-либо события, необходимо в редакторе полей выбрать нужное поле и воспользоваться Object Inspector-ом.
Типы полей. Обращение к полям
Поля в таблицах БД различаются по типу - символьные, числовые, логические, BLOB - поля и т. д.
Компоненты |
Описание |
|
TField |
||
TBLOBField |
Большой двоичный объект |
|
TGraphicField |
Графическое поле (работает с содержимым BLOB - поля как с графическим изображением) |
|
TMemoField |
Мемо - поле (интерпретирует BLOB - поле как большой текст) |
|
TBooleanField |
Логическое поле |
|
TBinaryField |
Нетипизированное двоичное поле |
|
TBytesField |
Поле для хранения байтовых значений фиксированной длины |
|
TVarBytesField |
Поле для хранения байтовых значений переменной длины |
|
TDateTimeField |
Поле для хранения даты и времени |
|
TDateField |
Поле для хранения только даты |
|
TTimeField |
Поле для хранения только времени |
|
TNumericField |
Числовые значения |
|
TBCDField |
BCD - значения |
|
TFloatField |
Значения с плавающей точкой |
|
TCurrencyField |
В том числе в денежном формате |
|
TIntegerField |
Целочисленные значения |
|
TAutoIncField |
Автоинкрементное поле |
|
TSmallIntField |
Короткие целые |
|
TWordField |
Беззнаковое длинное целое |
|
TStringField |
Поле для хранения строковых значений |
Иерархия компонентов полей.
Особенности каждого компонента будут рассматриваться ниже. Здесь рассмотрим общие для все классов свойства, методы и события.
Следует различать обращение к полю и обращение к его значению.
К полю можно обратиться, указав его несколькими способами:
Если поле было создано с помощью редактора полей, к полю можно обратиться с помощью его имени, заданное в свойстве Name.
Используя метод FieldByName НД - function FieldByName (const FieldName: string): TField;
Используя свойство Fields [Index] НД, где Index задает порядковый номер поля НД, начиная с нуля.
Используя свойство НД FieldValues [const FieldName: string]. Это свойство позволяет обратиться к полю через его имя, например: tbClients.FieldValues ['Name']:='ТОО IT Development';
Наиболее предпочтительным способом обращения к полю является использование метода FieldByName.
Обращение к значениям полей. Свойства Value и AsXXX
К значению поля можно обратиться при помощи свойств Value и AsXXX компонента TField.
Свойство Value возвращает значения следующих типов:
property Value: Variant; //---любой тип
property Value: string; //---TStringField, TBLOBField
property Value: LongInt; //---TSmallInt, TWordField
property Value: Double; //---TBCDField, TCurrencyField, TFloatField
property Value: Boolean; //---TBooleanField
property Value: TdateTime; //---TDateTime, TDate, TTime
В качестве примера рассмотрим вычисление стоимости текущего разговора. Будем считать, что указатели записей во всех НД установлены на необходимых для вычисления записях:
var nCost: Double;
nCost:=tbTraffic.FieldByName ('Duration').Value/60*
tbDirections.FieldByName ('Price').Value;
Свойства вида AsXXX служат для обращения к значениям полей и явного приведения их типов. Существуют следующие свойства:
property AsBoolean: Boolean;
property AsCurrency: Currency;
property AsDateTime: TDateTime;
property AsFloat: Double;
property AsInteger: Integer;
property AsString: string;
property AsVariant: Variant;
Каждое из этих свойств приводит значение поля к соответствующему типу данных. Например, если необходимо вывести в метку lbPrice (компонент TLabel) значение цены за минуту некоторого направления, то можно это сделать так:
lbPrice.Caption:=tbDirections.FieldByName ('Price').AsString;
Для того, чтобы проводить такие преобразования, необходима совместимость типов полей. В таблице на рис. 3.6.2 показана совместимость значений полей разных типов. Обозначения в таблице:
= - типы равнозначны;
+ - преобразование возможно;
+RI - преобразование возможно, округление до ближайшего целого;
? - преобразование происходит, если возможно (часто зависит от значения свойства DisplayFormat);
X - преобразование не разрешено;
memo - имеет значение memo - поля.
Тип поля |
AsString |
AsInteger |
AsFloat |
AsDateTime |
AsBoolean |
|
TStringField |
= |
? |
? |
? |
? |
|
TIntegerField |
+ |
= |
+ |
X |
X |
|
TSmallIntField |
+ |
= |
+ |
X |
X |
|
TWordField |
+ |
= |
+ |
X |
X |
|
TFloatField |
+ |
+RI |
= |
X |
X |
|
TCurrencyField |
+ |
+RI |
= |
X |
X |
|
TDateTimeField |
+ |
X |
+1 |
= |
X |
|
TDateField |
? |
X |
+1 |
= |
X |
|
TTimeField |
? |
X |
+2 |
= |
X |
|
TBooleanField |
+3 |
X |
X |
X |
= |
Таблица совместимости значений полей разных типов
1 - преобразование даты к числу дней с 01.01.0001
2 - преобразование времени делением на 24 часа
3 - в строку «True» или «False»
Рассмотрим свойства AsBoolean более подробно:
property AsBoolean: Boolean; - числовые значения приводятся к типу Boolean, если содержат 0 (False) или 1 (True). Символьные значения - если содержат в качестве первого символа «Y», «y», «T», «t», «Yes», «True» преобразуются в True и в False во всех остальных случаях.
Свойство DisplayFormat
Свойство property DisplayFormat: string; применяется для форматирования полей классов TDateTimeField, TIntegerField и т. д.
приведена таблица спецификаторов форматов.
Спецификатор |
Действие |
|
0 |
Число. В позициях нулевых незначащих разрядов будет отображаться ноль |
|
# |
Число. В позициях нулевых незначащих разрядов ничего не отображается |
|
. |
Десятичная точка. Разделяет целую и дробную часть числа. |
|
, |
Разделитель тысяч. Каждая группа чисел из 3 разрядов в целой части, начиная с младших разрядов, отделяются друг от друга запятой |
|
E+ |
Научный формат действительных чисел |
|
“xx” или `xx' |
Символы внутри кавычек или апострофах не форматируются и выводятся как есть |
Таблица спецификаторов форматов.
Пример. Если мы присвоим свойству DisplayFormat поля tbDirectionsPrice значение `######0.00“ тенге”', то для цены 123.5 тенге значение поля будет сформатировано в строку - «123.50».
В процессе работы приложения вы можете динамически изменять формат отображения любого доступного поля НД. Для этого вы просто присваиваете соответствующее значение свойству DisplayFormat.
Свойство IsNull
Свойство property IsNull: Boolean; позволяет во время выполнения приложения проверить поле на содержание в нем пустого значения (null). Если это свойство возвращает True, то поле ничего не содержит.
Вычисляемые поля
Допустим, перед нами встала задача при отображении таблицы БД Traffic динамически вычислять длительность разговоров в минутах, т. е. в компоненте gdTraffic у нас должно появиться поле с заголовком «Дл-ть в мин.». Для решения таких задач, связанных с динамическим вычислением дополнительных столбцов, применяются вычисляемые поля.
Для создания вычисляемого поля используют редактор полей Delphi. Для этого в редакторе полей создается новое поле с помощью выбора пункта всплывающего меню «New Field». Затем в появившемся окне диалога указывается имя поля, его тип и размер для строкового типа. Также данное поле должно быть отмечено как Calculated.
После создания вычисляемого поля необходимо для компонента НД, которому принадлежит это поле реализовать обработчик события OnCalcFields. Это событие возникает каждый раз, когда указатель записи перемещается по записям НД. Кроме того, если свойство НД AutoCalcFields установлено в True, событие OnCalcFields возникает также и при модификации значений невычисляемых полей.
В нашем случае код обработчика события OnCalFields будет выглядеть следующим образом:
procedure TdmMain.tbTrafficCalcFields(DataSet: TDataSet);
begin
tbTrafficMinutes.Value:=DataSet.FieldByName ('Duration').AsInteger/60;
end;
Lookup - поля
Допустим, перед нами, как разработчиками приложения по учету трафика переговоров, встала задача при отображении трафика динамически вычислять стоимость разговора, а также кроме отображения кода направления звонка отображать наименование направления.
Для вычисления значений мы научились применять вычисляемые поля. Но в нашем случае есть проблема, связанная с тем, что цена разговора находится в другой таблице БД - Directions. Следовательно, для вычисления стоимости разговоров нам каким-то образом необходимо иметь в компоненте tbTraffic поле с ценой направления, связанного с одноименным поле в таблице Directions.
Кроме того, для отображения наименования направления необходимо решит ту же задачу.
Для решения проблемы такого вида в Delphi используют, так называемые, lookup - поля. Данный вид полей применяется для таблиц БД, связанных отношениями «один ко многим» или «один к одному».
Для нашего случая создадим сначала lookup - поле с помощью редактора полей для вычисления стоимости. В диалоговом окне создания нового поля введем имя поля - Price, тип - Float. Отмечаем данное поле как Lookup. В списке «DataSet» мы выбираем компонент tbDirections. В списке «Key Fields» мы должны указать поле или набор полей связи таблицы Traffic с таблицей БД Directions. В списке «Lookup Keys» мы выбираем поля таблицы Directions, составляющие первичный ключ. И, наконец, в списке «Result Field» мы указываем поле таблицы Directions, которое должно присутствовать в tbDirections - поле Price.
Теперь мы может создать вычисляемое поле Cost, в обработчике события OnCalcFields НД tbTraffic для которого делать перемножение полей Minutes и Price.
Подобные действия по созданию lookup - поля проводим для отображения наименования направления.
Лабораторная работа
Для своих приложений используйте создание вычисляемых и lookup - полей.
6.7 Принципы работы с наборами данных (НД)
Понятие НД: TTable и TQuery
Под набором данных в Delphi понимается группа записей из одной или нескольких таблиц БД, доступная для использования через компоненты TTable и TQuery. Как НД, рассматривается компонент TStoredProc, хранимая процедура в серверной БД. Но этот компонент применим только для серверных СУБД, поэтому мы сосредоточимся на изучении, в основном только, первых двух из рассматриваемых компонентов.
TTable и TQuery наследуются от компонента TDBDataSet, которые определяет общие свойства, методы и события для этих компонентов. Именно эти свойства, методы и события рассматриваются в этом разделе. При этом TTable и TQuery называются одним общим термином - НД.
TTable и TQuery также имеют присущие только им свойства, методы и события. Их мы будем рассматривать отдельно в дальнейшем.
Перед рассмотрением общих возможностей работы с НД разберем общие черты и отличия TTable и TQuery.
TTable содержит подмножество записей, источником которых может служить только одна таблица. Если таблица не отфильтрована, т. е. не используется условия фильтрования записей, то TTable содержит полное множество всех записей таблицы БД.
В отличие от TTable, TQuery представляет собой запрос или иную команду SQL (select, update, insert, delete ) к таблицам БД. Поэтому TQuery содержит записи, источником которых могут являться несколько таблиц БД, а также агрегированные значения (такие как сумма, минимум, максимум и т. д.), рассчитанные по полям одной или нескольких таблиц. Например, пусть нам необходимо отобразить информацию о трафике, который был сформирован по направлению США с рассчитанной стоимостью и продолжительностью в минутах. Для выборки информации в таком виде необходимо либо использовать фильтрованную таблицу с lookup - полями, либо, что гораздо удобнее и производительнее, использовать TQuery со следующим запросом:
select A.PhoneNum, A.CallDateTime, A.DirectionId, A.Destination, A.Duration/60,
A.Duration/60*B.Price
from Traffic A, Directions B
where A.DirectionId=B.Id and B.Id='8101'
Навигация по НД
Общие положения. Существует 2 способа работы с записями НД.
Способ, основанный на использовании операторов SQL, предполагает оперирование с группами записей.
Второй способ состоит в оперировании единичными записями. Если необходимо изменить, добавить или удалить группу записей, необходимая операция выполняется для каждой записи отдельно. Для этого необходимые записи нужно отыскать в НД, для чего применяются навигационные методы.
Навигационные методы неразрывно связаны с понятием указателя текущей записи. Текущая запись - та запись, над которой в данный момент можно выполнять различные действия.
Метод |
Описание |
|
procedure First |
Устанавливает указатель записи на 1 запись НД |
|
procedure Last |
Устанавливает указатель записи на последнюю запись НД |
|
procedure Next |
Перемещает указатель записи на следующую запись НД |
|
procedure Prior |
Перемещает указатель записи на предыдущую запись НД |
|
function MoveBy (iOffset: Integer): Inrteger |
Перемещает указатель на iOffset записей к концу НД (iOffset>0) или к началу НД (iOffset<0) |
Таблица методов для изменения положения указателя записей НД
Определения начала и конца НД. Свойство property BOF: Boolean возвращает True, если указатель записи установлен на первую запись НД.
Свойство property EOF: Boolean возвращает True, если указатель записи установлен на последнюю запись НД.
Перемещения по НД. Рассмотрим 2 классических приема обхода всех записей НД: от первой записи к последней и от последней к первой.
Обход записей набора данных tbClients от первой записи к последней:
with dmMain.tbClients do begin
First;
while not EOF do begin
{какие-либо действия}
Next;
end;
Обход записей набора данных tbClients от последней записи к первой:
with dmMain.tbClients do begin
Last;
while not BOF do begin
{какие-либо действия}
Prior;
end;
Понятие первой и последней записей имеет чисто логический смысл. Порядок обхода записей зависит от текущего индекса или фильтрации. Например, если записи в НД tbTraffic отсортированы по возрастанию телефонов, то вызов метода tbTraffic.First приведет к установки указателя на запись с минимальным номером телефона, а если сортировка произведена по возрастанию по полю CallDateTime, то вызов того же метода установит указатель на самую раннюю запись трафика.
В качестве примера для понимания изменения порядка следования строк реализуем следующую функциональность. По умолчанию, при отображении записи в таблице Traffic отсортированы в порядке возрастания № телефонов и дат разговоров, т.к. эти поля являются первичным ключом. Дадим возможность пользователю нашего приложения менять сортировку по следующим полям: PhoneNum, CallDateTime; DirectionId; Duration. Для изменения сортировки пользователь должен щелкнуть левой кнопкой мышки по заголовку соответствующего столбца.
Для того, чтобы можно было менять сортировку мы должны с помощью утилиты DBD назначить индексы на соответствующие столбцы, кроме первичного ключа.
При щелчке левой кнопкой мышки на заголовке столбца вызывается обработчик события OnTitleClick компонента gdTraffic. Его-то мы и обработаем следующим образом:
procedure TfmTraffic.gdDirectionsTitleClick(Column: TColumn);
var lIndex: Boolean;
begin
lIndex:=False;
with dmMain.tbTraffic do begin
if Column.FieldName='PhoneNum' then begin
IndexName:='';
lIndex:=True;
end;
if Column.FieldName='DirectionId' then begin
IndexName:='DirectionId';
lIndex:=True;
end;
if Column.FieldName='Duration' then begin
IndexName:='IndDuration';
lIndex:=True;
end;
if lIndex then First;
end;
Здесь мы определяем на каком столбце щелкнул пользователь и если по этому столбцу есть индекс, мы его активизируем (свойство НД - IndexName). Заметьте, что для упорядочивагия по первичному ключу индекс не указывается - это режим сортировки по умолчанию для СУБД Paradox. Если индекс был установлен, то переводим указатель записей на первую запись НД.
Отключение визуализации НД. При частом перемещении указателя записей, например при обходе всех записей НД, возникает неприятный визуальный эффект в компоненте TDBGrid - отображение перемещения указателя. Кроме того, это сильно замедляет процесс обхода, что ведет к снижению производительности алгоритма. Чтобы избавиться от этого эффекта, необходимо временно отключать визуальное отображение при работе с НД.
Для временного отключения/включения визуализации существуют методы НД:
procedure DisableControls;
procedure EnableControls;
Внесение изменений в НД
Внесение изменений в текущую запись. Чтобы изменить текущую запись НД, этот НД нужно перевести в состояние изменения методом Edit, затем произвести изменение значения одного или нескольких полей записи и использовать метод Post для фиксации изменений в таблице.
Для отказа от сделанных изменений используется метод Cancel.
Для того, чтобы можно было сделать изменения, у НД должно быть установлено свойство ReadOnly в значение False.
Метод Post вызывается также автоматически, если указатель записи перемещается на другую запись.
Приведем пример изменения наименования абонента:
with dmMain.tbClients do begin
Edit;
FieldByName ('Name').AsString:='British Airways';
Post;
end;
Добавление записи. Чтобы добавить новую запись в НД, нужно вызвать метод Append для перевода НД в режим вставки. Затем производится присваивание значений одному или нескольким полям записи, после чего вызывается метод Post для фиксации изменений или Cancel - для отката изменений.
Для вставки записи необходимо. Чтобы свойство ReadOnly было в значении True.
Пример добавления клиента в таблицу Clients:
with dmMain.tbClients do begin
Insert;
FieldByName ('Name').AsString:='Coca Cola';
FieldByName ('Address').AsString:='…';
Post;
end;
Фиксация или отмена изменений. Как отмечалось выше для фиксации изменений, сделанных в полях текущей записи, используется метод Post. Данный метод может завершаться неудачно, если:
поле обязательного заполнения содержит пустое значение;
возникла ситуация дублирования первичного ключа.
Ваше приложение должно быть готово к таким ситуациям. Например, каждый вызов метода Post. Должен быть снабжен обработчиком исключительных ситуаций:
try
Post;
Exception
Application.MessageBox ('Фиксация изменений невозможна!', nil, 0);
Cancel;
end;
Метод Cancel отменяет все изменения, сделанные в записи. Если запись добавлялась в НД, запись в НД не добавляется.
Удаление записей. Удаление текущей записи НД реализуется методом Delete: dmMain.tbClients.Delete. Чтобы удалить все записи можно воспользоваться методом EmptyTable.
Закладки
Подобно тому. Как в книге нужную страницу можно заложить закладкой и впоследствии быстро найти эту страницу, в НД аналогичные действия можно осуществить для записи. Для этой цели НД обладает следующими методами:
function GetBookmark: TBoolmark; - создает объект - закладку для текущей записи ми возвращает ссылку на него;
procedure GotoBookmark (Bookmark: TBookmark); - перемещает указатель на запись, определяемую закладкой Bookmark;
procedure FreeBookmark (Bookmark: TBookmark); - освобождает ресурсы, выделенные под закладку;
function BookmarkValid (Bookmark: TBookmark): Boolean; - возвращает True, если закладка является корректной, т. е. она указывает на существующую запись НД;
function CompareBookmarks (Bookmark1, Bookmark2: TBookmark): Integer; - возвращает 0 - если закладки ссылаются на одну и ту же запись и 1 - в противном случае.
Поиск записей в НД
Метод Locate.
function Locate (const KeyFields: string; const KeyValues: Variant;
Options: TLocateOptions): Boolean;
Метод Locate ищет первую запись, удовлетворяющую критерию поиска, и, если такая запись найдена, делает ее текущей. В этом случае возвращается True. Если поиск был неуспешен, возвращается False.
Список KeyFields указывает поле или несколько полей, по которым ведется поиск, в виде строкового выражения. В случае нескольких полей поиска их названия разделяются точкой с запятой.
Критерии поиска задаются в вариантном массиве KeyValues так, что i-е значение в KeyValues ставится в соответствие i-му полю в KeyFields.
Options позволяет задать необязательные параметры поиска:
loCaseInsensitive - поиск ведется без учета регистра букв, т. е. строчные они или прописные;
loPartialKey - запись считается удовлетворяющей условию поиска, если она содержит часть поискового контекста, т. е., например, удовлетворяющими условию поиска «ТОО» будут все клиенты, у которых наименование начинается с этой аббревиатуры.
В качестве примера, пусть на необходимо найти первый разговор клиента «ТОО IT Development» (значение поля Id=1) с США. Тогда необходимо реализовать следующий код:
if Locate ('Clientid;DirectionId', VarArrayOf ([1, '8101']), []) then …;
Использование методов FindFirst, FindLast, FindNext, FindPrior. Известно, что НД может быть отфильтрован с использованием свойства Filtered. Условие фильтрации задается свойством Filter или описывается в обработчике события OnFilterRecord. Свойство Filtered указывает выполнять фильтрацию данных (True) или нет (False). Если установлено False, показываются все записи НД. Более подробно фильтрация рассматривается ниже.
Для НД, в котором определены условия фильтрации, но сама фильтрация не активизирована, Delphi предоставляет возможность навигации только между записями , удовлетворяющими условиям фильтрации.
Для этой цели используются методы FindFirst, FindLast, FindNext, FindPrior.
Условия фильтрации устанавливают такими, чтобы они соответствовали критериям поиска записей.
В случае, если искомая запись найдена, данные методы возвращают True, в противном случае - False.
function FindFirst: Boolean; - переходит на первую запись, удовлетворяющую фильтру;
function FindLast: Boolean; - переходит на последнюю запись, удовлетворяющую фильтру;
function FindNext: Boolean; - переходит на следующую запись, удовлетворяющую фильтру;
function FindPrior: Boolean; - переходит на предыдущую запись, удовлетворяющую фильтру;
property Found: Boolean; - возвращает True, если последнее обращение к любому из вышеописанных методов привело к нахождению записи.
Фильтрация записей в НД
Фильтрация записей позволяет отображать в визуальных компонентах только те строки таблицы БД, которые удовлетворяют критерию поиска.
Свойство Filtered.
property Filtered: Boolean;
Свойство Filtered, установленное в True, инициирует фильтрацию, условие которой задано или в обработчике события OnFilterRecord, или присвоено как строковое значение свойству Filter. Если установлены разные условия фильтрации в обработчике события OnFilterRecord и свойстве Filter, то выполняются оба условия.
Установка свойства Filtered в значение False приведет к отмене фильтрации.
Событие OnFilterRecord.
property OnFilterRecord: TfilterRecordEvent;
Событие OnFilterRecord возникает, когда свойство Filtered устанавливается в True. Обработчик события имеет 2 параметра: ссылка на фильтруемый НД и переменная Accept, установка которой определяет, попадет ли текущая запись в результирующее множество. В условие фильтрации могут входить любые поля НД.
В качестве примера, пусть необходимо отображать записи таблицы Traffic, которые относятся к разговорам с США с телефона 506558, тогда код фильтрации будет выглядеть следующим образом:
procedure TdmMain.tbTrafficFilterRecord (DataSet: TDataSet; var Accept: Boolean);
begin
Accept:=(DataSet.FieldByName ('PhoneNum').AsString='506558') and
(DataSet.FieldByName ('DirectionId').AsString='8101');
end;
Свойство Filter.
property Filter: string;
Свойство Filter позволяет указать условия фильтрации. В этом случае НД будет отфильтрован, как только его свойство Filtered станет равным True. В качестве параметров можно указывать имена полей и литералы. Переменные программы указывать нельзя.
Можно применять операторы сравнения: <, >, <=, >=, =< <>, а также использовать логические операции: and, or, not.
В качестве примера, пусть необходимо отображать записи таблицы Traffic, которые относятся к разговорам с США с телефона 506558, тогда код фильтрации будет выглядеть следующим образом:
with dmMain.tbTraffic do begin
Filter:='([PhoneNum]=''506558'') and ([DirectionId]=''8101'')';
Filtered:=True;
end;
Свойство FilterOptions.
property FilterOptions: TFilterOptions;
TFilterOption=(foCaseSensitive, foNoPartialCompare);
TFilterOptions=set of TFilterOption;
Данное свойство позволяет устанавливать режимы фильтрации с использование свойства Filter. По умолчанию, FilterOptions=[]. foCaseSensitive - фильтрация без учета регистра символов, foNoPartialCompare - фильтрация только при точном совпадении.
Лабораторная работа
Выполнить каждое задание.
Реализовать обход записей в прямом и обратном направлении и вывести их количество. Сравнить полученное значение с общим количеством записей в НД.
Повторить задание №1 только задать фильтрацию на НД на 3 полях. Вывести процент записей, которые участвовали в обходах. Повторить данное задание для нескольких комбинаций значений фильтруемых полей.
6.8 Работа с компонентом TTable
Исключительный доступ к таблице БД
Свойство Exclusive дает пользователю исключительный доступ к НД (значение True). Это означает, что никто иной, кроме данного пользователя, не может вносить изменения в НД и, вообще, получить к нему доступ. Установить исключительный доступ можно лишь, когда ни один из пользователей не имеет доступа к НД и тот не активизирован.
Очистка записей таблицы
Метод
procedure EmptyTable;
уничтожает все записи в таблице БД, связанной с данным НД. После этой операции таблица БД будет пустой. Метод применим только в случае исключительного доступа к НД. В противном случае возбуждается исключение, и удаление не будет произведено.
Уничтожение таблицы
Метод
procedure DeleteTable;
физически удаляет таблицу. Метод применим только к закрытым НД.
Создание таблицы
Метод
procedure CreateTable;
создает новую пустую таблицу. Перед созданием новой таблицы для данного компонента TTable необходимо указать:
имя БД - в свойстве DataBaseName;
имя таблицы - в свойстве TableName;
тип таблицы - в свойстве TableType;
описание полей - в свойстве FieldDefs;
описание индексов - в свойстве IndexDefs.
Для добавления описаний полей в свойство FiledDefs оно сначала очищается, а затем для каждого поля информация в FieldDefs заносится методом
procedure Add (const Name: string; DataType: TfieldType; Size Word;
Required: Boolean);
Для добавления описаний индексов в свойство IndexDefs оно сначала очищается, а потом для каждого индекса информация заносится методом
procedure Add (const Name: string; Fields: string; Options: TIndexOptions);
Использование контейнера TDataModule
Компонент класса TDataModule представляет собой контейнер, в который могут быть помещены любые невизуальные компоненты. Как правило, в TDataModule помещают компоненты НД. Создать экземпляр класса TDataModule можно, выбрав пункт меню «File»\ «New Data Module».
Данный компонент является специализированным классом формы, на который можно помещать только невизуальные компоненты.
6.9 Работа с компонентом TQuery
Общие сведения
Компонент TQuery предназначен для:
работы с НД, источником данных для которого являются записи как одной, так и нескольких таблиц БД;
выполнения команд к БД, не возвращающих множества записей (вставка, удаление и изменение записей).
Основные отличия компонента TQuery, возвращающего множество записей, от компонента TTable:
НД, возвращаемый TQuery, может состоять из записей нескольких таблиц, объединенных запросом;
В общем случае НД, возвращаемый TQuery, даже если источником НД служит одна таблица БД, предполагает обращение к подмножеству записей и столбцов, в то время, как TTable, ориентирован на работу со всеми записями и полями и для того, чтобы работать с подмножеством необходимо предпринимать специальные меры.
В качестве команд формирования запросов для TQuery служат операторы языка SQL. Ниже мы обсудим основные его команды.
Соединение компонента TQuery с БД
Для того, чтобы запросы TQuery корректно выполнялись, необходимо указать в некоторых его свойствах параметры соединения с целевой БД.
Свойство property DataBaseName: TFileName позволяет указать, с какой БД будет работать TQuery.
Как правило, в этом свойстве прописывается псевдоним целевой БД.
Как и компонент TTable, связь с визуальными компонентами осуществляется через отдельный компонент TDataSource.
Методы активизации TQuery
Если TQuery возвращает множество записей, например при использовании оператора select языка SQL, то такой компонент активизируется установкой значения True в свойстве Active.
В случае использования операторов insert, update, delete и т. д. записи не возвращаются. Для таких случаев компонент TQuery активизируется вызовом метода procedure ExecSQL;.
Деактивизация компонента производится установкой значения False свойству Active.
Основы языка SQL
Добавление записи. Для добавления записи в таблицу БД служит команда:
insert into <имя таблицы> (<список полей>) values (<список значений>)
где <имя таблицы> - имя любой таблицы БД; <список полей> - список полей таблицы, разделенный запятыми; <список значений> - список значений для полей, перечисленных после имени таблицы, также разделенный запятыми.
Пример добавления записи в таблицу Clients:
insert into Clients (Name, Address) values ('ТОО IT Development', 'площадь Республики, 13, офис 517')
Значение для поля Id не назначается, т. к. это поле является автоинкрементным и СУБД Paradox автоматически присвоит значение данному полю.
Удаление записей. Для удаления записей из таблицы БД служит команда:
delete from <имя таблицы> where <условия удаления>
где <имя таблицы> - имя любой таблицы БД; <условия удаления> - логические выражения, соединенные логическими операциями - and, or и not. Если условия удаления не заданы будут удалены все записи таблицы.
Пример удаления записей из таблицы Directions, у которых нулевая цена за минуту разговора:
delete from Directions where Price=0
Это удаление выполнится только, если в таблице Traffic нет разговоров с удаляемыми кодами направлений. Иначе будет возбуждено исключение. Тогда, если все-таки необходимо удаление, сначала надо удалить соответствующие записи в Traffic. А потом удалять в Directions.
Изменение записей. Для изменения значений полей записей таблицы БД служит команда:
update <имя таблицы> set <список присваиваний> where <условия изменения>
где <имя таблицы> - имя любой таблицы БД; <условия изменения> - логические выражения, соединенные
логическими операциями - and, or и not. Если условия удаления не заданы будут изменены все записи таблицы; <список присваиваний> - список, разделенный запятыми, пар <поле>=<выражение>.
Пример изменения записей таблицы Directions, поднимаем цены за междугородние переговоры на 20%:
update Directions set Price=Price*1.2 where Id like '810%'
В данной команде условие означает, что измененными будут те записи, у которых код направления начинается с подстроки «810».
Выборка всех записей таблицы. Упорядочивание. В общем случае команда выборки данных выглядит следующим образом:
select <список полей> from <список таблиц> where <условия выборки>
group by <список полей группировки> order by <список полей сортировки>
где <список полей> - список, разделенный запятыми, в котором перечисляются поля, значения которых должны быть получены в результате выборки (вместо списка может указываться звездочка, что означает - все поля таблицы); <список таблиц> - список, разделенный запятыми, в котором перечисляются таблицы, участвующие в выборке данных (таблицам могут назначаться псевдонимы); <условия выборки> - то же значение, что и в предыдущих командах; <список полей группировки> - список, разделенный запятыми, в котором перечисляются поля, участвующие в группировке значений (применяется при вычислении агрегированных данных); <список полей сортировки> - список, разделенный запятыми, в котором перечисляются поля, участвующие в сортировке результирующего набора записей.
В качестве примера выберем все записи из таблицы Traffic, отсортированные по коду направления и дате звонка:
select * from Traffic order by DirectionId, CallDateTime
Ограничение выборки. Для ограничения записей в выборки используется where - секция команды запроса.
В качестве примера выберем записи из таблицы Traffic, отсортированные по коду направления и дате звонка, у которых длительность междугороднего разговора больше минуты:
select * from Traffic where (DirectionId not like '810%') and (Duration>60)
order by DirectionId, CallDateTime
Объединение таблиц. Очень часто требуется при запросе данных выбрать значения из, более чем одной, таблиц, связанных отношениями «один ко многим» или «один к одному». Для этого также используется where - секция команды запроса, в которой указываются условия связи таблиц.
В качестве примера выберем записи из таблицы Traffic, отсортированные по коду направления и дате звонка, у которых длительность междугороднего разговора больше минуты, с указанием наименования позвонившего клиента и наименования направления:
select A.PhoneNum, A.ClientId, B.Name, A.CallDateTime, A.DirectionId, C.Name,
A.Duration
from Traffic A, Clients B, Directions C
where A.ClientId=B.Id and A.DirectionId=C.Id and (A.DirectionId not like '810%') and
(A.Duration>60)
order by A.DirectionId, A.CallDateTime
Агрегирование полей. Иногда требуются не детальные данные таблиц, а агрегированные. Например, сумму значений поля всех записей или минимальное/максимальное значение поля. Для таких целей используются, так называемые, групповые функции: Sum, Min, Max, Count и т. д. В качестве аргумента для них указывается имя поля.
В качестве примера посчитаем общую продолжительность разговоров по каждому направлению, отсортированные по общей продолжительности в порядке убывания:
select DirectionId, Sum (Duration) from Traffic
group by DirectionId order by 1 desc
Запросы с параметрами
Определение параметров. Обращение к параметрам. Предположим, в нашем приложении по учету трафика требуется отчет, в котором пользователю выдается информация о количестве разговоров по определенному направлению, причем код направления он вводит сам. Тогда рассмотренные выше запросы нас не устроят, т. к. в них мы явно в команде указывали значения выборки.
Для решения таких задач существуют параметрические запросы, в которых вместо конкретного значения поля можно использовать параметр, которому позже присвоить необходимое значение.
Например, для выборки количества разговоров по определенному направлению, можно использовать следующий запрос:
select Count (Duration) from Traffic where DirectionId=:cDirectionId
где :cDirectionId - параметр, которому можно присваивать любые значения кодов направлений. При это запрос будет выполнять выборку именно по нужному колу направления.
Для присваивания необходимого значения параметру используется метод ParamByName компонента TQuery, который работает подобно методу FieldByName. Для добавления текста запроса в TQuery используется метод Add. Приведем пример. Пусть у нас в приложении определен экземпляр компонента TQuery - qrMain, расположенный в модуле данных dmMain, а код направления пользователь вводит в экземпляр edDirection компонента TEdit, тогда:
with dmMain.qrMain do begin
SQL.Clear; //---очищаем предыдущую команду
//---формируем новую команду
SQL.Add ('select Count (Duration) ');
SQL.Add (' from Traffic ');
SQL.Add (' where DirectionId=:cDirectionId');
//---присваиваем значение параметру
ParamByName ('cDirectionId').AsString:=edDirection.Text;
//---активизируем запрос
Active:=True;
end;
Указание null - значений для параметров. Иногда бывает нужно, чтобы параметр запроса не имел значения. Для этого применяется метод Clear. Например, пользователь желает получить количество локальных разговоров (по городу). Для локальных разговоров характерно отсутствие значения в поле DirectionId. Чтобы получить результат, пользователь должен ввести в edDirection пустую строку, а программа должна проверить этот факт и очистить параметр запроса:
with dmMain.qrMain do begin
SQL.Clear; //---очищаем предыдущую команду
//---формируем новую команду
SQL.Add ('select Count (Duration) ');
SQL.Add (' from Traffic ');
SQL.Add (' where DirectionId=:cDirectionId');
//---присваиваем значение параметру
if edDirection.Text='' then ParamByName ('cDirectionId').Clear
else ParamByName ('cDirectionId').AsString:=edDirection.Text;
//---активизируем запрос
Active:=True;
end;
Пример реализации отчета «Отчет по трафику» с использованием параметрического запроса
Требуется получить отчет, в котором будет посчитана суммарная длительность разговоров и общая сумма по каждому направлению в трафике. Кроме того, должна быть реализована возможность выборки трафика не только по направлениям, но и по телефонам.
При выборе пункта меню приложения «Отчеты»\ «Отчет по трафику» появится диалоговая форма, которая будет определять параметры отчета. Необходимо установить нужные параметры и нажать кнопку «ОК». Будет выполнен запрос, и в новой дочерней форме отобразятся результаты отчета.
Начнем с создания диалогового окна. Причем мы, сначала, создадим общее диалоговое окно, от которого в последствии будем наследовать необходимые нам диалоговые окна.
Данное окно будет содержать два экземпляра компонента TPanel и 2 кнопки - «Запомнить» и «Отмена». Кроме того, добавим к данному окну свойство Status, которое будет определять, в каком статусе находится окно: 1 - добавление записи, 2 - редактирование записи, 3 - запрос на выборку записей. Это свойство будет полезным. Когда мы будем реализовывать возможность добавления, изменения и удаления записей БД.
Для создания диалогового окна выберем пункт меню «File»\ «New Form». Для данной формы присвоим свойству Name значение fmDialog, а свойству BorderStyle значение bsDialog, чтобы у формы появилась рамка, не позволяющая менять размеры, и исчезли кнопки изменения размеров формы. Сохраним полученную диалоговую форму в файле uDialog.pas.
Разместим на форме 2 панели: pnControls, у которой свойству Align присвоено значение alTop, и pnButtons, свойству Align которой присвоено значение alClient.
В центре pnButtons разместим 2 кнопки: btOk с заголовком «Запомнить» и свойством Default равным True (кнопка по умолчанию) и btCancel с заголовком «Отмена», свойством Cancel равным True и ModalResult равным mrCancel (кнопка отмены).
В public - часть описания класса TfmDialog добавим элемент Status типа Byte.
Последнее, что осталось сделать, это переопределить конструктор формы. Добавим в него код, присваивающий значение полю Status:
constructor TfmDialog.Create (AOwner: TComponent; iStatus: Byte);
begin
Status:=iStatus;
inherited Create(AOwner);
end;
Теперь мы можем создать диалоговое окно для запроса параметров отчета, которое будет наследоваться от окна TfmDialog.
Вид диалогового окна запроса параметров отчета.
Приведем назначение каждого управляющего элемента:
edPhoneNum - вводится маска № телефона;
cbDirections - список выбора направления
edMinDuration, edMaxDuration - задают диапазон длительностей разговоров
ckPhones - если установлен, то подсчитывается суммарная продолжительность и стоимость разговоров по № телефонов и направлениям, если не установлен, то подсчитываются значения только по направлениям.
Чтобы нажатие на кнопку «Выполнить» приводило к закрытию диалога, присвоим свойству ModalResult кнопки «Выполнить» значение mrOK.
Реализуем обработчик события OnCreate диалога. В котором у нас будет заполняться раскрывающийся список cbDirections:
Новая дочерняя форма fmTrafficRep является потомком от формы TfmMDIChild и создается таким же образом, как и предыдущие формы. Поэтому подробно на создании этой формы мы останавливаться не будем. Единственный пункт, которому мы уделим внимание, это то, что в качестве источника данных для gdTrafficRep является экземпляр компонента TQuery qrTrafficRep, который должен быть помещен в модуль данных.
Запрограммируем обработчик выбора пункта меню «Отчеты»\ «Отчет по трафику». Код обработчика состоит только в вызове процедуры TrafficRep, расположенной в модуле uTrafficRep дочерней формы fmTrafficRep.
...Подобные документы
Анализ реляционных баз данных и способов манипулирования ими. Основные понятия баз данных, архитектура СУБД, модели данных. Модель сущность-связь, характеристика связей, классификация сущностей, структура первичных и внешних ключей, целостности данных.
курсовая работа [166,6 K], добавлен 18.07.2012Понятие информации, автоматизированных информационных систем и банка данных. Общая характеристика описательной модели предметной области, концептуальной модели и реляционной модели данных. Анализ принципов построения и этапы проектирования базы данных.
курсовая работа [1,7 M], добавлен 18.01.2012Особенности разработки инфологической модели и создание структуры реляционной базы данных. Основы проектирования базы данных. Разработка таблиц, форм, запросов для вывода информации о соответствующей модели. Работа с базами данных и их объектами.
курсовая работа [981,4 K], добавлен 05.11.2011Этапы проектирования концептуальной модели базы данных: определение предметной области, каталогов задач, связей, первичных ключей. Математическое описание доменов и запросов в реляционной форме. Выбор технических средств и реализация программы.
курсовая работа [2,2 M], добавлен 06.02.2010Определенная логическая структура данных, которые хранятся в базе данных. Основные модели данных. Элементы реляционной модели данных. Пример использования внешних ключей. Основные требования, предъявляемые к отношениям реляционной модели данных.
презентация [11,7 K], добавлен 14.10.2013Анализ деятельности гостиницы. Структурный анализ бизнес-процесса на основе IDEF0-модели. Особенности построения инфологической и даталогической модели данных. Аспекты проектирования базы данных гостиницы с использованием программного языка Delphi.
курсовая работа [1,6 M], добавлен 15.02.2014Особенности управления информацией в экономике. Понятие и функции системы управления базами данных, использование стандартного реляционного языка запросов. Средства организации баз данных и работа с ними. Системы управления базами данных в экономике.
контрольная работа [19,9 K], добавлен 16.11.2010Структура, классификация и этапы проектирования баз данных. Системы управления базами данных, их жизненный цикл. Разработка и реализация базы данных в MS Access. Организация входных и выходных данных. Защита данных от внешних угроз. Сведение о программе.
курсовая работа [558,6 K], добавлен 21.06.2012Определение состава таблиц проектируемой реляционной базы данных, их полей и первичных ключей с использованием ER-метода логического проектирования БД. Особенности ER-метода для экономических приложений. Физическое проектирование БД в среде СУБД Access.
курсовая работа [1,7 M], добавлен 14.02.2012Базы данных с двумерными файлами и реляционные системы управления базами данных (СУБД). Создание базы данных и обработка запросов к ним с помощью СУБД. Основные типы баз данных. Базовые понятия реляционных баз данных. Фундаментальные свойства отношений.
реферат [57,1 K], добавлен 20.12.2010Этапы создания централизованных баз данных, создание инфологической и концептуальной модели. Основы проектирования реляционных БД. Таблица метаданных, установление связи между наименованием сущности и наименованием атрибутов; определение ключа атрибута.
лабораторная работа [319,9 K], добавлен 15.12.2009Разработка базы данных с информацией о сотрудниках, товарах, со справочником типов товаров средствами системы управления базами данных MySQL с помощью SQL-запросов. Разработка инфологической модели предметной области. Структура таблиц, полей базы данных.
контрольная работа [648,7 K], добавлен 13.04.2012Основные концепции построения реляционных СУБД, базовые принципы проектирования данных. Базы данных: способы представления и модели. Цели построения инфологического моделирования. Разработка структуры программы. Даталогическая модель, разработка процедур.
курсовая работа [1,7 M], добавлен 11.07.2012Процесс проектирования базы данных на основе принципов нормализации. Применение инфологической модели на втором этапе проектирования. Семантика предметной области в модели базы данных. Оформление, выдача и обмен паспорта. Модель "сущность-связь".
курсовая работа [67,9 K], добавлен 27.02.2009Выбор методологии проектирования и системы управления базами данных. Описание предметной области и проектирование физической структуры базы данных. Реализация проекта в MS SQL Server 2008. Построение инфологической модели. Ограничения целостности связи.
курсовая работа [679,2 K], добавлен 22.01.2013Понятие и внутренняя структура, стадии и объекты процесса проектирования баз данных. Требования, предъявляемые к данному процессу. Ограниченность реляционной модели. Группы CASE-средств. Анализ предметной области: функциональный и объектный подходы.
презентация [114,6 K], добавлен 19.08.2013Цель инфологического моделирования предметной области. Источники данных, базы данных и система управления, разработка модели. Принципы проектирования базы данных, концептуальная, логическая, материальная разработка. Типы сущностей, атрибутов и связей.
курсовая работа [188,6 K], добавлен 15.07.2012Основные понятия реляционной модели данных. Отношение атрибутов внутри модели. Контроль ссылочной целостности (анализ содержимого ключевых полей связанных таблиц). Нормализация отношений реляционной базы данных. Теоретико-множественные операции.
реферат [69,8 K], добавлен 19.12.2011Методика и основные этапы проектирования логической и физической модели базы данных. Реализация спроектированной модели в системе управления базами данных, принципы создания и апробация специального клиентского приложения для работы данной программы.
курсовая работа [1,3 M], добавлен 27.06.2013Последовательность проектирования базы данных для предприятия, занимающегося заготовкой древесины, её переработкой и сбытом готовой продукции: скрипты создания таблиц по типам связей и вторичных индексов, создание первичного и внешнего ключей, листинга.
курсовая работа [743,7 K], добавлен 02.06.2009