М И Н И СТ Е РСТ В О О БРА ЗО В А Н И Я РО ССИ Й СК О Й Ф Е Д Е РА Ц И И В О РО Н Е Ж СК И Й ГО СУ Д А РСТ В Е Н Н Ы Й У...
35 downloads
309 Views
440KB 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. Ч ас ть II.
У чебно-метод и ческоепособи епо специ альности «При клад наяматемати ка и и нформати ка » (010200)
В оронеж 2003
2
У тв ерж д ено научно-метод и чески м сов етом протокол № факультета ПМ М .
6 от 26.05.03
Состав и тели : Руд алев В .Г., К ры ж анов скаяЮ .А .
Пособи е под готов лено на кафед ре техни ческой ки бернети ки и ав томати ческого регули ров ани я факультета При клад ной математи ки , и нформати ки и механи ки В оронеж ского госуд арств енного уни в ерси тета. Рекоменд уетсяд лястуд ентов 4 курса д /о и 4 курса в /о факультета ПМ М .
3
Д анное пособи е, яв ляю щ ееся прод олж ени ем части I пособи я «Раз работка при лож ени й баз д анны х в сред еDelphi» ккурсу «Баз ы д анны х и э кспертны е си стемы » , сод ерж и т св ед ени я по соз д ани ю при лож ени й в сред е «кли ент-сервер» . М атери ал основ ы в ается на Delphi в ерси и 6 и СУ БД Interbase 5.5-6.0. Д ля работы с пособи ем необход и мо з нани е основ ны х компонентов Delphi д ля работы с баз ами д анны х в рамках пособи я [3] и з накомств о сяз ы ком SQL. Раз д елы 1, 4, п. 2.1-2.3 напи саны В .Г.Руд алев ы м, п. 2.4-2.5, раз д ел 3 – Ю .А .К ры ж анов ской . В ведени е В торая часть пособи я цели ком посв ящ ена особенностям соз д ани я кли ентсерверны х при лож ени й на при мереСУ БД InterBase. InterBase и д еально под ход и тд лясоз д ани яи нформаци онны х си стем малы х и сред ни х пред при яти й . Ряд особенностей д елает InterBase, по мнени ю корпораци и Borland и ряд а нез ав и си мы х э кспертов , при год ной и д лякрупны х пред при яти й : • У ни в ерсальность. InterBase в ы пускается д ля раз ли чны х программноаппаратны х платформ: рабочи х групп с сервером под управ лени ем Novell NetWare и ли д оменов на баз е Windows 2000 Server, и нформаци онны х си стем на баз е серверов IBM, Hewlett-Packard, SUN, SGI и д р. InterBase под д ерж и в ает станд арт ANSI SQL 92, корректно работает с наци ональны ми (в том чи сле и с ки ри лли чески ми ) код и ров ками какв Windows, таки в Unix. • InterBase отли чаетсяв ы сокой скоростью и над еж ностью , основ анной на уни кальны х алгори тмах д оступа, простотой ад ми ни стри ров ани я и ни з ки ми з атратами на сопров ож д ени е. • Реально IB мож ет обслуж и в ать БД раз мером в 10-20 ги габай т, при раз мере од ного фай ла БД 2 ги габай та. М ногофай лов ая БД мож ет состоять и з 65535 фай лов , таки м образ ом теорети чески й пред ел д ля од ной баз ы д анны х состав ляет132 терабай та. Преи мущ еств а более «крупнокали берны х» си стем (Oracle, DB2) прояв ляю тсяв скорости работы сбольши ми масси в ами д анны х. В InterBase отсутств ую т собств енны е сред ств а соз д ани я при лож ени й и Caseпроекти ров ани я баз д анны х, что компенси руется многочи сленны ми программны ми прод уктами сторонни х фи рм. Благод аря уд ачному сочетани ю ни з ки х си стемны х требов ани й и в ы сокой над еж ности InterBase хорошо себя прояв и л на Бостонской би рж е, в проекте Magnavox в в ооруж енны х си лах СШ А , на М еж банков ской В алю тной Би рж е М М В Б, в Ц ентре У прав лени я Полетами , в о в нешнеторгов ой корпораци и А в и аэ кспорти д р.
4
1. Ос но вы раб о ты в InterBase 1.1. Interbase Interactive SQL У ти ли та Interbase Windows Interactive SQL (сокращ енно ISQL) – основ ная ути ли та в InterBase д ляработы сБД . Е ефункци и : • Соз д ани ебаз ы д анны х • Соз д ани етабли ц и метад анны х БД • Соед и нени есБД и в ы полнени еSQL-з апросов • О тображ ени еи нформаци и о БД . Зад ачи ад ми ни стри ров ани ярешаю тсяспомощ ью ути ли ты Server Manager. В целом функци ональны е в оз мож ности WISQL нев ели ки , но сущ еств ую т многочи сленны е ути ли ты сторонни х фи рм, э ти в оз мож ности расши ряю щ и е. WISQL успешно работает и с фай лами БД , соз д анны ми в InterBase старши х в ерси й . О снов ной и нструмент InterBase в ерси й 6-7 – ути ли та IBConsole. Е е характери з ую тсов ершенно нов ы й и нтерфей с, ми ни мум нов ы х в оз мож ностей и болееж естки ели ценз и онны еограни чени я. 1.1.1. С оздан и еб азы дан н ы х О брати тесь кад ми ни стратору баз ы д анны х, чтобы он з ареги стри ров ал В ас на сервере Interbase под и менем (напри мер, 4k4gr) и паролем. Е сли ад ми ни стратором яв ляетесь В ы , то сд елай те э то самостоятельно с помощ ью ути ли ты Interbase Server Manager (см. п. 2.1). Пред полож и м, что сервер InterBase з апущ ен на компью тере с сетев ы м и менем c1r214srv, там ж ев папке d:\ib\4k располож ены фай лы баз д анны х. Папка d:\ib д оступна польз ов ателям сети в в и д елоги ческого д и ска V: . Соз д ай те папку, напри мерV:\4k\folder. Запусти те ути ли ту ISQL и в ы бери те пунктменю File | Create DataBase. Е сли серв ерз апущ ен у В ас на локальной маши не (тогд а он буд ет в и д ен в в прав ой части панели з ад ачWindows), то в появ и в шемся в и д е з начка окне требуется помети ть “Local Engine” и указ ать путь кфай лу БД , д алее указ ать и мя ад ми ни стратора (SYSDBA) и пароль (masterkey - пароль ад ми ни стратора по умолчани ю ). Пароль ад ми ни стратора з атем мож но смени ть, а такж е д обав и ть нов ы х польз ов ателей с помощ ью ути ли ты InterBase Server Manager. При работе в Windows-сетях необход и мо в ы брать в поле Network Protocol протокол TCP/IP и ли NetBEUI, в Novell-сетях – Novell SPX.
5
О брати те в ни мани е, что раз решается указ ы в ать только локальны е пути (D:\ib\4k\folder\sklad.gdb), букв ы сетев ы х д и сков (напри мер, V:\4k\folder\sklad.gdb) и спольз ов ать нельз я. Е сли в се бы ло сд елано прав и льно, в папке D:\ib\4k\folder появ и тся фай л sklad.gdb, несод ерж ащ и й пока табли ц. Послеуспешного соз д ани яБД работу ути ли ты мож но з ав ерши ть. 1.1.2. С оздан и ет аб ли ц и други х об ъ ек т овInterBase Д ля соз д ани я табли ц, генераторов , три ггеров и д руги х метад анны х (как, в прочем, и д ляв ы полнени ялю бы х SQL-з апросов ) необход и мо соед и ни тьсяс уж есущ еств ую щ ей БД . Д ля э того послез апуска ISQL в ы бери тепунктменю "File|Connect to Database", появ и тся д и алогов ое окно д ля в в од а и мени польз ов ателя и пароля. Соз д ани е табли ц в ы полняется, как обы чно, с помощ ью оператора CREATE TABLE. В се соз д анны е объ екты буд ут храни тьсяв од ном фай ле*.gdb. В ISQL сущ еств ует д в а способа в ы полнени я операторов SQL: в первом способе текст оператора след уетнабрать в окне SQL Statement; в о в тором в ы брать пункт "File|Run an ISQL Script..." и указ ать и мя скри птов ого фай ла (скри пта). Скри пт (текстов ы й фай л с расши рени ем .sql.) сод ерж и т послед ов ательность SQL-операторов , пред наз наченны х д ля соз д ани я объ ектов БД . В скри птах такж е уд обно храни ть часто и спольз уемы е SQLоператоры д ля работы с БД . При мер скри пта д ля соз д ани я БД и в сех объ ектов , в ней сод ерж ащ и хся, при в ед ен в п. 4.2. Более уд обны м способом соз д ани я объ ектов БД д ля Interbase яв ляется и спольз ов ани еути ли ты Delphi SQL Explorer.
6
З а м еча н и е. В ли тературе рекоменд уется д ля корректной работы с русски ми букв ами настраи в ать InterBase специ альны м образ ом: указ ы в ать строку DEFAULT CHARACTER SET WIN1251 при соз д ани и БД и атри бут COLLATE PXW_CYRL при опред елени и полей , в ы би рать д рай в ер LANGUAGE DRIVER = Pdox ANSI Cyrillic при опред елени и али аса в BDE. О д нако реально в сеэ то необход и мо только д ляправ и льной работы функци и UPPER яз ы ка SQL. По мнени ю ав торов , гораз д о раци ональнее(и над еж нее!) не менять яз ы ков ы х настроек, а и спольз ов ать в место UPPER UDF-функци и и з мод уляCASEUDF, которы й мож но скачать по ад ресу http://www.ibase.ru/ download/caseudf.zip (см. такж еп.2.5). 1.1.3. Получен и еи н формаци и о ст рук т уреб азы дан н ы х В ISQL мож но получи ть полную и нформаци ю о структуре баз ы д анны х: спи соктабли ц и и х структуры , спи ски и тексттри ггеров , храни мы х процед ур и т.п. Э ту операци ю мож но в ы полни ть в пункте меню View и ли Extract. Н апри мер, д ля соз д анной в гл.4 баз ы д анны х Sklad, в ы берем "Extract|SQL Metadata for Table" д ля табли цы Cust. В окошке ISQL Output появ и тся текст оператора, которы й соз д ав ал д анную табли цу и оператора, опред ели в шего перв и чны й клю ч: /* Extract Table CUST */ /* Table: CUST, Owner: RUD */ CREATE TABLE CUST (NC SMALLINT NOT NULL, NAME VARCHAR(20), ADDRESS VARCHAR(20), CONSTRAINT CUSTPRIMARYKEY1 PRIMARY KEY (NC));
1.2. SQL Explorer При мени тельно к InterBase ути ли та SQL Explorer облад ает множ еств ом д ополни тельны х в оз мож ностей , прев ращ аю щ и х ее в уд обны й полнофункци ональны й и нструмент. 1.2.1. С оздан и еали аса. В ы бери те пункт меню New, в окне New Database Alias з ад ай те з начени е IntеrBase. Переи менуй теали ас, указ ав в место Interbase1 и мяIbSklad, в строке Server Name установ и те путь к баз е д анны х c1r214srv:d:\ib\4gr\folder\sklad.gdb, в строке User Name з ад ай те и мя польз ов ателя - 4k4gr. Путь мож но з ад ав ать ли бо в формате : (если и спольз уется протокол TCP/IP), ли бо \\\ (протокол NetBEUI). Е сли ранее в ы би ралось Local Engine (серв ер з апущ ен на э том ж е компью тере), то мож но неуказ ы в ать.
7
При мени теи з менени я, в ы брав пунктменю File – Apply. 1.2.2. С оеди н ен и ес Б Д Щ елкни те по з начку + напроти в али аса (раскрой те али ас). В д и алогов ом окнев в ед и теи мяпольз ов ателя, напри мер4k4gr и пароль. 1.2.3. С оздан и ет аб ли ц В ы бери те в контекстном меню д ля в етв и Tables пунктNew (соз д ани енов ой табли цы ). Появ и тсяв етка Table1, переи менуй тееена Detal. Д ля соз д ани я столбца раскрой те Detal , в ы бери те д ля в етки Columns в контексном меню пункт New (соз д ани е нов ого столбца), и з мени те наз в ани е столбца с Column1 на nd, установ и те его ти п integer, в строке Nulls установ и теNo (полеnd буд етперви чны м клю чом).
8
А налоги чно соз д ай тед руги естолбцы , з атем в ы д ели те Detal и File – Apply. Т абли ца соз д ана, и ееструктура буд ети меть в и д :
в ы полни те
1.2.4. С оздан и еперви чн ого к лю ча. В ы бери теPrimary Key - New, з атем Columns – New и под став ьтез начени еnd.
1.2.5. С оздан и еген ерат ора . В ы бери тев етв ь Generators - New, и з мени те и мяG1, под став ьтеначальное з начени е0.
9
Замети м, что д ля каж д ого д ей ств и я мож но просмотреть соотв етств ую щ и й SQL-операторна з аклад ке Text. Д ей ств и ев ступаетв си лу послепри менени я (команд а меню Apply). 1.2.6. С оздан и ет ри ггерадля авт омат и ческ ого заполн ен и я перви чн ого к лю чевого поля при доб авлен и и н овой запи си . В в етв и Detal в ы бери теTriggers –New. И з мени теи мятри ггера – By_nd, на в клад кеDefinition укаж и тев полеType з начени еBefore insert, а на в клад ке Text меж д у Begin и End в в ед и тестроку new.nd=gen_id(g1,1);
А налоги чны е д ей ств и я в ы полняю тся д ля каж д ой соз д ав аемой табли цы . При необход и мости мож но соз д ать д ополни тельны е три ггеры , напри мер, д ля каскад ны х в оз д ей ств и й .
10
Х рани мы е процед уры соз д аю тся в в етв и Procedures али аса, метод и ка з д есь такаяж е, какпри соз д ани и три ггеров . 1.3. П ерех о д к InterBase Н а практи кечасто бы в ает, что кмоменту перев од а и нформаци онной си стемы пред при яти я на архи тектуру кли ент-сервер необход и мы е табли цы , з аполненны еи нформаци ей , уж есущ еств ую т, но в формателокальны х СУ БД *.dbf, Paradox, Access. К акпреобраз ов ать и х кформату InterBase, сохрани в , по в оз мож ности , д анны е? В о многи х (но не в о в сех) случаях з д есь мож ет помочь компонентTBatchMove, пред наз наченны й д лякопи ров ани яз апи сей и з од ного набора д анны х в д ругой . При копи ров ани и компонент преобраз ует форматы , ав томати чески сохраняя и мена столбцов , ти пы и сод ерж и мое д анны х. О снов ны есв ой ств а TBatchMove: Source – и мя набора д анны х (табли цы и ли з апрос), откуд а копи рую тся д анны е, Destination – и мяН Д , куд а копи рую тсяд анны е, Mode - ти п копи ров ани я. Е сли з ад ать ти п batCopy, то табли ца д ля Н Д Destination буд ет соз д ана з анов о в соотв етств и и со структурой табли цы Н Д Source и з аполнена еед анны ми . К опи ров ани епрои сход и тпри в ы полнени и метод а Execute. Д ругой в ари анти спольз ов ани е ути ли ты datapump.exe (в ы полненной на основ е компонента TBatchMove), наход ящ ей сяв папкеBDE. След ую щ и й э тап преобраз ов ани я табли ц – соз д ани е перви чны х клю чей , генераторов , три ггеров и д р. специ фи чны х д ля InterBase объ ектов . При э том необход и мо пересмотреть структуру при лож ени я, раз д ели в его на кли ентскую и серверную части сучетом необход и мы х транз акци й . 2. Ос о б енно с ти кл и ент-с ерверны х п ри л о ж ени й 2.1. О бщ и е при н ци пы 2.1.1. Проек т и рован и еБ Д Н еслед уетсли шком ув лекатьсянормали з аци ей баз ы д анны х. В о в сем нуж на мера. Н ормали з аци я способств ует целостности БД , и склю чает и з табли ц и з бы точную и нформаци ю и сокращ ает раз мер БД . Побочны е э ффекты – з амед лени е работы при д оступе к множ еств у небольши х табли ц и нарушени е в оспри яти я пред метной области раз работчи ком – в кли ентсерверной сред емогутоказ атьсяболеез начи мы ми . 2.1.2. Проек т и рован и е при лож ен и й. Н астоятельно рекоменд ую тся:
11
• Перенос основ ны х в ы чи слени й в серверную часть при лож ени я в соотв етств и и со след ую щ ей табли цей . Д ей с тви е И н с трум ен т Заполнени еуни кальны х клю чей
Генераторы
Под д ерж ка ссы лочной целостности
Т ри ггеры
В ед ени естати сти ки
Т ри ггеры
Би з нес-прав и ла, св яз анны еси з менени ем нескольки х табли ц в рамках од ной транз акци и О грани чени яна з начени яв в од и мы х д анны х
Т ри ггеры
Запросы , в клю чаю щ и е слож ны еалгори тмы с ци клами и в етв лени ем Ч асто и спольз уемы ев SQL-операторах функци и И нтерфей сспольз ов ателем, форми ров ани е з апросов и и нтерпретаци ярез ультатов
Пред лож ени е CHECK при соз д ани и табли ц БД Х рани мы епроцед уры UDF, в ы полняю щ и есяна сервере К ли ентскоепри лож ени е
• И спольз ов ани е компонента TDataBase. К омпонентустанав ли в аетод но общ ее соед и нени е с сервером д ля в сех компонентов DataSet, в проти в ном случае каж д ы й набор д анны х соз д ает отд ельное соед и нени е, что сни ж аетэ ффекти в ность д оступа. • И спольз ов ани е TQuery в место TTable. Пред лож ени е WHERE пред почти тельнее, чем фи льтр, таккакв ы полняетсяна сервере, а нена кли ентской маши не. 2.2. Тра н за кци и 2.2.1. Управлен и ет ран зак ци ями Т ранз акци я – э то группа операци й , рассматри в аемая как ед и ное целое. В случае успеха транз акци я под тв ерж д ается, в случае неуд ачи – цели ком отменяется. При каж д ом в ы полнени и оператора SQL порож д ается транз акци я. Т акж е неяв но транз акци я порож д ается при в ы з ов е нав и гаци онны х метод ов ред акти ров ани я наборов д анны х (Insert, Edit и т.п.) и при ред акти ров ани и с помощ ью TDBGrid. Зав ершается неяв ная транз акци яв ы з ов ом метод ов Post и ли Cancel. Пред почти тельны м яв ляется яв ное управ лени е транз акци ями . Д ля э того и спольз ую тсяли бо операторы яз ы ка SQL (SET TRANSACTION, COMMIT, ROLLBACK), ли бо соотв етств ую щ и е и м св ой ств а и метод ы компонента TDataBase [2] . Рассмотри м послед ни е более под робно. В ы з ов метод а StartTransaction оз начает, что в се послед ую щ и е операторы , и з меняю щ и е д анны е, относятся к текущ ей акти в ной транз акци и . А кти в ной наз ы в ается нез ав ершеннаятранз акци я. Зав ершаетсятранз акци яв ы з ов ом метод а Commit – под тв ерж д ени е транз акци и (и з менени я окончательно фи кси рую тся в БД ) и ли RollBack – откат транз акци и (д анны е оказ ы в аю тся в состояни и , пред шеств ов ав шем началу транз акци и ). Св ой ств о IsTransaction ти па Boolean поз в оляет пров ери ть, и мею тся ли в настоящ и й момент акти в ны е
12
транз акци и (в д анном при лож ени и !). Е сли есть, то начи нать транз акци ю (метод StartTransaction) нельз я. При органи з аци и транз акци и рекоменд уется и спольз ов ать механи з м и склю чи тельны х си туаци й try … except. В при в од и мом ни ж е при мере транз акци ей (нераз ры в ной операци ей ) яв ляется отпусктов ара со склад а, сопров ож д аю щ и й ся уменьшени ем остатка на склад е (табли ца Detal) и д обав лени ем з аказ а (табли ца CD): if Otpusk ;
Замечани е. Н ельз я соз д ать просмотр, которы й баз и руется на рез ультатах работы храни мой процед уры . Просмотрмож ет бы ть состав лен и з лю бого под множ еств а столбцов и строк од ной табли цы , форми руемого оператором SELECT. Н апри мер, табли ца job и з employee.gdb (табли ца сотруд ни ков и з д емонстраци онной БД , постав ляемой в месте с InterBase) и меет 8 столбцов job_code, job_grade, job_country, job_title, min_salary, max_salary, job_requirement, language_req. Просмотр отображ ает грани чны е з начени я з арплаты д лякаж д ой работы (в сестроки , но под множ еств о столбцов ) CREATE VIEW JOB_SALARY_RANGES AS SELECT JOB_CODE, MIN_SALARY, MAX_SALARY FROM JOB;
О снов ны епреи мущ еств а и спольз ов ани япросмотров : 1. У прощ ени е д оступа к д анны м. Просмотры объ ед и няю т д анны е и з нескольки х табли ц и поз в оляю т в ы полнять часто и спольз уемы е операторы од и н раз . 2. У д обны й д ля польз ов ателей способ д оступа к д анны м. Просмотры поз в оляю т «под гонять» БД к нуж д ам раз ли чны х польз ов ателей , которы м гораз д о уд обней работать только с той и нформаци ей , которая и меет отношени е только к ни м, не отв лекаясь на и нформаци ю д руги х польз ов ателей . 3. Н ез ав и си мость д анны х. Просмотры поз в оляю т з ащ и ти ть польз ов ателей отраз ли чны х э ффектов , в ы з в анны х и з менени ями в структуреБД . Н апри мер, если ад ми ни страторпри нял решени ео раз д елени и од ной табли цы на д в е, то польз ов атель э того мож ет и не з амети ть, если работает с просмотром, опред еленны м нуж ны м образ ом. 4. Без опасность д анны х. Просмотры обеспечи в аю т без опасность, раз д еляя процесс д оступа к «чув ств и тельны м» и «без раз ли чны м» частям БД .
17
Н апри мер, мож но просмотреть спи сокв аканси й , но без и нформаци и о пред лагаемой з арплатеи наз в ани и фи рмы . Просмотры могутбы ть обнов ляемы ми , но могути нед опускать в несени я в ни х и з менени й (когд а и з менени е просмотра ни как не отраж ается на табли цах, и з которы х просмотрсоз д ан). О бнов ляемость з ав и си тотхарактера просмотра. В целом з д есь требов ани ятаки еж е, каки д ляред акти ров ани яН Д TQuery (см. [1], [3, стр.39]). Просмотры мож но и спольз ов ать в при лож ени ях на Delphi нарав не с обы чны ми табли цы , указ ы в ая и мя просмотра в св ой ств е TableName и ли в оператореSQL, в строенном в TQuery. 2.5. Фун кци и , о пределяем ы е по льзо ва телям и Поми мо в строенны х SQL-функци й , таки х, какmin(), max(), avg(), InterBase под д ерж и в ает би бли отеки в нешни х функци й UDF (функци й , опред еляемы х польз ов ателем). Пред став ляя собой д и нами чески е би бли отеки (DDL в случае Windows), компонуемы е к яд ру сервера InterBase, UDF обеспечи в аю т макси мально в ы сокую прои з в од и тельность. UDF мож но соз д ав ать с помощ ью лю бы х компи ляторов (С, Pascal, Fortran и т.п.). Д ля э того необход и мо напи сать необход и мы е функци и , откомпи ли ров ать и х, в клю чи ть в состав DLL и объ яв и ть на сервере InterBase. UDF мож ет при нять д о 10 параметров , соотв етств ую щ и х лю бому ти пу д анны х InterBase, з а и склю чени ем масси в ов . В се в ход ны е параметры перед аю тсяпо ссы лке. В оз в ращ аемы е з начени я перед аю тся ли бо по ссы лке (по умолчани ю ), ли бо по з начени ю . В послед нем случае необход и мо учи ты в ать соотв етств и е ти пов : Тип Interbase
Тип Object Pascal
Integer Double precision Cstring Date
Integer Double Pchar Type IBGateTime=record Days: integer; Msec: cardinal; End;
Ч тобы перед ать чи слов ое з начени е по з начени ю , след ует при объ яв лени и UDF в БД послев ы ход ного параметра указ ать служ ебноеслов о BY VALUE. Послетого, какфункци и откомпи ли ров аны в би бли отеку, и х нуж но объ яв и ть д ля в сех БД , в которы х плани руется ее и спольз ов ани е. К аж д ую функци ю требуется объ яв лять отд ельно, но только од и н раз д ля каж д ой БД . О бъ яв лени ефункци и и нформи руетБД о еерасполож ени и и св ой ств ах. Си нтакси собъ яв лени я: DECLARE EXTERNAL FUNCTION name [datatype | CSTRING(длина) [,datatype | CSTRING(длина)…]]
18 RETURNS {datatype [BY VALUE] | CSTRING(длина)} [FREE_IT] ENTRY_POINT ‘entryname’ MODULE_NAME ‘modulename’;
Аргум ен т
О пи с а н и е И мяUDF д ляи спольз ов ани яв SQL-операторах; мож етотли чатьсяоти мени , указ анного после ENRT_POINT Datatype Т и п в ход ного и ли в оз в ращ аемого параметра RETURNS О пред еляетв оз в ращ аемоефункци ей з начени е BY VALUE О пред еляет, что в оз в ращ аемы й рез ультатд олж ен перед ав атьсяпо з начени ю CSTRING(длина) У каз ы в аетсяд ляпар аметров строков ого ти па FREE_IT Послез ав ершени яработы UDF осв обож д аетпамять, в ы д еленную под в оз в ращ аемоепо ссы лкез начени е ‘entryname’ Строка в кав ы чках, опред еляю щ аяи мяфункци и в и сход ном код екаконо храни тсяв би бли отеке ‘modulename’ О пи сани ефай ла, и д енти фи ци рую щ ееби бли отеку, в которой храни тсяUDF Name
При опред елени и и мени мод уля (би бли отеки ) в операторе DECLARE EXTERNAL FUNCTION необход и мо указ ы в ать располож ени е UDF, и спольз уя абсолю тны й путь, относи тельны й путь и ли только и мя би бли отеки . Первы й в ари ант, без услов но, яв ляется неги бки м. О тноси тельны е пути могут бы ть неправ и льно и столков аны О С. В том ж е случае, если и спольз уется только и мя мод уля, О С в сегд а буд ет и скать в под д и ректори и lib установ очной д и ректори и InterBase (напри мер, C:\Program Files\InterBase\lib) и в си стемны х д и ректори ях Windows. Н ачи наясInterBase 6, UDF д олж ны храни тьсятолько в д и ректори и ..\InterBase\udf ! К огд а UDF соз д ана и объ яв лена в БД , ее мож но и спольз ов ать в операторах SQL, в храни мы х процед урах и три ггерах. Д ляэ того след уетв став и ть ееи мя в соотв етств ую щ ее место SQL-оператора, з аклю чи в в ход ны е параметры в круглы ескобки . InterBase пред остав ляетпольз ов ателям некотороеколи честв о наи болеечасто и спольз уемы х функци й в в и д е UDF-би бли отеки ib_udf.dll (папка ..\InterBase\udf ). Э ти UDF напи саны на яз ы ке С. И сход ны етексты и д руги е фай лы , необход и мы е д ля перекомпи ляци и би бли отеки , располож ены в д и ректори и examples. Упра жн ен и е. Под клю чи те би бли отеку ib_udf.dll и пров ерьте ее работоспособность. 3. Си с тема б езо п ас но с ти InterBase 3.1. Ба за да н н ы х безо па с н о с ти Без опасность InterBase строи тся на основ е специ альной баз ы д анны х (БД без опасности ) д ля каж д ого сервера, сод ерж ащ ей а) спи сокпольз ов ателей ,
19
и мею щ и х раз решени е на установ лени е соед и нени я с БД и серви сами InterBase на э том сервере, б) пароли польз ов ателей в з аши фров анном в и д е. Э та баз а д анны х храни тся в фай ле isc4.gdb в папке ..\Interbase. След ую щ аятабли ца опи сы в аетсод ерж и моеБД без опасности : Столбец О пи с а н и е User name И мя, в в од и моепольз ов ателем при под клю чени и Password Пароль UID Ц елое чи сло, опред еляю щ ее и д енти фи катор польз ов ателя GID Ц елоечи сло, опред еляю щ ееи д енти фи каторгруппы Full name Реальноеи мяпольз ов ателя К огд а польз ов атель пы тается установ и ть соед и нени е с БД на сервере, прои з в од и тся пров ерка соотв етств и я и мени польз ов ателя и его пароля и з з апи си в БД без опасности (при перед аче по сети пароли ши фрую тся). В случаесоотв етств и ясоед и нени еуспешно устанав ли в ается. Д ля управ лени я польз ов ателями (отображ ени я, и з менени я, д обав лени я и ли уд алени я и нформаци и и з баз ы без опасности ) служ ат ути ли та команд ной строки gsec и ли более уд обная Windows-программа IB Server Manager, которую рассмотри м болеепод робно. 3.2. П о льзо ва тели и па ро ли Д ля просмотра и и з менени я коли честв а польз ов ателей и и х при в и леги й след ует в ы брать пункт Tasks|User Security в IB Server Manager, чтобы откры ть InterBase Security dialog box и в ы полни ть таки еопераци и , как: • Просмотреть спи сокав тори з ов анны х польз ов ателей . • Д обав и ть польз ов ателя(пунктAdd User). • И з мени ть польз ов ательски й пароль и д ополни тельную и нформаци ю о польз ов ателе(пунктModify User). И мяпольз ов ателяи з мени ть нельз я: д ля э того нуж но сначала польз ов ателя уд али ть, а з атем д обав и ть нов ого польз ов ателя. • У д али ть польз ов ателя. Д ля э того след ует в ы брать пункт Delete, а з атем под тв ерд и ть уд алени ев д и алогов ом окне. Замечани е. Т олько польз ов атель SYSDBA и меет прав а на д обав лени е, мод и фи каци ю и уд алени епольз ов ателей . К аж д ы й серверInterBase и меет польз ов ателя SYSDBA с паролем masterkey. Сначала э то ед и нств енны й ав тори з ов анны й польз ов атель на сервере. И он д олж ен ав тори з ов ать (з ареги стри ров ать) д руги х польз ов ателей . SYSDBA – специ альны й польз ов атель, которы й мож етобой ти станд артную SQL-з ащ и ту и в ы полни ть некоторы еспеци альны еопераци и , напри мер, shutdown д ляБД . В аж но: • Рекоменд уется какмож но бы стрее и з мени ть пароль д ля польз ов ателя SYSDBA, в проти в ном случае без опасность мож ет бы ть нарушена, так
20
как неав тори з ов анны й польз ов атель мож ет получи ть д оступ кБД на сервере (польз ов атель SYSDBA и меет д оступ ко в сем объ ектам). • Имен апользоват елей могутбы ть д ли ной д о 31 си мв ола, неяв ляю тся чув ств и тельны ми к смене реги стра, но не д олж ны сод ерж ать пробелов . • П аро ли чу вст вит ель н ы к регист ру бу кв. З н а чен и е и м еют то лько первы е 8 с и м во ло в па ро ля, но д ли на пароля мож ет д ости гать 32 си мв олов . О бы чно д лякаж д ого челов ека, работаю щ его сInterBase, соз д аетсяотд ельны й польз ов атель, од нако в оз мож ны и д руги ев ари анты : • Соз д ани е од ного польз ов ателя д ля группы ли ц в целях упрощ ени я ад ми ни стри ров ани я паролей . Н апри мер, польз ов атель FINANCE мож ет уд ов летв орять з апросы на д оступ лю бого и каж д ого и з персонала фи нансов ого отд ела. Группа сотруд ни ков д олж на з апомни ть только од и н общ и й пароль. • Соз д ани еод ного польз ов ателя д ля группы ли ц, и мею щ и х од и наков ы е при в и леги и д ляд оступа кБД . След ую щ и й SQL-оператор соз д ает БД с указ ани ем и мени польз ов ателя и пароля: CREATE DATABASE 'c1r214srv:d:\ib\folder\ibSklad.gdb' USER "SVETA" PASSWORD "privet"
О ператорбуд етуспешны м, если польз ов атель SVETA з ареги стри ров ан в баз е д анны х без опасности на серв ереc1r214srv спаролем privet, послечего SVETA станетв лад ельцем (owner) БД IB_Sklad.gdb. 3.3. Гра н ты и при ви леги и Под клю чени е к БД не оз начает ав томати ческую в оз мож ность ред акти ров ани я и д аж е отображ ени я д анны х. При в и леги и д олж ны бы ть з ад аны яв ны м образ ом; польз ов атели не смогут обращ аться ни к од ному объ екту БД , пока не получат соотв етств ую щ и е при в и леги и . При в и леги и , д анны е специ альному «польз ов ателю » PUBLIC, при мени мы д ля в сех польз ов ателей . В се табли цы и храни мы е процед уры з ащ и щ аю тся отнесанкци они ров анного д оступа при и х соз д ани и . Сначала только соз д атель табли цы (owner) и меет д оступ кд анны м, но он мож етназ начать при в и леги и д руги м польз ов ателям (пред остав лять грант). Grant (англ.) – д ар, пред остав лени е, субси д и я. Защ и та от несанкци они ров анного д оступа осущ еств ляется с помощ ью табли цы при в и леги й д оступа - спи ска операци й , которы е раз решены польз ов ателям БД . О д нои менны й SQL-оператор GRANT наз начает при в и леги и д оступа раз ли чны м субъ ектам без опасности - конкретны м польз ов ателям, ролям (см. п. 3.4), а такж е храни мы м процед урам и три ггерам. О бъ ектами без опасности
21
(охраняемы ми объ ектам), ккоторы м при меняется GRANT, могут бы ть табли цы цели ком, столбцы табли ц, три ггеры , храни мы е процед уры , просмотры . SQL-операторREVOKE уд аляетранеепред остав ленны епри в и леги и д оступа. Си нтакси соператора GRANT (под робнее см. в раз д еле Language Reference техни ческой д окументаци и , постав ляемой сInterBase): GRANT {<privileges> ON [Table] {tablename | viewname} TO { | <userlist> | GROUP Unix_group} | TO {PUBLIC | role_grantee_list}}; Здесь: <privileges> = {ALL [PRIVILEGES] | <privilege_list>} <privilege_list>={ SELECT | DELETE | INSERT | UPDATE [(col [, col …]) ] | REFERENCES [(col [, col ...])] [, <privilege_list> ...]}} = { PROCEDURE procname | TRIGGER trigname | VIEW viewname | PUBLIC [, …]} <userlist> ={ [USER] username | rolename | Unix_user} [, <userlist> ...] [WITH GRANT OPTION] = rolename [, rolename…] = [USER] username [, [USER] username …] [WITH ADMIN OPTION]
П ри ви леги я
Ра зреш а ет по льзо ва телям …
SELECT DELETE INSERT UPDATE EXECUTE
Просматри в ать строки в табли цеи ли просмотре У д алять строки В став лять строки И з менять в сеи ли указ анны естолбцы В ы полнять храни мы епроцед уры
REFERENCES
Соз д ав ать в нешни й клю ч, которы й ссы лается на указ анны й перви чны й клю чтабли цы , д аж е если польз ов атель неяв ляетсяеев лад ельцем О бъ ед и няет SELECT, DELETE, INSERT, UPDATE, и REFERENCES
ALL
При меры : GRANT ALL ON detal TO Vasya
- наз начени е д оступа д лятабли цы Detal польз ов ателю Vasya. GRANT UPDATE (ost) ON detal TO Vasya
- наз начени е при в и леги и на и з менени естолбца Ost.
22
3.4. Группы по льзо ва телей При в и леги и мож но наз начать группам польз ов ателей через механи з м ролей. Ч тобы соз д ать и и спольз ов ать роль, необход и мо в ы полни ть четы ре шага. Сначала роль объ яв ляетсяспомощ ью оператора CREATE ROLE .
Затем с помощ ью оператора GRANT наз начаю тся при в и леги и роли д ля указ анны х табли ц и столбцов . Н а третьем шаге, снов а с помощ ью оператора GRANT, роли наз начаю тся польз ов ателям. Н аконец, роль д олж на бы ть указ ана при соед и нени и с баз ой д анны х, напри мер, в д и алогов ом окне соед и нени яWISQL. При мер: CREATE ROLE admins // Соз д ани ероли admins GRANT ALL,EXECUTE ON cust TO admins //При в и леги и на табли цу GRANT admins TO sveta, vasya // Т еперь оба - ад ми ни страторы CONNECT 'c1r214srv:d:\ib\folder\ibSklad.gdb' USER 'SVETA' PASSWORD 'privet' ROLE 'admins'
3.5. InterBase Server Manager У ти ли та пред наз начена д ля ад ми ни стри ров ани я локальны х и распред еленны х БД и серверов InterBase. С помощ ью э той ути ли ты мож но в ы полни ть след ую щ и еопераци и : • опр ед ели ть и ли и з мени ть и мена польз ов ателей и и х пароли ; • пр ои з в ести рез ервноекопи ров ани еи в осстанов лени еБД ; • уд али ть "мусор " и з баз ы ; • з ав ер ши ть/отмени ть «з ав и сши е» транз акци и ; • пр ои з в ести пров ерку баз ы на нали чи еоши бок. Рассмотри м некоторы ев оз мож ности болеепод робно. 3.5.1. Резервн оек опи рован и еб азы дан н ы х При рез ервном копи ров ани и , пров ед енном спомощ ью Server Manager, кроме сохранени я баз ы д анны х в архи в е, в ы полняю тся д ополни тельны е операци и . При э том: • У в ели ч и в ается бы строд ей ств и е баз ы . В процессе копи ров ани я/в осстанов лени япрои сход и т"сбормусора" - в баз ед анны х осв обож д ается место, з анятое уд аленны ми з апи сями . Т ем самы м уменьшаетсяфи з и чески й раз мербаз ы . • Рез ер в ное копи ров ани е мож ет в ы полняться на работаю щ ей баз е, д ля э того не над о отклю чать польз ов ателей от нее. При э том и з менени я, в носи мы е в баз у д анны х после начала процесса копи ров ани я, не з апи сы в аю тсяв рез ерв ны й фай л. • Д анны е мож но пер енести на д ругую операци онную си стему. Раз ли чны е компью теры и мею т собств енны е форматы фай лов баз д анны х и э ти фай лы нельз япросто перенести на д ругую операци онную
23
си стему. Д ля в ы полнени я э той операци и рез ервную копи ю баз ы в т ран спорт н ом формате.
нуж но
соз д ать
3.5.2. Удален и е« мусора» Borland InterBase - СУ БД с многов ерси онностью д анны х. К огд а з апи сь и з меняется, на страни цу д анны х помещ ается еекопи яснов ы ми з начени ями , од нако старая з апи сь остается. Старое з начени е наз ы в ается "Back Version" (рез ерв ная в ерси я) и яв ляется "и стори ей отката" - если транз акци я, и з мени в шая з апи сь, отмени тся, то старая в ерси я з апи си останется на св оем месте. К роме э того, стары е в ерси и обеспечи в аю т уров ень и з оляци и Repeatable Read д ля д ли нны х транз акци й , которы м на в се в ремя д ей ств и я нуж но в и д еть д анны е, сущ еств ов ав ши ена моментначала такой транз акци и . К огд а и з меняю щ аяз апи си транз акци япод тв ерж д аетсяи в секонкури рую щ и е транз акци и такж е з ав ершаю тся, старая в ерси я перестает бы ть необход и мой . В часто и з меняемой баз ед анны х стары ез апи си могутз ани мать з начи тельное д и сков ое пространств о и ухуд шать прои з в од и тельность БД . Т аки е з апи си яв ляю тся «мусором» , которы й необход и мо в ы чи щ ать, д ля чего в ы бери те Maintenance | Database Sweep. Э то при в ед ет кнемед ленной очи стке БД от «мусора» с осв обож д ени ем места, з анятого отмененны ми и неактуальны ми з апи сями . Сбор «мусора» мож ет прои з в од и ться ав томати чески через и нтервал, опред еленны й в д и алогеDatabase Properties. 4. При мерп ро грамми ро вани я Н апи шем программу в ед ени я БД «Склад » , специ али з и ров анны х компонентах Interbase Express.
основ анную
на
Полностью готов ы й при мер наход и тся на сетев ом ресурсе \\c1r214srv\method\BD. А налоги чны е, но более раз в ернуты е полнофункци ональны е д емонстраци онны е при меры мож но най ти в папке ..\Borland\Delphi6\Demos\Db\IBMastApp в установ очной д и ректори и Delphi (соотв етств ую щ и й фай л БД ..\Borland\Borland Shared\Data\mastsql.gdb) и ли в кни ге[2]. 4.1. Серверн а я ча с ть Скри птопред елени яд анны х: CREATE DATABASE "d:\db\ib_sklad2.gdb" USER "SYSDBA" PASSWORD "masterkey";
24 SET TERM ^; CREATE TABLE CUST ( NC SMALLINT NOT NULL PRIMARY KEY, NAME VARCHAR(20), ADDRESS VARCHAR(20) ) ^ CREATE TABLE DETAL ( ND SMALLINT NOT NULL PRIMARY KEY, NAME VARCHAR(10) NOT NULL, PRICE DOUBLE PRECISION CHECK (PRICE > 0), OST INTEGER CHECK (OST >= 0) ) ^ CREATE TABLE CD ( NUM SMALLINT NOT NULL PRIMARY KEY, NC SMALLINT NOT NULL, ND SMALLINT NOT NULL, KOL INTEGER NOT NULL CHECK (KOL > 0), TOTAL DOUBLE PRECISION NOT NULL, DATA DATE ) ^ CREATE TABLE STAT ( DATA TIMESTAMP NOT NULL, ND SMALLINT NOT NULL, KOL INTEGER NOT NULL ) ^ /* Генераторы */ CREATE GENERATOR G1 ^ SET GENERATOR G1 TO 1 ^ CREATE GENERATOR G2 ^ SET GENERATOR G2 TO 1 ^ CREATE GENERATOR G3 ^ SET GENERATOR G3 TO 1 ^ /* Хранимые процедуры */ CREATE PROCEDURE GET_NUM RETURNS ( NR INTEGER ) AS BEGIN NR=gen_id(g1,1); END ^ /* Триггеры */ CREATE TRIGGER CDTRIGGER1 FOR CD BEFORE INSERT POSITION 0 AS BEGIN new.num=gen_id(g2,1); END ^ CREATE TRIGGER BY_ND FOR DETAL BEFORE INSERT POSITION 0 AS BEGIN detal.nd=gen_id(g3,1); END ^ /* Каскадное удаление */ CREATE TRIGGER DETALTRIGGER1 FOR DETAL AFTER DELETE POSITION 0 AS BEGIN
25 delete from cd where END ^
cd.nd=detal.nd;
/* Сбор статистики */ CREATE TRIGGER T1 FOR CD AFTER INSERT POSITION 0 AS declare variable cnt integer; declare variable old_kol integer; BEGIN SELECT count(*) FROM stat WHERE (data=New.data) and (nd=new.nd) INTO :cnt; IF (:cnt = 0) THEN BEGIN INSERT INTO STAT (data, nd, kol) VALUES (new.data, new.nd, new.kol); END ELSE BEGIN UPDATE stat SET kol=kol + new.kol WHERE (data= new.data) AND (nd = new.nd); END END ^ COMMIT ^ EXIT ^
З а да н и е. Перепи ши те операци ю отпуска тов ара с помощ ью три ггера, ав томати чески уменьшаю щ его остаток тов ара на склад е после в став ки нов ого з аказ а. 4.2. К ли ен тс ка я ча с ть М о дульда н н ы х :
У каз ани я. • Н астрой ку компонентов в ы полни те в соотв етств и и с при в од и мы ми ни ж е фай лами опи сани я форм (.dfm). В ни х указ ы в аю тся только те з начени я св ой ств компонентов , которы е необход и мы д ля работоспособности программы . Д руги е св ой ств а (раз мер, цв ет и пр.) з ад ав ай те в и нспекторе объ ектов по собств енному усмотрени ю .
26 • О бъ екты dsCust, dsCD, dsDetal св яж и те с объ ектами idCust, idCD, idDetal, соотв етств енно. • Н астр ой те компоненты соед и нени я и управ лени я транз акци ями . При настрой кеidbSklad в оспольз уй тесь ред актором DataBase Editor и укаж и те
в се параметры соед и нени я, в клю чая и мя польз ов ателя и пароль, з апрос которы х з аблоки руй те. object idbSklad: TIBDatabase DatabaseName = 'D:\DB\IB_SKLAD2.GDB' LoginPrompt = False DefaultTransaction = itaSklad end object itaSklad: TIBTransaction Active = False End • В се остальны е Н Д idCust … iqTemp св яж и те с пр ед ы д ущ и ми д в умя
компонентами , установ и в св ой ств а Database = idbSklad Transaction = itaSklad • Н астр ой текомпоненты д ляв став ки нов ы х з апи сей в табли цу Detal: object iqInsert: TIBQuery Database = idbSklad Transaction = itaSklad end object iqTemp: TIBQuery Database = idbSklad Transaction = itaSklad End • Д ля объ ектов TIBDataSet укаж и те в св ой ств ах SelectSQL з апросы в и д а select * from . Соз д ай те в соотв етств и и с ли сти нгом ти пи з и ров анны е поля (idCustNC: TSmallintField и остальны е),
и спольз уяFields Editor. • И спольз уяDataSet Editor, опред ели тед ей ств и япо ред акти ров ани ю Н Д (св ой ств а DeleteSQL, InsertSQL, ModifySQL з аполнятсяав томати чески ). • Заполни тесв ой ств о GeneratorField, указ ав необход и мы й генер атори собы ти еOn New Record. object idCust: TIBDataSet CachedUpdates = True DeleteSQL.Strings = ( 'delete from CUST where NC = :OLD_NC') InsertSQL.Strings = ('insert into CUST (NC, NAME, ADDRESS) values (:NC, :NAME, :ADDRESS)') SelectSQL.Strings = ('select * from CUST' ) ModifySQL.Strings = ('update CUST set NC = :NC, NAME = :NAME, ADDRESS = :ADDRESS where NC = :OLD_NC') GeneratorField.Field = 'NC' GeneratorField.Generator = 'G1' object idCustNC: TSmallintField FieldName = 'NC' Required = True
27 end object idCustNAME: TIBStringField FieldName = 'NAME' end object idCustADDRESS: TIBStringField FieldName = 'ADDRESS' end end object idCD: TIBDataSet CachedUpdates = False DeleteSQL.Strings = ( 'delete from CD where NUM = :OLD_NUM') InsertSQL.Strings = ( 'insert into CD (NUM, NC, ND, KOL, TOTAL, DATA) values (:NUM, :NC, :ND, :KOL, :TOTAL, :DATA)') SelectSQL.Strings = ( 'select * from CD' ) ModifySQL.Strings = ('update CD set NUM = :NUM, NC = :NC, ND = :ND, KOL = :KOL, TOTAL = :TOTAL, DATA = :DATA where NUM = :OLD_NUM') GeneratorField.Field = 'NUM' GeneratorField.Generator = 'G2' object idCDNUM: TSmallintField FieldName = 'NUM' Required = True end object idCDNC: TSmallintField FieldName = 'NC' end object idCDND: TSmallintField FieldName = 'ND' end object idCDKOL: TIntegerField FieldName = 'KOL' end object idCDTOTAL: TfloatField FieldName = 'TOTAL' end object idCDDATA: TDateTimeField FieldName = 'DATA' end end object idDetal: TIBDataSet Database = idbSklad Transaction = itaSklad CachedUpdates = False DeleteSQL.Strings = ( 'delete from DETAL where ND = :OLD_ND') InsertSQL.Strings = ('insert into DETAL (ND, NAME, PRICE, OST) values (:ND, :NAME, :PRICE, :OST)' ) SelectSQL.Strings = ('select * from DETAL') ModifySQL.Strings = ( 'update DETAL set ND = :ND, NAME = :NAME, PRICE = :PRICE, OST = :OST where ND = :OLD_ND')
28 GeneratorField.Field = 'ND' GeneratorField.Generator = 'G3' object idDetalND: TSmallintField FieldName = 'ND' Required = True end object idDetalNAME: TIBStringField FieldName = 'NAME' end object idDetalPRICE: TFloatField FieldName = 'PRICE' end object idDetalOST: TIntegerField FieldName = 'OST' end end end
Гла вн а я ф о рм а при ло жен и я:
Зд есь
sbAdd, sbRem, sbArc, spQuit: располож ены кнопки TspeedButton, р еали з ую щ и е функци и – при ход , расход , архи в , в ы ход . В
глав ном меню прод убли руй те функци и кнопоки д обав ьте д ополни тельны е необход и мы е, на В аш в з гляд , функци и . Д ля лучшей и ллю страци и матери ала в се в ы з ы в аемы е мод ули AddUnit, OtpUnit, TablUnit и спольз ую тр аз ли чны еспособы д оступа кд анны м. О бра бо тчи ки с о бы ти й кн о по к: procedure TMainForm.sbAddClick(Sender: TObject); begin // При добавлении товара используются неявные транзакции with DM do // Добавление товара на склад if AddForm.ShowModal=mrOK then begin iqTemp.CLose; iqTemp.SQL.Clear; // Проверить, есть ли на складе iqTemp.SQL.Add('SELECT * FROM Detal WHERE Name= and Price = :p2'); iqTemp.ParamByName('p1').value:=AddForm.Edit1.Text; iqTemp.ParamByName('p2').value:=AddForm.Edit2.Text; iqTemp.Open; iqInsert.SQL.Clear; if iqTemp.Recordcount=0 then //Если нет, то добавить begin
:p1
29 iqInsert.SQL.add('INSERT INTO detal (name, price, ost) values (:p1, :p2, :p3)'); iqInsert.ParamByName('p1').value:= AddForm.Edit1.Text; iqInsert.ParamByName('p2').value:= StrToFloat(AddForm.Edit2.Text); iqInsert.ParamByName('p3').value:= StrToInt(AddForm.Edit3.Text); iqInsert.ExecSQL; end else begin // Если есть, то увеличить количество iqInsert.SQL.add ('UPDATE detal SET ost = ost + :p3 (Name =:p1) and (price=:p2)'); iqInsert.ParamByName('p1').value:= AddForm.Edit1.Text; iqInsert.ParamByName('p2').value:= StrToFloat(AddForm.Edit2.Text); iqInsert.ParamByName('p3').value:= StrToInt(AddForm.Edit3.Text); iqInsert.ExecSQL; end; end; end;
WHERE
procedure TMainForm.spRemClick(Sender: TObject); begin OtpForm.ShowModal; // вызов формы отпуска end; procedure TMainForm.sbArcClick(Sender: TObject); begin TablForm.ShowModal; // вызов формы архивов end;
Фо рм а при х о да то ва ра AddForm:
Зд есь и спольз ую тся обы чны е компоненты TEdit. У станов и те д ля кнопки Применить св ой ств о ModalResult = mrOK, а д ля кнопки Отмена ModalResult = mrCancel.
30
Фо рм а о тпуска то ва ро в:
О пи с а н и е ф о рм ы (View as Text): object OtpForm: TOtpForm Caption = 'Расход' OnCloseQuery = FormCloseQuery OnShow = FormShow object lbTotal: TLabel Caption = '0' end object lbOpl: TLabel Caption = 'К оплате' end object lbDate: TLabel Caption = 'lbDate' end object dblcCust: TDBLookupComboBox DataField = 'NC' DataSource = DM.dsCD KeyField = 'NC' ListField = 'NAME;Address' ListSource = DM.dsCust end object dblcDetal: TDBLookupComboBox DataField = 'ND' DataSource = DM.dsCD KeyField = 'ND' ListField = 'NAME;PRICE;OST' ListSource = DM.dsDetal end object btAdd: TButton Caption = 'Добавить пустой' OnClick = btAddClick end
31 object btCancel: TButton Caption = 'Отменить' OnClick = btCancelClick end object btClose: TBitBtn Caption = '&Выход' Kind = bkClose end object btOrder: TBitBtn Caption = 'В заказ!' OnClick = btOrderClick end object eKol: TEdit Text = '0' OnChange = eKolChange end end
О бра бо тчи ки с о бы ти й : function CheckTrans: boolean; begin Result := dm.itaSklad.InTransaction; if Result then OtpForm.lbOpl.Color:=clRed //При активной транзакции меняется цвет else OtpForm.lbOpl.Color:=OtpForm.Color; end; procedure TOtpForm.FormShow(Sender: TObject); begin dblcCust.Enabled:=False; dblcDetal.Enabled:=False; btOrder.Enabled:=False; btCancel.Enabled:=False; lbDate.Caption:=DateToStr(Date); end; procedure TOtpForm.btAddClick(Sender: TObject); begin with dm do begin idCust.Close; idCust.Open; idDetal.Close; idDetal.Open; idCd.Close; idCD.Open; idCD.append; end; CheckTrans; dblcCust.Enabled:=True; dblcDetal.Enabled:=True;
32 btOrder.Enabled:=True; btCancel.Enabled:=True; end; procedure TOtpForm.btCancelClick(Sender: TObject); begin dm.idCD.Cancel; dm.idCD.Close; dm.idCust.Close; dm.idDetal.Close; dm.itaSklad.RollBack; CheckTrans; dblcCust.Enabled:=False; dblcDetal.Enabled:=False; btOrder.Enabled:=False; btCancel.Enabled:=False; end; procedure TOtpForm.btOrderClick(Sender: TObject); var otpusk, ostatok: integer; begin with dm do begin Otpusk := StrToInt(eKol.Text); Ostatok := DM.idDetalOst.value; if Otpusk