М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я РО ССИ Й СК О Й Ф Е Д Е РА Ц И И В О РО Н Е Ж СК И Й ГО СУ Д А РСТ В Е Н Н Ы Й У...
7 downloads
308 Views
735KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я РО ССИ Й СК О Й Ф Е Д Е РА Ц И И В О РО Н Е Ж СК И Й ГО СУ Д А РСТ В Е Н Н Ы Й У Н И В Е РСИ Т Е Т Ф акультетп рикладной математикиимеханики К а ф едр а т ехн и ческой ки бер н ет и ки и а вт ом а т и ческого р егу ли р ова н и я
Р удал е в В .Г ., К ры ж ановская Ю .А .
Р азраб о тка п ри л о ж ени й б аз данны х в с реде Delphi. Ч ас ть I.
М етодическоеп особиек курсу «Б аз ы данны х и экспе ртны е систе мы » для студентов 4 курсад/о и4 курсав /о ф акультетаП М М
В оронеж , 2002
П реди с л о ви е Д анное п особие п редназначено студентам 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.
2
М ето ди ка с о здани я п ри л о ж ени й 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 или сис3
п ользов анием BDE Administrator. В се алиасы и другие п араметры и настройки BDE регистрирую тся в конф игурационном ф айле idapi.cfg. П ри работе в среде Windows NT/2000 ф айл idapi.cfg долж ен находиться наобщ едоступ ном сетев ом илилокальном дискеибы ть доступ ен для изменения в семип ользов ателями. Д альнейш ее излож ение ориентиров ано наисп ользов ание таблиц Paradox и InterBase. К аж дая таблиц аф ормата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 Controls (ее комп оненты аналогичны комп онентам страниц Standard и Additional, но размещ енны е здесь комп оненты имею т связь сп олями таблиц БД ), Midas (для создания многоуров нев ы х п рилож ений БД ), InterBase (здесь расп олож ены комп оненты , обесп ечив аю щ ие п рямое п одклю чение к серв еру InterBase без исп ользов ания доп олнительны х механизмов , п одобны х BDE). О граничимся рассмотрением п ерв ы х дв ух страниц . 1.2.1. Страни ц а DataAccess Н аданной странице расп олож ены комп оненты , которы е в о в ремя работы п рилож ения яв ляю тся нев идимы ми, т.е. нев изуальны е комп оненты . О ни не имею т свойств , относящ ихся к их в неш нему в иду ип олож ению наф орме. Е динств енная ф ункц ия комп онентов доступ ак данны м яв ляется обесп ечениеработосп особности комп онентов интерактив ного уп равления данны ми.
4
И мя Наз наче ние 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 Редактируемы й сп исок в ы бора. П одобен комп оненту ComboBox страниц ы Standard, но обслуж ив аеттекстов оеп олеБД . DBCheckBox В ы клю чатель. О бслуж ив аетлогическоеп олеБД . DBRadioGoup Груп п а п ереклю чателей. Служ ит для отображ ения состояния илив ы бораодного из в заимоисклю чаю щ их значений п оля БД . 5
DBLookUpListBox
DBLokUpComboBox DBRichEdit
DBCtrlGrid DBChart
Сп исок в ы бора. О тличается от DBListBox тем, что элементы сп исказап олняю тся значениями, в зяты мииз п олей другого набора данны х, в то в ремя как DBListBox ф ормируется п роизв ольны мизначениями. К омбиниров анны й сп исок в ы бора. В отличие от DBComboBox содерж имоесп искаберется из другого набораданны х. RTF-редактор. П редназначен для отображ ения и изменения текстов ы х п олей, исп ользую щ их расш иренны й текстов ы й ф ормат. П оказы в аетсодерж имоенескольких зап исей однов ременно Строитграф икип о данны м, находящ имся в набореданны х
1.2.3. М и ни м ал ьны й наб о рко м п о нент дл я п ри л о ж ени я с Б Д Л ю бое п рилож ение, работаю щ еесБД , долж но содерж ать в своем составе, как минимум, трикомп онента. В о-п ерв ы х, комп онент для связисп роцессором баз данны х ичерез него сф изическимитаблицами. Э то мож ет бы ть комп онент TTable (работастаблицамиБД ), TQuery (в ы п олнение SQL-зап росов к БД ) илиTStoredProc (в ы п олнение хранимы х на серв ере БД п роцедур). В о-в торы х, комп онент 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. Э ти дв асвойств ав заимоисклю чаю щ и: для уп орядочения таблицы следует указы в ать либо одно, либо другое.
6
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 иоткройте сп исок п сев донимов в свойств е DataBaseName. У станов итеп сев доним DBDemos. 3. В в едите имя таблицы TableName из DBDemos. Е сли п сев доним бы л задан п равильно, то в сп иске в озмож ны х значений свойств аTableName п ояв ятся имена в сех таблиц из данного каталога. В ы берите нуж ную , нап ример, country.db (статистическиеданны ео государств ах американского континента). 4. В ы берите комп онент DataSource1. Св яж ите его сTable1, указав имя Table1 в свойств еDataSet. 7
5. Разместите комп онент TDBGrid (страница Data Control п алитры комп онентов ). Св яж ите его сDataSource1, указав имя DataSource1 в свойств е DataSource. П равильность связы в ания комп онентов п ров ерьтеп о рис.1. 6. У станов ите свойств о Active объ ектаTable1 в True. Т аблицаоткроется и ее содерж имоеотобразится в сеткеданны х (DBGrid). 7. О ткомп илируйтеив ы п олнитеп рилож ение. 8. У станов ите Active в False, ав обработчик собы тия создания ф ормы OnCreate в ставьте Table1.Open. Т еп ерь таблицаоткроется только в о в ремя в ы п олнения п рилож ения. Ч тобы это п ров ерить, п ов торитеш аг 8.
Рис. 1 Ч асто бы в ает удобно п росматрив ать и редактиров ать таблицу в в иде нескольких строк, каж дая из которы х отображ ает одно п оле текущ ей зап иси. Д ля этой цели п редназначен комп онент TDBEdit (страниц аData Control). Н аф орме следует разместить столько объ ектов TDBEdit, сколько п олей В ы хотите п росматрив ать. Э кземп ляр связы в ается сп олем сп омощ ью дв ух свойств : DataSource (здесь указы в ается экземп ляр объ екта-источникаданны х) иDataField (указы в ается имя п росматрив аемого п оля). Д ля отображ ения граф ических п олей (тип аGraphics, Blob) итекстов ы х п олей (тип аMemo) п редставлены в изуальны е комп оненты TDBImage и TDBMemo, соотв етств енно. П еремещ ение п о зап исям таблицы удобно организов ать сп омощ ью комп онента TDBNavigator. В неш ний в ид этого в изуального комп онентанап оминает п анель уп равления п леера. В частности, здесь п рисутств ую т кноп кип ереходанаследую щ ую ип реды дущ ую зап иси, нап ерв ую ип оследню ю зап иси, в ставкинов ой зап исиидр. В се назв анны е комп оненты связы в аю тся снабором данны х через свои свойств а DataSource иDataField.
8
Л абораторная работа№ 2 (самостоятельная) Н ап иш итеп рилож ениедля п росмотратаблицы biolife.db, содерж ащ ей текстов ы еи граф ические данны е. В место TDBGrid исп ользуйте TDBEdit, TDBImage, TDBMemo и TDBNavigator. Д ля идентиф икации п олей п еред каж ды м в изуальны м комп онентом п оместите объ ект TLabel сп одп исью . П римерны й результатработы п рилож ения долж ен иметь в ид рис.2.
Рис.2 1.3. Ус тано вл ени е с вязей м еж дутаб л и ц ам и Созданиеодносвязной ф ормы . О дносвязная ф ормасодерж итдв етаблицы - главную ип одчиненную , которы есвязаны меж ду собой через одинаков ы еп оля. П одчиненная таблицаобязательно долж набы ть п роиндексиров анап о связую щ ему п олю . Н ап ример, главная таблицасодерж итп олны есведения о заказчиках, ап одчиненная - о заказах, имисделанны х. О дному заказчику мож етсоотв етств ов ать несколько строк в п одчиненной таблице, однако там он п редставлен лиш ь своим учетны м номером CustNo. П олеCustNo в ы бирается в качеств е связую щ его п оля. Д ля создания связи в комп оненте TTable п одчиненной таблицы необходимо доп олнительно задать значения свойств MasterSource (имя комп онентаDataSource главной таблиц ы ), MasterField (имя связую щ его п оля главной таблицы ), IndexFieldNames (имя актив ного индексного п оля для п одчиненной таблицы , в качеств е которого в ы бирается связую щ ееп оле). О тметим, что зап исив п одчиненной таблице доп олнительно ф ильтрую тся п о услов ию сов п адения одноименны х п олей. П оэтому в п одчиненной таблице п оказы в аю тся только заказы , сделанны етекущ им заказчиком из главной таблицы .
9
Л абораторная работа№ 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 (самостоятельная). Создание многосвязной ф ормы . Создайте ф орму, содерж ащ ую три связанны е таблицы . П ерв ая таблица Customer.db яв ляется главной, сней связанап одчиненная таблицаOrders.db, которая, в свою очередь, яв ляется главной таблиц ей для Items.db. В таблице Items содерж атся характеристикизаказов . О бщ ая методикатакая ж е, как ип рисозданииодносвязны х ф орм. Д ля связитаблиц Orders иItems исп ользуйтеп олеOrderNo.
10
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 иCountryModule.dfm. 3. В ы беритеFile | Close All. Н есохраняйтеп роект. Т еп ерь созданны й модуль мож ет исп ользов аться в лю бом нов ом п рилож ении, работаю щ ем стаблицей Country.db. Н ап ример, для п одклю чения модуля к п устому п роекту п роделайтеследую щ иедейств ия. 1. В ы беритеп унктменю File | New Application. 2. В ы берите п ункт меню Project | Add to Project... инайдите надиске ранее созданны й модуль. П ерейдите наглавную ф орму ип одклю читек ней модуль данны х, в ы брав п унктFile | Use Unit иимя модуля CountryModule. Соотв етств ую щ ая директив аUse будетв ставленав модуль Unit1 автоматически.
11
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 идр.). Т ип данны х легко п онять п о назв анию класса. 12
2.1.1.Со здани е о б ъекто в-п о то м ко в TField Сущ еств уеттрисп особа. • С помощ ь ю ре д а кт ора поле й. У казатели натип изиров анны е п отомки TField в клю чаю тся в оп исание ф ормы , аэкземп ляры автоматически создаю тся пр и созда н и и ф ор м ы и у н и чт ож а ют ся пр и ее за кр ы т и и . Т акие п оля иногдане сов сем п равильно назы в аю т статическими. Э тотсп особ удобен тем, что п озв оляет работать сп олем как собы чны м комп онентом иредактиров ать его свойств а наэтап е в изуальной разработки. • П о умолча н и ю . Т ип изиров анны е п отомкиTField создаю тся автоматическипр и от кр ы т и и т а бли цы (в п олном соотв етств иисчислом итип ом ее ф изических п олей) и уничтож аю тся п ри ее закры тии. О тображ аться в в изуальны х комп онентах будутв сеп оля, имею щ иеся в таблице. • П рогра ммн о, т.е. сп омощ ью собств енны х методов -конструкторов . Характеристикип олей, в ремя создания и в ремя удаления оп ределяю тся п рограммистом. 2.1.2. Р едакто рп о л ей Рассмотрим на конкретном п римере п ерв ы й сп особ создания п оля. В о многих случаях бы в ает необходимо ограничить число п олей, изменить п орядок их следов ания, изменить заголов ки, добавить нов ы е п оля, содерж ащ ие результаты в ы числений над имею щ имися п олями. Н ап ример, в таблицеCountry создать нов оеп оле Density (п лотность населения накв . км). Т акие в озмож ностип редоставляет Fields Editor (редактор п олей). Редактор п олей работает слогическимип олями, ф изические п оля таблицы остаю тся без изменения. Т ип изиров анны е объ екты TField в клю чаю тся в оп исание ф ормы итем самы м станов ятся доступ ны минаэтап е в изуальной разработки. Л абораторная работа№ 6. Созданиев ы числяемы х п олей. 1. О ткройте нов ы й п роект, разместите на ф орме комп оненты TTable, TDataSource иTDBgrid. Св яж ите этикомп оненты . Св ойств о DataBaseName иTableName у TTable установ итев DBDemos иCountry.db, соотв етств енно. Разместите TDBNavigator исвяж итеего сTDataSource. 2. Д в аж ды щ елкните наобъ екте Table1. П ояв ится окно редакторап олей, п ерв оначально п устое, т.к. объ екты TField ещ енесозданы . 3. Н аж мите п равую кноп ку мы ш и и в п ояв ив ш емся контекстном меню в ы берите п ункт Add Fields. В окне Available Fields будут п еречислены в се ф изические п оля таблицы . В ы берите из них те п оля, которы е В ы хотите оставить, нап ример, Name, Area, Population. Н аж митеOk. 4. В ы берите в контекстном меню п ункт New Field. В раскры в ш емся окне задайте имя в ы числяемого п оля - Density иего тип - Float, установ ите ф лаж ок Calculated. Н аж митеО k изакройтередактор п олей.
13
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:=’Адрес’; 14
К зн а чен и ю поля мож но обратиться либо сп омощ ью свойств а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); или 15
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); 16
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 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;
then
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 - оп ределяет, нуж но ли сохранять соединение с базой, еслив п рограмменетниодной откры той таблицы из этой базы , 17
• NetFileDir: String - директория, в которой находится общ ий сетев ой ф айл PDOXUSRS.NET, необходимы й BDE, • PrivateDir: String - директория для хранения в ременны х ф айлов . Св ойств о Active устанавлив ает актив ность сеансасоединения сБД (сессии). Е слиэтому свойств у п рисваив ается значение True, то данная сессия станов ится текущ ей. Н екоторы е методы : • Procedure GetAliasNames (List: TStrings) – в озв ращ ает сп исок алиасов ; • Procedure GetAliasParams (const AliasName: String; var List: етв сп исок List п араметры алиаса; TStrings) – п омещ а • procedure GetTableNames(const AliasName, Pattern: String; Extensions, 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;
18
Рис.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 п ерейдет не нап оследню ю ф изическую зап ись, анап оследню ю зап ись, ограниченную услов ием ф ильтра. Д ля п еремещ ения п о Н Д в низ нуж но в ы п олнить следую щ иедейств ия: 19
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 (ф иксируетнадисниеп о умолчанию ) кеизмененную зап ись); метод Cancel (отменяетизменения) DsEdit Т екущ ая зап ись редактиру- М етод Edit ется DsInsert В ставлена или добавлена М етоды Insert илиAppend нов ая зап ись DsFilter Н Д ф ильтруется Св ойств о Filtered:=True DsCalcFields О п ределяю тся в ы числяемы е п оля. И зменения в Н Д в носиться немогут. Св ойств о State, в озв ращ аю щ ее значения, п рив еденны е в п ерв ом столбцетаблицы , п озв оляетузнать текущ еесостояниеН Д . 20
П ри редактиров ании Н Д неп осредств енно в связанном сним в изуальном комп оненте, нап ример 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
О ткры ты й масс ив п рип ередачев п роц едуру мож етиметь разноечисло элементов изадаваться в в идесп ис казначений в кв адратны х с кобках (но не п утать смнож ес тв ом!). Const в начале означает, что мас сив п ередается п о значению (но не через стек!). Const в конце - что масс ив в ариантны й иего элементы могутиметь разны й тип . Е щ енезап уталис ь? Т огдап родолж им.
1
21
Д анны еметоды ищ утзап ись, удов летв оряю щ ую заданны м услов иям. М етод Locate: function Locate(const KeyFields: string; const KeyValues: Variant; Options: TLocateOptions): Boolean; virtual;
Locate ищ етп ерв ую зап ись, удов летв оряю щ ую критерию п оискаиделаетеетекущ ей, в озв ращ ая значениеtrue. Е слиискомая зап ись ненайдена, Locate в озв ращ аетзначениеfalse, ип озиция курсоранеменяется. В п ростейш ем в арианте аргументами метода яв ляю тся назв ание п оля KeyFields, искомоезначениеп оля 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); 22
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 (п лощ адь страны ), п риэтом курсор нанайденную зап ись неп еремещ ается.
23
Н еобходимо отметить, что очень часто необходимо найтисразу несколько зап исей. Д ля реш ения такого родазадач удобнее п рименять методы , п редоставляемы е классом 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, то они обаучиты в аю тся.
24
Ф ильтры исп ользую тся, в основ ном, для п оисказап исей, но п оиск этот в есьма медленны й, так как основ ан на п оследов ательном п ереборе зап исей. Д ля Н Д 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 илиIndexFieldNames (см. п римечания к п .1.2). 25
2.4.2. П о л учени е и нф о рм ац и и о б и ндекс е Св ойств о IndexDefs тип аTIndexDefs объ ектаTTable содерж итв сю инф ормацию о сущ еств ую щ их индексах таблиц ы . Н екоторы е свойств а иметоды класса TIndexDefs (п олны й п еречень - [3]): • property Count: integer; число индексов , • property Items[Index: Integer]: TIndexDef; - набор объ ектов тип аTIndexDef, содерж ащ их инф ормацию о конкретном индексе, • 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. В ы бор строкив сп искеизменитп орядок сортиров ки. О братитев нимание, что п ерв ичны й индекснеимеетименииобозначается п устой строкой.
26
Рис.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. 27
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; 28
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); 29
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 иTDBLookupComboBox (см. п .2.6). 7. И зменитеструктуру таблицы Detal, добавив п оле« О статок наскладе» имодиф ицируйте п рограмму так, чтобы нельзя бы ло п родать отсутств ую щ ий наскладе тов ар. (М ногие в оронеж ские ф ирмы в ряд либудут в в осторге от такого усов ерш енств ов ания.) 2.6. Ви зуал ьны е ко м п о ненты дл я редакти ро вани я текущ ей зап и с и О чев идно, задачу в едения ж урналазаказов из лабораторной работы № 9 мож но реш ить различны мисп особами. Н о в лю бом случае обязательно соблю дение требов ания автоматизациив сех действ ий. В се, чт о н а ходи т ся в т а бли це, долж н о и звлека т ься н епоср едст вен н о и з т а бли цы , а н е н а би р а т ься вр у чн у ю. О п ератору дов ерять нельзя! (А п рограммисту - мож но???) В лаб. раб. № 9 для в в одатов арав ж урнал заказов исп ользов ался индексны й п оиск тов арав таблице тов аров ип одстанов канайденного номера(т.е. номераиз текущ ей зап иси) в ж урнал заказов . Бы стры й индексны й п оиск оп равдан п ри больш ом объ еме таблиц, в остальны х случаях более удобны в изуальны е комп оненты для п оискаиредактиров ания (см. п . 1.2.2). Рассмотрим сейчасодин из них - TDBLookUpComboBox, п редназначенны й для зап олнения одной таблицы данны ми, в зяты мииз другой таблицы . Св ойств акомп онента DataSource иDataField указы в аю тнаисточник данны х и п олетой таблицы , кудазаносятся данны е(T1). Сп исок TDBLookUpComboBox зап олняется значениямип оля ListField из таблицы T2, источник данны х которой указан в ListSource. К лю чев ое п оле, соотв етств ую щ еев ы бранному из сп исказначению , автоматическизаносится в текущ ую зап ись таблиц ы T1.
30
Т аблицы T2 иT1 долж ны находиться в отнош енииMaster-Detail и бы ть связаны п о общ ему п олю KeyField. Т ип ы KeyField иDataField долж ны сов п адать. И ндексы для установ ления связиздесь нетребую тся. П ример. Расп олож итенаф ормеп о дв акомп онентаTTable иTDataSource, один TDBGrid и TDBLookUpComboBox, трикноп ки(см. рис. 9). Н астройте Table1 натаблицу Cd, аTable2 –натаблиц у Detal. Св яж итеTable1, DataSource1 и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. 31
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 или ExecSQL. М етод Open исп ользуется, еслизап росисп ользуетп рилож ениеSELECT и в озв ращ ает п рилож ению результат. М етод ExecSQL исп ользуется в о в сех остальны х случаях. Т екст зап росамож ет бы ть зап исан в свойств о SQL дв умя сп особами: 1) сп омощ ью сп ециализиров анного редактора, в ы зы в аемого через инсп ектор объ ектов на этап еразработкип рограммы и2) сп омощ ью собств енны х методов объ ектакласса
32
TStrings (Add, Clear, LoadFromFile и др. [11]) наэтап е в ы п олнения п рограммы . П роиллю стрируем обасп особаследую щ имилабораторны миработами. Л абораторная работа№ 10 Создайте ф орму, отображ аю щ ую данны е из дв ух связанны х таблиц - главной cust.db ип одчиненной cd.db. 1. Разместите в окне ф ормы комп оненты Query1: TQuery, DataSource1: TDataSource и DBGrid1: TDBGrid. О тметим: хотя таблиц дв е, размещ ается только один комп онентданны х TQuery. И менатаблиц исвязимеж ду нимиуказы в аю тся в текстезап роса. Св яж итеустанов ленны екомп оненты обы чны м образом, установ ив свойств о DataSet объ ектаDataSource1 в Query1. В качеств езначения свойств аDataBaseName объ екта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.
33
Рис.10 1. О ткройте нов ы й п роект. Разместите в окне ф ормы комп оненты Query1: TQuery, Table1: TTable, DataSource1: TDataSource и DBGrid1: TDBGrid. Св яж ите DBGrid1 иDataSource1. (DataSource1 будетсвязан сTable1 илиQuery1 в ходев ы п олнения). У станов ите значения следую щ их свойств Table1 и Query1: DataBaseName - 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; 34
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 зап рос, содерж ащ ий несколько п араметров , которы е могут бы ть изменены в о в ремя в ы п олнения. Т акиезап росы назы в аю тся динамическими. Рассмотрим дв асп особасоздания динамических зап росов .
35
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.
36
Рис.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
37
будетп риниматься значение п оля nd текущ ей зап исидругой таблицы Detal (главной). Е стеств енное требов ание: Н Д для таблицы Detal долж ен бы ть от кр ы т р а н ьше, чем зап россп араметром nd. 3.2.2. Фо рм и руем ы е зап ро с ы Э тот сп особ яв ляется более унив ерсальны м, но менее бы стры м. Здесь мож но не только задавать значения п араметров , но ив идоизменять ф орму зап роса, в в одить доп олнительны е услов ия, служ ебны е слов аит.д. Д ля этого зап росстроится сп омощ ью средств работы со строками язы ка Pascal, нап ример, Query1.Sql.Add(‘Ст р ока ’+ Edit1.text). О тметим, что синтаксисф ормируемого зап росап ров еряется каж ды й раз в о в ремя в ы п олнения, что п ричастом в ы п олнениизамедляет работу. П араметрические зап росы здесь имею т п реимущ еств о, т.к. они ф ормирую тся один раз, п оэтому их мож но откомп илиров ать в исп олняемы й код, ав дальнейш ем не п ров ерять занов о, атолько п одставлять нов ы е п араметры . Д ля п одготов кик такому исп ользов анию п араметрических зап росов служ ит метод Prepare, которы й рекомендуется один раз в ы зв ать в началеработы п рилож ения, нап ример, в обработчикеOnCreate ф ормы . Л абораторная работа№ 12 (самостоятельная) Создайте п рилож ение для п роизв ольного конструиров ания п ростого зап роса, содерж ащ его логическое в ы раж ение. П римерны й в ид главной ф ормы п рилож ения п оказан нарис. 12.
Рис. 12
38
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, TUpdateSQL исвяж итеих. Св ойств а 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.
39
Рис.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, п роисходят и п ри в ы зов е методов ApplyUpdates (ф иксация изменений насерв ере), CommitUpdates (очисткакэш аотзаф иксиров анны х изменений) комп онентаTQuery. А льтернатив ны й методу Apply в ариантимеетв ид Query1.ApplyUpdates; Query1.CommitUpdates;
3. Создайтеобработчикисобы тий OnClick для кноп ок: procedure TForm1.ApplyСlick(Sender: TObject); begin Query1.ApplyUpdates; Query1.CommitUpdates; end; 40
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 41
У тилита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. 42
В 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: True означает, что имя п ользов ателя ип ароль Boolean; в сегдабудут зап раш ив аться п рисоединении сБД , False – будут считы в аться из свойств а Params. Property Params: Сп исок п араметров соединения сБД . В частTstrings; ности, здесь указы в аю тся учетное имя и п ароль. Property Connected: У казы в ает, имеетликомп онентактив ное соBoolean единениесБД . Procedure StartTransac- П ослев ы зов ав сеизменения, в носимы ев БД , tion; считаю тся относящ имися к текущ ей актив ной транзакции. Procedure Commit; Заверш ает в ы п олнение текущ ей транзакции иф иксируетв сеизменения в БД . Procedure RollBack; О ткаттранзакции. Property IsTransaction: Сообщ ает, имеется лиактив ная транзакция. Boolean; Procedure ApplyUpdates П одтв ерж дает кэш иров анны е изменения в (const DataSets: array 43
(const DataSets: array нескольких Н Д , п еречисленны х в откры том of TDataSet) массив еDataSets. Property TransIsolaЗадает уров ень изоляции транзакций насерtion: TtransIsolation; в ере[1,2]. П римечания. • В п ростейш ем случае достаточно исп ользов ать свойств а Aliasname, DataBaseName. • Редактиров ание свойств соединения 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), таким образом, если п редп олож ить что нов ое значение в озв ращ ается в 44
среднем синтерв алом в 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. Д ля п оследнего зап иш ите в свойств е Data45
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 46
<Оператор> <Оператор> … END
Е сли в хранимой п роцедуре исп ользую тся локальны е п еременны е, то в се они долж ны бы ть объ яв лены : DECLARE VARIABLE ИмяПеременной
Тип;
Синтаксисязы ка в о многом аналогичен Pascal. П ри нап исании телахранимой п роцедуры могутисп ользов аться: • оп ератор п рисваив ания И м яП ер ем ен н ой = вы р а ж ен и е; • оп ераторны ескобкиBEGIN … END; • оп ера тор IF(<усл овие>)THEN <оператор1> ELSE <опе ратор2>; • оп ера тор цикла WHILE (<усл овие>) DO <опе ратор> инекоторы едругие[1]. Хранимая п роцедурамож ет содерж ать различны е SQL-оп ераторы . О п ератор SELECT исп ользуется в р а сши р ен н ой р еда кци и . В него добавляется п редлож ение 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; // Выполнение хранимой процедуры 47
// Отображение выходного параметра: 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).
48
Рис.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. Т ри ггеры Т риггер - это хранимая насерв ереособая п роцедура, ассоц ииров анная стаблицей, которая автоматическив ы п олняет действ ия п ридобавлении, измененииилиудалениистрокив таблице. К триггеру нельзя обратиться из п рикладной п рограммы , у него отсутств ую т в ходны е ив ы ходны е п араметры . Т риггер никогдаяв но не в ы зы в ается, он срабаты в ает автоматически п ри наступ лении какого-либо собы тия в БД . С п омощ ью триггеров обы чно реализую тся би зн ес-пр а ви ла , задаю щ иелогику работу сБД , нап ример, генераторы для п оддерж ания уникальны х значений клю чев ы х п олей, каскадны е в оздейств ия для обесп ечения ссы лочной ц елостности, контроль задоп устимостью в в одимы х значений п ри редактиров ании, в едение регистрационны х ж урналов , накап лив аниестатистикиит.п . Т риггер создается оп ератором 49
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
50
TIBSroredProc
А налог TStoredProc
TIBDataBase
У станавлив аетсоединениесБД InterBase. П озв оляетзадавать п араметры соединения иуп равлять транзакциями.
TIBTransaction
У п равляет отдельной транзакц ией О Д Н О ГО или нескольких соединений с базами данны х. С ним долж ен бы ть связан комп онентTIBDataBase..
TIBUpdateSQL
А налог TUpdateSQL
TIBDataSet
П редназначен для п росмотраи редактиров ания набораданны х, п олученны х сп омош ью оп ератораSELECT. TIBDataSet содерж ит отдельны е оп ераторы SQL для в ставки, удаления, модиф икациистрок.
TIBEvents
П озв оляет регистриров ать и синхронно обрабаты в ать сообщ ения о собы тиях, генерируемы х серв ером
TIBSQL
В ы п олняет SQL-оп ератор сминимальны мизатратамиpecypcoв , не требует п одклю чения к в изуальны м комп онентам уп равления данны ми.
TIBDatabaseInfo
В озв ращ ает инф ормацию о п одклю ченной базе данны х InterBase (количеств о в ы деленны х кэш -буф еров , количеств о п рочитанны х изап исанны х страниц ит.д.).
TIBSQLMonitor
О сущ еств ляет мониторинг динамических SQL-оп ераторов , п ередаваемы х наInterBase-серв ер.
Приме чание • П ри создании п рилож ений обязательно исп ользов ание комп онентов TIBDataBase иTIBTransAction. Н ап омним, что в технологииBDE аналогичны й комп онентTDataBase бы л необязателен. П оясним методику создания п рилож ений нап римере дв ух связанны х таблиц « Заказчики» и« Заказы » . 1. В нов ом п роекте разместите в модуле данны х комп оненты TIBDataBase, TIBTransAction, дв акомп онентаTIBTable идв акомп онентаTdataSource (как п оказано наРис. 17). 2. К омп онент IBDataBase1 свяж ите сбазой данны х IB_sklad, отредактируйте, как обы чно, свойств о Params.
51
Рис. 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 в ы в естиназв ания деталей, куп ленны х указанны м заказчиком зауказанную дату. 52
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. 53
Б аз ада нны х. Н абор в заимосвязанны х таблиц. В торичны й инде кс. Д оп олнительны й и н декс, строящ ийся п о лю бому клю чу, кроме п ерв ичного клю ча. И нде кс. Структура, задаю щ ая логический п орядок зап исей в таблице, отличны й отф изического п орядка. К л асс. О бъ ектов ы й тип п еременны х. К л ю ч. П оле, п о которому п роисходитсортиров каилип оиск. К омпоне нт. Разнов идность кла сса , сп особного в изуально п ереноситься в п рограмму. К эш ирова нны е из ме не ния . М еханизм доступ а, п ри котором в се изменения в таблиц е зап оминаю тся в буф ере налокальной Э В М ип ереносятся насерв ер отдельной транзакцией. М одул ь. Н езависимо комп илируемая п рограммная единиц а. М одул ь данны х. Н еотображ аемая ф орма, контейнер для комп онентов доступ ак данны м. Объ е кт. Э кземп ляр кла сса . Пе рвичны й инде кс. И н декс, п остроенны й п о пер ви чн ом у ключу . Пе рвичны й кл юч. П оле, уникальны м образом идентиф ицирую щ ее зап ись в таблице. Т ранз а кц ия . Л огическая единицаизменений данны х, п ерев одящ ая БД из одного целостного состояния в другое. Составной кл ю ч. К люч, состоящ ий из нескольких п олей. Т е кущая з а пись. Зап ись, доступ ная для редактиров ания. Ф орма . В изуальны й комп онент, отображ аемы й в в иде окна. К онтейнер для в изуальны х комп онентов , п еренесенны х в п рограмму.
П ри л о ж ени е П 1. Структура ф рагм ента Б Д « Заказы » (ф о рм ат Paradox) Та бл иц аCust («За ка з чики» ) 54
П оле Nc Name Address
Т ип AutoIncrement Alpha (симв ольны й) Alpha (симв ольны й)
Д лина О п исание К од заказчика(п ерв ичны й клю ч) 20 И мя заказчика(в торичны й клю ч) 20
А дресзаказчика
20
К од изделия (п ерв ичны й клю ч) И мя изделия (в торичны й клю ч)
Та бл иц аDetal («Д е та л и» ) Nd Name Price Rest
AutoIncrement Alpha (симв ольны й) Number Long Integer
Ц ена единицы тов ара(у.е.) О статок наскладе(ш тук)
Та бл иц аCD («Ж урна л з а каз ов» ) Num Nc Nd Kolvo Total Data
Н омер заказа(п ерв ичны й клю ч) К од заказчика К од изделия О бъ ем заказа(ш тук) О бъ ем заказа(у.е.) Д атазаказа
AutoIncrement Long Integer Long Integer Long Integer Number Date
П 2. Т и п ы п о л ей Paradox Т ип п оля Alpha
О бознач. A
Number
N
Money
$
Short LongInteger BCD Date
S L # D
Time Timestamp Memo
T @ M
Хранимы езначения Симв ольны езначения длиной до 255 симв олов . Ч исласп лаваю щ ей точкой в диап азоне–10307 … 10 308. Т очность 15 значащ их циф р А налогичен тип у Number, но число знаков п ослезап ятой – 2. В ы в одится знак $. Ц елы ечислав диап азоне–32767 … 32767. Ц елы ечислав диап азоне–2147 483648 … 2147483647. Ч ислов ы езначения п ов ы ш енной точности. Значения даты (в диап азонеот01.01.9999 до н.э. до 31.12.9999) . Значения в ремени. Значения даты ив ремени. Строков ы езначения длиной свы ш е255 симв олов . Д о 240 симв олов мож етхраниться в 55
Formatted Memo Graphics Fields
F
OLE
O
Logical AutoIncrement
L ±
Binary (Blob)
B
Bytes
Y
G
таблице, остальны еотдельно, в MB-ф айле. Т о ж е, но храниттексты , ф орматиров анны е ш риф том, цв етом ит.п . Граф ическиеизображ ения в ф орматеф айлов .bmp, .pcx, .tif, .gif, .eps. Хранятся в отдельны х ф айлах. И нф ормац ия об объ ектах OLE (Object Linking and Embedding). Л огическиезначения, ‘ True’, ‘ False’. Ц елы ечислатолько для чтения савтоматическим п риращ ением на1 п ридобавлениинов ой зап иси. И сп ользую тся в качеств еп ерв ичного клю ча. П роизв ольны едв оичны езначения, интерп ретируемы п рограммой п ользов ателя. Хранятся отдельно, в М В -ф айле. Т о ж е, но хранятся в местестаблиц ей.
П 3. Т и п ы п о л ей InterBase Т ип п оля SmallInt Integer
Размер, байт 2 4
Float
4
Double precision
8
Char(n) 0-32767 VarChar(n) 0-32767 Date
8
Blob
П ерем.
Хранимы езначения Ц елы ечислав диап азоне–32767 … 32767. Ц елы ечислав диап азоне–2147 483648 … 2147483647. Ч исласп лаваю щ ей точкой в диап азоне – 3,4 ⋅1038 … 3,4 ⋅10 38 до 7 значащ их циф р. Ч исласп лаваю щ ей точкой в диап азоне –1,7 1,7⋅ 10 308 точностью до 15 зна⋅10307 … чащ их циф р. Симв ольны й столбец длиной n симв олов . Симв ольны й столбец п еременной длины , содерж ащ ий до n симв олов . Д атав п ределах от01.01.0100 до 11.12.5491 и в ремя. Л ю бой тип дв оичны х данны х.
Ли тература 1. Ш умаков П .В ., Ф аронов В .В . Delphi 5. Руков одств о разработчикабаз данны х. – М .: Н олидж , 2000. – 640 с. 2. Д арахв елидзе П .Г., М арков Е .П . Delphi 4. - СП б.: BHV-Санкт-П етербург, 1999. - 816 с.
56
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 57
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
58
А в торы :
Рудалев В алерий Геннадьев ич, К ры ж анов ская Ю лианаА лександров на. Редактор: Т ихомиров аО .А .
59