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

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

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

Учебно-метод ическое пособие по специальности «Прикладная математика и

информатика» 010501 (010200)

В оронеж , 2005

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

2

Утверж д ено научно-метод ическим советом факультета ПМ М протокол № 1 от 21.09.2005 г.

Составитель Руд алев В .Г. Учебно-метод ическое пособие под готовлено на кафедре технической киберне-тики и автоматического регулирования факультета прикладной математики , информатики и механики В оронеж ского госуд арственного уни верситета. Рекоменд уется д ля студентов 4 курса д /о факультета ПМ М .

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

3

В ведени е Д анное пособие, являю щ ееся прод олж ением серии метод ических пособий по разработке прилож ений баз д анны х, содерж ит сведения об особенностях ис-пользования СУБД InterBase. Д ля работы с пособием необход имо знание ос-новны х компонентов Delphi д ля работы с базами д анны х в рамках пособия [3] и знакомство с языком SQL. Сервер баз д анны х InterBase в ы пускается фирмой Borland д ля различны х про-граммно-аппаратных платформ: Novell NetWare, Windows всех версий, Linux, информационны х систем на базе серверов IBM, Hewlett-Packard, SUN, SGI и др. Реально InterBase мож ет обслуж и вать БД размером в 10-20 ги габайт, при раз-мере одного файла БД 2 ги габайта. М ногофайловая БД мож ет состоять и з 65535 файлов , таким образом, теоретический предел д ля одной базы д анны х - 132 терабайта. InterBase – оптимальное реш ение д ля малы х и средних организаций с числом рабочих станций порядка нескольких д есятков . Сервер Interbase облад ает д ос-таточной производ ительностью , над еж ностью и низкими системными требова-ниями . А д министрирование Interbase горазд о прощ е, чем серверов Oracle или MS SQL, но при этом обеспечи вается приемлемая д ля многих зад ач степень защ иты информации . В ходной язык Interbase наиболее точно под д ерж и вает станд арт ANSI SQL 92, что д елает Interbase некоей «константой» сред и множ ества несовместимы х д и а-лектов SQL други х фирм. Н емаловаж ное преимущ ество Interbase – отсутств ие ж естких лицензионны х ог-раничений. В ерси и InterBase, в ы пускаемые фирмой Borland, не бесплатны . В то ж е время исход ные тексты InterBase открыты д ля разработчиков и в рамках ря-д а проектов (например, FireBird, Jaffil) в ы пускаю тся свои соверш енно бесплат-ные усоверш енствованные версии сервера, совместимые с InterBase, информа-ция о которых постоянно обновляется на сайте ibase.ru. И звестный нед остаток Interbase – отсутств ие средств инструментальной под д ерж ки - полностью ком-пенсируется многочисленными утилитами и программными комплексами сто-ронних фирм – IBAdmin, IBManager, IBExpert и др.

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

4

1. О с но в ы р або ты в InterBase

1.1. У стано вка InterBase Установка InterBase или FireBird, как правило, происход ит быстро и не в ы зы вает затруднений. Н апример, при установке сервера FireBird 1.5 на локальны й компью тер, не подклю ченны й к сети , необход имо запустить установочный файл Firebird-1.5.2.4731-Win32.ехе и след овать инструкциям, принимая установки по умолчанию (в частности , согласи в ш ись с запуском FireBird при старте Windows в качестве служ бы ). FireBird предлож ит В ам д в а варианта установки – Classic и SuperServer. В в арианте Classic каж д ы й запрос клиента обрабаты вается в отдельном процессе, в в арианте SuperServer – отдельными потоками внутри ед иного процесса. Первы й вариант отличается стабильностью работы , второй – меньш им потреблением системны х ресурсов . При установке FireBird в сети необход имо установ ить сервер на одном и з узлов сети , который буд ет и грать роль сервера баз д анны х. Н а рабочих станциях сети необход имо установ ить клиент InterBasе. Это мож но в ы полнить различными способами . В о-первы х, запустить установочны й файл, отклю чи в опцию установки сервера, а остав и в только установку клиента. В о-вторых, отметить при установке Delphi флаж ок Install InterBase Client. Н аконец, мож но скопировать файл gds32.dll в папку Windows\System32. Это ед инственны й файл, необход имы й д ля работы клиента.

1.2. И нструментал ьны е средства

Утилита Interbase Console (сокращ енно IBConsole) – основная утилита в InterBase версий 6-7 д ля работы с БД . Е е функци и :

• Созд ание базы д анны х • Соед инение с БД и в ы полнение SQL-запросов • О тображ ение информаци и о БД . • А д министрирование БД .

В целом функциональные возмож ности IBConsole невелики , поэтому часто пользую тся утилитой SQL Explorer, в ход ящ ей в состав Delphi. SQL Explorer работает через BDE и позволяет легко созд авать таблицы и другие объекты БД в д и алоговом реж име. О д нако, по мнени ю автора (совсем не ори гинальному), предпочтительней явля-ется свободно распространяемая утилита IBExpert, отличаю щ аяся богатой функциональностью , простотой использования и стабильностью работы . Рас-смотрим подробнее основные возмож ности IBExpert и метод ику ее использова-ния на примере верси и 2.5. Утилита под д ерж и вает несколько языков пользова-тельского интерфейса, в том числе и русский (который мож но в ы брать через пункт меню Options – Environment Option – Interface Language), но д алее мы бу-д ем и з пед агогических побуж д ений (т.е. и з вред ности ) использовать англоя-зычный интерфейс.

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

5

1.3. Со здани е и реги страци я б азы данны х Созд ание новой базы д анны х происход ит в четыре этапа

• Созд ание новой пустой БД , хранящ ейся в файле с расш ирением *.gdb (д ля InterBase) *.fdb (д ля FireBird)

• Регистрация БД в IBExpert • Соед инение с БД • Созд ание таблиц и други х метад анны х

Предполож им, что сервер установлен у В ас на локальном компью тере д ома или на том ж е компью тере, на котором буд ет д алее работать клиентское ПО . Убе-д итесь, что сервер запущ ен: в Windows 98 он буд ет в и д ен в в и д е значка в правой части панели зад ач; в Windows 2000/XP управлять его запуском мож но через список служ б (Services), в котором присутств ую т служ бы InterBase (или Firebird) Guardian и InterBase Server. В ы берите в главном меню IBExpert пункт DataBase - Create DataBase. В поле Server в вед ите Local, в поле Database – путь к новому, ещ е не сущ еств ую щ ему файлу:

В поле UserName – имя ад министратора SYSDBA, в поле Password – пароль ад министратора masterkey (впрочем, надеемся, что В ы этот всем и звестный пароль уж е сменили или скоро смените). В качестве SQL Dialect укаж ите Dialect 3. Этот д и алект языка SQL под держ и вается начиная с версий InterBase 6 и FireBird и отличается расш иренными возмож ностями . Д и алект 1 используйте, если необход имо обеспечить совместимость с InterBase ранних версий. О стальные поля мож но остав ить без и зменений. Регистрация необход има д ля уд обства д альнейш ей работы . При регистраци и IBExpert запоминает путь к БД и другие параметры соед инения и при послед ую щ и х запусках отображ ает список зарегистрированны х баз. О кно регистрации автоматически появляется после созд ания БД . Здесь необход имо указать имя и версию сервера ( в д анном случае FireBird 1.5), в ы брав и х и з списка, и алиас – сокращ енное имя БД . Буд ьте внимательны и

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

6

уточните, какая версия InterBase у В ас установлена. О стальные поля заполнять не обязательно.

После регистрации в окне DataBase Explorer появится алиас БД – NewSklad.

Д ля д альнейш ей работы необход имо соед иниться с БД , д ва раза щ елкнув по алиасу, после чего появ ится список метад анны х (д оменов , таблиц, просмотров , хранимы х процед ур, триггеров , генераторов , исклю чений, функций, определяемых пользователем и ролей):

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

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

7

учиты вать при работе в сети . И мена баз д анны х в InterBase строятся по правилу: Server_Name:Full_FileName,

гд е Server_Name – сетевое имя компью тера, на котором установлен сервер InterBase. В качестве сетевого имени могут в ы ступать имя NetBios, д оменное имя или IP-адрес компью тера. Full_FileName – имя файла *.gdb, обычно с указанием пути . Н апример: c1r214srv:d:\ib\4gr\MyBase\sklad.gdb. Н аправление слэш а значения не имеет. Н о в имени файла нельзя указы вать ни имена папок общ его д оступа, ни отображ ения этих папок на логические буквы д исков . Н апример, недопустима запись \\c1r214srv\MyBase\sklad.gdb. Н ельзя такж е записы вать c1r214srv:H:\MyBase\sklad.gdb, если буква H указы вает не на физический д иск, а обозначает сетевую папку общ его д оступа. Н апример, если на сервере на д иске D заведена папка общ его д оступа d:\ib, отображ аемая на букву H. В кач естве Full_FileName мо ж но п ро п и сы вать то л ько ф и зи ч ески й п уть к БД на комп ьютере, где устано вл ен сервер. В при веденном примере таким путем являлся путь d:\ib\4gr\MyBase\sklad.gdb, который и над о указы вать при регистраци и сервера. В реальны х ситуациях д ля в ыяснения д опустимы х путей обратитесь к ад министратору сети . При работе в сети окна созд ания и регистрации БД в IBExpert имею т несколько иной в и д , гд е д ля уд обства имя сервера c1r214srv записы вается отдельно в верхней части окна. Разумеется, если БД используется не только д ля учебных целей, то ад министратор д олж ен заранее созд ать пользователей БД с неадми -нистрати вными правами , имена и пароли которых В ы , как рядовые пользовате-ли , указы ваете вместо SYSDBA и masterkey (см. п. 1.7.2).

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

8

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

• Скопировать файл БД на сервер, например в папку H:\4gr\MyBase. • Зарегистрировать БД , в ы брав в главном меню IBExpert пункт DataBase -

Register DataBase и заполни в окно

Замеч ани е. В литературе рекоменд уется д ля корректной работы с русскими буквами настраи вать InterBase специальным образом: указы вать в качестве CharSet при созд ани и БД WIN1251 и зад авать атрибут COLLATE PXW_CYRL при определении строковы х полей. О д нако реально все это необход имо только

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

9

д ля прав ильной работы функци и Upper языка SQL с русскими буквам. По мне-нию автора, горазд о рациональнее и надеж нее не менять языковы х настроек, а использовать функци ю UpCase (и аналогичные функци и ) и з мод уля CASEUDF, который мож но скачать по адресу http://www.ibase.ru/ download/caseudf.zip и ус-тановить на сервере (см. раздел 3).

1.4. Со здани е таб л и ц Д ля созд ания таблиц, генераторов , триггеров и други х метад анны х (как, впро-чем, и д ля в ы полнения лю бы х SQL-запросов ) необход имо соед иниться с уж е сущ еств ую щ ей БД . Д ля этого после запуска IBExpert раскройте алиас БД , в ы -д елите ветку Tables, и в контекстном меню в ы берите пункт New Table. Сразу ж е и змените имя таблицы на Customers (см. верхню ю часть окна). Д обавьте имена полей, вы бирая и х тип (или д омен) и з списка д оступных типов (или д о-менов ). Чтобы объяв ить поле первичным клю чом, д в аж д ы щ елкните напроти в него в колонке PK.

Н аж атие первой кнопки в панели инструментов или Ctrl+F9 генерирует DDL оператор созд ания таблицы , которое затем след ует подтверд ить, наж ав кнопку Commit в след ую щ ем окне. Заметим, что и д алее все д ейств ия в IBExpert рас-сматри ваю тся как транзакции и требую т явного под тверж д ения (Commit), что повы ш ает над еж ность работы . После того как таблица была созд ана, ее структуру мож но при необход имости мод ифицировать. Н апример, чтобы д обав ить новое поле, след ует в контекст-ном меню в ы брать New Field, в появ и в ш емся окне зад ать имя поля и его тип и в заверш ение наж ать Ctrl+Alt+C (подтверж д ение транзакции ):

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

10

IBExpert пытается корректно мод ифицировать структуру таблиц без потери со-д ерж ащ и хся в них д анны х. Замечание: д ля и зменения типа поля сущ еств ую т д в а способа. В первом способе след ует уд алить поле и созд ать его заново. В то-рой способ предпочтительнее, но требует некоторой пред усмотрительности : старайтесь явно созд авать д омены д ля всех используемы х в БД типов д анны х. Д ля и зменения типа д остаточно буд ет в ы брать необход имы й д омен и з списка на первой вкладке пред ы д ущ его окна. InterBase автоматически , неявно созд ает д омены д ля всех созд аваемы х полей, но присваи вает им «неуд обочитаемые» имена, например, RDB$6. Поэтому лучш е созд авать д омены явно. Д ля явного созд ания д омена в ы д елите объект Domains в окне Database Explorer, наж мите CTRL+N и заполните окно,

указав при необход имости наклад ы ваемые на д омен ограничения. Д алее при созд ани и поля указы ваем не тип Varchar(40) not null, а имя д омена Address_Domain.

1.5. Со здани е генераторо в, три ггеро в и храни мы х п роцедур

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

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

11

всегд а, незав исимо от того, как происход ит вставка новой записи – и з IBExpert, клиентского прилож ения на Delphi, Web-прилож ений и т.п. Созд ать генератор прощ е всего сразу при объявлении первичного клю чевого поля. Д ля этого над о перейти на вкладку AutoIncrement и пометить флаг Create Generator. Генератор буд ет созд ан автоматически , его имя и начальное значение мож но при необход имости отред актировать.

Н а вкладке Trigger отметьте флаг Create Trigger, что при ведет к аналогичному результату:

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

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

12

CREATE PROCEDURE SP_GEN_CUSTOMERS_ID RETURNS (ID INTEGER) AS BEGIN ID = GEN_ID(GEN_CUSTOMERS_ID, 1); SUSPEND; END Генераторы , триггеры и хранимые процед уры мож но такж е созд авать и вруч-ную (через окно Database Explorer). При созд ани и триггеров и хранимы х проце-д ур откры вается уд обны й ред актор с синтаксической подсветкой и ниспад аю -щ ими списками подсказок. В неш ний в и д редактора представлен на рисунке (см. ни ж е). О тметим, что ред актируется только тело триггера. Н азвание табли -цы и событие д ля триггера (After Insert и т.п.) в ы бираю тся и з списков .

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

1.6. Вы п о л нени е SQL-зап ро со в

В IBExpert сущ еств ует несколько способов в ы полнения операторов языка SQL. И нструмент SQL Editor (клави ш а F12) наиболее уни версален и предназначен д ля в ы полнения произвольны х операторов созд ания, в ы борки , манипулирова-ния и управления д анными .

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

13

И нструмент Query Builder (пункт меню Tools) уд обно использовать, как след ует и з названия, д ля в и зуального построения запросов SELECT. В кладка Builder предназначена д ля конструирования запроса, вкладка Edit – д ля про-смотра и ред актирования его текста, Result – просмотра результата. Д ля вы пол-нения запроса наж мите F9, но перед этим убед итесь, что нуж ная база д анны х (NewSklad) в ы брана в левом верхнем углу окна:

И нструмент Script Executive используется д ля ред актирования и в ы полнения скриптов – последовательностей SQL-операторов . Н апример, у В ас имеется скрипт д ля созд ания базы д анны х, полученный при помощ и системы Case-проектирования ERWIN. Скрипт хранится в текстовом файле sklad.sql и сод ер-ж ит д ва оператора Create Table. Загрузите этот файл в Script Executive.

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

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

14

1.7. У п равл ени е п о л ьзо вател ями

К аж д ы й сервер InterBase имеет пользователя SYSDBA с ад министрати вными полномочиями . Пароль - masterkey. Сначала это ед инственны й авторизованны й пользователь на сервере. И он д олж ен авторизовать (зарегистрировать) други х пользователей. Т олько пользователь SYSDBA имеет права на д обавление, мо-д ификаци ю и уд аление пользователей. И м ена п о ль зо в ат елей могут быть д линой д о 31 символа, не являю тся чувств и -тельными к смене регистра, но не д олж ны сод ерж ать пробелов . П арол и чув с т -в и т ел ьны к реги с т ру букв . Знач ени е и меют то л ько п ервы е 8 си мво л о в п а-ро л я, но д лина пароля мож ет д ости гать 32 символов . Рассмотрим основные операции ад министрирования InterBase. 1.7.1. С м ена п аро ля адм инис т рат о ра О бычно это самая первая операция после установки сервера. В ы берите в глав -ном меню Tools – User Manager. В появ и в ш емся окне в вод им SYSDBA и masterkey. В ы д еляем пользователя (пока он только од ин) и ж мем Edit.

В вод им и подтверж д аем новы й пароль. Е сли в IBExpert уж е были зарегистри -рованы базы д анны х со старым паролем, то и х все придется перерегистриро-вать, иначе соед инение не буд ет установлено. В этом – смысл появляю щ егося на экране пред упреж д ения. Пароль не мож ет быть пустым и состоящ им и з пробелов !

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

15

1.7.2. Добав ление но в о го п о ль зо в ат еля В окне User Manager наж имаем Add и д обавляем информаци ю

Н овы й пользователь 4k4gr смож ет созд авать базы д анны х и регистрировать и х, после чего он станет и х влад ельцем (owner) с правом полного д оступа. При соед инении c базой д анны х 4k4gr буд ет указы вать свои учетные д анные. В лад елец базы д анны х мож ет предоставлять при в илеги и д оступа к своей БД другим пользователям, разреш ая или запрещ ая им отдельные операции . 1.7.3. П редо с т ав ление п рив илегий Подклю чение к БД не означает автоматическую возмож ность ред актирования, и д аж е отображ ения д анны х. При в илеги и д олж ны быть зад аны явным образом; пользователи не смогут обращ аться ни к одному объекту БД , пока не получат соответств ую щ ие при вилеги и . При в илеги и , д анные специальному «пользовате-лю » PUBLIC, применимы д ля всех пользователей. Сначала только созд атель таблицы (owner) имеет д оступ к д анным, но он мож ет назначать при в илеги и другим пользователям (предоставлять грант). Grant (англ.) – д ар, пред оставление, субси д ия. О д ноименный SQL-оператор GRANT назначает при в илеги и д оступа различным субъектам безопасности - конкрет-ным пользователям, ролям (см. п. 3.4), а такж е хранимым процед урам и триг-герам. О бъектами безопасности (охраняемыми объектам), к которым применя-ется GRANT, могут быть таблицы целиком, столбцы таблиц, триггеры , хранимые процед уры , просмотры . SQL-оператор REVOKE уд аляет ранее предоставленные при вилеги и д оступа. При ви л еги я Р азреш ает п о л ьзо вател ям …

SELECT Просматри вать строки в таблице или просмотре DELETE У д алять строки INSERT В ставлять строки UPDATE И зменять все или указанные столбцы EXECUTE В ы полнять хранимые процед уры

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

16

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

ALL О бъед иняет SELECT, DELETE, INSERT, UPDATE, и REFERENCES

При в илеги и мож но назначать в д и алоговом реж име с помощ ью IBExpert. В ы зо-в ите в главном меню инструмент Tools - Grant Manager. О ткроется окно:

К ак в и д им, первоначально все права имею тся только у SYSDBA. У пользовате-лей 4k4gr и PUBLIC и х нет:

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

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

17

браж ением «лад они » означаю т Grant WITH GRANT OPTION. Поль-зователь, облад аю щ и й такими при вилегиями , мож ет предоставлять указанную при в илеги ю другим пользователям. При в илеги и могут назначаться как по от-нош ени ю к таблицам, так и к отдельным колонкам (см. ни ж ню ю часть окна). 1.7.4. И с п о ль зо в ание ро лей. Роль – это аналог группы пользователей в Windows 2000/XP. Рекоменд уется при в илеги и назначать именно ролям, а не пользователям. Д ействительно, роли хранятся в самой базе д анны х, а пользователи – в служ ебной базе isc4.gdb, ко-торая у каж д ого сервера своя. Поэтому при переносе БД на другой сервер роли сохраняю тся, а пользователи – нет. Е сли права д аны не ролям, а пользователям, то потребуется и х назначать заново. При использовани и ж е ролей д остаточно буд ет вклю чить в и х состав новы х пользователей, при в илеги и менять нет необ-ход имости . Созд ад им в качестве примера роли Manager и Guest. Д ля созд ания ролей служ ит вкладка Roles инструмента User Manager.

Д ля вклю чения пользователей в состав роли перейд ите на вкладку Membership и отметьте соответств ую щ и й флаж ок.

В ы бор флага With ADMIN OPTION означает, что пользователь, вклю ченный в состав роли , буд ет иметь возмож ность назначения, отзы ва и уд аления роли , т.е. станет ее ад министратором. Н азначение при в илеги й д ля ролей в ыполняется с помощ ью Grant Manager, как и д ля обычных пользователей. Замеч ани е. Е сли пользователь имеет при в илеги и д оступа к БД только через роль, то имя роли д олж но быть указано при лю бом соед инении с базой д анны х,

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

18

например, при использовани и операторов SQL, в окне регистраци и IBExpert, в компонентах клиентских прилож ений и т.п.

1.8. Со здани е UDF Помимо встроенны х простейш и х функций языка SQL, таких как min(), max(), avg(), InterBase под д ерж и вает библиотеки внеш них функций UDF (функций, определяемых пользователем). UDF сущ ественно расш иряю т возмож ности языка SQL. Н апример, в состав Firebird в ход ят UDF математических и кален-д арны х функций. UDF мож но созд авать с помощ ью лю бы х компиляторов (С, Delphi, Fortran и т.п.). Д ля этого необход имо написать необход имые функци и , откомпилировать и х, вклю чить в состав DLL и объяв ить на сервере InterBase. UDF мож ет принять д о 10 параметров , соответств ую щ и х лю бому типу д анны х InterBase, за исклю чением масси вов . В се в ходные параметры перед аю тся по ссылке. В озвращ аемые значения перед аю тся либо по ссылке (по умолчанию ), либо по значению . В последнем случае необход имо учиты вать соответствие типов :

Т ип Interbase Т ип Object Pascal Integer Integer Double precision Double Cstring Pchar Date Type IBGateTime=record

Days: integer; Msec: cardinal; End;

Чтобы перед ать числовое значение по значени ю , след ует при объявлени и UDF в БД после в ы ход ного параметра указать служ ебное слово BY VALUE. После того как функци и откомпилированы в библиотеку, и х нуж но объявить д ля всех БД , в которых планируется ее использование. К аж д ую функцию тре-буется объявлять отдельно, но только од ин раз д ля каж д ой БД . О бъявление функци и информирует БД о ее располож ени и и свойствах. Синтаксис объявле-ния: DECLARE EXTERNAL FUNCTION name [datatype | CSTRING(длина) [,datatype | CSTRING(длина)…]] RETURNS {datatype [BY VALUE] | CSTRING(длина)} [FREE_IT] ENTRY_POINT ‘entryname’ MODULE_NAME ‘modulename’; А ргумент О писание Name И мя UDF д ля использования в SQL-операторах; мо-

ж ет отличаться от имени , указанного после

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

19

ENRT_POINT Datatype Т ип в ход ного или возвращ аемого параметра

RETURNS О пределяет возвращ аемое функцией значение

BY VALUE О пределяет, что возвращ аемы й результат д олж ен перед аваться по значению

CSTRING(д лина) Указы вается д ля параметров строкового типа

FREE_IT После заверш ения работы UDF освобож д ает память, в ы д еленную под возвращ аемое по ссылке значение,

‘entryname’ Строка в кавычках, определяю щ ая имя функци и в исход ном коде как оно хранится в библиотеке;

‘modulename’ О писание файла, и д ентифицирую щ ее библиотеку, в которой хранится UDF

Замеч ани е: Н ачиная с InterBase 6, UDF д олж ны храниться только в папке ..\InterBase\udf . Когд а UDF созд ана и объявлена в БД , ее мож но использовать в операторах SQL, в хранимы х процед урах и триггерах. Д ля этого след ует встав ить ее имя в соответств ую щ ее место SQL-оператора, заклю чи в в ходные параметры в круг-лые скобки . Продемонстрируем подклю чение и использование UDF на примере и звестной библиотеки caseudf.dll. Просмотрим исходны й текст библиотеки . К ак в и д им, это - обычная DLL, написанная на Delphi. library caseudf; { Copyright Dmitry Kuzmenko, Epsylon Technologies } { e-mail: [email protected], web: http://ib.demo.ru } { вообще о копирайте на такие функции говорить смешно, так что пользуйтесь на здоровье } uses Windows, SysUtils; function UpCase(CStr: PChar): PChar; cdecl; export; begin CharUpperBuff(CStr, Length(CStr)); Result:=CStr; end; { другие функции, а также комментарии и инструкции автора для краткости опущены } exports UpCase; begin isMultiThread:=True; end.

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

20

В DataBase Explorer в ы берем пункт UDFs – New и заполним откры в ш ую ся форму ред актирования в соответстви и с ее объявлением в DLL:

Сгенерированное объявление UDF на SQL, записанное на вкладке DDL, буд ет иметь в и д : DECLARE EXTERNAL FUNCTION UPCASE CSTRING(255) RETURNS CSTRING(255) ENTRY_POINT 'UpCase' MODULE_NAME 'CASEUDF.DLL' О бычно авторы UDF не прилагаю т к файлу *.dll исход ны й код , а пред остав -ляю т только в ы ш епри вед енны й SQL-оператор, что вполне д остаточно. Пример использования UDF в SQL Builder:

2. Напи с ани е кли ентс ки х пр и ло жени й Н аиболее эффекти вным способом созд ания прилож ений являю тся прямые в ы -зовы функций API клиента и з прилож ений. Х орош им примером такого способа является сама программа IBExpert, написанная, по косвенным признакам, на Delphi. О д нако в повседневной практике горазд о уд обнее использовать компо-нентно-ориентированные технологи и , основанные на станд артны х технологиях д оступа к д анным. Д ля разработчика важ но, что под д ерж ка InterBase встроена во все сущ еств ую щ ие станд арты д оступа к д анным со стороны клиента – ADO, ADO.NET, ODBC, JDBC, BDE, DbExpress и др. В Delphi имею тся компоненты д ля д оступа через ADO, BDE и DbExpress. Прав д а, технология BDE в на-стоящ ее время устарела и не обеспечи вает требуемой производ ительности . Д ля д оступа через ADO необход имо установить в Windows ADO-провайд ер д ля InterBase (возмож ные в арианты см. на сайте www.ibase.ru). Уни версальная

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

21

компонентная технология DbExpress, официально рекоменд уемая Borland, позволяет созд авать компактные и быстрые кроссплатформенные прилож ения, но имеет некоторые неуд обства и ограничения. Д алее мы буд ем рассматри вать специали зированные компоненты Interbase Express (IBX), поставляемые в составе Delphi и умею щ ие работать только с InterBase. А льтернати вные специализированные компоненты FIBPlus от ком-пани и Devrace более функциональны , но они являю тся самостоятельным плат-ным программным прод уктом, который след ует приобретать отд ельно.

2.1. Структура п ри л о ж ени я Структура и код прилож ения при различны х технологиях д оступа од нотипны , так как компоненты д оступа к д анным в Delphi, буд учи потомками класса TDataSet, имею т много общ их черт со став ш ими классическими BDE-ориентированными компонентами . Н аиболее инвариантны участки код а, свя-занные с поиском, просмотром и ред актированием д анны х. Н еобход имо учиты вать след ую щ ие особенности IBX. О бязат ел ьны м яв л яет с я компонент IBDataBase, содерж ащ и й параметры соед инения с сервером (имя сервера, протокол, путь к БД , имя и пароль), кото-рые устанавли ваю тся в окне DataBase Component Editor, в ы зы ваемом при д вой-ном щ елчке по компоненту.

Эти значения мож но в вести такж е программно или с помощ ью инспектора объектов . Н апример, путь к базе д анны х на сервере c1r214srv:D:\IB\4gr\MyBase\NewSklad.gdb хранится в свойстве DataBaseName рассматри ваемого компонента.

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

22

Н а этапе отладки не забуд ьте установить свойство LoginPrompt в False, что ли ш ит В ас сомнительного уд овольствия многократно набирать имя и пароль при запусках программы . Н а заверш аю щ ем этапе разработки при под готовке программы к разверты ва-нию , наоборот, след ует очистить компонент IBDataBase от параметров со-ед инения с базой д анны х, пред усмотрев и х в вод в д и алоговом реж име (см. пример в разделе 3). В проти вном случае при установке программы на новы й компью тер, скорее всего, потребуется ее перекомпиляция. Об язател ьны м в п ри л о ж ени и является компонент IBTransaction, с по-мощ ью которого происход ит управление транзакциями . Компонент IBDataBase связы вается с объектом IBTransaction через свойство property DefaultTransaction: TIBTransaction. Кроме того, ссылку на IBTransaction над о указать в свойствах Transaction: TIBTransaction наборов д анны х (IBQuery, IBTable и др.). В прилож ени и мож ет быть несколько объектов -транзакций, поэтому каж -д ы й набор д анны х мож ет организовы вать свои собственные, незав исимые от други х наборов транзакции . Стартует транзакция в ы зовом метод а StartTransaction или установкой свойства компонента TIBTransaction Active:= True. Н о запуск транзакци и происход ит такж е и неявно при акти в и заци и соед ине-ния, происходящ ей при открытии наборов д анны х, связанны х с компонентом IBTransaction, например, при в ы зове tbCust.Open. При в ы зове метод ов Commit (под тверж д ение транзакци и ) или RollBack (откат) связанные набо-ры д анны х закры ваю тся, а при и х новом открыти и запускается новая транзак-ция. Поэтому след ует обязательно проверять, не запущ ена ли ранее транзакция дру-гими способами (влож енные транзакции не д опускаю тся!). Д ля этой цели слу-ж ит свойство компонента IBTransaction property InTransaction: Boolean. Провери в его значение, мож но такж е сигнализировать об акти вности транзак-ций запросами , сообщ ениями т.п. О пи ш ем кратко особенности компонентов д оступа к д анным.

2.2. Комп о ненты до ступ а к данны м

2.2.1. TIBTable Компонент TIBTable формирует в иртуальную таблицу, аналог фи зической таблицы БД . Компонент при открытии набора д анны х неявно в ы зы вает опера-тор SELECT * FROM Таблица, что при вод ит к копировани ю всех д анны х на

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

23

клиентский компью тер. Поэтому д ля больш и х таблиц этот компонент использовать не рекоменд уется. О сновные свойства и метод ы совпад аю т с TTable. Полож ительная особенность - пригодность д ля отображ ения не только таблиц, но и просмотров (View). Н ачиная с версии Delphi 7, исправлена д осадная ош ибка при работе с фильт-рами . 2.2.2. TIBQuery Н абор д анны х, возвращ аемы й TIBQuery, всегд а, незав исимо от типа запроса, имеет значение свойства ReadOnly, равное True, что препятств ует его непосредственному ред актировани ю . Д ля ред актирования наборов д анны х, возвращ аемы х TIBQuery, последний над о обязательно связы вать с компонентом TIBUpdateSQL, незав исимо от того, используется кэш ирование и зменений или нет. Компонент TIBUpdateSQL размещ ается в мод уле д анны х. И мя экземпляра TIBUpdateSQL указы вается в свойстве UpdateObject компонента TIBQuery. Д алее в Update SQL Editor необход имо автоматически сгенериро-вать или вручную прописать мод ифицирую щ ие SQL-запросы . 2.2.3. TIBDataSet Д анны й компонент объед иняет функциональность IBTable, IBQuery и IBUpdateSQL, являясь наиболее «прод винутым» . Т екст SQL-запроса хра-нится в свойстве SelectSQL типа TStrings (причем, формируется он уд об-ным ред актором). В озмож ности IBUpdateSQL обеспечи ваю тся ред актором набора д анны х, в ы зы ваемом в контекстном меню и работаю щ ем так ж е, как в обычном UpdateSQL. SQL-операторы мод ификаци и Н Д записы ваю тся в соот-ветств ую щ ие свойства InsertSQL, ModifySQL, DeleteSQL.

И нтересной особенностью компонентов IBQuery и IBDataSet является возмож ность непосредственного в ы зова генератора д ля заполнения первичного клю чевого поля. Зд есь используется свойство property GeneratorField: TIBGeneratorField, в которое след ует записать имя клю чевого поля и имя генератора (это уд обнее сделать с помощ ью инспектор объектов ). Е сли д ля д анной цели определен так-ж е и триггер, то он перепи ш ет вставленное значение. 2.2.4. TIBSQL Компонент предназначен д ля быстрого в ы полнения SQL-запросов . В отличие от рассмотренны х компонентов , являю щ и хся потомками TDataSet, он проис-ход ит непосредственно от TСomponent, не умеет отображ аться в в и зуальны х

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

24

компонентах и использует однонаправленный курсор. Перемещ е-ние по набору д анны х, возвращ аемому компонентом, происход ит только в од -ном направлении – вни з, с использованием метод а Next. В ы полняется запрос при в ы зове метод а ExecQuery.

3. Пр и мер пр о гр амми р о вани я

3.1. Предметная о б л асть В качестве примера рассмотрим зад ачу автоматизаци и отпуска товара со скла-д а. Ц ели д анного пособия не требую т учета всех особенностей предметной об-ласти , поэтому упростим зад ачу д о минимально возмож ны х пределов . Предполож им, что БД состоит и з трех таблиц (заказчики , заказы и и зд елия), связанны х по клю чам Cust_ID и Prod_ID. К аж д ы й заказчик мож ет сде-лать несколько заказов , а каж д ы й товар мож ет быть прод ан нескольким заказ-чикам. А нонимные прод аж и не д опускаю тся. Т овар прод ается пош тучно, при -чем нельзя прод ать товар, которого нет на склад е. Л огическая структура БД в нотаци и системы Case-проектирования Erwin при ведена на рисунке. (Заметим, что в составе IBExpert имеется под обны й инструмент Database Designer).

В д анном случае заказ (Order) мож ет состоять только и з одного товара (Product), что является наиболее серьезным ограничением представленной мо-д ели , которое мож но преод олеть в вед ением ещ е одной таблицы «Д етали зака-за» . Развернуты й и более функциональны й д емонстрационны й пример базы д анны х «Заказы » мож но найти , например, в папке ..\Borland\Delphi7\Demos\Db\IBMastApp в установочной д иректории Delphi (соответствую щ и й файл БД наход ится в папке ..\Borland\Borland Shared\Data\mastsql.gdb).

3.2. Структура БД

Структура БД д ля предметной области с учетом особенностей языка SQL сер-вера InterBase мож ет быть описана с помощ ью след ую щ его скрипта:

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

25

SET TERM ^; /* Ус т анав лив ает разделит ель м еж ду о п ерат о рам и */

/* Т аблицы */ CREATE TABLE Customers ( Cust_ID INTEGER NOT NULL, CustName VARCHAR(20) NOT NULL, Address CHAR(40), PRIMARY KEY (Cust_ID) )^ CREATE TABLE Products ( Prod_ID INTEGER NOT NULL, ProductName VARCHAR(20) NOT NULL, Price DECIMAL(10,2) NOT NULL CHECK (Price > 0), /* Остаток на складе */ Rest INTEGER NOT NULL CHECK (Rest >= 0), PRIMARY KEY (Prod_ID) )^ CREATE TABLE Orders ( Num INTEGER NOT NULL, Cust_ID INTEGER NOT NULL, Prod_ID INTEGER NOT NULL, ProdCount INTEGER NOT NULL CHECK (ProdCount > 0), Total NUMERIC(10,2) NOT NULL,/*Итого в у.е.*/ SaleDate DATE NOT NULL, PRIMARY KEY (Num), FOREIGN KEY (Cust_ID) REFERENCES Customers, FOREIGN KEY (Prod_ID) REFERENCES Products )^ /* Генерат о ры */ CREATE GENERATOR GEN_CUSTOMERS_ID ^ SET GENERATOR GEN_CUSTOMERS_ID TO 0 ^ CREATE GENERATOR GEN_ORDERS_ID ^ SET GENERATOR GEN_ORDERS_ID TO 0 ^ CREATE GENERATOR GEN_PRODUCTS_ID ^ SET GENERATOR GEN_PRODUCTS_ID TO 0 ^ /* Х ранимые процед уры */ CREATE PROCEDURE SP_GEN_CUSTOMERS_ID RETURNS (ID INTEGER) AS BEGIN ID = GEN_ID(GEN_CUSTOMERS_ID, 1); SUSPEND; /* Во зв ращ ает значение генерат о ра */ END ^ /* Т ри ггеры */ CREATE TRIGGER PRODUCTS_BI FOR PRODUCTS ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.PROD_ID IS NULL) THEN NEW.PROD_ID = GEN_ID(GEN_PRODUCTS_ID,1); END ^

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

26

CREATE TRIGGER PRODUCTS_AD0 FOR PRODUCTS ACTIVE AFTER DELETE POSITION 0 AS begin /* Каскадное удаление заказов на удаленный товар */ delete from Orders where orders.prod_id = products.prod_id; end ^ CREATE TRIGGER ORDERS_BI FOR ORDERS ACTIVE BEFORE INSERT POSITION 0 AS BEGIN IF (NEW.NUM IS NULL) THEN NEW.NUM = GEN_ID(GEN_ORDERS_ID,1); END ^ COMMIT ^ SET TERM ; ^ Д ля созд ания перечисленных объектов в ыполните скрипт в окне Script Executive или воспользуйтесь д и алоговыми средствами IBExpert. Задани е. Перепи ш ите операцию отпуска товара с помощ ью триггера, автома-тически уменьш аю щ его остаток товара на склад е после вставки нового заказа.

3.3. Кл и ентская ч асть 3.3.1. Наст ро йка м о дуля данных После созд ания мод уля д анны х (пункт меню File – New – Data Module) распо-лож им на нем компоненты д оступа к д анным. При в ы боре имен компонентов зд есь и д алее буд ем пользоваться венгерской нотацией. Префикс ds использу-ем д ля типов TDataSorce, id – TIBDataSet, iq – TIBQuery, и т.д .

1. Н астройте компонент соед инения idbSklad: TIBDatabase и компонент управления транзакциями itaSklad: TIBTransaction. При начальной от-ладке воспользуйтесь д ля настройки idbSklad ред актором DataBase Editor

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

27

(см.п.2.1), в котором укаж ите параметры соед инения, вклю чая имя пользователя и пароль.

После того, как программа буд ет полностью отлаж ена, в ы зов ите DataBase Editor и очистите в нем все поля. О ни буд ут заполняться при запуске програм-мы . 2. Н астройте компонент iqInsert , используемы й д ля вставки новы х записей в таблицу Product, и компоненты idCust, idOrders, idProduct, связав и х с базой д анны х: 3. Д ля объектов idCust, idOrders, idProduct типа TIBDataSet укаж ите в свойствах SelectSQL запросы в и д а select * from <имя соответствующей таблицы>. 4. И спользуя DataSet Editor (контекстное меню компонентов idCust, idOrders, idProduct), определите д ействия по ред актировани ю наборов д анны х. Д ля примера рассмотрим компонент idCust.

Кнопка Get Table Fields заполняет полями таблицы области на экране Key Fields и Update Fields. В о второй области указы ваю тся ред актируемые поля. К ак пра-

Свойство Значение DatabaseName D:\IB\4gr\MyBase\NewSklad.gdb LoginPrompt False DefaultTransaction

ItaSklad

Database IdbSklad Transaction itaSklad

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

28

в и ло, мож но остав ить все поля. В области слева необход имо в ы брать клю чевые поля, по которым буд ет происход ить поиск в таблице. Н аж ав кнопку Select Primary Keys, в ы берем д ля поиска первичны й клю ч. При в ы боре Datasets Defaults поиск буд ет провод иться по всем полям. Н аж ав кнопку Generate SQL, получим SQL-операторы д ля обновления Н Д , ко-торые мож но просмотреть и при необход имости отред актировать на вкладке SQL. Сами операторы хранятся в свойствах SelectSQL, DeleteSQL, InsertSQL, ModifySQL и имею т в и д , соответственно, select * from CUSTOMERS delete from CUSTOMERS where Cust_ID = :OLD_Cust_ID insert into CUSTOMERS (Cust_ID, CustName, Address) values (:Cust_ID, :CustName, :ADDRESS) update CUSTOMERS set Cust_ID = :Cust_ID, CustName = :CustName, ADDRESS = :ADDRESS where Cust_ID = :OLD_ Cust_ID Параметрами запросов (например, :Cust_ID) являю тся поля набора д анны х, значения которых подставляю тся в поля таблицы на сервере. Приставка OLD означает обращ ение к старому значению поля и з набора д анны х (д о ред актиро-вания), с которым сравни вается поле и з таблицы на сервере. Заполните свойство GeneratorField, указав имя генератора GEN_CUSTOMERS_ID, имя клю чевого поля Cust_ID и событие On New Record.

А налогичным образом настройте компоненты idOrders, idProduct. 5. Д ля ред актирования заказчиков вклю чим реж им кэш ирования и зменений, ус-танови в свойство CachedUpdates компонента idCust в True. К эш ирова-ние и зменений означает, что записи на сервере могут и зменяться группами , ко-торые буд ут переноситься и з прилож ения на сервер отдельной команд ой. В д анном случае мож но буд ет д обавлять сразу несколько заказчиков , но в базе д анны х они появятся только после в ы зова метод а ApplyUpdates компонента idCust.

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

29

Д ля компонентов idOrders, idProduct остав им обычны й реж им ред актирования, установи в CachedUpdates равным False.

6. Д ля компонентов idCust, idOrders, idProduct созд айте типи зи -рованные поля (например, idСustAddress: TStringField и остальные), используя ред актор полей Fields Editor. Fields Editor в ы зы вается в контекстном меню упомянуты х компонентов . Д обавьте в состав типи зированны х полей (Т П) все поля набора д анны х. И мена Т П строятся по принципу ИмяНД+ИмяПоля и вклю чаю тся в описание мод уля д анны х. О чев и д ным преимущ еством д анного под ход а является контроль компилятора за корректностью обращ ений к полям. 7. Установите свойство DataSource объектов dsCust, dsOrder, dsProduct, в idCust, idOrders, idProduct, соответственно. 3.3.2. Взаим о дейс т в ие с п о ль зо в ат елем Гл авная ф орма п ри л о ж ени я

Н а главной форме располож ены кнопки sbAdd, sbOtp, sbArc, spQuit: TspeedButton, реализую щ ие функци и – приход (мод уль AddUnit), расход (OtpUnit), архи в (ArcUnit), в ы ход . В главном меню функци и кнопок прод ублированы . Установка соед инения с БД в ы полняется при в ы боре пункта «И нструменты - Соед инение» . Запускается форма соед инения (frmConnect), имею щ ая на эта-пе разработки след ую щ и й в и д

Д ля в вод а пароля здесь используется компонент MaskEdit. И нформация о соед инени и записы вается в компоненты edtDatabase: TEdit; //Полное имя БД с указанием сервера (см.стр 6)

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

30

edtUser: TEdit; // Имя пользователя edtRole: TEdit; //Роль пользователя medtPassword: TMaskEdit; // Пароль В обработчик события OnClick кнопки Ok запи ш ите: if dlgOpen.Execute then edtDatabase.Text := dlgOpen.FileName; Соед инение в ы полняется в главной форме в обработчике пункта главного ме-ню : procedure TMainForm.ConnectClick(Sender: TObject); begin with frmConnect, dm do if ShowModal = IDOK then begin itaSklad.Active := false; IdbSklad.Connected := false; idbSklad.DatabaseName := edtDatabase.Text; idbSklad.Params.Clear; idbSklad.Params.Add(Format('USER_NAME=%s', [edtUser.Text])); idbSklad.Params.Add(Format('PASSWORD=%s', [medtPassword.Text])); if edtRole.Text <> '' then idbSklad.Params.Add(Format('ROLE=%s', [edtRole.Text])); idbSklad.Connected := true; itaSklad.Active := true; end; end; У праж нени я. Запрограммируйте д оступность кнопок операций с БД в зав иси -мости от наличия с ней соед инения. Пред усмотрите безопасное хранение пара-метров соед инения в конфи гурационном файле или системном реестре, чтобы не в ы зы вать д и алог соед инения при каж д ом запуске программы . Форма п ри хо да товара на склад имеет в и д

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

31

и раскры вается при наж ати и кнопки sbAdd главного меню procedure TMainForm.sbAddClick(Sender: TObject); begin // При добавлении товара SQL-операторы with DM.iqInsert do // Добавление товара на склад if AddForm.ShowModal=mrOK then begin // Проверяем наличие на складе Close; SQL.Clear; SQL.Add('SELECT * FROM Products WHERE ProductName = :p1 and Price = :p2'); ParamByName('p1').value:=AddForm.Edit1.Text; ParamByName('p2').value:=AddForm.Edit2.Text; Open; if IsEmpty then begin //Если нет, то добавляем CLose; SQL.Clear; SQL.add('INSERT INTO Products (ProductName, Price, Rest) values (:p1, :p2, :p3)'); ParamByName('p1').value:=AddForm.Edit1.Text; ParamByName('p2').value:= StrToFloat(AddForm.Edit2.Text); ParamByName('p3').value:= StrToInt(AddForm.Edit3.Text); ExecSQL; end else // Если есть, то увеличиваем количество begin CLose; SQL.Clear; SQL.add('UPDATE Products SET Rest = Rest+ :p3 WHERE (ProductName = :p1) and (Price = :p2)'); ParamByName('p1').value:=AddForm.Edit1.Text; ParamByName('p2').value:= StrToFloat(AddForm.Edit2.Text); ParamByName('p3').value:= StrToInt(AddForm.Edit3.Text); ExecSQL; end; end; end; Д ля лучш ей иллю страци и материала мод ули AddUnit, OtpUnit, ArcUnit использую т различные способы д оступа к д анным. Н епосредственны й в ы зов SQL-операторов , использованны й в ы ш е, обеспечи вает наиболее быстрый д ос-туп. Н о след ует помнить, что под обны й код некорректен, его след ует о б яза-тел ьно до п о л нять п ро верко й вво ди мы х данны х (что В ы сейчас сделаете в качестве упраж нения). В этом плане более уд обны компоненты , используемые нами при программировани и форма отпуска товаров . Форма о тп уска товара имеет в и д

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

32

и в ы зы вается в обработчике procedure TMainForm.spOtpClick(Sender: TObject); begin OtpForm.ShowModal; end; Компонент dblcCust: TDBLookUpComboBox служ ит д ля занесения в зака-зы код а заказчика, в ы бираемого и з таблицы клиентов , и настраи вается сле-д ую щ им образом: Свойство Значение Примечание DataField Cust_ID В какое поле и DataSource DM.dsOrders в какой Н Д записы вается KeyField Cust_ID Что записы вается ListField CustName;Address Что отображ ается в списке ListSource DM.dsCust О ткуд а берется

Компонент dblcProduct в ы полняет ту ж е функци ю , но д анные берет и з таблицы и зд елий. Свойство Значение Примечание DataField Prod_ID В какое поле и DataSource DM.dsOrders в какой Н Д записы вается KeyField Prod_ID Что записы вается ListField ProdName;Price;Rest Что отображ ается в списке ListSource DM.dsProduct О ткуд а берется

Компонент deCount: TDBEdit предназначен д ля в вод а количества товаров в связанное с ним поле БД :

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

33

Свойство Значение Примечание DataField ProdCount В какое поле и DataSource DM.dsOrders в какой Н Д записы вается

Больш им преимущ еством TDBEdit по сравнени ю с обычными TEdit являет-ся его «типи зированность» : в вод символов , недопустимы х д ля связанны х с компонентом д анны х, блокируется. Компонент dp: TdateTimePicker используется д ля отображ ения текущ ей д аты и занесения ее в таблицу заказов . Д алее напи ш ем простую процед уру (метод класса TOtpForm ), которая прове-ряет состояние Н Д и , в случае вставки , д елает д оступными элементы управле-ния. procedure TOtpForm.Accessed; var Ins: Boolean; begin // Разрешаем кнопки в зав-ти от состояния НД Ins := dm.idOrders.State in [dsInsert]; dblcCust.Enabled := Ins; dblcProduct.Enabled := Ins; btOrder.Enabled := Ins; btCancel.Enabled := Ins; btAdd.Enabled := Not Ins; btClose.Enabled := Not ins; end; end; В первы й раз процед ура в ы зы вается при появлени и формы на экране: procedure TOtpForm.FormShow(Sender: TObject); begin Accessed; end; О бработчик наж атия кнопки «Д обав ить пустой» : procedure TOtpForm.btAddClick(Sender: TObject); begin with dm do begin // Переоткрываем НД, что влечет старт транзакции idCust.Close; idCust.Open; idProduct.Close; idProduct.Open; idOrders.Close; idOrders.Open; // Добавляем пустую запись idOrders.Append; end; // О старте транзакции сигнализируем цветом OtpForm.lbCount.Color := clRed;

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

34

Accessed; end; При написани и обработчика наж атия кнопки «В заказ!» учтем, что оформление заказа состоит и з операций в д в ух таблицах (записи в ж урнал заказов и умень-ш ения остатка на складе) и д олж но рассматри ваться как транзакция. procedure TOtpForm.btOrderClick(Sender: TObject); var otpusk, ostatok: integer; begin with dm do begin Otpusk := deCount.Field.Value; Ostatok := DM.idProductRest.value; if Otpusk <= Ostatok then begin //Можно продать только то, что есть на складе try // Редактируем новый пустой заказ idOrdersSaleDate.Value := dp.Date; idOrdersProdCount.Value := Otpusk; idOrdersTotal.Value := idProductprice.Value * Otpusk; lbTotal.Caption := idOrdersTotal.AsString; idOrders.Post; // Уменьшаем остаток idProduct.Edit; idProductRest.Value := Ostatok-Otpusk; idProduct.Post; // Подтверждаем транзакцию itaSklad.Commit; except // Откатываем транзакцию itaSklad.RollBack; ShowMessage('Ошибка транзакции!'); end; end //if Otpusk <= Ostatok else begin ShowMessage('На складе нет нужного количества!’); // Откатываем транзакцию dm.itaSklad.RollBack; end; end; // with dm CheckTrans; Accessed; end;

При наж ати и кнопки «О тмена» откаты ваем транзакцию : procedure TOtpForm.btCancelClick(Sender: TObject); begin dm.itaSklad.RollBack; CheckTrans; Accessed;

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

35

end; При и зменени и количества пересчиты ваем сумму заказа: procedure TOtpForm.deCountChange(Sender: TObject); var Otpusk: integer; begin if deCount.Text <>'' then Otpusk := StrToInt(deCount.Text) else Otpusk := 0 ; try lbTotal.Caption := FloatToStrF( dm.idProductprice.Value * Otpusk, ffFixed, 10, 2); except ShowMessage('Неправильно указано количество!'); end; end; При закрыти и формы проверяем акти вность транзакци и , в ы д аем пред упреж д е-ния и заверш аем либо откаты ваем транзакцию : procedure TOtpForm.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if CheckTrans then if MessageDlg ('Имеются незавершенные транзакции. Завершить их?’, mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin dm.idOrders.Post; dm.idProduct.Post; dm.itaSklad.Commit; end else dm.itaSklad.RollBack; OtpForm.lbCount.Color := OtpForm.Color; Close; end; Ф ункция проверки акти вности транзакци и : function CheckTrans: boolean; begin Result := dm.itaSklad.InTransaction; if Result then OtpForm.lbOpl.Color := clRed //При активной транзакции меняется цвет else OtpForm.lbOpl.Color := OtpForm.Color; end; Форма архи во в состоит и з трех заклад ок - заказчики , заказы и товары . Раз-местите на форме компонент TPageControl. В ы бирая в его контекстном ме-

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

36

ню пункты New Page, созд айте три закладки TTabSheet – tsCust, tsOrders, tsProducts. Располож ите на первой и з них сетку д анны х DBGrid и другие элементы управления (д ве строки ред актирования, пять кно-пок и группу переклю чателей), как показано на рисунке.

Свяж ите сетки д анны х dgrCust, dgrProduct с соответств ую щ ими ис-точниками д анны х dsCust, dsProduct: TDataSource. Д обавление новы х заказчиков буд ет происход ить с помощ ью обычны х компо-нентов TEDit. И спользую тся кэш ированные и зменения. Т ак как запись вед ется только в одну таблицу, организовы вать неявную транзакцию нет необход имо-сти . Запи ш ем обработчики событий, реализую щ ие функци и обновления: procedure TArcForm.bApplyClick(Sender: TObject); begin // Если такого заказчика нет if (eName.text<>'') and (eAddress.Text<>'') then with DM do begin // Добавляем в набор данных idCust.Append; idCustCustName.value:=eName.text; idCustAddress.Value:=eAddress.Text; idCust.Post; end else ShowMessage('Имя и адрес обязательны для заполнения!') end; procedure TArcForm.bDeleteClick(Sender: TObject); begin // Удаление заказчика dm.idCust.Delete;

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

37

end; procedure TArcForm.bbApplyClick(Sender: TObject); begin // Переносим из кэша в базу данных dm.idCust.ApplyUpdates; end; procedure TArcForm.bbCancelClick(Sender: TObject); begin // Отмена изменений dm.idCust.CancelUpdates; end; Ф ункци и сортировки и поиска: procedure TArcForm.rgOrderClick(Sender: TObject); begin // Устанавливаем режим сортировки case rgOrder.ItemIndex of 0: dm.idCust.SelectSQL[1]:=''; 1: dm.idCust.SelectSQL[1]:='ORDER BY CustName'; 2: dm.idCust.SelectSQL[1]:='ORDER BY Address'; end; dm.idCust.Close; dm.idCust.Open; end; procedure ArcForm.bLocateClick(Sender: TObject); begin // Поиск заказчика по фамилии DM.idCust.Locate('Name', eName.text,[loPartialKey]); end; В кладки «Заказы » и «Т овары » функционально более простые, на них реализо-ван (в табличной форме) только просмотр заказов и товаров соответственно. Н а вкладке «Заказы » сетка д анны х отображ ает в ы борку и з трех таблиц, полу-ченную с помощ ью запроса, реализую щ его внутреннее соед инение (см. пере-менную Query в листинге). Чтобы не расход овать ли ш них ресурсов , пропи ш ем запрос в уж е имею щ и йся у нас компонент iqInsert. Последний связы вает-ся с сеткой посредством временного компонента, объявляемого в секци и реали -заци и мод уля var ds: TDataSource и созд аваемого д инамически : procedure TArcForm.FormCreate(Sender: TObject); begin // Создаем временный источник данных ds:= TDataSource.Create(self); // Связываем его с набором данных ds.DataSet := dm.iqInsert; // и с сеткой dgrOrders.DataSource := ds; end;

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

38

О бработчик щ елчка по группе переклю чателей: procedure TTablForm.rgLinkClick(Sender: TObject); var Query: string; begin // Формируем запрос Query := 'SELECT Customers.Cust_id, Customers.CustName,’ + ‘Products.ProductName, Orders.Total,’ + ‘ Orders.SaleDate FROM customers, orders, products' + ' WHERE (Customers.Cust_id=Orders.Cust_id)' + ' AND (Orders.Prod_ID=Products.Prod_ID)'; with dm,iqInsert do begin Close; Sql.Clear; Sql.Add(Query); // Показываем данные для … case rgLink.Itemindex of 0: begin // текущего заказчика SQL.add('AND (Orders.Cust_Id = :p1)'); ParamByName('p1').value := idCustCust_ID.value; end; 1: begin // текущего товара SQL.add('AND (Orders.Prod_Id = :p1)'); ParamByName('p1').value := idProductProd_ID.value; end;

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

39

end; Open; end; end; Чтобы запрос в ы полнялся каж д ы й раз при появлении формы на экране, при -свойте с помощ ью инспектора объектов обработчику события OnShow формы или tsOrders процед уру rgLinkClick. Н аконец, чтобы все работало, напи ш ем обработчики procedure TArcForm.tsCustShow(Sender: TObject); begin dm.idCust.Close; dm.idCust.Open; end; и procedure TArcForm.tsDetalShow(Sender: TObject); begin dm.idProduct.Close; dm.idProduct.Open; end; В неш ний в и д сетки д ля заказов настройте самостоятельно. Задани я для с амо с то ятельно й р або ты Реш ение каж д ой зад ачи д олж но вклю чать ER-модель указанной предметной области , структуру БД с серверной реализацией бизнес-правил и клиентское прилож ение.

1. Библиотека 2. В и д еотека 3. И нформационно-поисковая система 4. М узыкальные альбомы 5. О тд ел кадров 6. Распределение учебной нагрузки 7. Бронирование ав и абилетов 8. Гостиница 9. Прокуратура 10. Ф акультет 11. И Т У 12. К улинарные рецепты 13. Н ародные д епутаты 14. Регистратура лечебного учреж д ения 15. А втозапчасти

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

40

16. Заказы на сборку компью теров 17. А втосалон 18. F1 Word Grand Prix 19. Бирж а труд а 20. Т урагентство 21. А ренд а помещ ений 22. Ри элтерская фирма 23. CIA 24. Ф инансовая организация 25. Управление госимущ еством 26. О рд ена и наград ы 27. О хранное агентство 28. Hollywood 29. Российский футбол 30. Город ские д остопримечательности 31. Д ома на прод аж у 32. А льпинистский клуб 33. Управление проектами 34. К атера и яхты 35. Ресторан 36. Заповед ник

Пр и ло жени е. Ти пы по лей InterBase Т и п поля Раз-

мер, байт

Д и апа-зон/точность

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

SmallInt 2 – 32768 … 32767

Ц елые числа в д и апазоне – 32767 … 32767.

Integer 4 –2,147,483,648 … 2,147,483,647

Ц елые числа со знаком

Float 4 – 3,4 ⋅1038 … 3,4 ⋅10 38

Ч исла с плаваю щ ей точкой точностью д о 7 значащ и х цифр.

Double precision

8 – 2,225 ⋅10307

2,225⋅ 10 308 Ч исла с плаваю щ ей точкой точностью д о 15 значащ и х цифр.

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

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

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

41

Date 8 01.01.0100 – 29.02.32768

Д ата.

Time 4 0:00 -23:59.9999

В ремя д ня.

TIMESTAMP

8 1.01.100 - 29.02. 32768

Содерж ит д ату и время.

Blob Пере-мен-ный

Н ет

И спользуется д ля хранения объемных д анны х (текст, графика, оцифрованны й зв ук и др.). Содерж имое определяется под типом.

Decimal (p,s)

пере-мен-ный

P – общ ее число знаков от 1 д о 18, s – число зна-ков после точки от 0 д о 18, s <= p

Ч исло с фиксированной точкой. Н апри -мер, DECIMAL(10, 3) сод ерж ит числа след ую щ его формата: ppppppp.sss. Ч исло P определяет наи -меньш ую точность при хранени и .

Numeric (p,s)

пере-мен-ный

P – общ ее число знаков от 1 д о 18, s – число зна-ков после точки .

Ч исло с фиксированной точкой. Н апри -мер, NUMERIC (10, 3) сод ерж ит числа след ую щ его формата: ppppppp.sss. P определяет точное число хранимы х знаков .

Т аблица составлена применительно к Interbase 6.5 и FireBird 1.1, в други х вер-сиях Interbase и FireBird имею тся некоторые различия. Ли тер атур а

1. Ф аронов В .В . Программирование баз д анны х в Delphi 7: Учебны й курс / В .В . Ф аронов .— СПб.: Питер, 2003 .— 458 с.

2. Д арахвели д зе П.Г. Разработка WEB-служ б средствами Delphi / П.Г. Д арахвели д зе, Е .П.М арков . - СПб.: BHV-Петербург, 2003. - 647 с.

3. Разработка прилож ений баз д анны х в среде Delphi: Учебно-метод ическое пособие по специальности "Прикладная математика и информатика" 010200 / В оронеж . гос. ун-т. Сост.: В .Г. Руд алев , Ю .А . Кры ж ановская .— Ч .2 .— 2003 .— 38 с.

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

42

СОДЕР Ж А Н И Е Введени е ................................................................................................3 1. Осно вы раб о ты в InterBase.............................................................4

1.1. Установка InterBase....................................................................................4 1.2. И нструментальные средства...................................................................... 4 1.3. Созд ание и регистрация базы д анны х .......................................................5 1.4. Созд ание таблиц.........................................................................................9 1.5. Созд ание генераторов , триггеров и хранимы х процед ур....................... 10 1.6. В ыполнение SQL-запросов ...................................................................... 12 1.7. Управление пользователями .................................................................... 14 1.7.1. Смена пароля администратора.............................................................. 14 1.7.2. Д обавление нового пользователя.......................................................... 15 1.7.3. Пред оставление при в илеги й ................................................................. 15 1.7.4. И спользование ролей. ........................................................................... 17 1.8. Созд ание UDF .......................................................................................... 18

2. Н ап и сани е кл и ентски х п ри л о ж ени й ..........................................20 2.1. Структура прилож ения............................................................................ 21 2.2. К омпоненты д оступа к д анным............................................................... 22 2.2.1. TIBTable................................................................................................. 22 2.2.2. TIBQuery ................................................................................................ 23 2.2.3. TIBDataSet ............................................................................................. 23 2.2.4. TIBSQL .................................................................................................. 23

3. При мер п рограмми ро вани я .........................................................24 3.1. Предметная область ................................................................................. 24 3.2. Структура БД ............................................................................................ 24 3.3. Клиентская часть...................................................................................... 26 3.3.1. Н астройка мод уля д анны х .................................................................... 26 3.3.2. В заимодейств ие с пользователем......................................................... 29

Задани я дл я само сто ятел ьно й раб о ты ............................................39 При л о ж ени е. Т и п ы п о л ей InterBase................................................40 Л и тература..........................................................................................41

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

43

Составитель Руд алев В алерий Геннад ьев ич Ред актор Т и хомирова О .А .


Recommended