Transcript
Page 1: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я РО ССИ Й СК О Й Ф Е Д Е РА Ц И И

В О РО Н Е Ж СК И Й ГО СУ Д А РСТ В Е Н Н Ы Й УН И В Е РСИ Т Е Т

Ф акультет прикладной математики и механики

К а ф едр а т ехн и ческой ки бер н ет и ки и а вт ом а т и ческого р егули р ова н и я

Р удал ев В .Г ., К ры ж ановская Ю .А .

Р азраб о тка п ри л о ж ени й б аз данны х в с реде Delphi. Час ть I.

М етодическое п особие к курсу «Базы данны х и экспертны е системы » для студентов 4 курса д/о и 4 курса в /о

ф акультета П М М

В оронеж , 2002

Page 2: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

2

Преди с л о ви е

Д анное п особие предназначено студентам 4 курса ф акультета прикладной ма-тематики и механики В ГУ . В п особии излагаю тся основы создания прилож е-ний баз данны х в среде Delphi для Windows 9X/NT/2000. Delphi - мощ ная уни-версальная система программирования для Windows на основе язы ка Object Pascal, вклю чаю щ ая в себя средства п оддержки баз данны х (БД ). О сновны м на-правлением использования Delphi является разработка автономны х (переноси-мы х) коммерческих приложений, умею щ их работать как с локальны ми, так и с удаленны ми базами данны х в среде клиент-сервер, создание распределенны х инф ормационны х систем. (Среди ближайш их аналогов и конкурентов Delphi в этой области можно отметить Clarion, С++ Builder, Power Builder и, отчасти, Visual Basic.) Delphi - это инструмент программиста, а не конечного п ользовате-ля. Д ля первоначального изучения СУБД и для реш ения просты х задач п о ав -томатизации оф исны х работ более удобны ми являю тся специализированны е системы интерпретирую щ его типа, например, Microsoft Access или Paradox. Систематизированное излож ение справочной инф ормации не является целью п особия. Е го задача состоит в другом : бы ст р о н а учи т ь студента, независимо от уровня его п одготовки, осн ова м создания программ для баз данны х. В озмож но-сти Delphi труднообозримы . В этих инф ормационны х « зарослях» важ но обозна-чить « тропинку» , п о которой удобно пробираться в п еред, п о мере необходимо-сти отступая в стороны за нов ы ми ф актами. Д ля углубленного изучения материала могут бы ть рекомендованы книги [1-3]. Я зы к SQL прощ е всего освоить п о [4]. В [1,2,5] описана методика проектирова-ния баз данны х с использованием сервера InterBase. Д ля первоначального оз-накомления с Delphi мож но использовать источники [6-9], а такж е методиче-ские указания [10-12]. А бсолю тно необходимы м инструментом при лю бой ра-боте с Delphi является встроенная справочная система. Работа с п особием предполагает знание основ баз данны х и СУБД в рамках курса « Базы данны х и экспертны е системы » , читаемого на 1 семестре 4 курса ф -та П М М , знание основны х конструкций язы ка SQL, умение п ользоваться стандартны ми визуальны ми компонентами Delphi. И злож ение материала осно-в ы вается на Delphi версий 4.0-6.0. Д оп олнительны е справочны е материалы и примеры программ , необходимы е для работы с п особием , находятся на Web-сайте каф едры технической киберне-тики п о адресу www.main.vsu.ru/~pmmtkiar.

Page 3: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

3

М ето ди ка с о здани я п ри л о ж ени й 1.1. Введени е Средства работы с базами данны х в Delphi можно разделить на две груп п ы : • универсальны е утилиты с развиты м п ользовательским интерф ейсом (DataBase

Desktop, ReportSmith, DataBase Explorer, WISQL). • компоненты Delphi для разработки автономны х программ ведения баз данны х. Универсальны е утилиты представляю т собой сильно упрощ енны е варианты обы чны х СУБД с весьма ограниченны ми возмож ностями. П оэтому их целесооб-разно использовать лиш ь в качестве вспомогательного инструмента, например, для создания или изменения структуры базы данны х, отладки запросов и т.д. М ы будем рассматривать только нов ы е специф ичны е для Delphi средства разра-ботки на основе комп онентов . В частности, рассмотрим общ ую методику разра-ботки, использование компонентов доступа к базам данны х и визуальны х компо-нентов создания п ользовательского интерф ейса. П еред началом работы с БД необходимо убедиться, что на ж есткий диск комп ью -тера установлена библиотека BDE (Borland DataBase Engine, процессор баз дан-ны х). Ф айлы BDE записы ваю тся программой инсталляции Delphi. Расположение BDE регистрируется в реестре Windows. BDE реализован в виде динамически за-гружаемы х библиотек (DLL). В BDE входят драйверы низкоуровневого доступа к ф айлам БД разны х ф орматов , драйверы язы ковой п оддерж ки, интерпретаторы SQL и др. И нтерф ейс, образуемы й ф ункциями BDE, известен п од названием IDAPI. BDE являет ся поср едн и ком меж ду пр и лож ен и ем и БД, освобож даю щ им прилож ение от многих деталей доступа к ф айлам . К онечную реализацию лю бы х действий с БД берет на себя драйвер BDE. П риложения баз данны х строятся на основе компонентов доступа к БД . BDE п од-держивает работу с ф айлами ф орматов Paradox (*.db), dBase (*.dbf), ASCII, FoxPro, Access. К роме того, BDE может использоваться для доступа к локальны м и уда-ленны м SQL-серверам InterBase, Oracle, Informix и др. А рхитектура BDE откры та и может бы ть дополнена новы ми драйверами. П рограммны й пакет Delphi 5 в стандартной п оставке содержит также Borland SQL Server – InterBase 5, которы й п озволяет создавать системы с архитектурой кли-ент/сервер на отдельном персональном компью тере, что особенно п олезно при от-ладке. П ри работе с BDE требуется создавать алиасы . Али а с (Alias, псевдоним) - услов -ное обозначение специф икации каталога, где находятся ф айлы БД . Например, при установке Delphi автоматически создается алиас DBDEMOS для обозначения ка-талога PROGRAM FILES\COMMON FILES\BORLAND SHARED\DATA\, где хра-нятся ф айлы демонстрационны х и учебны х баз данны х. Рекомендуется в про-граммах использовать именно алиасы , а не конкретны е имена каталогов . В этом случае программы приобретаю т доп олнительную гибкость: при изменении место-п олож ения ф айлов нет необходимости переделы вать программу, а достаточно пе-реопределить псевдоним с п омощ ью , например, утилиты DB Explorer или с ис-

Page 4: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

4

п ользованием BDE Administrator. В се алиасы и другие параметры и настройки BDE регистрирую тся в конф игурационном ф айле idapi.cfg. П ри работе в среде Windows NT/2000 ф айл idapi.cfg долж ен находиться на общ едоступном сетевом или локальном диске и бы ть доступен для изменения всеми п ользователями. Д альнейш ее излож ение ориентировано на использование таблиц Paradox и Inter-Base. Каждая таблица ф ормата Paradox хранится в отдельном ф айле (*.db), все таблицы СУБД InterBase хранятся в одном ф айле *.gdb. Создание структуры таблицы и ее заполнение инф ормацией может в ы п олняться несколькими способами: специализированны ми СУБД типа Paradox или FoxPro, п оддерживаю щ ими требуемы й ф ормат данны х, утилитами Data Base Desktop (DBD) или DB Explorer, с п омощ ью компонентов Delphi, с п омощ ью InterBase Windows ISQL. Н еобходимо учиты вать, что DBD 1) плохо работает с кириллическими ш риф тами и 2) слабо использует в озмож ности InterBase. П оэтому осн овн ое н а зн а чен и е DBD – созда н и е и ли и змен ен и е ст р укт у р ы локальны х таблиц , индексов и других мета-данны х. Утилита DB Explorer (другое название SQL Explorer) свободна от этих недостатков и может применяться для ввода и н ф ор м а ци и и от ла дки SQL-за пр осов. О собенно удобна она при работе с InterBase, т.к. п озволяет создавать и изменять метаданны е InterBase, в том числе структуру таблиц . (О днако и у DB Explorer приготовлены « сю рпризы » для п ользователя.) П ри работе с InterBase п олезна утилита Windows ISQL, п озволяю щ ая создавать ф айлы и объ екты баз данны х (таблицы , первичны е клю чи, триггеры , просмотры , хранимы е процедуры и др.).

1.2. Ос но вны е ко м п о ненты Среда Delphi предоставляет п ользователю компоненты , п озволяю щ ие п олучить доступ к БД и осущ ествлять их редактирование. В палитре компонентов присутст-вую т 4 страницы с компонентами БД : Data Access (для доступа к БД ), Data Con-trols (ее компоненты аналогичны компонентам страниц Standard и Additional, но размещ енны е здесь компоненты имею т связь с п олями таблиц БД ), Midas (для создания многоуровнев ы х прилож ений БД ), InterBase (здесь расположены компо-ненты , обеспечиваю щ ие прямое п одклю чение к серверу InterBase без использова-ния дополнительны х механизмов , п одобны х BDE). О граничимся рассмотрением первы х двух страниц . 1.2.1. Страни ц а DataAccess На данной странице располож ены компоненты , которы е в о время работы прило-ж ения являю тся невидимы ми, т.е. невизуальны е компоненты . О ни не имею т свойств , относящ ихся к их внеш нему виду и п олож ению на ф орме. Е динственная ф ункция комп онентов доступа к данны м является обеспечение работоспособности компонентов интерактивного управления данны ми.

Page 5: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

5

И мя Назначение DataSource И сточник данны х. Служит связую щ им звеном меж ду комп онен-

тами доступа к данны м и компонентами отображения данны х. Table Т аблица. Служит мощ ны м средством доступа к ф айлам баз дан-

ны х (таблицам). Query Запрос. О сущ ествляет в ы борку данны х из одной или нескольких

таблиц с п омощ ью язы ка запросов SQL. StoredProc Хранимая процедура. О беспечивает доступ к процедурам , распо-

лож енны м на сервере баз данны х, таком, как InterBase, Oracle, MS SQL Server и т.п .

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

Session Содержит инф ормацию о текущ ем сеансе работы с базой данны х. BatchMove П акетная пересы лка. И спользуется для копирования записей и

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

UpdateSQL Этот комп онент используется для редактирования данны х, п олу-ченны х с п омощ ью сложны х SQL-запросов .

NestedTa-ble

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

1.2.2. Страни ц а DataControls И мя Назначение DBGrid Т аблица БД . И сп ользует табличную ф орму для визуализации и

редактирования данны х DbNavigator Навигатор БД . О блегчает перемещ ение п о записям набора

данны х и операции вставки, удаления и редактирования запи-сей.

DBText И спользуется для отображения (но не изменения) текущ их тек-стовы х п олей набора данны х.

DBEdit П редназначен для отображения и изменения текстов ы х п олей набора данны х.

DBMemo М ногострочны й текстов ы й редактор. С его п омощ ью отобра-жаю тся и изменяю тся многострочны е текстовы е п оля (Memo).

DBImage П редназначен для отображения и редактирования хранящ ихся в БД граф ических изображений.

DBListBox Список в ы бора. П редназначен для отображения текущ его зна-чения текстового п оля БД , а такж е занесения в него одного из возмож ны х значений, содержащ ихся в списке.

DBComboBox Редактируемы й список в ы бора. П одобен компоненту Com-boBox страницы Standard, но обслуживает текстовое п оле БД .

DBCheckBox В ы клю чатель. О бслуживает логическое п оле БД . DBRadioGoup Груп па переклю чателей. Служит для отображения состояния

или в ы бора одного из в заимоисклю чаю щ их значений п оля БД .

Page 6: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

6

DBLookU-pListBox

Список в ы бора. О тличается от DBListBox тем , что элементы списка заполняю тся значениями, в зяты ми из п олей другого на-бора данны х, в то время как DBListBox ф ормируется произ-в ольны ми значениями.

DBLokUp-ComboBox

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

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

DBCtrlGrid П оказы вает содержимое нескольких записей одновременно DBChart Строит граф ики п о данны м , находящ имся в наборе данны х

1.2.3. М и ни мал ьны й наб о р ко м п о нент дл я п ри л о ж ени я с БД Л ю бое прилож ение, работаю щ ее с БД , должно содержать в своем составе, как ми-нимум , три компонента. В о-первы х, компонент для связи с процессором баз дан-ны х и через него с ф изическими таблицами. Это мож ет бы ть компонент TTable (работа с таблицами БД ), TQuery (в ы п олнение SQL-запросов к БД ) или TStored-Proc (в ы п олнение хранимы х на сервере БД процедур). В о-вторы х, компонент TDataSource, соединяю щ ий передаваемы е компонентами TTable или TQuery на-боры данны х (таблицы и запросы ) с визуальны ми компонентами п ользовательско-го интерф ейса. В -третьих, визуальны е компоненты для создания такого интерф ей-са, отображаю щ ие наборы данны х различны ми способами (в виде таблиц , экран-ны х ф орм и др., п о в ы бору п ользователя). В простейш ем случае использую тся три компонента TTable, TDataSource и TDBGrid. Рассмотрим методику их использования. К омпонент TTable описы вает логическую виртуальную таблицу - образ ф изиче-ской таблицы (ф айла данны х). Сейчас перечислим только осн овн ы е, всегда ис-п ользуемы е, свойст ва TTable, доступны е через инспектор объ ектов : • DataBaseName, тип String - содержит либо алиас базы данны х, либо п олную специф икацию каталога, где находятся ф айлы БД .

• TableName: TFileName - имя таблицы . Эти два свойства предназначены для привязки TTable к ф изической таблице через BDE.

• Name - имя экземпляра компонента в программе. П о умолчанию имеет значе-ние Table1.

• Active, тип Boolean - установка Active в True откры вает таблицу и делает ее дос-тупной для просмотра. П о умолчанию - False.

В аж нейш ие дополн и т ельн ы е свойст ва : • IndexName: String - имя активного вторичного индекса, • IndexFieldNames: String - клю чевое п оле активного индекса. П римечания. 1. Эти два свойства в заимоисклю чаю щ и: для упорядочения таблицы следует

указы вать либо одно, либо другое.

Page 7: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

7

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

3. В IndexName указы вается имя вторичного индекса, а в IndexFieldNames - клю чевы е п оля, как первичного, так и вторичного индексов .

4. Е сли индекс является составны м , то в свойстве IndexFieldNames перечисля-ю тся через точку с запятой п оля, из которы х он состоит.

5. В инспекторе объ ектов значения свойства в ы бираю тся с п омощ ью комби-нированного списка, в котором для каждой таблицы перечислены все доступны е индексы . • MasterSource: TDataSource - содержит имя компонента TDataSource, описы -ваю щ его главную таблицу для данной таблицы .

• MasterFields: String - имя п оля, п о которому устанавливается связь с главной таблицей.

• Filter: String - логическое условие ф ильтрации записей при просмотре. • Filtered: Boolean - установка в True активизирует ф ильтр. Значение п о умолча-нию – False.

П осле п омещ ения компонентов на ф орме следует установить свойства объ екта TTable (DataBaseName и TableName), связы ваю щ их его с реальной таблицей. Следую щ ий этап - связы вание объ екта TDataSource c объ ектом TTable. Д ля этого надо указать в его свойстве DataSet: TDataSet имя (значение свойства Name) эк-земпляра TTable. Задача компонента TDBGrid (« сетка данны х» ) - отображение и редактирование данны х на экране в табличном виде. Ч тобы связать DBGrid с данны ми, надо ука-зать в его свойстве DataSource имя комп онента TDataSource, через которы й пере-даю тся данны е. Благодаря использованию комп онента TDataSource компонент TDBGrid становит-ся более специализированны м , а следовательно, более просты м и удобны м . Е го задача - только визуальное представление данны х. TDBGrid не зависит ни от ф ор-мата ф айлов , ни от имени конкретной таблицы (его « знает» Table), ни от конкрет-ного типа набора данны х - таблицы или запроса.

Лабораторная работа № 1. Ф орма для работы с одной таблицей.

1. О ткройте новы й проект с пустой ф ормой. Разместите на ф орме компоненты TTable и TDataSource. И х мож но найти на странице Data Access палитры компо-нентов . Это - невизуальны е компоненты : на ф орме они изобразятся в виде пикто-грамм , а во время в ы п олнения видны не будут.

2. В ы берите компонент Table1 и откройте список псевдонимов в свойстве Da-taBaseName. Установите псевдоним DBDemos.

3. В ведите имя таблицы TableName из DBDemos. Е сли псевдоним бы л задан правильно, то в списке в озмож ны х значений свойства TableName п оявятся имена всех таблиц из данного каталога. В ы берите нужную , например, country.db (стати-стические данны е о государствах американского континента).

4. В ы берите компонент DataSource1. Свяжите его с Table1, указав имя Table1 в свойстве DataSet.

Page 8: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

8

5. Разместите комп онент TDBGrid (страница Data Control палитры компонен-тов ). Свяжите его с DataSource1, указав имя DataSource1 в свойстве DataSource. П равильность связы вания компонентов проверьте п о рис.1.

6. Установите свойство Active объ екта Table1 в True. Т аблица откроется и ее содержимое отобразится в сетке данны х (DBGrid).

7. О ткомпилируйте и в ы п олните прилож ение. 8. Установите Active в False, а в обработчик собы тия создания ф ормы OnCre-

ate вставьте Table1.Open. Т еперь таблица откроется только в о время в ы п олнения прилож ения. Ч тобы это проверить, п овторите ш аг 8.

Рис. 1

Ч асто бы вает удобно просматривать и редактировать таблицу в виде нескольких строк, каждая из которы х отображает одно п оле текущ ей записи. Д ля этой цели предназначен компонент TDBEdit (страница Data Control). Н а ф орме следует раз-местить столько объ ектов TDBEdit, сколько п олей В ы хотите просматривать. Эк-земпляр связы вается с п олем с п омощ ью двух свойств : DataSource (здесь указы ва-ется экземпляр объ екта-источника данны х) и DataField (указы вается имя просмат-риваемого п оля). Д ля отображения граф ических п олей (типа Graphics, Blob) и текстовы х п олей (ти-па Memo) представлены визуальны е компоненты TDBImage и TDBMemo, соот-ветственно. П еремещ ение п о записям таблицы удобно организовать с п омощ ью компонента TDBNavigator. В неш ний вид этого визуального компонента напоминает панель управления плеера. В частности, здесь присутствую т кнопки перехода на следую -щ ую и преды дущ ую записи, на первую и п оследню ю записи, вставки новой запи-си и др. В се названны е комп оненты связы ваю тся с набором данны х через свои свойства DataSource и DataField.

Page 9: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

9

Лабораторная работа № 2 (самостоятельная) Н апиш ите прилож ение для просмотра таблицы biolife.db, содержащ ей текстовы е и граф ические данны е. В место TDBGrid используйте TDBEdit, TDBImage, TDBMemo и TDBNavigator. Д ля идентиф икации п олей перед кажды м визуальны м комп онентом п оместите объ ект TLabel с п одписью . П римерны й ре-зультат работы прилож ения должен иметь вид рис.2.

Рис.2

1.3. Ус тано вл ени е с вязей меж ду таб л и ц ам и Создание односвязной ф ормы . О дносвязная ф орма содержит две таблицы - глав -ную и п одчиненную , которы е связаны между собой через одинаковы е п оля. П од-чиненная таблица обязательно должна бы ть проиндексирована п о связую щ ему п олю . Например, главная таблица содержит п олны е сведения о заказчиках, а п од-чиненная - о заказах, ими сделанны х. О дному заказчику может соответствовать несколько строк в п одчиненной таблице, однако там он представлен лиш ь своим учетны м номером CustNo. П оле CustNo в ы бирается в качестве связую щ его п оля. Д ля создания связи в компоненте TTable п одчиненной таблицы необходимо до-п олнительно задать значения свойств MasterSource (имя компонента DataSource главной таблицы ), MasterField (имя связую щ его п оля главной таблицы ), Index-FieldNames (имя активного индексного п оля для п одчиненной таблицы , в качестве которого в ы бирается связую щ ее п оле). О тметим , что записи в п одчиненной таблице дополнительно ф ильтрую тся п о ус-ловию сов падения одноименны х п олей. П оэтому в п одчиненной таблице п оказы -ваю тся только заказы , сделанны е текущ им заказчиком из главной таблицы .

Page 10: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

10

Лабораторная работа № 3 Создадим приложение, отображаю щ ее данны е из двух связанны х таблиц - глав -ной customer.db и п одчиненной orders.db.

1. Разместите в окне ф ормы два комп лекта компонентов TTable, TDataSource и TDBGrid (п о одному на каждую таблицу) и один компонент DBNavigator для главной таблицы .

2. Свяжите комп оненты с таблицами customer.db и orders.db, как это делалось ранее. Установите связь меж ду таблицами, задав значения свойств MasterSource, MasterField, IndexFieldNames для п одчиненной таблицы . Схема установления свя-зей приведена на рис. 3.

3. О ткомпилируйте и в ы п олните прилож ение. 4. Создайте аналогичное приложение с п омощ ью утилиты Form Wizard баз

данны х (пункт меню DataBase).

Рис. 3

Лабораторная работа № 4 (самостоятельная). Создание многосвязной ф ормы . Создайте ф орму, содержащ ую три связанны е таблицы . П ервая таблица Cus-tomer.db является главной, с ней связана п одчиненная таблица Orders.db, которая, в свою очередь, является главной таблицей для Items.db. В таблице Items содер-жатся характеристики заказов . О бщ ая методика такая ж е, как и при создании од-носвязны х ф орм. Д ля связи таблиц Orders и Items используйте п оле OrderNo.

Page 11: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

11

1.4. М о дул и данны х Ранее мы размещ али все комп оненты доступа к данны м непосредственно на глав -ной ф орме прилож ения. О днако размещ ение на одной ф орме больш ого количест-ва разнородны х компонентов наруш ает принцип модульности и затрудняет разра-ботку. Начиная с версии 2.0, в Delphi п оявилась возмож ность разделять визуаль-ны е и невизуальны е комп оненты баз данны х, в ы неся все невизуальны е компонен-ты DataSet и DataSource в специальную разновидность ф ормы - модуль данны х (Data Module). Т акой модуль содержит всю инф ормацию о базе данны х, хранится отдельно на диске и мож ет бы ть использован различны ми приложениями. В отли-чие от обы чной ф ормы , модуль данны х не виден в о время в ы п олнения. Mодули данны х настоятельно рекомендую тся при больш ом количестве комп онен-тов TQuery, TTable. П реимущ ества модулей данны х такж е проявляю тся в трех-звенной архитектуре БД [2], когда один модуль данны х, расположенны й на сер ве-р е пр и лож ен и й, используется множ еством «т он ки х» кли ен т ски х пр и лож ен и й на рабочих станциях. М одули данны х необходимы , когда в прилож ении имею тся н е-сколько ф орм , содержащ их визуальны е компоненты БД (все они могут ссы латься на один модуль). О тметим сразу ж е некоторую путаницу в терминологии. М одуль данны х (Data Module) и программны й модуль (Unit) - это разны е вещ и. М одуль данны х - это разновидность ф ормы , и для него сущ ествует свой Unit.

Лабораторная работа № 5 Сначала рассмотрим первы й этап - создание модуля данны х на примере БД из ла-бораторной работы № 1.

1.О ткройте новы й проект. В ы берите File | New… Data Module. П оявится новое маленькое окно - модуль данны х. П оместите TTable и TDataSource в модуль дан-ны х. Свяжите эти компоненты и установите нужны е свойства, как обы чно. И зме-ните название ф ормы (свойство Name) - CountryTables.

2. П ерейдите к окну кода. Заметьте, что нов ы й программны й модуль назы ва-ется Unit2, и в нем описы вается класс, п орож денны й от TDataModule, а не от обы чного TForm. В ы берите пункт File | Save As и сохраните модуль в В аш ем ката-логе с именем CountryModule. Т ам п оявятся два ф айла CountryModule.pas и Coun-tryModule.dfm.

3. В ы берите File | Close All. Н е сохраняйте проект. Т еперь созданны й модуль может использоваться в лю бом новом прилож ении, ра-ботаю щ ем с таблицей Country.db. Например, для п одклю чения модуля к пустому проекту проделайте следую щ ие действия.

1. В ы берите пункт меню File | New Application. 2. В ы берите п ункт меню Project | Add to Project... и найдите на диске ранее

созданны й модуль. П ерейдите на главную ф орму и п одклю чите к ней модуль дан-ны х, в ы брав пункт File | Use Unit и имя модуля CountryModule. Соответствую щ ая директива Use будет вставлена в модуль Unit1 автоматически.

Page 12: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

12

3. Разместите на главной ф орме объ ект TDBGrid и свяжите его с TDataSource, указав в соответствую щ ем свойстве значение CountryTables.DataSource1. П риложение готово. П еределайте с использованием модулей данны х прилож ения из лабораторны х ра-бот 1-4.

2. Нави гац и о нны й до с туп к БД В Delphi п оддерживаю тся два способа доступа к базам данны х. П ерв ы й способ, реализованны й компонентом TTable, основан на перемещ ении п о отдельны м за-писям таблицы . Т акой п одход назы вается навигационны м (Record-ориентированны м). К омп онент TQuery, напротив , возвращ ает целы е наборы дан-ны х, п олученны е п осле в ы п олнения операторов язы ка SQL. Это - SQL-ориентированны й, более « реляционны й» п одход. О днако оба компонента являю т-ся п отомками класса TDataSet (набор данны х) и имею т много общ их унаследо-ванны х от TDataSet навигационны х свойств и методов , которы е можно применять к возвращ аемому набору данны х. В данном разделе мы будем рассматривать, в основном , именно эти универсальны е свойства и методы , применяя их, без огра-ничения общ ности, к комп оненту TTable. Д ля иллю страции, если не оговаривает-ся противное, будем использовать пример простой БД « Заказы » , описанной в П рилож ении. 2.1. Р аб о та с п о л ями наб о ра данны х Как в программе обратиться к конкретному п олю конкретной записи? В о-перв ы х, надо сделать эту запись текущ ей (как это сделать, см .п .2.2). Д ля доступа к кон-кретному ф изическому п олю текущ ей записи предназначен класс TField (логиче-ское п оле). Н апример, для изменения п оля “Address” текущ ей записи таблицы “Cust” БД “Заказы ” необходимо в ы п олнить действия (см .п .2.3) with Table1 do begin Edit; // Перевод набора данных в режим редактирования FieldByName(‘Address’).value:=’Москва’;// Обращение к TField Post; // Запоминание результатов end; В классе TField собраны (инкапсулированы ) всевозмож ны е свойства, методы и собы тия, которы е могут п онадобиться при работе со столбцом таблицы . Напри-мер, свойство Value типа Variant хранит значение п оля, свойство DisplayLabel – заголовок столбца, свойство DisplayFormat – ф ормат отображения п оля и т.п . (Variant – тип переменны х, которы й мож но изменять во время в ы п олнения про-граммы . В переменную типа Variant мож но записать значения лю бы х типов , при-чем ф актический тип переменной определяется в момент присваивания. В ариант-ны е переменны е совместимы с переменны ми всех других типов . П одробнее см. в [10].) В место TField в программах обы чно использую тся его типизированны е п о-томки, специально предназначенны е для работы с п олем конкретного типа дан-ны х (TStringField, TBooleanField, TDateField, TFloatField, TIntegerField и др.). Т ип данны х легко п онять п о названию класса.

Page 13: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

13

2.1.1.Со здани е о б ъекто в-п о то мко в TField Сущ ествует три способа. • С помощ ь ю ре д а кт ора поле й. Указатели на типизированны е п отомки TField вклю чаю тся в описание ф ормы , а экземпляры автоматически создаю тся пр и созда н и и ф ор м ы и у н и чт ож ают ся пр и ее за кр ы т и и . Т акие п оля иногда не со-всем правильно назы ваю т статическими. Этот способ удобен тем , что п озв оля-ет работать с п олем как с обы чны м компонентом и редактировать его свойства на этапе визуальной разработки.

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

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

2.1.2. Р едакто р п о л ей Рассмотрим на конкретном примере первы й способ создания п оля. В о многих случаях бы вает необходимо ограничить число п олей, изменить п орядок их следо-вания, изменить заголовки, добавить новы е п оля, содержащ ие результаты в ы чис-лений над имею щ имися п олями. Н апример, в таблице Country создать новое п оле Density (п лотность населения на кв . км). Т акие возмож ности предоставляет Fields Editor (редактор п олей). Редактор п олей работает с логическими п олями, ф изиче-ские п оля таблицы остаю тся без изменения. Т ипизированны е объ екты TField вклю чаю тся в описание ф ормы и тем самы м становятся доступны ми на этапе ви-зуальной разработки.

Лабораторная работа № 6. Создание в ы числяемы х п олей.

1. О ткройте нов ы й проект, разместите на ф орме компоненты TTable, TDataSource и TDBgrid. Свяжите эти компоненты . Свойство DataBaseName и Ta-bleName у TTable установите в DBDemos и Country.db, соответственно. Разместите TDBNavigator и свяжите его с TDataSource.

2. Д важды щ елкните на объ екте Table1. П оявится окно редактора п олей, пер-в оначально п устое, т.к. объ екты TField ещ е не созданы .

3. Н аж мите правую кнопку мы ш и и в п оявив ш емся контекстном меню в ы бе-рите п ункт Add Fields. В окне Available Fields будут перечислены все ф изические п оля таблицы . В ы берите из них те п оля, которы е В ы хотите оставить, например, Name, Area, Population. Наж мите Ok.

4. В ы берите в контекстном меню п ункт New Field. В раскры в ш емся окне за-дайте имя в ы числяемого п оля - Density и его тип - Float, установите ф лаж ок Cal-culated. Н аж мите О k и закройте редактор п олей.

Page 14: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

14

5. Убедитесь, что объ екты -п отомки TField вклю чены в описание класса ф ор-мы . Запомните, как строятся их названия и тип . Раскройте комбинированны й спи-сок компонентов в инспекторе объ ектов . В ы берите объ ект Table1Density. И змени-те его свойства: DisplayLabel - П лотность, DisplayFormat - 0.000. А налогично из-мените заголовки других п олей.

6. Напиш ите следую щ ий обработчик собы тия OnCalcFields компонента TTable (значения п олей доступны через свойство Value объ ектов TField):

procedure TForm1.Table1CalcFields(DataSet: TDataSet); begin Table1Density.Value:=Table1Population.value/Table1Area.Value end;

Рис.4

7. Установите Active в True. В ы п олните приложение. Результат его работы бу-

дет иметь вид рис. 4. 2.1.3. Об ращ ени е к п о л ю М етод компонентов TDataSet с названием function FieldByName(const FieldName: String): TField; дает универсальны й способ обращ ения к объ ектам TField, независимы й от того, каким образом они бы ли созданы . П араметром метода является название п оля, а результатом работы - ссы лка на эк-земпляр класса TField для указанного п оля. Напомним , что обращ ение к отдель-ны м атрибутам п оля (заголовку, содержанию и др.) производится через свойства компонента TField. Например, чтобы изменить заголовок п оля Address в таблице Cust БД “Заказы ”, используйте конструкцию : Table1.FieldByName(‘Address’).DisplayLabel:=’Адрес’; Е сли объ ект бы л создан с п омощ ью Редактора п олей, то к нему мож но обраться как с п омощ ью FieldByName, так и п о имени. И мя объ екта строится п о правилу: и мя н а бор а да н н ы х+и мя поля, например, Table1Address.DisplayLabel:=’Адрес’;

Page 15: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

15

К зн а чен и ю поля мож но обратиться либо с п омощ ью свойства Value типа Variant, либо с п омощ ью свойств AsNNN типа NNN. В свойстве Value хранятся значения следую щ их типов :

string для объ ектов TstringField, LongInt для всех целы х типов объ ектов TField, Double для всех вещ ественны х типов TField, Boolean для объ ектов типа TbooleanField TdataTime для объ ектов типа TdateField, TDateTimeField, TTimeField

О дна из наиболее часты х задач - отображение значения п оля в визуальном ком-п оненте, например, TEdit, или обратная операция. П ри чтении происходит преоб-разование значения Value к типу переменной, куда оно будет записы ваться, на-пример, для целого п оля Kolvo Edit1.text:=Table1.FieldByName(‘Kolvo’).Value; будет эквивалентно Edit1.text:=IntToStr(Table1.FieldByName(‘Kolvo’).Value); П ри записи в свойст во Value следует п омнить, что для этого свойства, в отличие от обы чн ых ва р и а н т н ы х пер ем ен н ы х, метод записи будет п ы таться преобразовать тип присваиваемой переменной к типу п оля, указанному в таблице (см . в ы ш е), и это мож ет иногда приводить к ош ибкам времени в ы п олнения. Н апример, пра-вильны обращ ения Table1.FieldByName(‘Kolvo’).Value:=10; Table1.FieldByName(‘Kolvo’).Value:=Edit1.text; // ‘10’ Table1.FieldByName(‘Kolvo’).Value:=StrToInt(Edit1.text);//‘10’ и ош ибочны обращ ения Table1.FieldByName(‘Kolvo’).Value:=Edit1.text; // ’01.01.80’ Table1.FieldByName(‘address’).Value:=100. Более удобны и безопасны свойства AsString: String, AsInteger: integer, AsFloat: Double, AsDateTime: TDateTime, AsCurrenty: Currenty, преобразую щ ие к типу п оля, указанному в названии (некоторы е коллизии здесь могут бы ть « отловлены » компилятором). В ажны м практически является свойство AsString класса TField. С п омощ ью этого свойства мож но обращ аться к больш инству типов как к строко-в ы м переменны м. Например, Edit1.text:=Table1.FieldByName(‘Date’).AsString; Table1.FieldByName(‘Date’).AsString:=Edit1.text;//’10.10.89' В ажно учиты вать: • М етод FieldByName возвращ ает ссы лку на объ ект TField, свойство Value для которого имело тип Variant, п оэтому лю бы е присваивания свойству Value в приведенны х в ы ш е примерах бы ли разреш ены компилятором (дальнейш ие проблемы с приведением типов во время в ы п олнения программы компилятора уж е не касаю тся).

• Д ля типизированны х объ ектов -п отомков TField, к которы м всегда относятся « статические» п оля, свойство Value п олиморф но переопределяется и имеет уж е конкретны й тип . П оэтому присваивание

Table1Kolvo.Value := Edit1.text; в ы зовет ош ибку компиляции (догадайтесь, какую ). П равильно для « статических» п олей будет Table1Kolvo.Value := StrToInt(Edit1.text); или

Page 16: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

16

Table1Kolvo.AsString := Edit1.text; Ч тобы обратиться к значению п оля, мож но использовать свойство property FieldValues [F: string]: variant, являю щ ееся свойством « п о умолчанию » наборов данны х, например, Table1. FieldValues [‘Address’]:=’Москва’; или Table1[‘Address’]:=’Москва’; Работать с FieldValues следует так ж е осторож но, как и со свойством Value: Variant. 2.1.4. П о л учени е и нф о рмац и и о п о л ях В о время работы программы всегда есть риск обратиться к несущ ествую щ ему п о-лю таблицы . И ногда здесь п омогает компонент TFieldDefs набора данны х, содер-жащ ий инф ормацию о числе и характеристиках ф изических п олей таблицы , свя-занной с этим Н Д . О братиться к TFieldDefs можно через свойство Н Д property FieldDefs: TFieldDefs, возвращ аю щ ее ссы лку на экземпляр TFieldDefs. Свойства TFieldDefs: • property Count: integer; В озвращ ает число объ ектов TFieldDef, кажды й из которы х описы вает конкретное п оле таблицы .

• property Items[Index: Integer]: TFieldDef; Содержит набор объ ектов TFieldDef. Index изменяется от 0 до Count-1.

Свойства TFieldDef: • property DataType: TFieldType; В озвращ ает тип п оля, кодированны й име-нованны ми константами.

• property FieldNo: Integer; В озвращ ает ф изический номер п оля в таблице. • property Required: Boolean; В озвращ ает True, если п оле требует обяза-тельного зап олнения.

• property Size: Integer; В озвращ ает размер п оля в байтах. Д ля больш инст-ва числовы х типов размер п оля не задается и определяется типом п оля.

Характеристики логических п олей (объ ектов TField) можно узнать с п омощ ью средств язы ка Object Pascal для проверки типа времени в ы п олнения. Лабораторная работа № 7 1. Разместите на ф орме и соедините компоненты TTable (имя T1), TDataSource, TDBgrid. Свяжите T1 с какой-нибудь таблицей и установите Active в True. Размес-тите компонент TComboBox с именем CB1 и три пары компонентов TLabel и TEdit. 2. Создайте обработчики следую щ их собы тий. OnCreate для ф ормы : procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin // Заполнение списка именами физических полей for i:=0 to T1.FieldDefs.Count-1 do cb1.Items.add(T1.FieldDefs.Items[i].Name);

Page 17: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

17

end; OnChange для CB1: procedure TForm1.CB1Change(Sender: TObject); begin // Определение типов логических полей Edit1.text :=T1.FieldByName(CB1.text).AsString; Edit2.text := T1.FieldByName(CB1.text).ClassName; // Определение типов значений if VarType(T1.FieldByName(cb1.text).value)=VarDate then Edit3.text :='TDate' else if VarType(T1.FieldByName(cb1.text).value)=VarInteger then Edit3.text :='VarInteger'

else if VarType(T1.FieldByName(cb1.text).value)=VarDouble then Edit3.text :='VarDouble' else if VarType(T1.FieldByName(cb1.text).value)=VarString then Edit3.text :='VarString' end; 3. П осле компиляции и запуска в ы берите имя п оля в комбинированном списке, при этом окно программы примет вид рис. 5. 4. Д оработайте программу, чтобы она п оказы вала состав и характеристики ф изи-ческих п олей (свойство FieldDefs: TFieldDefs Н Д ), а такж е состав и характеристи-ки логических п олей (свойство Fields [index: integer]: TField Н Д ). И мя п оля, с ко-торы м связан объ ект TField, содержится в его свойстве FieldName: string; имя объ екта, как обы чно, содержится в свойстве Name. Ч исло логических п олей мож -но узнать, используя свойство Н Д FieldCount: integer; 5. Д оработайте программу, чтобы она могла во время в ы п олнения откры вать лю -бую таблицу из базы данны х с лю бы м зарегистрированны м алиасом . (Указание: используйте компонент TSession.) К омментарий К омпонент TSession служит для глобального управления соединениями с базами данны х в приложении. О бъ ект Session: TSession создается автоматически в программе, работаю щ ей с ба-зами данны х, и программист п олучает доступ к его свойствам и методам . О бы чно объ ект Session используется для п олучения на этапе в ы п олнения инф ормации о настройках и параметров драйверов , псевдонимов , таблиц БД и т.д. Ч асто бы вает удобно явно (визуально) создавать экземп ляры TSession, чтобы от-редактировать их свойства на этапе разработки через инспектор объ ектов . Н еобходимость явного создания Session в озникает, как правило, при написании многопоточны х приложений БД [1] (в этом случае число объ ектов TSession долж -но бы ть равно числу п отоков ). Н екоторы е основны е свойства TSession: • SessionName: String – имя сеанса (это имя надо указать в одноименном свойстве комп онента DataSet, например, TTable),

• KeepConnections: Boolean - определяет, нуж но ли сохранять соединение с базой, если в программе нет ни одной откры той таблицы из этой базы ,

Page 18: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

18

• NetFileDir: String - директория, в которой находится общ ий сетевой ф айл PDOXUSRS.NET, необходимы й BDE,

• PrivateDir: String - директория для хранения временны х ф айлов . Свойство Active устанавливает активность сеанса соединения с БД (сессии). Е с-ли этому свойству присваивается значение True, то данная сессия становится те-кущ ей. Н екоторы е методы : • Procedure GetAliasNames (List: TStrings) – возвращ ает список алиасов ; • Procedure GetAliasParams (const AliasName: String; var List:

TStrings) – п омещ ает в список List параметры алиаса; • procedure GetTableNames(const AliasName, Pattern: String; Exten-

sions, SystemTables: Boolean; List: TStrings) - п омещ ает в List для алиаса AliasName имена таблиц , удовлетворяю щ их ш аблону Pattern;

Например, компонентом TSession можно в оспользоваться, чтобы узнать, в каком каталоге находятся ф айлы базы данны х, если известен только алиас: function GetDBPath(const Alias: string): string; var AllSt: TStringList; i: integer; S: string; begin Result:=''; if Length(Alias)<>0 then begin AllSt := TStringList.Create; try DM1.Session1.GetAliasParams(Alias,AllSt); S:=''; for i:=0 to AllSt.Count-1 do begin if Copy(AllSt[i],1,11)='SERVER NAME' then begin S:=ExtractFilePath(Copy(AllSt[i],13,80)); Break; end else if Copy(AllSt[i],1,4)='PATH' then begin S:=Copy(AllSt[i],6,80); Break; end; end; if Length(S)<>0 then Result:=S finally AllSt.Free; end; end; end;

Page 19: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

19

Рис.5

2.2. Нави гац и я п о наб о ру данны х Т екущ ая запись – это запись, доступная в данны й момент для просмотра или мо-диф икации. Д ля доступа к конкретному п олю текущ ей записи необходимо обра-титься к экземпляру объ екта TField данного п оля. Указатель текущ ей записи на-зы вается курсором набора данны х. Д ля изменения курсора Н Д предназначены следую щ ие методы объ ектов TDataSet: • procedure First; П ередвигает курсор к первой записи Н Д ; • procedure Last; П ередвигает курсор к п оследней записи Н Д ; • procedure Next; П еремещ ает курсор на одну запись вниз; • procedure Prior; П еремещ ает курсор на одну запись в верх. • function MoveBy (n: integer): integer; П еремещ ает курсор на n записей к концу набора данны х (n>0) или к началу набора (n<0).

Свойство BOF: Boolean устанавливается в True, когда курсор находится на пер-в ой записи, а свойство EOF: Boolean устанавливается в True, когда курсор нахо-дится на п оследней записи. Свойство RecordCount возвращ ает число записей в Н Д . Следует п омнить, что перемещ ение происходит в соответствии с логи чески м по-р ядком записей, определяемы м активны м индексом (см .п .2.5), которы й мож ет от-личаться от ф изического п орядка. П оэтому, чтобы не запутаться, при навигации нельзя изменять п оле, определяю щ ее активны й индекс. Кроме того, при активи-зированном ф ильтре (см .п .2.4.2) перемещ ение происходит вн у т р и обла ст и НД, удовлетворяю щ ей условию ф ильтра. Н апример, метод Last перейдет не на п о-следню ю ф изическую запись, а на п оследню ю запись, ограниченную условием ф ильтра. Д ля перемещ ения п о Н Д вниз нуж но в ы п олнить следую щ ие действия:

Page 20: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

20

with Table1 do begin First; while not EOF do begin <действие над текущей записью> Next; end; end; Д ля перемещ ения п о Н Д в верх: with Table1 do begin Last; while not BOF do begin <действие над текущей записью> Prior; end; end; Д ля запоминания текущ ей п озиции удобен механизм за кладок. М етод Н Д GetBookMark создает закладку, GotoBookMark перемещ ает курсор к закладке, FreeBookMark удаляет закладку, BookMarkValid проверяет закладку. Например: var B1: TBookMark; … b1:=Table1.GetBookMark; // заложить закладку … // перейти на запись, на которую заложена закладка if Table1.BookMarkValid(b1) then Table1.GotoBookkMark(b1); … // удалить ненужную закладку if Table1.BookMarkValid(b1) then Table1.FreeBookkMark(b1);

2.3. Дейс тви я над текущей зап и с ью В озмож ность внесения изменений в Н Д зависит от его сост оян и я. Н екоторы е ос-новны е состояния Н Д описаны в таблице. Состояние О писание П еревод в состояние

DsInActive Н Д закры т М етод Close DsBrowse Запись просматривается,

но не изменяется (состоя-ние п о умолчанию )

М етод Open (откры вает закры ты й Н Д ); метод Post (ф иксирует на дис-ке измененную запись); метод Can-cel (отменяет изменения)

DsEdit Т екущ ая запись редактиру-ется

М етод Edit

DsInsert В ставлена или добавлена новая запись

М етоды Insert или Append

DsFilter Н Д ф ильтруется Свойство Filtered:=True DsCalcFields О пределяю тся в ы числяе-

мы е п оля. И зменения в Н Д вноситься не могут.

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

Page 21: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

21

П ри редактировании Н Д непосредственно в связанном с ним визуальном компо-ненте, например TDBGrid, набор данны х переводится в состояние редактирования автоматически (при этом свойство AutoEdit компонента TDataSource долж но бы ть установлено в True). П ри модиф икации Н Д из программы следует сначала в ы звать методы Edit, Insert или Append, а п осле модиф икации – метод Post (закрепление) или Cancel (отмена). Н апример, with Table1 do begin Edit; FieldByName(‘Address’).value:=’Москва’; Post; end; П ри использовании визуальны х компонентов редактирования (например, TDBGrid, TDBEdit) эти методы в ы зы ваю тся автоматически. Д ля установки значений п олей текущ ей записи мож но такж е использовать метод procedure SetFields(const V: array of const); П араметр V - откры ты й массив с элементами вариантного типа1 [8]. М етоды Edit и Post встроены в SetFields, п оэтому отдельно в ы писы вать их не требуется. На-пример, Table1.SetFields ([5, ‘Иванов’, ‘Москва’]). Т ип и п орядок элементов долж ен соответствовать типу и п орядку п олей, лиш ние элементы в массиве не учиты ваю тся, для недостаю щ их элементов п оля не меняю т значения. Д ля вставки новой записи и заполнения ее значениями можно использовать ана-логичны й метод procedure InsertRecord(const V: array of const); Д ля добавления – метод procedure AppendRecord(const V: array of const); М етод EmptyTable удаляет все записи из Н Д . Д ля удаления текущ ей записи служит метод Delete. 2.3. П о и с к данны х Самая распространённая задача, которую реш аю т приложения, работаю щ ие с ба-зами данны х - это п оиск необходимы х записей п о заданному критерию . М етоды п оиска в Delphi мож но условно разделить на три груп п ы - универсальны е методы класса TDataSet (в том числе методы ф ильтрации); методы индексного п оиска класса TTable; комп онент TQuery со встроенны ми SQL-запросами. 2.3.1.Уни верс ал ьны е мето ды Locate и Lookup кл ас с а TDataSet

1 О ткры ты й массив при передаче в процедуру мож ет иметь разное число элементов и задавать-ся в виде списка значений в квадратны х скобках (но не путать с множ еством!). Const в начале означает, что массив передается п о значению (но не через стек!). Const в конце - что массив вариантны й и его элементы могут иметь разны й тип . Е щ е не запутались? Т огда продолжим .

Page 22: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

22

Д анны е методы ищ ут запись, удовлетворяю щ ую заданны м условиям . М етод Locate: function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; virtual; Locate ищ ет первую запись, удовлетворяю щ ую критерию п оиска и делает ее те-кущ ей, в озвращ ая значение true. Е сли искомая запись не найдена, Locate в озв ра-щ ает значение false, и п озиция курсора не меняется. В простейш ем варианте аргументами метода являю тся название п оля Key-Fields, искомое значение п оля KeyValues и ф лаг оп ций. О дно из преимущ еств методов Locate и Lookup состоит в том , что они не требу-ю т, чтобы таблица бы ла проиндексирована. О днако, если индексы созданы , ме-тоды будут их учиты вать и работать намного быстрее. М етод LookUp: function Lookup(const KeyFields: string; const KeyValues: Variant; const ResultFields: string): Variant; virtual; Lookup в ы бирает значения столбца той записи, которая удовлетворяет заданны м значениям п оиска. П озиция курсора не меняется. В простейш ем варианте методу передается название п оля, искомое значение п оля и названия п олей найденной за-писи (третий параметр), значения которы х метод возвратит. О сновное различие меж ду двумя методами состоит в том, что ф ункция Locate при п оиске записи п озиционирует курсор на найденную запись, а Lookup этого не де-лает. Работу методов рассмотрим на примерах. Создадим ф орму, которая при запуске прилож ения примет вид Рис. 6.

Рис. 6

В данном случае используется таблица country.db из DBDEMOS. В обработчике собы тия OnClick кнопки Button1 организуем в ы зов метода Locate. К од обработчика собы тия приведен ниже: procedure TForm1.Button1Click(Sender: TObject);

Page 23: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

23

begin if not Table1.Locate('Name',Edit1.Text,[]) then ShowMessage('Запись не найдена'); end; Здесь строка Table1.Locate организует п оиск записи в таблице Country. В данном случае мы ищ ем запись п о одному п олю Name. В торой параметр - это ш аблон п о-иска, а третий - оп ции п оиска. П осле запуска программы и нажатия на кнопку Locate курсор в DBGrid1 переме-щ ается на запись, имею щ ую в п оле Name в веденное в Edit1 значение. В строку редактирования необходимо в в одить п олное название страны с учетом регистра, т.е., если мы вместо Cuba в ведем , например Cu или cuba, то п оиск будет безрезультатны м . Е сли это не устраивает, то третий параметр процедуры долж ен содержать непустое множ ество констант. Например, константа loCaseInsensitive отменяет чувствительность к регистру в текстов ы х п олях, а loPartialKey п озволяет искать запись, частично соответствую щ ую заданному условию . Соответствую щ ий код обработчика запиш ите самостоятельно. Следую щ ей проблемой является п оиск записи п о нескольким п олям. Д ля органи-зации п оиска п о имени страны и континенту добавим на ф орму ещ е один компо-нент Edit2. К од обработчика собы тия нажатия на кнопку Locate изменим следую -щ им образом: procedure TForm1.Button1Click(Sender: TObject); begin if not Table1.Locate('Continent;Name',VarArrayOf ([Edit2.Text,Edit1.Text]),[loCaseInsensitive,loPartialKey]) then ShowMessage('Запись не найдена'); end; Как видно, при п оиске п о нескольким п олям все они перечисляю тся через точку с запятой в первом строковом параметре ф ункции Locate. Ф ункция VarArrayOf соз-дает вариантны й массив [25]. Запустив прилож ение, в строке п оиска континента пиш ем South America, а в стро-ке "Страна" - C. Нажимаем кнопку Lookup. Результат п оиска - установка курсора в DBGrid на запись Chile. О тметим особенность - частичны й п оиск при п оиске п о нескольким п олям работает лиш ь для п оследнего п оля, указанного в списке. М одиф ицируем наш пример для использования ф ункции Lookup. procedure TForm1.Button2Click(Sender: TObject); var Res:Variant; begin Res:=Table1.Lookup ('Continent;Name', VarArrayOf ([Edit2.Text, Edit1.Text]),'Area'); if Res <> Null then ShowMessage('Площадь страны '+String(Res)); end; Здесь п оиск проводится п о п олям Continent, Name. П ри нахождении записи ф унк-ция LookUp в озвращ ает значение п оля Area (площ адь страны ), при этом курсор на найденную запись не перемещ ается.

Page 24: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

24

Н еобходимо отметить, что очень часто необходимо найти сразу несколько запи-сей. Д ля реш ения такого рода задач удобнее применять методы , предоставляемы е классом TQuery, либо производить ф ильтрацию . 2.3.2. Фи л ьтрац и я наб о ра данны х Ф ильтрация Н Д означает, что п ользователю будет видна лиш ь часть Н Д , удовле-творяю щ ая некоторому логическому условию , назы ваемому условием ф ильтра-ции. Ф ильтр может находиться в активном или неактивном состоянии. В первом случае свойство Filtered: Boolean набора данны х долж но бы ть установлено в True. П о умолчанию ф ильтр в ы клю чен и Filtered равно False. Условие ф ильтрации мо-ж ет бы ть задано двумя способами. В первом из них используется свойство Filter типа String, доступное как программно, так и через инспектор объ ектов . Напри-мер, при задании условия Filter:=’Price>100’; будут доступны только записи товаров с ценой, больш ей 100 у.е. В условии можно применять операторы отнош ения (такие ж е, как в Pascal’е) и логические операто-ры AND, OR, NOT. Свойство FilterOptions: TFilterOptions п озволяет задать режимы ф ильтрации. П о умолчанию FilterOptions=[], значение foCaseInsensitive используется, чтобы ф ильтрация происходила без учета регистра букв , значение foNoPartialCompare – чтобы ф ильтрация происходила при условии точного сов падения строк. К сожа-лению , в ны не доступны х версиях Delphi (а оп ы т п оказы вает, что так будет и в о всех п оследую щ их версиях) это свойство не п онимает русских букв . П оэтому предпочтительны м является второй, более гибкий способ задания условия ф ильт-рации, с использованием обработчика собы тия OnFilterRecord. Собы тие OnFilterRecord наступает при активизации ф ильтра (т.е. при установке Filtered в True). О бработчик собы тия имеет два параметра: имя ф ильтруемого на-бора данны х DataSet: TDataSet и параметр Accept: Boolean, возвращ аю щ ий ре-зультат проверки условия ф ильтрации. В отф ильтрованны й Н Д вклю чаю тся толь-ко записи, для которы х Accept имеет значение True. В нутри обработчика пере-менной Accept присваивается логическое условие ф ильтрации, в котором могут использоваться богаты е средства Delphi для работы со строками. Например, procedure TForm1.Table1FilterRecord(DataSet: TDataSet; var Accept: Boolean); begin Accept:=(Pos(‘Ив’, DataSet[‘Name’])=1); // Условие неточного совпадения строк end; Здесь известная В ам ф ункция Pos проверяет, встречаю тся ли в начале п оля Name буквы Ив. (П о п оводу « непонятной» записи DataSet[‘Name’] см . п .2.1.2.) Ч тобы ф ильтр бы л нечувствителен к регистру, надо записать: Accept:=(Pos(‘ИВ’, AnsiUpperCase(DataSet[‘Name’]))=1); Е сли заданы условия и в свойстве Filter, и в обработчике OnFilterRecord, то они оба учиты ваю тся.

Page 25: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

25

Ф ильтры использую тся, в основном , для п оиска записей, но п оиск этот весьма медленны й, так как основан на п оследовательном переборе записей. Д ля Н Д TTable, при возмож ности, следует использовать более быстры е методы индексно-го п оиска. 2.4. Индекс ы и и ндекс ны й п о и с к М етоды п оиска, рассмотренны е в преды дущ их п одразделах, одинаково пригодны для наборов данны х TTable и TQuery. И сп ользование индексов – особенность компонента TTable.

2.4.1.Со здани е и ндекс а И ндекс – это вспомогательная структура, определяю щ ая логическое располож е-ние записей в таблице. Д ля одной таблицы может сущ ествовать несколько индек-сов (задаю щ их сортировку п о разны м п олям), один из которы х мож ет бы ть актив -ны м . А ктивны й индекс изменяет п орядок просмотра и навигации в таблице. П оле, для которого создан индекс, назы вается индексны м п олем , или клю чом . И ндекс, созданны й для уникального первичного клю ча таблицы , – первичны й ин-декс, индексы , созданны е п о другим п олям, – вторичны е индексы . Д ля таблиц Paradox первичны й индекс долж ен сущ ествовать, иначе невозмож но создание ос-тальны х индексов . О бы чно в качестве первичного клю ча в ы бираю т п оле, содер-жащ ее уникальны й код для записи. И ндексы могут определяться также на основе составного клю ча, состоящ его из нескольких п олей. Создавать индексы удобнее всего с п омощ ью утилиты DBD (для таблиц InterBase в п олне пригоден SQL Explorer [5]), при этом указы ваю тся п оля, п о которы м стро-ится индекс и имя индекса. Д ля индексов , п остроенны х п о одному п олю и не ис-п ользую щ их какие-либо в ы числения, имя индекса может совпадать с именем п о-ля. В нутри приложения индекс создается методом procedure AddIndex(const Name, Fields: string; Options: TIndexOptions); Здесь Name - имя нового индекса, Fields – список п олей, определяю щ их индекс (через точку с запятой), Options – множ ество атрибутов индекса, состоящ ее из значений · ixPrimary (первичны й индекс) · ixUnique (уникальны й индекс) · isDescending (индекс п о убы ванию ) · ixCaseInsensitive (индекс, нечувствительны й к регистру) · ixExpression (в ы числяемы й индекс, только для dBASE).

П ервичны е индексы этот метод не создает, хотя оп ция ixPrimary предусмотрена. П еред созданием индекса необходимо убедиться, что ни одно прилож ение не ра-ботает с БД и установить свойство Exclusive:=True. П ример: AddIndex(‘By_FIO_Address’,’FIO;Address’,[ ]); Сущ ествую щ ие индексы активизирую тся с п омощ ью свойства IndexName или In-dexFieldNames (см . примечания к п .1.2).

Page 26: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

26

2.4.2. П о л учени е и нф о рмац и и о б и ндекс е Свойство IndexDefs типа TIndexDefs объ екта TTable содержит всю инф ормацию о сущ ествую щ их индексах таблицы . Н екоторы е свойства и методы класса TIndexDefs (п олны й перечень - [3]): • property Count: integer; число индексов , • property Items[Index: Integer]: TIndexDef; - набор объ ектов типа TIn-

dexDef, содержащ их инф ормацию о конкретном индексе, • procedure Updates; - обновление набора TIndexDef с учетом вновь созданны х индексов .

Н екоторы е свойства класса TIndexDef: • property Name: String; - имя индекса, • property Fields: string; - список п олей, входящ их в индекс, • property Options: TIndexOptions;

Лабораторная работа № 8 Создадим ф рагмент программы , в котором мож но в ы бирать активны е индексы из сф ормированного списка. 1. Разместите, как обы чно, три компонента для доступа к БД , связав их с табли-цей Cust, компонент ListBox и Label. 2. Создайте обработчики собы тия OnCreate для ф ормы и OnClick для ListBox1: procedure TForm1.FormCreate(Sender: TObject); var i: integer; begin ListBox1.Clear; Table1.IndexDefs.Update; for i:=0 to Table1.IndexDefs.Count-1 do ListBox1.Items.Add(Table1.IndexDefs[i].Name); end; procedure TForm1.ListBox1Click(Sender: TObject); begin Label1.Caption:= Table1.IndexDefs.Items[ListBox1.Itemindex].Fields; Table1.IndexName:=ListBox1.Items[ListBox1.ItemIndex]; end; Е сли все бы ло сделано правильно, то п осле запуска прилож ение будет иметь вид рис.7. В ы бор строки в списке изменит п орядок сортировки. О братите внимание, что первичны й индекс не имеет имени и обозначается пустой строкой.

Page 27: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

27

Рис.7

2.4.3. Индекс ны й п о и с к Рекомендую тся два метода индексного п оиска FindKey и FindNearest. П ерв ы й ме-тод, предназначенны й для точного п оиска, описы вается следую щ им образом : function FindKey(const KeyValues: array of const): boolean; П араметр KeyValues задает список значений клю чев ы х п олей. О бы чно это только одно значение. Н есколько значений использую тся для п оиска п о составному клю -чу. М етод предполагает, что необходимы й индекс уж е активизирован с п омощ ью установки свойств IndexFieldNames или IndexName. В случае успеш ного п оиска метод возвращ ает True и перемещ ает указатель на найденную запись, в случае не-удачи возвращ ает False. В отличие от него, метод приближенного п оиска procedure FindNearest (const KeyValues: array of const); всегда успеш ен. О н находит запись, значение индексного п оля которой больш е или равно значению KeyValues. П о умолчанию использую тся первичны е индексы . Ч тобы п оиск п оследовательно уточнялся п о мере в вода все новы х букв , вставьте в ы зов метода FindNearest в обработчик собы тия OnChange компонента TEdit. П роиллю стрируем рассмотренны е нами методы доступа следую щ ей лабораторной работой. Лабораторная работа № 9. Создание ф ормы для ведения ж урнала заказов . Ц ель приложения – автоматизация занесения данны х в таблицу « Заказы » . Н еоб-ходимы е сведения в ы бираю тся из таблиц « Заказчики» и « Т овары » . Е сли заказчик отсутствует в таблице, он туда добавляется. П оиск заказчика ведется приближен-ны м индексны м методом . П ри необходимости можно просмотреть связанную ин-ф ормацию из трех таблиц .

1. Создадим ф орму, представленную на рис.8. Н еобходимы е компоненты БД : три тройки TTable, TDataSource, TDBGrid, TDBNavigator. П оследний связы вается с компонентом TTable для таблицы « Заказы » . С таблицей « Т овары » свяжите ком-п оненты Detal_Code: TDBText и Detal_Price: TDBText. Установите связи меж ду таблицам Cust и Cd п о п олю Nc и меж ду таблицей Cd и Detal п о п олю Nd. Уста-новите свойство Active для всех таблиц в True.

Page 28: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

28

2. В окне груп п ы CustBox1: TGroupBox расположите элементы для редактиро-вания атрибутов заказчика EditCust: TEdit, EditAdres: TEdit, EditCode: TEdit, FindCust: TButton, AddCust: TButton, ExtractCust: TButton, LabelAdres: TLabel.

3. На панели CDPanel: TPanel расположите элементы для редактирования за-каза NdLabel: Tlabel, Edit_Detal_Name: TEdit, Edit_Detal_Kol: TEdit, PriceLabel: TLabel, Edit_Detal_Total: TEdit, Edit_Date: TEdit, FindDetal: TButton, ExtractDetal: TButton, CustDetal: TButton с соответствую щ ими метками-обозначениями.

4. Разместите два в ы клю чателя Cust_CD_Link: TCheckBox и Cd_Detal_Link: TCheckBox для отклю чения связи меж ду таблицами.

Рис.8

5. Создайте обработчики собы тий: procedure TForm1.FindCustClick(Sender: TObject); begin Table1.IndexName := 'Cust_Name'; // Активизация индекса Table1.FindNearest([EditCust.text]); // Приближенный поиск end; procedure TForm1.FindDetalClick(Sender: TObject); begin Cd_Detal_Link.Checked := false; //”Развязать” таблицы Cd_Detal_LinkClick(sender); Table3.IndexName := 'detal_Name'; Table3.FindNearest([Edit_Detal_Name.text]); end;

Page 29: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

29

procedure TForm1.AddCustClick(Sender: TObject); begin // Автоинкрементное поле Nc не заполняется Table1.AppendRecord([Nil, EditCust.Text, EditAdres.Text]); EditCode.Text:=Table1.FieldByName(‘nc’).AsString; end; procedure TForm1.Cd_Detal_LinkClick(Sender: TObject); begin with Table3 do if Not (Cd_Detal_Link.Checked) then begin IndexName := 'detal_Name'; MasterSource := Nil; // Отмена связывания MasterFields := ' '; end else begin IndexFieldNames := 'Nd'; MasterSource := DataSource2; // Связать таблицы MasterFields := 'Nd'; end; end; procedure TForm1.Cust_CD_LinkClick(Sender: TObject); begin with Table2 do if Not (Cust_Cd_Link.Checked) then begin IndexFieldNames := 'No'; MasterSource := Nil; MasterFields :=' '; end else begin IndexFieldNames := 'nc'; MasterSource := DataSource1; MasterFields := 'Nc'; end; end; procedure TForm1.CustDetalClick(Sender: TObject); begin Cust_Cd_Link.Checked := false; Cust_CD_LInkClick(sender); Edit_Date.text := DateToStr(date);// Текущая дата Table2.AppendRecord ([Nil,EditCode.Text,Table3[Detal_Code.DataField], Edit_Detal_Kol.Text,Edit_Detal_Total.Text, strToDate(Edit_Date.Text)]); end; procedure TForm1.Edit_Detal_KolChange(Sender: TObject);

Page 30: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

30

begin if Edit_Detal_Kol.Text<>'' then Edit_Detal_Total.Text := IntToStr(StrToInt(Edit_DEtal_Kol.text) *Table3['Price']); end; procedure TForm1.ExtractCustClick(Sender: TObject); begin EditCust.text := Table1['Name']; EditCode.Text := Table1['nc']; EditAdres.Text := Table1['Address']; end; procedure TForm1.ExtractDetalClick(Sender: TObject); begin Edit_Detal_Name.text :=Table3['Name']; end;

6. Собы тиям OnChange компонентов EditCust и Edit_Detal_Name присвойте через инспектор объ ектов обработчики собы тий FindCustClick и FindDetalClick, соответственно. П осле окончательной отладки видоизмените программу, исполь-зуя для в вода данны х, где это в озмож но, компоненты TDBEdit и TDBLookupCom-boBox (см . п .2.6).

7. И змените структуру таблицы Detal, добавив п оле « О статок на складе» и мо-диф ицируйте программу так, чтобы нельзя бы ло продать отсутствую щ ий на скла-де товар. (М ногие воронежские ф ирмы вряд ли будут в восторге от такого усо-верш енствования.)

2.6. Ви зуал ьны е ко м п о ненты дл я редакти ро вани я текущей зап и с и О чевидно, задачу ведения ж урнала заказов из лабораторной работы № 9 можно реш ить различны ми способами. Н о в лю бом случае обязательно соблю дение тре-бования автоматизации всех действий. Все, чт о н а ходи т ся в т а бли це, долж н о и з-влека т ься н епоср едст вен н о и з т а бли цы , а н е н а би р а т ься вр у чн ую. О ператору доверять нельзя! (А программисту - можно???) В лаб. раб. № 9 для в вода товара в ж урнал заказов использовался индексны й п оиск товара в таблице товаров и п од-становка найденного номера (т.е. номера из текущ ей записи) в ж урнал заказов . Бы стры й индексны й п оиск оправдан при больш ом объ еме таблиц , в остальны х случаях более удобны визуальны е компоненты для п оиска и редактирования (см . п . 1.2.2). Рассмотрим сейчас один из них - TDBLookUpComboBox, предназначен-ны й для заполнения одной таблицы данны ми, в зяты ми из другой таблицы . Свойства компонента DataSource и DataField указы ваю т на источник данны х и п оле той таблицы , куда заносятся данны е (T1). Список TDBLookUpComboBox зап олняется значениями п оля ListField из таблицы T2, источник данны х которой указан в ListSource. К лю чевое п оле, соответствую -щ ее в ы бранному из списка значению , автоматически заносится в текущ ую запись таблицы T1.

Page 31: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

31

Т аблицы T2 и T1 должны находиться в отнош ении Master-Detail и бы ть связаны п о общ ему п олю KeyField. Т ип ы KeyField и DataField должны совпадать. И ндексы для установления связи здесь не требую тся. П ример. Расположите на ф орме п о два компонента TTable и TDataSource, один TDBGrid и TDBLookUpComboBox, три кнопки (см . рис. 9). Н астройте Table1 на таблицу Cd, а Table2 –на таблицу Detal. Свяжите Table1, Da-taSource1 и DbGrid1, Table2 и DataSource2. Д ля компонента DBLookUpComboBox1 установите свойства: DataSource – DataSource1 DataField - Nd KeyField - Nd ListSource – DataSource2 ListField - Name

Рис.9

Запиш ите обработчики собы тий: procedure TForm1.CancelClick(Sender: TObject); begin Table1.Cancel; end; procedure TForm1.AppendClick(Sender: TObject); begin Table1.Append; end; procedure TForm1.PostClick(Sender: TObject); begin If Table1.State = dsInsert then Table1.Post; end; Ч тобы сделать невозмож ны м непроизвольное или умы ш ленное редактирование непосредственно п о сетке DBGrid, запиш ите в свойство AutoEdit связанного ком-п онента DataSource1 значение False.

Page 32: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

32

3. SQL-о ри енти ро ванны й до с туп к БД 3.1. Ис п о л ьзо вани е SQL Я зы к SQL (Structured Query Language) принят в качестве основного для работы с удаленны ми БД в среде клиент-сервер [1], но часто используется и при работе с локальны ми данны ми. С точки зрения прикладного интерф ейса сущ ествую т две разновидности команд SQL:

• интерактивны й SQL • встроенны й SQL.

И нтерактивны й SQL используется в специальны х утилитах (типа WISQL или SQL Explorer), п озв оляю щ их в интерактивном режиме в водить запросы , п осы лать их для в ы п олнения на сервер и п олучать результаты в предназначенном для этого окне. В строенны й SQL используется в прикладны х программах, п озволяя им п о-сы лать запросы к серверу и обрабаты вать п олученны е результаты , в том числе комбинируя SQL-ориентированны й и навигационны й п одходы . Д ля вклю чения в программу операторов SQL в Delphi сущ ествует специальны й компонент - TQuery, располож енны й на странице Data Access палитры компонен-тов . О н имеет много общ их свойств с компонентом TTable и также может исполь-зоваться для просмотра и редактирования данны х, но обладает и рядом специ-ф ичны х свойств . О тметим , что на практике обы чно приходится использовать не только реляцион-ны е, но и рассмотренны е нами общ ие навигационны е свойства и методы TQuery, унаследованны е им от класса TDataSet. Наиболее важны следую щ ие особенности: • В TQuery указы вается только алиас, а свойство TableName отсутствует. Т ре-буемы е таблицы указы ваю тся в тексте запроса.

• Т ексты SQL-запросов записы ваю тся в свойство SQL объ екта TQuery. Это свой-ство типа TStrings представляет собой объ ект-массив строк. П ри в ы боре его в инспекторе объ ектов запускается специализированны й редактор строк. Свой-ство SQL мож ет содержать текст только одного запроса.

Запрос может бы ть откры т и в ы п олнен уже на этапе разработки приложения соот-ветствую щ ей установкой свойства Active. Результат в ы п олнения запроса отобра-жается в связанном визуальном комп оненте отображения данны х, например в TDBGrid. П ри работе приложения запрос мож ет бы ть в ы п олнен методами Open или Ex-ecSQL. М етод Open используется, если запрос использует приложение SELECT и возвращ ает приложению результат. М етод ExecSQL используется во всех осталь-ны х случаях. Т екст запроса мож ет бы ть записан в свойство SQL двумя способами: 1) с п омо-щ ью специализированного редактора, в ы зы ваемого через инспектор объ ектов на этапе разработки программы и 2) с п омощ ью собственны х методов объ екта класса

Page 33: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

33

TStrings (Add, Clear, LoadFromFile и др. [11]) на этапе в ы п олнения программы . П роиллю стрируем оба способа следую щ ими лабораторны ми работами.

Лабораторная работа № 10 Создайте ф орму, отображаю щ ую данны е из двух связанны х таблиц - главной cust.db и п одчиненной cd.db.

1. Разместите в окне ф ормы компоненты Query1: TQuery, DataSource1: TDa-taSource и DBGrid1: TDBGrid. О тметим : хотя таблиц две, размещ ается только один комп онент данны х TQuery. И мена таблиц и связи меж ду ними указы ваю тся в тексте запроса. Свяжите установленны е компоненты обы чны м образом , установив свойство DataSet объ екта DataSource1 в Query1. В качестве значения свойства Da-taBaseName объ екта Query1 задайте алиас DBDemos.

2. В ы зовите строков ы й редактор свойства SQL в инспекторе объ ектов . В ведите строки SELECT cust.name, cd.nc FROM cust, cd WHERE (cust.nc=cd.nc)

3. Установите свойство Active объ екта TQuery в True. О ткомпилируйте и в ы -п олните прилож ение. Рассмотрим второй способ записи запросов . О сновное правило: изменять свойство SQL мож но только при закры том запросе. Стандартная п оследовательность действий: Query1.Close; // Может применяться даже при закрытом запросе Query1.SQL.Clear; // Очистка запроса Query1.SQL.Add (‘SELECT * FROM cust’); Query1.Open; // или Query1.Active:=True

Лабораторная работа № 11.Создание интерактивного редактора запросов Разработайте приложение, которое п озволяло бы изменять и в ы п олнять запрос во время в ы п олнения программы , в ы бирать п о ж еланию п ользователя способ досту-па к данны м (через TTable или TQuery). Т ребуемы й внеш ний вид прилож ения п о-казан на рис. 10.

Page 34: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

34

Рис.10

1. О ткройте новы й проект. Разместите в окне ф ормы компоненты Query1: TQuery, Table1: TTable, DataSource1: TDataSource и DBGrid1: TDBGrid. Свяжите DBGrid1 и DataSource1. (DataSource1 будет связан с Table1 или Query1 в ходе в ы -п олнения). Установите значения следую щ их свойств Table1 и Query1: Data-BaseName - DBDemos , Active - False.

2. Расположите на ф орме две кнопки - Старт и В ы ход, три панели. На панели Panel1 п оместите объ екты ComboBox1 и Label1 для в вода имени таблицы . Зап ол-ните список ComboBox1 именами таблиц , которы е предполагается просматривать (используйте свойство Items в инспекторе объ ектов ). На второй панели (Panel2) разместите аналогичны е ComboBox2 и Label2 для в в ода запроса SQL и занесите в список ComboBox2 несколько предполагаемы х запросов . Н а третьей панели (Panel3) расположите строку редактирования (Edit1) для в вода логического усло-вия ф ильтра и кнопку-в ы клю чатель CheckBox1 для активизации ф ильтра.

3. Разместите груп пу кнопок-переклю чателей RadioGroup1, чтобы мож но бы ло в ы бирать меж ду компонентами TTable и TQuery. Создайте для этой груп п ы обра-ботчик собы тия OnClick: procedure Tform1.RadioGroup1Click(Sender: TObject); begin case RadioGroup1.ItemIndex of 0: begin Panel1.Enabled:=True; Panel2.Enabled:= False; end; 1: begin Panel2.Enabled:= True;

Page 35: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

35

Panel1.Enabled:= False; end; end; end; Т аким образом, при в ы боре одного из способов доступа, например, TTable, аль-тернативны й доступ запрещ ается, панель со строкой запроса становится недос-тупной (enabled:=False). 4. Создайте обработчик собы тия OnClick кнопки Cтарт: procedure TForm1.Button1Click(Sender: TObject); begin case RadioGroup1.ItemIndex of 0: begin Table1.Close; // Закрытие таблицы Table1.TableName:=ComboBox1.Text; // Имя таблицы DataSource1.DataSet:=Table1; // Связь компонентов Table1.Filter:= Edit1.Text; // Установка фильтра Table1.Filtered:=Checkbox1.Checked; Table1.Open // Открытие таблицы end; 1: begin DataSource1.DataSet:=Query1; // Связь через запрос Query1.Close; // Закрытие запроса Query1.Sql.Clear; // Очистка текста запроса Query1.Sql.Add(Combobox2.Text); // Занесение в текст отредактированной строки Query1.Filter:= Edit1.Text; // Установка фильтра Query1.Filtered:=Checkbox1.Checked; Query1.Open; // Выполнение запроса end; end; { case } end; П риложение готово. П оскольку на этапе разработки запросы не создавались, про-смотреть их результаты мож но только п осле компиляции и в ы п олнения. И змените прилож ение, используя для редактирования запроса компонент TMemo.

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

Page 36: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

36

3.2.1. Параметри зац и я зап ро с о в П араметры запроса записы ваю тся в виде :П араметр , например, SELECT * FROM cust WHERE name =:p1 AND address =:p2. П ри откры тии запроса параметрам :p1, :p2, … будут присвоены некоторы е значе-ния, которы е должны бы ть заданы с п омощ ью метода ParamByName компонента TQuery. Этот метод в озвращ ает ссы лку на объ ект TParam, ассоциируемы й с за-данны м параметром и создаваемы й при откры тии запроса. Д ля доступа к значе-нию параметра служат свойства TParam, такие как Value: Variant, AsString: String, AsInteger: Integer. Н апример, Query1.ParamByName(‘P2’).Value:=Edit1.Text; Query1.ParamByName(‘P2’).AsString:=Edit1.Text; О днако, несмотря на внеш ню ю схожесть с объ ектами TField, при использовании Value тип параметра здесь п олностью определяется присваиваемы м значением , при использовании свойства AsXXX – определяется типом XXX. В данном примере это строков ы й тип , хотя п о смы слу запроса параметр на самом деле мож ет иметь другой несовместимы й тип , что приведет к ош ибке в о время в ы п олнения про-граммы . О чевидно такж е, что на этапе проектирования, когда значения параметров ещ е не присвоены , такой запрос откры ть нельзя. П оэтому рекомендуется на этапе проектирования явно - через инспектор объ ектов - определять тип объ ектов TParam и присваивать параметрам значения п о умол-чанию , что п озволит отлаживать запросы на этапе разработки. В качестве примера напиш ем следую щ ее простейш ее приложение, использую щ ее динамические запросы . 1. На ф орме разместите компоненты TQuery, TDataSource, TDBgrid. Свяжите их стандартны м образом . И спользуйте алиас Zakpar. Свойство Active установите в False. Создайте объ екты Edit1, Edit2: TEdit для в вода значения параметров и кнопку Button1. 2. Занесите в свойство SQL объ екта TQuery строку SELECT * FROM cd WHERE Total > :p1 and Data= :p2 3. В ы зовите Редактор параметров запроса, активизировав в инспекторе объ ектов свойство Params объ екта Query1. П оявится окно со списком параметров запроса (см . рис.11, справа). В ы делите кажды й параметр и для него в инспекторе объ ектов (рис.11, слева) в ы берите тип (например, Type=Date) и значение п о умолчанию (например, Value=19.11.98). Т еперь В ы мож ете проверить запрос на этапе разра-ботки, установив Active в True.

Page 37: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

37

Рис.11 4. В обработчик собы тия OnClick для кнопки Button1 запиш ите Query1.Close; //Перед изменением запрос обязательно закрыть Query1.ParamByName(‘p1’).AsInteger:=StrToInt(Edit1.text); Query1.ParamByName(‘p2’).value:= Edit2.text;//Для календарных // типов параметров такое присваивание является единственно //правильным Query1.Open; П риложение готово. И так, у В ас есть в ы бор из двух вариантов . • П ри присваивании параметру значения В ы указы ваете тип параметра, в ы зы -вая методы приведения AsXXX и ф ункции StrToXXX. Редактор параметров (рис.11) здесь использовать не обязательно. Н о этот способ не работает для параметров « дата-время» .

• В ы присваиваете значение свойству Value: Variant. Это универсальны й способ. Н о для календарны х типов надо явн о задать тип параметра DataType, напри-мер через редактор параметров в инспекторе объ ектов .

Н адеж нее задать тип непосредственно перед присваиванием параметра: Query1.ParamByName(‘p2’).DataType:= ftDateTime; Query1.ParamByName(‘p2’).value:= Edit2.text; Д ля связы вания главного и п одчиненного наборов данны х используйте свойство DataSource комп онента TQuery. Е сли в момент откры тия запроса обнаружится, что у одного из параметров п одчиненного Н Д отсутствует значение, то в качестве него берется значение одн ои м ен н ого поля из главного набора данны х, имя компо-нента TDataSource которого указано в свойстве DataSource п одчиненного ком-п онента TQuery. Например, в качестве значения неопределенного параметра nd в запросе для п одчиненного Н Д SELECT * FROM cd WHERE cd.nd = :nd

Page 38: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

38

будет приниматься значение п оля nd текущ ей записи другой таблицы Detal (глав -ной). Е стественное требование: Н Д для таблицы Detal должен бы ть от кр ы т р а н ьше, чем запрос с параметром nd. 3.2.2. Фо рми руемы е зап ро с ы Этот способ является более универсальны м , но менее бы стры м . Здесь можно не только задавать значения параметров , но и видоизменять ф орму запроса, в водить доп олнительны е условия, служ ебны е слова и т.д. Д ля этого запрос строится с п о-мощ ью средств работы со строками язы ка Pascal, например, Query1.Sql.Add(‘Ст р ока ’ + Edit1.text). О тметим , что синтаксис ф ормируемого запроса проверяется кажды й раз во время в ы п олнения, что при частом в ы п олнении замедляет работу. П араметрические за-просы здесь имею т преимущ ество, т.к. они ф ормирую тся один раз, п оэтому их мож но откомпилировать в исполняемы й код, а в дальнейш ем не проверять зано-во, а только п одставлять новы е параметры . Д ля п одготовки к такому использова-нию параметрических запросов служит метод Prepare, которы й рекомендуется один раз в ы звать в начале работы прилож ения, например, в обработчике OnCreate ф ормы .

Лабораторная работа № 12 (самостоятельная) Создайте прилож ение для произв ольного конструирования простого запроса, со-держащ его логическое в ы ражение. П римерны й вид главной ф ормы прилож ения п оказан на рис. 12.

Рис. 12

Page 39: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

39

3.3. Р едакти ро вани е резул ьтато в зап ро с а О сновны м инструментом SQL для редактирования баз данны х являю тся операто-ры UPDATE, INSERT, DELETE (см .[4]). Ч тобы с их п омощ ью изменить значения п олей, необходимо для каждого такого оператора завести отдельны й компонент TQuery и откры вать его методом ExecSQL. О днако можно и « напрямую » , как обы чную таблицу, редактировать набор дан-ны х, возвращ аемы й компонентом TQuery, содержащ им оператор SELECT. Д ейст-вительно, TQuery относится к классу TDataSet, п оэтому к нему мож но применить п очти все методы , излож енны е в разделе 2. Рассмотрим некоторы е особенности этого способа. Ч тобы запрос мож но бы ло редактировать, необходимо сначала установить свой-ство RequestLive компонента TQuery в True. (П о умолчанию оно равно False). Н о это п омогает не всегда, так как на самом деле не всякий запрос может бы ть отре-дактирован. Н ельзя редактировать запросы , содержащ ие агрегатны е ф ункции, операторы JOIN, UNION, предложения ORDER BY, GROUP BY, DISTINCT, в ы бор-ки из нескольких таблиц . Т аким запросам Delphi присваивает атрибут « только для чтения» , свойство CanModify компонента TQuery принимает значение False, за-прещ аю щ ее редактирование. П ричина состоит в том , что при использовании упо-мянуты х операторов отдельны м п олям запроса мож ет не соответствовать ни одна запись реальной таблицы , либо, напротив , соответствовать несколько разны х за-писей. Ч астично обойти эти проблемы можно с использованием компонента TUpdateSQL. Суть его работы состоит в следую щ ем . Ф актически для редактиро-вания будут в ы зы ваться SQL-запросы UPDATE, INSERT, DELETE, для которы х меньш е « преград» . В се изменения данны х при прямом редактировании Н Д (на-пример, при п омощ и TDBGrid) сохраняю тся в локальном промеж уточном буф ере на клиентской маш ине (меха н и зм кэши р ова н и я и змен ен и й), а упомянуты е запро-сы корректно переносят внесенны е изменения из буф ера в реальную таблицу на сервере.

Лабораторная работа № 13 1. Разместите на ф орме (рис.13) компоненты TQuery, TDataSource, TDBGrid, TUp-dateSQL и свяжите их. Свойства Query1 DatabaseName - zakint CachedUpdates - True // Разрешает кэшированные изменений RequestLive - True // Разрешает редактировать запрос UpdateObject - UpdateSQL1 //Ссылка на экземпляр //TUpdateSQL SQL - SELECT cd.num, cd. nd, detal.name, cd.kol, cd.data FROM cd, detal WHERE detal.name='Болт' and detal.nd=cd.nd Active - True П оследний запрос в ы в одит из двух таблиц заказы на указанны й товар. О чевидно, это – нередактируемы й запрос, свойство CanModify равно false.

Page 40: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

40

Рис.13

2. В ы зовите редактор свойств объ екта UpdateSQL, щ елкнув п о нему два раза. В диалоговом окне в ы берите обновляемы е п оле KOL и клю чевое п оле NUM, п о ко-торы м будет происходить сравнение нов ы х записей из буф ера со стары ми запися-ми в ф изической таблице. Наж мите кнопку Generate SQL. В результате п олучатся запросы для обновления, удаления и вставки записей. Н апример, запрос для об-новления будет иметь вид UPDATE cd SET KOL = :KOL WHERE Num = :OLD_Num П ри его в ы п олнении в место параметра :KOL будут п одставлены значения одно-именны х п олей из буф ера. Д алее эти значения будут присвоены п олям тех запи-сей ф изической таблицы , для которы х значения клю чевы х п олей сов падаю т со ст а р ы м и значениями, имев ш имися до в ы п олнения запроса. П оследние значения в тексте запроса отличаю тся приставкой :OLD_. Д ля в ы п олнения сф ормированны х запросов UPDATE, INSERT, DELETE служит метод компонента TUpdateSQL procedure Apply (UpDateKind: TUpDateKind); В качестве параметра UpDateKind передается константа, обозначаю щ ая тип за-проса: ukModify, ukInsert, ukDelete. Д ействия, в ы п олняемы е методом Apply, происходят и при в ы зове методов Ap-plyUpdates (ф иксация изменений на сервере), CommitUpdates (очистка кэш а от за-ф иксированны х изменений) компонента TQuery. А льтернативны й методу Apply вариант имеет вид

Query1.ApplyUpdates; Query1.CommitUpdates;

3. Создайте обработчики собы тий OnClick для кнопок: procedure TForm1.ApplyСlick(Sender: TObject); begin Query1.ApplyUpdates; Query1.CommitUpdates; end;

Page 41: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

41

procedure TForm1.ReopenClick(Sender: TObject); begin Query1.Close; Query1.Open; end; П ри в ы п олнении программы измените значение п оля KOL какой-нибудь записи. П осле нажатия кнопки “П рименить” изменения будут сохранены , в чем В ы смо-ж ете убедиться, нажав кнопку « О ткры ть заново» . Е сли ж е нажать только кнопку « О ткры ть заново» , запрос будет переоткры т без сохранения изменений. О тметим , что • компонент TUpdateSQL может применяться как к локальны м , так и к удален-ны м БД ,

• компонент TUpdateSQL не является обязательны м и реально требуется лиш ь при необходимости редактировать запросы « только для чтения» . Собственно для кэш ирования изменений он, как правило, не нуж ен (К И использую тся для ускорения работы в сети и п олезны для одновременного доступа к стары м и нов ы м значениям п олей при редактировании).

У пражнение. И змените пример для редактирования нескольких п олей в заданном запросе. Задание. П еределайте пример лаб. работы № 6 (« Ж урнал заказов » ), заменив TTable на TQuery. П ереведите БД к ф ормату InterBase.

4. Р аб о та с с ерверо м InterBase InterBase – это СУБД , предназначенная для п остроения прилож ений с архитекту-рой клиент-сервер произв ольного масш таба: от сетевой среды небольш ой рабочей груп п ы с сервером п од управлением Novell NetWare или Windows NT на базе IBM PC до инф ормационны х систем крупного предприятия на базе серверов IBM, Hewlett-Packard, SUN и т.п . В процессе обучения мож но использовать как п олную версию InterBase, так и ло-кальны й однопользовательский сервер, входящ ий в комплект п оставки Delphi, пригодны й для ведения локальны х БД и для предварительной отладки прилож е-ний для среды « клиент-сервер» на локальной Э В М . И спользуя локальны й InterBase, можно создавать и отлаживать приложения, рабо-таю щ ие с данны ми п о схеме клиент-сервер, без п одклю чения к настоящ ему сер-веру. В дальнейш ем п отребуется только перенастроить используемы й псевдоним базы данны х, и программа будет работать с реальной базой без перекомпиляции. К роме того, локальны й InterBase мож но использовать в прилож ениях для работы с данны ми в место таблиц Paradox. О бщ ая методика работы с InterBase описана в [1]. Здесь более п одробно рассматриваю тся некоторы е особенности создания при-ложений, отличаю щ ие InterBase от локальны х СУБД .

4.1. Ути л и та Windows Interactive SQL

Page 42: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

42

Утилита Windows ISQL из п оставки Interbase п озв оляет интерактивно в ы п олнять SQL-запросы к базе данны х. Ч ащ е всего она используется для отладки запросов и для управления данны ми и их структурой, например для создания базы данны х, таблиц , хранимы х процедур, триггеров , и т.п . На самом первом этапе работы требуется создать БД , и здесь WISQL – основной инструмент. Д ля создания БД необходимо п осле запуска утилиты в ы брать п ункт меню File | Create DataBase. П оявится диалоговое окно (Рис. 14):

Рис. 14

Е сли сервер запущ ен у В ас на локальной маш ине (он виден в виде значка в правой части панели задач Windows), то в окне требуется п ометить “Local Engine” и указать путь к ф айлу БД , например D:\db\zakint.gdb, далее указать имя админи-стратора (SYSDBA) и пароль (masterkey - пароль администратора п о умолчанию ). П ароль администратора затем можно сменить, а такж е добавить новы х п ользова-телей с п омощ ью другой утилиты - InterBase Server Manager. Е сли все бы ло сдела-но правильно, в папке D:\db\ п оявится ф айл zakint.gdb, не содержащ ий п ока таб-лиц . Е сли В ы работаете с удаленны м сервером, то В ам надо п ометить переклю чатель “Remote Server”, узнать у администратора имя сервера, тип сетевого протокола, сетевой п уть к ф айлу БД , имя п ользователя и пароль и в вести их, как п оказано на рис. 14. П осле успеш ного создания БД заверш ите работу утилиты . Д ля создания таблиц , генераторов , триггеров и других метаданны х (как, в прочем , и для в ы п олнения лю бы х SQL-запросов ) необходимо соединиться с уже сущ ест-вую щ ей БД . Д ля этого п осле запуска ISQL в ы берите пункт меню "File|Connect to Database", п оявится диалоговое окно для в вода имени п ользователя и пароля. Создание таблиц в ы п олняется, как обы чно, с п омощ ью оператора CREATE TABLE. В се созданны е объ екты будут храниться в одном ф айле *.gdb.

Page 43: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

43

В WISQL сущ ествует два способа в ы п олнения операторов : в первом случае текст оператора следует набрать в окне SQL Statement; во втором - в ы брать пункт "File\Run an ISQL Script..." и указать имя скриптового ф айла (скрипта). Скрипт содержит п оследовательность SQL-операторов , предназначенны х для создания объ ектов БД и других необходимы х действий. Скрипт – это текстов ы й ф айл с расш ирением *.sgl. П римеры скриптов мож но найти п о адресу http://www.main.vsu.ru/~pmmtkiar. Более удобны м способом создания объ ектов БД для Interbase является использо-вание утилиты Delphi SQL Explorer, интерф ейс которой прост, интуитивно п оня-тен и мож ет бы ть легко освоен самостоятельно. И спользование SQL Explorer п од-робно описано в методических указаниях [5]. 4.2. Ко м п о нент TdataBase Экземпляр компонента TDataBase автоматически, независимо от ж елания про-граммиста, создается в прилож ении для каждой откры той БД . П ри работе с кли-ент-серверной СУБД рекомендуется его создавать явн о, перенося соответствую -щ ий компонент на ф орму или в модуль данны х. Я вное создание обеспечивает доступ к свойствам и методам TDataBase на этапе разработки. О сновны е задачи TDataBase: управление соединением с БД , управление транзакциями, регистрация п ользователя на сервере. Н екоторы е основны е свойства и методы : property AliasName: string;

Задает алиас БД

property DataBaseName: string;

Задает локальны й псевдоним , используемы й далее в свойстве DataBaseName компонентах TDataSet.

Property LoginPrompt: Boolean;

True означает, что имя п ользователя и пароль всегда будут запраш иваться при соединении с БД , False – будут считы ваться из свойства Params.

Property Params: Tstrings;

Список параметров соединения с БД . В част-ности, здесь указы ваю тся учетное имя и па-роль.

Property Connected: Boolean

Указы вает, имеет ли компонент активное со-единение с БД .

Procedure StartTransac-tion;

П осле в ы зова все изменения, вносимы е в БД , считаю тся относящ имися к текущ ей актив -ной транзакции.

Procedure Commit; Заверш ает в ы п олнение текущ ей транзакции и ф иксирует все изменения в БД .

Procedure RollBack; О ткат транзакции. Property IsTransaction: Boolean;

Сообщ ает, имеется ли активная транзакция.

Procedure ApplyUpdates (const DataSets: array

П одтверж дает кэш ированны е изменения в

Page 44: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

44

(const DataSets: array of TDataSet)

нескольких Н Д , перечисленны х в откры том массиве DataSets.

Property TransIsola-tion: TtransIsolation;

Задает уровень изоляции транзакций на сер-вере [1,2].

П римечания. • В простейш ем случае достаточно использовать свойства Aliasname, Data-

BaseName. • Редактирование свойств соединения Params рекомендуется с п омощ ью редак-тора, в ы зы ваемого двойны м щ елчком п о компоненту. В откры в ш емся редакто-ре следует нажать кнопку Defaults для п олучения списка параметров соедине-ния п о умолчанию и их редактирования.

• Н а этапе отладки рекомендуется п одавить запраш ивание учетного имени и па-роля; для этого надо установить свойство LoginPrompt в False и отредактиро-вать в Params строки UserName=… и Password =…

• В свойстве DataBaseName компонентов TDataSet теперь указы вается не алиас БД , а значение свойства DataBaseName компонента TDataBase.

4.3. Генерато ры В таблицах Paradox для хранения значений уникальны х первичны х клю чей ис-п ользую тся п оля AutoIncrement, обеспечиваю щ ие автоматическое приращ ение значения п оля при добавлении новой записи. В InterBase вместо этого использу-ю тся ген ер а т ор ы . Генератор (generator) - это хранимы й на сервере механизм, которы й создает п о-следовательны й уникальны й номер, которы й автоматически вставляется в столбец БД при в ы п олнении операций INSERT или UPDATE. Генератор обы чно применя-ется для создания уникальны х значений, вставляемы х в столбец , которы й исполь-зуется как PRIMARY KEY. Д ля базы данны х мож ет бы ть определено лю бое число генераторов , кажды й генератор долж ен иметь уникальное имя. Генератор при об-ращ ении к нему возвращ ает новое уникальное значение Создание генератора: CREATE GENERATOR ИмяГенератора; Установка начального значения: SET GENERATOR ИмяГенератора TO НачЗначение; Создание и установка в ы п олняется либо с п омощ ью отдельны х запросов , либо в диалоговом режиме с п омощ ью утилиты SQL Explorer. Д ля обращ ения к генератору служит ф ункция: GEN_ID (ИмяГенератора, Приращение); М еханизм генераторов гарантирует, что даже при конкурентном (параллельном) в ы зове ф ункции GEN_ID каждому п ользователю будет в ы даваться уникальное значение. П оследнее значение генератора всегда запоминается в БД , п оэтому раз-работчику не нуж но заботиться о "восстановлении" его максимального значения п осле п одсоединения к БД . Генераторы являю тся переменны ми типа integer (longint), таким образом, если предположить что новое значение возвращ ается в

Page 45: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

45

среднем с интервалом в 3 секунды , значений генератора хватит приблизительно на 270 лет. Способы обращения к генератору 1. C помощью оператора INSERT Н апример, разместите на ф орме несколько строк редактирования, связанны е ком-п оненты Query1, DataSource1, DBGrid1 и дополнительно отдельны й Query2. В свойство SQL Query1 запиш ите SELECT * FROM cust а в свойство SQL Query2 INSERT INTO cust(nc, name, address) VALUES (GEN_ID(G1,1), :p1, :p2) Здесь G1 – имя ранее созданного В ами генератора. В обработчик кнопки « Д обавить запись» запиш ите Query2.ParamByName(‘p1’).value:=Edit1.Text; Query2.ParamByName(‘p2’).value:=Edit2.Text; Query2.ExecSql;Query1.Close;Query1.Open;

2. С помощью т ри гге ра Создайте, используя утилиту WISQL или SQL Explorer, триггер CREATE TRIGGER by_nc FOR cust BEFORE INSERT AS BEGIN new.nc=gen_id(g1,1); END В триггере генератор будет автоматически в ы зы ваться при редактировании перед собы тием запоминания новой записи. К лю чевое п оле nc п ользователем не в водит-ся; оно заполняется генератором . В место значения "1" мож ет бы ть использовано лю бое число, на которое нуж но иметь приращ ение текущ его значения генератора. За м еча н и я к и спользова н и ю т р и ггер а : • Этот метод пригоден только для редактирования Н Д , возвращ аемы х компонен-том TQuery. П ри использовании TTable генераторы следует в ы зы вать из хра-нимы х процедур.

• В операторе INSERT, используемом как самостоятельно, так и в составе компо-нента TUpdateSQL, клю чевое п оле, для которого п остроен генератор, долж но бы ть опущ ено.

3. С помощью хра н и мой проце д уры Н апиш ите хранимую процедуру CREATE PROCEDURE Get_Num RETURNS (n INTEGER) AS BEGIN n = gen_id(g1,1); END П ример. Расположите три связанны х компонента Table1, DataSource1, DBGrid1 и один компонент SP1: TStoredProc. Д ля п оследнего запиш ите в свойстве Data-

Page 46: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

46

baseName алиас БД , а в свойство StoredProcName имя хранимой процедуры (Get_Num). П росмотрите свойство Params и убедитесь, что параметр n хранимой процедуры там присутствует и описан правильно. В ы зов хранимой процедуры и считы вание возвращ енного ею значения запиш ите в обработчике собы тия OnAfterInsert Н Д : procedure TForm1.Table1AfterInsert(DataSet: TDataSet); begin Sp1.Prepare; Sp1.ExecProc; Table1.FieldByName('nd').Value:= Sp1.ParamByName('n').Value; end; 4.4. Х рани мы е п ро ц едуры Хранимы е процедуры (stored procedure) - это отдельны е программы , написанны е на язы ке процедур и триггеров Interbase, которы й является расш ирением SQL. Хранимы е процедуры являю тся частью метаданны х базы данны х. О ни могут п о-лучать входны е параметры , в озвращ ать значения прилож ению и могут бы ть в ы -званы явно из прилож ения или п одстановкой вместо имени таблицы в инструкции SELECT. Хранимы е процедуры имею т следую щ ие преимущ ества: • М одульность: сохраненны е процедуры могут бы ть общ ими для прилож ений, которы е обращ аю тся к той ж е самой базе данны х, что п озв оляет избегать п о-вторяю щ егося кода, и уменьш ает размер приложений.

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

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

М одуль хранимой процедуры хранится в БД на сервере и в ы зы вается из прилож е-ний. Ч асто используемы е типов ы е SQL-запросы к серверу рекомендуется оф орм-лять в виде хранимы х процедур, так как это п ов ы ш ает быстродействие системы . Хранимы е процедуры создаю тся в среде WISQL или SQL Explorer. Ф ормат хра-нимой процедуры : CREATE PROCEDURE ИмяПроцедуры [(ВхПар Тип [,ВхПар Тип] …)]

RETURNS [(ВыхПар Тип [,ВыхПар Тип] …)] AS <Тело процедуры> П рилож ение обменивается инф ормацией с хранимой процедурой через список входны х и в ы ходны х параметров , как с обы чной процедурой на Pascal’e. В озмож -ны е типы параметров см . в П рилож ении 3. Т ело хранимой процедуры имеет вид <Объявления локальных переменных> BEGIN

Page 47: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

47

<Оператор> <Оператор> … END Е сли в хранимой процедуре использую тся локальны е переменны е, то все они долж ны бы ть объ явлены : DECLARE VARIABLE ИмяПеременной Тип; Синтаксис язы ка во многом аналогичен Pascal. П ри написании тела хранимой процедуры могут использоваться: • оператор присваивания ИмяП ер ем ен н ой = вы р а ж ен и е; • операторны е скобки BEGIN … END; • оператор IF(<усл овие>)THEN <оператор1> ELSE <оператор2>; • оператор цикла WHILE (<усл овие>) DO <оператор> и некоторы е другие [1]. Хранимая процедура мож ет содержать различны е SQL-операторы . О ператор SE-LECT используется в р а сши р ен н ой р еда кци и . В него добавляется предложение INTO :пер ем ен н а я [, :пер ем ен н а я]. В перечисленны е переменны е или в ы ходны е параметры будут записаны значения, возвращ аемы е оператором SELECT. Хранимы е процедуры делятся на пр оцеду р ы дейст ви я и пр оцеду р ы от бор а . П ро-цедуры действия не возвращ аю т параметров или возвращ аю т один экземпляр па-раметров . П од экземпляром п онимается строка в результирую щ ем наборе данны х. П роцедуры отбора в озвращ аю т несколько экземпляров . Д ля в ы зова процедур дей-ствия в Delphi применяется компонент TStoredProc, для в ы зова процедур отбора – компонент TQuery.

Лабораторная работа № 14. В ы зов процедур действия. 1. Создайте в БД ZakGdb хранимую процедуру: CREATE PROCEDURE MAXIM (dname CHAR(10)) RETURNS (max_total integer) AS BEGIN SELECT max(cd.Total) FROM cd, detal WHERE (cd.nd=detal.nd)and (detal.name= :dname) into:max_total; END 2. Разместите на ф орме компоненты DataBase1: TDataBase, Table1, DataSource1, DBGrid1 и StoredProc1. Настройте DataBase1 на алиас ZakGdb и определите ло-кальны й алиас db1. Настройте Table1 на таблицу Detal и локальны й алиас db1. Соедините перв ы е четы ре компонента. Установите свойства StoredProc1: Name - Sp1 StoredProcName - Maxim DatabaseName - Db1 3. В обработчике собы тия щ елчка п о ячейке таблицы DBGrid1 запиш ите procedure TForm1.DBGrid1CellClick(Column: TColumn); begin Sp1.Unprepare; // Задание входного параметра хранимой процедуры: Sp1.ParamByName('Dname').AsString:= table1.FieldByName('Name').AsString; Sp1.Prepare; //Связывание параметров Sp1 и параметров ХП Sp1.ExecProc; // Выполнение хранимой процедуры

Page 48: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

48

// Отображение выходного параметра: Label2.Caption:=Sp1.ParamByName('max_total').AsString; end; 4. М одиф ицируйте запрос для в ы дачи максимального, минимального и среднего заказа.

Рис.15

Лабораторная работа 15. В ы зов процедур отбора В процедурах, возвращ аю щ их несколько строк, обы чно используется конструкция FOR <оператор SELECT> DO SUSPEND; Здесь оператор SUSPEND в ы п олняется для каждой строки, возвращ енной опера-тором SELECT. О ператор SUSPEND передает значения в ы ходны х параметров в ы -зы ваю щ ему приложению и приостанавливает работу хранимой процедуры , п ока прилож ение не запросит следую щ ую п орцию параметров . П осле этого управление снова передается оператору SELECT. И з прилож ения хранимая процедура отбора в ы зы вается оператором SELECT * FROM <ИмяХП> (<список входных параметров>) 1. Создайте хранимую процедуру. CREATE PROCEDURE zakazy (dname CHAR(10)) RETURNS (out_nc INTEGER, out_data DATE, out_total INTEGER) AS BEGIN FOR SELECT cd.nc, cd.data, cd.total FROM cd, detal WHERE (cd.nd=detal.nd) and (detal.name= :dname) INTO :out_nc, out_data, out_total DO SUSPEND; END Д анная процедура в ы водит инф ормацию о заказах на изделие, передаваемое в о входном параметре. 2. Расположите две тройки компонентов TQuery, TDataSource, TDBGrid и один DataBase1: TDataBase. Свяжите их с БД ZakGdb (см .рис.16).

Page 49: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

49

Рис.16

3. В свойство SQL для Query1 запиш ите SELECT * FROM detal а в свойство SQL для Query2 SELECT * FROM zakazy (:dname) О бращ ение к хранимой процедуре zakazy (:dname) указы вается п осле FROM вме-сто имени таблицы . 4. О бработчик для DBGrid1: procedure TForm1.DBGrid1CellClick(Column: TColumn); begin Query2.Close; Query2.ParamByName('Dname').asstring:= Query1.FieldByName('Name').asstring; Query2.open; end; Н а перв ы й в згляд, для п одобного установления связей меж ду таблицами удобнее использовать свойства компонентов TTable (см .п .1.3), однако в « клиент-серверны х» прилож ениях п одобны е навигационны е приемы не рекомендую тся. 4.5. Т ри ггеры Т риггер - это хранимая на сервере особая процедура, ассоциированная с таблицей, которая автоматически в ы п олняет действия при добавлении, изменении или уда-лении строки в таблице . К триггеру нельзя обратиться из прикладной программы , у него отсутствую т в ходны е и в ы ходны е параметры . Т риггер никогда явно не в ы зы вается, он сраба-ты вает автоматически при наступлении какого-либо собы тия в БД . С п омощ ью триггеров обы чно реализую тся би зн ес-пр а ви ла , задаю щ ие логику работу с БД , на-пример, генераторы для п оддержания уникальны х значений клю чевы х п олей, кас-кадны е в оздействия для обеспечения ссы лочной целостности, контроль за допус-тимостью в в одимы х значений при редактировании, ведение регистрационны х ж урналов , накапливание статистики и т.п . Т риггер создается оператором

Page 50: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

50

CREATE TRIGGER ИмяТриггера FOR ИмяТаблицы [ACTIVE | INACTIVE] {BEFORE | AFTER} {DELETE | INSERT | UPDATE} AS <Тело триггера> Здесь: ACTIVE | INACTIVE указы вает, активен триггер или нет. П о умолчанию действу-ет ACTIVE. BEFORE | AFTER указы вает момент в ы п олнения триггера, до или п осле запомина-ния изменений в БД . DELETE | INSERT | UPDATE указы вает тип собы тия, на которое реагирует триг-гер. Ф ормат тела триггера и алгоритмический язы к такие ж е, как у хранимы х проце-дур. О тличие состоит в возмож ности обращ ения к стары м и нов ы м значениям столбцов таблицы . Запись OLD.ИмяСтолбца означает обращ ение к состоянию столбца до внесения в озмож ны х изменений. Запись NEW.ИмяСтолбца – к состоя-нию столбца после внесения возмож ны х изменений. П ример триггера для п оддержания ссы лочной целостности путем каскадны х из-менений в связанны х таблицах. CREATE TRIGGER BY_nc FOR cust ACTIVE BEFORE UPDATE AS BEGIN IF (old.nc <> new.nc) THEN UPDATE cd SET nc = new.nc WHERE nc=old.nc END Т риггер для каскадного удаления записей напиш ите самостоятельно. Замечание: перед использованием такого рода триггеров необходимо удалить из БД ограничения ссы лочной целостности, если они имею тся. 4.6. Ко м п о ненты до с туп а к данны м с ервера InterBase Начиная с версии 5, в Delphi п оявился набор компонентов доступа к данны м , п о-добны х описанны м ранее универсальны м компонентам, однако обеспечиваю щ их прямое п одклю чение к серверу InterBase без использования механизма BDE. Ра-зумеется, для работы с Interbase п о преж нему могут использоваться BDE-ориентированны е компоненты , но преимущ ествами нового п одхода являю тся п о-в ы ш енны е компактность и бы стродействие. В се нов ы е компоненты собраны на странице InterBase палитры компонентов . В таблице дана их краткая характеристика. П рилож ение « Заказы » с использованием компонентов Interbase можно скачать п о адресу http://www.main.vsu.ru/~pmmtkiar.

К омпонент Описание

TIBTable А налог BDE-компонента TTable

TIBQuery А налог TQuery

Page 51: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

51

TIBSroredProc А налог TStoredProc

TIBDataBase Устанавливает соединение с БД InterBase. П озволяет задавать параметры соединения и управлять транзакциями.

TIBTransaction Управляет отдельной транзакцией О Д Н О ГО или нескольких соединений с базами данны х. С ним долж ен бы ть связан компонент TIBDataBase..

TIBUpdateSQL А налог TUpdateSQL

TIBDataSet П редназначен для просмотра и редактирования набора дан-ны х, п олученны х с п омош ью оператора SELECT. TIBDataSet содержит отдельны е операторы SQL для вставки, удаления, модиф икации строк.

TIBEvents П озволяет регистрировать и синхронно обрабаты вать сооб-щ ения о собы тиях, генерируемы х сервером

TIBSQL В ы п олняет SQL-оператор с минимальны ми затратами pecyp-coв , не требует п одклю чения к визуальны м компонентам управления данны ми.

TIBDatabaseInfo В озвращ ает инф ормацию о п одклю ченной базе данны х Inter-Base (количество в ы деленны х кэш -буф еров , количество про-читанны х и записанны х страниц и т.д.).

TIBSQLMonitor О сущ ествляет мониторинг динамических SQL-операторов , передаваемы х на InterBase-сервер.

Примечание • П ри создании прилож ений обязательно использование компонентов

TIBDataBase и TIBTransAction. Н ап омним , что в технологии BDE аналогичны й компонент TDataBase бы л необязателен.

П оясним методику создания прилож ений на примере двух связанны х таблиц « За-казчики» и « Заказы » .

1. В новом проекте разместите в модуле данны х компоненты TIBDataBase, TIBTransAction, два комп онента TIBTable и два компонента TdataSource (как п ока-зано на Рис. 17).

2. К омпонент IBDataBase1 свяжите с базой данны х IB_sklad, отредактируйте, как обы чно, свойство Params.

Page 52: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

52

Рис. 17

3. С п омощ ью свойства DefaultDataBase свяжите компонент IBTransaction1 с IBDataBase1. Свяжите IBTable1 с IBDataBase1 через свойство DataBase. В TableName в ы берите таблицу Cust и откройте ее. А налогично п оступите с IBTable2, связав ее с таблицей CD.

4. Свяжите комп оненты IBTable и TDataSource. Установите связь Master-Detail меж ду таблицами Cust и CD п о п олю nc.

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

Задани я дл я с ам о с то ятел ьно й раб о ты Задачи п о проектированию баз данны х для конкретны х предметны х областей, на-пример « Склад» , « П оликлиника» , « О тдел кадров » и др. см . в методических указа-ниях [4,5]. П римерны е задачи на п остроение SQL-запросов . Реш ение каждой задачи должно иметь вид законченного приложения, необходимы е параметры долж ны в водится с п омощ ью визуальны х компонентов . Реш ение представляется в двух вариантах: на основе клиентских запросов и с использованием хранимы х процедур. 1. В таблицах cust, detal, cd в ы вести ф амилии п окупателей заданного товара за заданны й промеж уток времени. П овторяю щ ихся п окупателей из списка исклю -чить.

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

3. В таблицах cust, detal, cd в ы вести названия деталей, купленны х указанны м за-казчиком за указанную дату.

Page 53: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

53

4. В ы вести ф амилию и адрес заказчика, купив ш его заданны й товар раньш е дру-гих.

5. Найти название товара, которы й заданны й п окупатель приобретал чащ е других (т.е. на которы й он сделал больш е всего заказов ).

6. В ы вести названия товаров , купленны х п окупателем , ф амилия которого вклю -чает заданны е буквы , не п озднее указанной даты .

7. В ы вести ф амилию заказчика, сделавш его самы й крупны й разовы й заказ на указанны й товар.

8. В таблицах detal, cd в ы вести в ы дать на каждую дату число и объ ем сделок на указанны й товар.

9. В ы вести названия всех товаров , которы е приобрел п окупатель, купив ш ий наи-больш ее число товаров . В ы вести из них только товары , купленны е п осле ука-занного срока.

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

11. В ы вести названия товаров , купленны х п окупателями из указанного города, ес-ли сумма сделки превы ш ала в веденное число. Результат упорядочить п о назва-нию товара, исклю чив п овторяю щ иеся товары .

12. Найти заказчиков , чащ е всего п окупав ш их указанны й товар. 13. Найти сумму заказов , сделанны х на указанны й товар за данны й период. 14. Найти названия городов , из которы х чащ е всего делались заказы за данны й пе-риод времени.

15. Найти заказчика из указанного города, купив ш его самы й деш евы й товар из в веденной ценовой груп п ы .

16. С п омощ ью триггеров реализовать ведение ж урнала статистики продаж п о ка-ж дому городу и товару.

17. Создать триггеры для обеспечения каскадны х изменений в БД « Заказы » . 18. Создать триггер для ведения ж урнала изменений для таблицы « Д етали» . 19. Д ля БД « П оликлиника» написать триггер для ведения статистики заболеваний для разны х в озрастны х груп п .

Следую щ ие задачи реш ить с использованием индексов и ф ильтров . 20. П одсчитать средний объ ем сделок на данны й товар за данны й период. 21. П одсчитать сумму заказов , сделанны х из указанного города за данны й период. 22. П одсчитать число заказчиков из данного города, купив ш их данны й товар. 23. В БД « Н аучная конф еренция» п одсчитать сумму внесенны х оргв зносов док-ладчиками из данного города.

24. Написать ф орму для занесения инф ормации в таблицу Detal. П еред занесением проверить, имеется ли данны й товар уже на складе.

25. Написать ф орму для занесения инф ормации в таблицу « К онф еренция» .

Сл о варь терми но в А л иас. Условное наименование каталога, где находится БД . А лиасы регистриру-ю тся и использую тся BDE.

Page 54: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

54

База данны х. Н абор в заимосвязанны х таблиц . Вторичны й индекс. Д оп олнительны й и н декс, строящ ийся п о лю бому клю чу, кроме первичного клю ча. И ндекс. Структура, задаю щ ая логический п орядок записей в таблице, отличны й от ф изического п орядка. К л асс. О бъ ектов ы й тип переменны х. К л юч. П оле, п о которому происходит сортировка или п оиск. К омпонент. Разновидность кла сса , способного визуально переноситься в про-грамму. К эшированны е изменения . М еханизм доступа, при котором все изменения в таблице запоминаю тся в буф ере на локальной Э В М и переносятся на сервер от-дельной транзакцией. М одул ь. Н езависимо компилируемая программная единица. М одул ь данны х. Н еотображаемая ф орма, контейнер для компонентов доступа к данны м. Объ ект. Экземпляр кла сса . Первичны й индекс. Индекс, п остроенны й п о пер ви чн ом у ключу . Первичны й кл юч. П оле, уникальны м образом идентиф ицирую щ ее запись в таб-лице. Транзакц ия . Л огическая единица изменений данны х, переводящ ая БД из одного целостного состояния в другое. Составной кл юч. К люч, состоящ ий из нескольких п олей. Текущая запись. Запись, доступная для редактирования. Ф орма. В изуальны й компонент, отображаемы й в виде окна. К онтейнер для визу-альны х компонентов , перенесенны х в программу.

При л о ж ени е П1. Структура фрагмента БД « Заказы » (ф о рмат Paradox) Табл иц а Cust («Заказчики» )

Page 55: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

55

П оле Т ип Д лина О писание Nc AutoIncrement К од заказчика (первичны й клю ч) Name Alpha (символь-

ны й) 20 И мя заказчика (вторичны й клю ч)

Address Alpha (символь-ны й)

20 А дрес заказчика

Табл иц а Detal («Д етал и» ) Nd AutoIncrement К од изделия (первичны й клю ч) Name Alpha (символь-

ны й) 20 И мя изделия (вторичны й клю ч)

Price Number Ц ена единицы товара (у.е.) Rest Long Integer О статок на складе (ш тук) Табл иц а CD («Ж урнал заказов» ) Num AutoIncrement Н омер заказа (первичны й клю ч) Nc Long Integer К од заказчика Nd Long Integer К од изделия Kolvo Long Integer О бъ ем заказа (ш тук) Total Number О бъ ем заказа (у.е.) Data Date Д ата заказа П2. Т и п ы п о л ей Paradox

Т ип п оля О бознач. Хранимы е значения Alpha A Символьны е значения длиной до 255 симво-

лов . Number N Ч исла с п лаваю щ ей точкой в диапазоне –10307

… 10 308. Т очность 15 значащ их циф р Money $ А налогичен типу Number, но число знаков п о-

сле запятой – 2. В ы водится знак $. Short S Ц елы е числа в диапазоне –32767 … 32767. LongInte-ger

L Ц елы е числа в диапазоне –2147 483648 … 2147483647.

BCD # Ч исловы е значения п ов ы ш енной точности. Date D Значения даты (в диапазоне от 01.01.9999 до

н.э. до 31.12.9999) . Time T Значения времени. Timestamp @ Значения даты и времени. Memo M Строковы е значения длиной свы ш е 255 сим-

волов . Д о 240 символов мож ет храниться в

Page 56: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

56

таблице, остальны е отдельно, в MB-ф айле. Formatted Memo

F Т о ж е, но хранит тексты , ф орматированны е ш риф том, цветом и т.п .

Graphics Fields

G Граф ические изображения в ф ормате ф айлов .bmp, .pcx, .tif, .gif, .eps. Хранятся в отдельны х ф айлах.

OLE O И нф ормация об объ ектах OLE (Object Linking and Embedding).

Logical L Л огические значения, ‘True’, ‘False’. AutoIn-crement

± Ц елы е числа только для чтения с автоматиче-ским приращ ением на 1 при добавлении но-в ой записи. И спользую тся в качестве первич-ного клю ча.

Binary (Blob)

B П роизв ольны е двоичны е значения, интерпре-тируемы программой п ользователя. Хранятся отдельно, в М В -ф айле.

Bytes Y Т о ж е, но хранятся в месте с таблицей. П3. Т и п ы п о л ей InterBase

Т ип п оля Размер, байт

Хранимы е значения

SmallInt 2 Ц елы е числа в диапазоне –32767 … 32767. Integer 4 Ц елы е числа в диапазоне –2147 483648 …

2147483647. Float 4 Ч исла с плаваю щ ей точкой в диапазоне –

3,4 ⋅1038 … 3,4 ⋅10 38 до 7 значащ их циф р.

Double precision

8 Ч исла с плаваю щ ей точкой в диапазоне –1,7 ⋅10307 … 1,7⋅ 10 308 точностью до 15 зна-чащ их циф р.

Char(n) 0-32767 Символьны й столбец длиной n символов . VarChar(n) 0-32767 Символьны й столбец переменной длины , со-

держащ ий до n символов . Date 8 Д ата в пределах от 01.01.0100 до 11.12.5491 и

время. Blob П ерем . Л ю бой тип двоичны х данны х.

Ли тература 1. Ш умаков П .В ., Ф аронов В .В . Delphi 5. Руководство разработчика баз данны х. – М .: Н олидж , 2000. – 640 с.

2. Д арахвелидзе П .Г., М арков Е .П . Delphi 4. - СП б.: BHV-Санкт-П етербург, 1999. - 816 с.

Page 57: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

57

3. Т ю качев Н .А ., Свиридов Ю .Т . П роектирование баз данны х в Delphi. – В оро-неж : Биомик, 1998. – 190 с.

4. Астахова И .Ф ., Т олстобров А .П ., М ельников В .М . SQL в примерах и задачах. – В оронеж : Б.и., 1999. – 104 с.

5. Д оступ к БД в Delphi / Сост.: М .В . Бакланов , Н .А . Т ю качев , Ю .Т . Свиридов .- В оронеж , 1999. – 24 с.

6. Роб Баас, М айк Ф ервай, Хайдемария Гю нтер. Delphi 5. – Киев : И рина; BHV, 2000.- 494с .

7. Ф аронов В .В . Delphi 5: Учеб. курс. – М .: Н олидж , 2000. – 605 с. 8. К огсвелл Д . И зучи сам программирование баз данны х в Delphi 2.0 сегодня. - М инск: П опурри, 1997. - 448 с.

9. Д антеманн Д ., М иш ел Д ., Т ейлор Д . П рограммирование в среде Delphi. - Киев : Д иаСоф т Л тд, 1995. - 608 с.

10. Е панеш ников А ., Е панеш ников В . П рограммирование в среде Delphi 2.0. - М .: Д И А Л О Г-М И Ф И , 1997. – Ч .2.- 319 с.

11. Разработка Windows-прилож ений. Delphi / Сост. В .Г. Рудалев . – В оронеж , 1999.– 32 с.

12. О бъ ектно-ориентированное программирование. Создание нового комп онента / Сост. Н .А . Т ю качев , В .Г. Рудалев , М .В . Бакланов .– В оронеж , 1999. – 36 с.

СОД Е Р Ж АНИ Е Предисл овие ................................................................................................................ 2 1. М етодика создания прил ож ений...................................................................... 3

1.1. В В Е Д Е Н И Е .............................................................................................................................................................. 3

Page 58: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

58

1.2. О СН О В Н Ы Е К О М П О Н Е Н Т Ы ................................................................................................................................4 1.2.1. Ст р а н и ца DataAccess ................................................................................. 4 1.2.2. Ст р а н и ца DataControls .............................................................................. 5 1.2.3. М и н и м а льн ы й н а бор компон ен т для пр и лож ен и я с БД............................ 6

1.3. УСТ А Н О В Л Е Н И Е СВ Я ЗЕ Й М Е Ж Д У Т А БЛ И Ц А М И ..............................................................................9 1.4. М О Д У Л И Д А Н Н Ы Х...........................................................................................................................................11

2. Навигац ионны й доступ к Б Д .............................................................................. 12 2.1. РА БО Т А С П О Л Я М И Н А БО РА Д А Н Н Ы Х.......................................................................................................12

2.1.1.Созда н и е объект ов-пот ом ков TField ........................................................13 2.1.2. Реда кт ор полей ..........................................................................................13 2.1.3. О бр а щ ен и е к полю .....................................................................................14 2.1.4. П олучен и е и н ф ор м а ци и о полях................................................................16

2.2. Н А В И ГА Ц И Я П О Н А БО РУ Д А Н Н Ы Х........................................................................................................19 2.3. Д Е Й СТ В И Я Н А Д Т Е К УЩ Е Й ЗА П И СЬ Ю ........................................................................................................20 2.3. П О И СК Д А Н Н Ы Х ...............................................................................................................................................21

2.3.1.У н и вер са льн ы е мет оды Locate и Lookup кла сса TDataSet .......................21 2.3.2. Ф и льт р а ци я н а бор а да н н ы х......................................................................24

2.4. И Н Д Е К СЫ И И Н Д Е К СН Ы Й П О И СК ..........................................................................................................25 2.4.1.Созда н и е и н декса ........................................................................................25 2.4.2. П олучен и е и н ф ор м а ци и об и н дексе...........................................................26 2.4.3. Индексн ы й пои ск........................................................................................27

2.6. В И ЗУ А Л Ь Н Ы Е К О М П О Н Е Н Т Ы Д Л Я РЕ Д А К Т И РО В А Н И Я Т Е К УЩ Е Й ЗА П И СИ .......................30 3. SQL-ориентированны й доступ к Б Д ................................................................. 32

3.1. И СП О Л Ь ЗО В А Н И Е SQL .......................................................................................................................................32 3.2. Д И Н А М И Ч Е СК И Е ЗА П РО СЫ ..............................................................................................................................35

3.2.1. П а р а м ет р и за ци я запр осов ........................................................................36 3.2.2. Ф ор м и р у ем ы е запр осы ..............................................................................38

3.3. РЕ Д А К Т И РО В А Н И Е РЕ ЗУ Л Ь Т А Т О В ЗА П РО СА ...................................................................................39 4. Р абота с сервером InterBase ................................................................................ 41

4.1. У Т И Л И Т А WINDOWS INTERACTIVE SQL...............................................................................................41 4.2. К О М П О Н Е Н Т TDATABASE..........................................................................................................................43 4.3. ГЕ Н Е РА Т О РЫ .............................................................................................................................................................44 4.4. ХРА Н И М Ы Е П РО Ц Е Д У РЫ ...................................................................................................................................46 4.5. Т РИ ГГЕ РЫ ....................................................................................................................................................................49 4.6. К О М П О Н Е Н Т Ы Д О СТ У П А К Д А Н Н Ы М СЕ РВ Е РА INTERBASE .......................................................50

Задания дл я самостоя тел ьной работы ................................................................... 52 Сл оварь терминов .................................................................................................... 53 Прил ож ение ............................................................................................................... 54 П 1. СТ РУ К Т У РА Ф РА ГМ Е Н Т А БД « ЗА К А ЗЫ » (Ф О РМ А Т PARADOX)................................................54 П 2. Т И П Ы П О Л Е Й PARADOX .....................................................................................................................................55 П 3. Т И П Ы П О Л Е Й INTERBASE .................................................................................................................................56

Л итература................................................................................................................ 56

Page 59: Разработка приложений баз данных в среде Delphi. Часть 1: Методическое пособие

59

А вторы : Рудалев В алерий Геннадьевич, К ры жановская Ю лиана А лександровна. Редактор: Т ихомирова О .А .


Recommended