Система управления базами данных

Содержание



Введение

1.Иследовательская часть

1.1 Firebird

1.2 Основные характеристики

1.3 Требования к аппаратному обеспечению

1.4 Версии сервера

1.5 Лицензирование

2. Конструкторская часть

2.1 Создание таблицы

2.2 Создание триггеров

2.3 Создание генераторов

2.4 Создание Хранимых процедур

2.5 Разработка приложения

2.6 Блок схема

3. Технологическая часть

3.1 Руководство пользователю

4. Заключение

Список литературы

Листинг программы




Введение



InterBase - сервер баз данных, имеющий 20-летнюю историю(создан в 1985 году). Инновации, предложенные в этом сервере, не только остаются актуальными до сих пор, но и начинают широко внедряться в альтернативных СУБД. Основной особенностью функциональности InterBase является версионность. Механизм версионности впервые был предложен (в теории) Д.П. Ридом в 1978 году, и далее идеи многоверсионного доступа в СУБД были описаны Ф.Бернштейном и Н. Гудменом в 1981 году. Джим Старки, автор InterBase, разработал модель версионности для своей СУБД самостоятельно в интервале между 1981 и 1984 годом.

Механизм версионности кроме InterBase практически нигде не использовался, и потихоньку начал внедряться в коммерческих серверах не более 10-ти лет назад. На текущий момент в той или иной степени версионный механизм поддерживают кроме InterBase и Firebird: Oracle, PostgreSQL, а также MS SQL 2005. MySQL также планирует использовать версионный "движок".







На рисунке отображены этапы развития InterBase и Firebird с 2000 года по 2006г. Специально отмечено появление в 2001 году еще одного клона InterBase –Yaffil, который базируется на исходных текстах Firebird 1.0. Этот сервер был разработан в Санкт-Петербурге, и имел целью реализовать оптимизацию различных аспектов работы СУБД, а также обеспечить более легкий переход с InterBase версий 4.x и 5.x. В 2003 году было объявлено о слиянии Yaffil с Firebird, для исключения конкуренции и объединения функциональности. Тем не менее, Yaffil до сих пор существует как отдельный проект.

InterBase начал активно использоваться в России для построения различных систем в 1992-1994 году, когда был выпущен InterBase 4.0 for Windows.С тех пор InterBase и Firebird используются массово для решения задач биллинга, бухгалтерии, складов, ERP, CRM, банковского ПО. По нашим оценкам примерное число разработчиков, использующих InterBase, Firebird и Yaffil в России и СНГ составляет около 100 тысяч.

По мере увеличения числа систем на InterBase и Firebird растет и объем баз данных. С одной стороны, это увеличение баз данных промышленных систем, которые функционируют несколько лет подряд, а с другой стороны, это новые системы, изначально ориентированные на большой объем данных.В 2002 году число систем с базами размером от 1 до 8 гигабайт оценивалось как 15% от общего числа систем, а с большим объемом – на уровне не более 3-х процентов, причем в диапазоне именно от 8 до 980 гигабайт, то есть, такие системы чаще были эксклюзивными. Сейчас ситуация изменилась, и даже количество БД объемом от 10 до 50 гигабайт составляют уже 15 процентов, причем на самом деле диапазон размера таких баз данных от 15 до 100 гигабайт. Рост этот постоянный, в том числе он обусловлен уменьшением затрат на поддержку таких объемов со стороны аппаратного обеспечения. В настоящее время средний объем баз данных для систем на InterBase и Firebird составляет от 2 до 20 гигабайт (отсюда можно сделать вывод, что бесплатные варианты коммерческих СУБД Oracle, MS SQL и др. не являются конкурентами InterBase и Firebird в таких системах, т.к. искуственно ограничивают допустимый "бесплатно" размер базы данных на уровне 4 гигабайт).

Инструменты разработчика:

В поставку InterBase и Firebird обязательно входит комплект утилит командной строки, которые в основном используются разработчиками и администраторами для автоматизации резервного копирования и других операций. Кроме того, эти утилиты кроссплатформенные. Для создания БД, таблиц, процедур и т.п. в InterBase и Firebird принято использовать сторонние инструменты, которые обладают высокой функциональностью - IBExpert, IBManager, IB/FB Developer Studio, DatabaseWorkbench и др. Большая часть этих инструментов бесплатны для России, а их качество, функциональность и удобство использования зачастую превышают подобные характеристики инструментов другихк коммерческих СУБД (например в отношении MS SQL).

С момента выпуска InterBase 6.5 Borland производит только платную версию сервера с закрытым кодом. Сейчас существует версия InterBase 7.5, которая обладает достаточно высокой функциональностью и производительностью, особенно на многопроцессорных серверах. InterBase выпускается под платформы Windows, Linux и Solaris (Sparc).

В настоящий момент выпущена версия InterBase 2007 с поддержкой журналирования, point in time recovery, online dump и другой функциональностью необходимой для работы с базами данных размером от 5 до 150 и более гигабайт.

Несмотря на расхождения между последними версиями InterBase и Firebird, они оба наследуют все те положительные черты исходной СУБД InterBase, которые обеспечили высокую популярность этого сервера. Более того, здоровая конкуренция между этими серверами по возможностям SQL, производительности и другим параметрам гарантируют пользователям той или иной СУБД интенсивное развитие выбранного ими сервера. Небольшой объем дистрибутива, простой и быстрый процесс установки с моментальной готовностью к работе, минимальные требования к оборудованию, широкий спектр компонент и драйверов для разнообразных сред разработки, возможность обслуживания больших баз данных и большого числа пользователей, а также архитектура многоверсионности, упрощающая логику приложений - все это востребовано как начинающими, так и опытными разработчиками, и позволяет им успешно строить все больше и больше новых систем.




1. Иследовательская часть



1.1 Firebird



(FirebirdSQL) — компактная,кроссплатформенная,свободная система управления базами данных (СУБД), работающая наGNU/Linux,Microsoft Windows и разнообразных Unix платформах.

В качестве преимуществ Firebird некоторые разработчики выделяют возможность параллельной обработки, высокую эффективность и мощную языковую поддержку для хранимых процедур и триггеров.

Среди недостатков числятся отсутствие кеша результатов запросов, индексов fulltext для полнотекстового поиска.

Firebird является сервером баз данных. Один сервер Firebird может обрабатывать несколько независимых баз данных, каждую с множеством пользовательских соединений. И, что немаловажно, он является полностью свободным от лицензионных отчислений даже для коммерческого использования.



1.2 Основные характеристики



Соответствие требованиям A.C.I.D: Firebird сделан специально, чтобы удовлетворять требованиям "атомарности, целостности, изоляции и надежности" транзакций ("Atomicity, Consistency, Isolation and Durability") .

Версионная архитектура: Основная особенность Firebird — версионная архитектура, позволяющая серверу обрабатывать различные версии одной и той же записи в любое время таким образом, что каждая транзакция видит свою версию данных, не мешая соседним ("читающие транзакции не блокируют пишущие, а пишущие не блокируют читающих").

Хранимые процедуры - это процедуры и функции, хранящиеся непосредственно в базе данных в откомпилированном виде и которые могут запускаться пользователями или приложениями, работающими с базой данных. Хранимые процедуры обычно пишутся либо на специальном процедурном расширении языка SQL (например, PL/SQL для ORACLE или Transact-SQL для MS SQL Server), или на некотором универсальном языке программирования, например, C++, с включением в код операторов SQL в соответствии со специальными правилами такого включения. Основное назначение хранимых процедур - реализация бизнес-процессов предметной области. Используя язык PSQL (процедурный SQL) Firebird, возможно создавать сложные хранимые процедуры для обработки данных полностью на стороне сервера. Для генерации отчетов особенно удобны хранимые процедуры с возможностью выборки, возвращающие данные в виде набора записей. Такие процедуры можно использовать в запросах точно так же как и обычные таблицы.

События: Хранимые процедуры и триггеры могут генерировать события, на которые может подписаться клиент, открывая специально настроенный TCP/IP порт.

Генераторы: Идея генераторов (последовательностей) делает возможной простую реализацию автоинкрементных полей, и не только их. Генераторы являются счётчиками хранимыми в базе данных, работающими независимо от транзакций. Они могут быть использованы для различных целей, таких как генерация первичных ключей, управление длительными запросами в соседних транзакциях.

Полный контроль за транзакциями: Одно клиентское приложение может выполнять множество одновременных транзакций. В разных транзакциях могут быть использованы разные уровни изоляции. Протокол двухфазного подтверждения транзакций обеспечивает гарантированную устойчивость при работе с несколькими базами данных. Так же доступны оптимистическое блокирование данных и точки сохранения транзакций.

Резервное копирование на лету: Для резервного копирования нет надобности останавливать сервер. Процесс резервного копирования сохраняет состояние базы данных на момент своего старта, не мешая при этом работе с базой. Кроме того, существует возможность производить инкрементальное резервное копирование БД.

Триггеры - это хранимые процедуры, связанные с некоторыми событиями, происходящими во время работы базы данных. В качестве таких событий выступают операции вставки, обновления и удаления строк таблиц. Если в базе данных определен некоторый триггер, то он запускается автоматически всегда при возникновении события, с которым этот триггер связан. Очень важным является то, что пользователь не может обойти триггер. Триггер срабатывает независимо от того, кто из пользователей и каким способом инициировал событие, вызвавшее запуск триггера. Таким образом, основное назначение триггеров - автоматическая поддержка целостности базы данных. Триггеры могут быть как достаточно простыми, например,поддерживающими ссылочную целостность, так и довольно сложными, реализующими какие-либо сложные ограничения предметной области или сложные действия, которые должны произойти при наступлении некоторых событий. Для каждой таблицы возможно назначение нескольких триггеров, срабатывающих до или после вставки, обновления или удаления записей. Для триггеров используется язык PSQL, позволяя вносить начальные значения, проверять целостность данных, вызывать исключения. В Firebird 1.5 появились "универсальные" триггеры, позволяющие в одном триггере обрабатывать вставки, обновления и удаления записей таблицы.

Декларативное описание ссылочной целостности: Обеспечивает непротиворечивость и целостность многоуровневых отношений "master-detail" между таблицами

Наборы символов: Firebird поддерживает множество международных наборов символов (включая Unicod) с множеством вариантов сортировки.




1.3 Требования к аппаратному обеспечению



Firebird успешно работает на почти любом аппаратном обеспечении, и на широком спектре операционных систем. Может использоваться даже не очень мощное оборудование, особенно под GNU/Linux. И как в любой СУБД, на производительность влияют: количество памяти, скорость работы дисковой подсистемы, и т. д. Рекомендации для выбора аппаратного обеспечения зависят от требования к системе, прогнозируемого размера базы данных, количества пользователей, и т. д. Вы можете начать с минимальной конфигурации и далее расширять ее по мере надобности.

Физические ограничения:

Firebird поддерживает большие базы данных. Базы данных могут быть расположены в нескольких файлах, предельный размер которых зависит от операционной системы. Теоретический предел в настоящее время составляет 64TB для одного файла базы данных, таким образом, главные ограничения накладываются файловой системой и местом на жестком диске.



1.4 Версии сервера



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

Классик сервер (один процесс на одно соединение; поддержка многопроцессорных машин).

Суперсервер (все соединения используют один процесс, меньшие требования к памяти при большем быстродействии; для однопроцессорных машин)

Встраиваемая (Embedded) версия (весь движок содержится в одной библиотеке с именем клиентской библиотеки сервера, идеально подходит для однопользовательских систем, не требует инсталляции)

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



1.5 Лицензирование



Firebird выпускается под условиями IPL(InterBase Public License) и IDPL (Initial Developer’s Public License), которые совпадают с условиями Mozilla Public License 1.1. Firebird полностью бесплатен для использования и распространения. Раскрытие исходного кода вашего продукта не требуется, вне зависимости от используемой модели лицензирования. Однако, в случае, если вы модифицировали исходный код сервера, то необходимо сделать доступным исходный код ваших модификаций.

Средства разработки и администрирования

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

Поддержка

Компания IBPhoenix(В России, например компания iBase) предлагают профессиональную поддержку, выполняемую людьми с многолетним опытом. На сайтах IBPhoenix и iBase.ru находится большое количество технической информации, инструкций и документации.




2. Конструкторская часть



Создание базы данных.

Для создания базы данных использовался Ibexpert:

Утилита администрации InterBase (поддерживет InterBase Firebird Yaffil) Работает одновременно с несколькими базами данных. Содержит редакторы для всех объектов БД с синтаксической подсветкой, SQL редактор с историей запросов и возможностью фонового выполнения запросов, отладчик хранимых процедур и триггеров, поиск в метаданных, полное и частичное извлечение данных и метаданных, анализатор зависимостей объектов баз данных, отчеты по метаданным, менеджеры пользователей и пользовательских привилегий, экспорт данных в различные форматы.



2.1 Создание таблицы



Таблица – основной объект для хранения информации в реляционной базе данных. Она состоит из содержащих данные строк и столбцов, занимает в базе данных физическое пространство и может быть постоянной или временной. Поле, также называемое в реляционной базе данных столбцом, является частью таблицы, за которой закреплен определенный тип данных. Каждая таблица базы данных должна содержать хотя бы один столбец. Строка данных – это запись в таблице базы данных, она включает поля, содержащие данные из одной записи таблицы.

Главное в команде создания таблицы – определение имени таблицы и описание набора имен полей, которые указываются в соответствующем порядке. Кроме того, этой командой оговариваются типы данных и размеры полей таблицы.

Ключевое слово NULL используется для указания того, что в данном столбце могут содержаться значения NULL. Значение NULL отличается от пробела или нуля – к нему прибегают, когда необходимо указать, что данные недоступны, опущены или недопустимы. Если указано ключевое слово NOT NULL, то будут отклонены любые попытки поместить значение NULL в данный столбец. Если указан параметр NULL, помещение значений NULL в столбец разрешено. По умолчанию стандарт SQL предполагает наличие ключевого слова NULL.



CREATE GENERATOR GEN_GORODA_ID;

CREATE TABLE GORODA (

ID_GOR INTEGER NOT NULL,

NAZVANIE VARCHAR(30) NOT NULL,

DOLGOTA INTEGER,

SHIROTA INTEGER,

ID_STR INTEGER NOT NULL);



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

id_gor – индентефикатор города, данное поле не может быть пустым.

nazvanie- это поле содержит название города, оно не может превышать 30 символов.

id_str – индентификатор страны к которой принадлежит город.

dolgota- долгота на которой находится данный город.

shirota- широта на которой находится данный город.



CREATE GENERATOR GEN_STRANA_ID_STR;

CREATE TABLE STRANA (

ID_STR INTEGER NOT NULL,

NAZVANIE VARCHAR(30) NOT NULL,

STOLICA VARCHAR(30) NOT NULL,

NASELENIE INTEGER);


Таблица страны:

id_str – индентификатор страны

nazvanie- это поле содержит название страны

stolica – в данном поленаходится столица выбранной страны

naselenie- население данной страны(в млн).



CREATE TABLE LOG (

"WHEN" TIMESTAMP,

"USER" VARCHAR(20),

"ACTION" CHAR(3));



Таблица лог: данная таблица содержит информацию о том Кто? Когда? и что сделал(удалил,изменил,вставил)?

When- дата дейстивя;

User- кто совершает действия;

Action- показывает действие которое совершает пользователь



2.2 Создание триггеров



REATE TRIGGER TRIG_AI_GOR FOR GORODA

ACTIVE AFTER INSERT POSITION 0

AS

BEGIN

INSERT INTO log VALUES (current_timestamp, current_user, 'INS');

END



Данный триггер следит за действием вставка, если пользователь добавляет новое значение в таблицу goroda, триггер автоматически записывает в таблицу LOG имя пользователя и дату.


CREATE TRIGGER TR_AD_GOR FOR GORODA

ACTIVE AFTER DELETE POSITION 0

AS

BEGIN

INSERT INTO log VALUES (current_timestamp, current_user, 'DEL');

END



Данный триггер отвечает за удаление, если пользователь удалил значение из таблицы goroda, триггер автоматически записывает в таблицу LOG имя пользователя и дату.



CREATE TRIGGER TR_AU_GOR FOR GORODA

ACTIVE AFTER UPDATE POSITION 0

AS

BEGIN

INSERT INTO log VALUES (current_timestamp, current_user, 'UPD');

END



Данный триггер следит за изменением, если пользователь изменил любое поле из таблицы goroda, триггер автоматически записывает в таблицу LOG имя пользователя и дату.



Создание генераторов



CREATE GENERATOR GEN_GORODA_ID;

SET GENERATOR GEN_GORODA_ID TO 24;

CREATE GENERATOR GEN_STRANA_ID_STR;

SET GENERATOR GEN_STRANA_ID_STR TO 15;




Данные генераторы необходимы для создания триггеров на автоинкремент.

В них можно указать начальное значение автоинкремента.



CREATE TRIGGER TRIG_GORODA FOR GORODA

ACTIVE BEFORE INSERT POSITION 0

as

begin

if(new.id_gor is null) then new.id_gor = gen_id(gen_goroda_id,1);

end



Данный триггер автоматически создает индентификационный номер каждого нового города в таблице goroda.



CREATE TRIGGER TRIG_STRANA FOR STRANA

ACTIVE BEFORE INSERT POSITION 0

AS BEGIN

IF (NEW.Id_str IS NULL) THEN NEW.Id_str = GEN_ID(gen_strana_id_str,1);

END



Тоже самое делает и ‘тот триггер.только для таблицы strana,отметим что индентификационный номер каждой новй страны или города увеличивается на 1.



2.4 Создание Хранимых процедур



CREATE PROCEDURE STRANA_1

RETURNS (

STRANA_S VARCHAR(30),

GOROD_G VARCHAR(30),

NASELENIE_S INTEGER)

AS

begin

for select strana.nazvanie,goroda.nazvanie,strana.naselenie

from strana,goroda

where(strana.id_str=goroda.id_str)

into :strana_s,:gorod_g,:naselenie_s

do suspend;

end



Данная процедура осуществляет выборку из таблиц Strana и Goroda.

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



2.5 Разработка приложения для базы данных с помощью Borland Delphi



Основыне компоненты которые использовались для создания приложения:

IBDatabase- Компонент TDatabase позволяет наиболее эффективно управлять подключениями к базам данных. Это управление включает:

- создание постоянного подключения к базе данных;

- отмену установленной по умолчанию регистрации на сервере;

- создание псевдонима BDE на уровне приложения;

- управление транзакциями и определение уровней их разграничения.

IBTransaction- компонент IBTransaction, который будет использоваться в качестве умолчательного для выполнения различных операций IBDatabase. Клиентская часть InterBase допускает выполнение любых действий только в контексте транзакции. Поэтому если вы смогли получить доступ к данным без явного вызова IBTransaction.StartTransaction, то значит где то в недрах IBX этот вызов произошел автоматически. Такое поведение крайне не рекомендуется использовать. Для корректной работы приложений с базой данных желательно управлять транзакциями вручную, то есть явно вызывать методы StartTransaction, Commit и Rollback компонента TIBTransaction.

IBDataSet- Назначение компонента: буферизация записей, выбираемых оператором SELECT, для представления этих данных в Grid, а также для обеспечения "редактируемости" записи путем автоматического или ручного задания запросов Insert, Delete и Update.

DataSource- Свойство DataSet обеспечивает связь между компонентом, представляющим собой таблицу или запрос, и компонентами, предназначенными для доступа к записям. Наличие этого свойства позволяет выбирать источник данных. Например, база данных может быть организована таким образом, что таблица, состоящая из большого числа записей, разделена на несколько подтаблиц, имеющих одинаковую структуру. В этом случае в приложении каждой подтаблице будет соответствовать свой компонент Table, а выбор конкретной подтаблицы можно осуществить установкой значения свойства DataSet.

PageControl- Компонент Т PageControl может содержать несколько перкрывающих друг друга панелей класса TtabSheet. Каждая панель выбирается связанной с ней закладкой и может содержать свой набор помещенных на нее компонентов.

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

PopupMenu- контекстное меню.




2.6 Блок схема








3. Технологическая часть



3.1 Руководство пользователю



Для того, чтобы открыть приложение базы данных необходимо двойным кликом мыши нажать на ярлык .

После запуска приложения появится основное окно программы







Для добавления новых данных необходимо нажать на кнопку New, после чего появится дополнительное окно в которое необходимо ввести новые данные.






Для того чтобы измененить уже существующие данные, необходимо выбрать интересующую запись и нажать кнопку Change, после чего появится дополнительное окно в котором можно изменить данные. После внесенных изменений необходимо нажать кнопку Save для сохранения, либо Cancel для отмены.







Для удаления существующих записей, необходимо выбрать ту запись,которую следует удалить и нажать кнопку Delete.








Так же в базе данных существует поиск по названию страны(города).

Для того,чтобы осуществить поиск, необходимо ввести название страны(города) в соответствующее поле и нажать кнопку Search.






Для того чтобы скопировать необходимые данные из таблицы , нужно зажав кнопку Shift левой клавишей мыши, выбрать интересующие записи, после чего нажать правой кнопкой мыши для вызова контекстного меню и выбрать Copy.







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








4. Заключение



В данной работе были кратко описаны основные характеристики системы управления базами данных. Определены основные классы объектов БД, которые имеют значение при использовании для решения наиболее распространенных задач. Interbase- хорошее решение для предприятий, стремящихся совершенствовать управление бизнесом в условиях постоянно изменяющегося рынка, стремящихся в максимально короткие сроки получить правильное решение.

Разработанное приложение осуществляет основные операции: добавление, изменение, удаление данных. Разработан поиск по названию стран (городов).Возможно копирование данных из таблицы. Создана лог-таблица, в которой ведется учет изменения данных.



	
Список литературы

	

		www.ibase.ru;

		Фаронов В.В. Delphi 6. Учебный курс. Москва 2003г.

		Шупрута В.В. Delphi 2005.

		Петр Дархвелидзе, Евгений Марков Программирование в Delphi7 СПб, 2003г.

	5. megalib.com

	

	
Листинг программы

	

	unit Unit1;

	interface

	uses

	Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

	Dialogs, Grids, DBGrids, DB, IBCustomDataSet, IBDatabase, StdCtrls,

	ComCtrls, Buttons, Mask, DBCtrls, Menus, QClipbrd;

	type

	TForm1 = class(TForm)

	IBDatabase1: TIBDatabase;

	IBTransaction1: TIBTransaction;

	IBDataSet1: TIBDataSet;

	DataSource1: TDataSource;

	DataSource2: TDataSource;

	IBDataSet2: TIBDataSet;

	PageControl1: TPageControl;

	TabSheet1: TTabSheet;

	TabSheet2: TTabSheet;

	DBGrid1: TDBGrid;

	DBGrid2: TDBGrid;

	BitBtn1: TBitBtn;

	BitBtn2: TBitBtn;

	BitBtn3: TBitBtn;

	BitBtn4: TBitBtn;

	BitBtn5: TBitBtn;

	BitBtn6: TBitBtn;

	BitBtn7: TBitBtn;

	Edit1: TEdit;

	Label1: TLabel;

	Button1: TButton;

	Edit2: TEdit;

	Label2: TLabel;

	BitBtn8: TBitBtn;

	TabSheet3: TTabSheet;

	DBGrid3: TDBGrid;

	DataSource3: TDataSource;

	IBDataSet3: TIBDataSet;

	PopupMenu1: TPopupMenu;

	copy1: TMenuItem;

	delete1: TMenuItem;

	procedure Button1Click(Sender: TObject);

	procedure Button2Click(Sender: TObject);

	procedure BitBtn1Click(Sender: TObject);

	procedure BitBtn3Click(Sender: TObject);

	procedure BitBtn2Click(Sender: TObject);

	procedure BitBtn4Click(Sender: TObject);

	procedure BitBtn5Click(Sender: TObject);

	procedure BitBtn6Click(Sender: TObject);

	procedure BitBtn7Click(Sender: TObject);

	procedure BitBtn8Click(Sender: TObject);

	procedure FormCreate(Sender: TObject);

	procedure DBGrid1DblClick(Sender: TObject);

	procedure DBGrid2DblClick(Sender: TObject);

	procedure copy1Click(Sender: TObject);

	private { Private declarations }

	public { Public declarations }

	end;

	var

	Form1: TForm1;

	implementation

	uses Unit2, Unit3, Unit4, unit5;

	{$R *.dfm}

	procedure TForm1.Button1Click(Sender: TObject);

	begin

	if ibdataset2.Locate('NAZVANIE',Edit2.Text,[loPartialKey]) then form2.Show

	else

	showmessage('Не найдено');

	//form1.ibdataset2.insert;

	//form2.show;

	end;

	procedure TForm1.Button2Click(Sender: TObject);

	begin

	form1.IBDataSet1.Post;

	end;

	procedure TForm1.BitBtn1Click(Sender: TObject);

	begin

	ibdataset1.Edit;

	//ibdataset1.Post;

	form3.Show;

	end;

	procedure TForm1.BitBtn3Click(Sender: TObject);

	begin

	form1.IBDataSet1.Insert;

	//form1.IBDataSet1.Post;

	form3.Show;

	end;

	procedure TForm1.BitBtn2Click(Sender: TObject);

	begin

	ibdataset2.Insert;

	//ibdataset2.Post;

	form2.Show;

	end;

	procedure TForm1.BitBtn4Click(Sender: TObject);

	begin

	if MessageDlg ('Подтвердите удаление записи',

	mtConfirmation, [mbYes, mbNo], 0) = mrYes then

	ibdataset1.Delete

	end;

	procedure TForm1.BitBtn5Click(Sender: TObject);

	begin

	ibdataset2.Edit;

	form2.Show;

	end;

	procedure TForm1.BitBtn6Click(Sender: TObject);

	begin

	if MessageDlg ('Подтвердите удаление записи',

	mtConfirmation, [mbYes, mbNo], 0) = mrYes then

	ibdataset2.Delete;

	end;

	procedure TForm1.BitBtn7Click(Sender: TObject);

	begin

	if ibdataset1.Locate('NAZVANIE',Edit1.Text,[loPartialKey]) then form3.Show

	else

	showmessage('Не найдено');

	end;

	procedure TForm1.BitBtn8Click(Sender: TObject);

	begin

	Form4.show;

	end;

	procedure TForm1.FormCreate(Sender: TObject);

	begin

	ibdataset1.Open;

	ibdataset2.Open;

	end;

	procedure TForm1.DBGrid1DblClick(Sender: TObject);

	begin

	form5.Show;

	form5.IBDataSet1.Open;

	end;

	procedure TForm1.DBGrid2DblClick(Sender: TObject);

	begin

	form5.Show;

	form5.IBDataSet1.Open;

	end;

	procedure TForm1.copy1Click(Sender: TObject);

	var

	i, j: Integer;

	s: string;

	begin

	if DBGrid2.SelectedRows.Count>0 then

	with DBGrid2.DataSource.DataSet do

	for i:=0 to DBGrid2.SelectedRows.Count-1 do

	begin

	GotoBookmark(pointer(DBGrid2.SelectedRows.Items[i]));

	for j := 0 to FieldCount-1 do

	begin

	if (j>0) then s:=s+', ';

	s:=s+Fields[j].AsString;

	end;

	s:= s+#13+#10;

	end;

	Clipboard.AsText := s;

	end;

	end.

	unit Unit2;

	interface

	uses

	Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

	Dialogs, StdCtrls, DBCtrls, Mask, Buttons;

	type

	TForm2 = class(TForm)

	DBEdit2: TDBEdit;

	DBEdit3: TDBEdit;

	DBEdit4: TDBEdit;

	Button1: TButton;

	Label2: TLabel;

	Label3: TLabel;

	Label4: TLabel;

	BitBtn1: TBitBtn;

	procedure Button1Click(Sender: TObject);

	procedure BitBtn1Click(Sender: TObject);

	private

	{ Private declarations }

	public

	{ Public declarations }

	end;

	var

	Form2: TForm2;

	implementation

	uses unit1;

	{$R *.dfm}

	procedure TForm2.Button1Click(Sender: TObject);

	begin

	form1.IBDataSet2.Post;

	form2.Close;

	end;

	procedure TForm2.BitBtn1Click(Sender: TObject);

	begin

	form2.Close;

	end;

	end.

	unit Unit3;

	interface

	uses

	Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

	Dialogs, StdCtrls, Buttons, Mask, DBCtrls;

	type

	TForm3 = class(TForm)

	DBEdit2: TDBEdit;

	DBEdit3: TDBEdit;

	DBEdit4: TDBEdit;

	DBEdit5: TDBEdit;

	Label2: TLabel;

	Label3: TLabel;

	Label4: TLabel;

	Label5: TLabel;

	BitBtn1: TBitBtn;

	BitBtn2: TBitBtn;

	procedure BitBtn1Click(Sender: TObject);

	procedure BitBtn2Click(Sender: TObject);

	procedure FormCreate(Sender: TObject);

	private

	{ Private declarations }

	public

	{ Public declarations }

	end;

	var

	Form3: TForm3;

	implementation

	uses unit1;

	{$R *.dfm}

	procedure TForm3.BitBtn1Click(Sender: TObject);

	begin

	form1.IBDataSet1.Post;

	form3.Close;

	end;

	procedure TForm3.BitBtn2Click(Sender: TObject);

	begin

	form3.Close;

	end;

	procedure TForm3.FormCreate(Sender: TObject);

	begin

	end;

	end.

	unit Unit4;

	interface

	uses

	Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

	Dialogs, StdCtrls;

	type

	TForm4 = class(TForm)

	Edit1: TEdit;

	Edit2: TEdit;

	Button1: TButton;

	procedure Button1Click(Sender: TObject);

	procedure FormCreate(Sender: TObject);

	private

	{ Private declarations }

	public

	{ Public declarations }

	end;

	var

	Form4: TForm4;

	implementation

	uses unit1; {$R *.dfm}

	procedure TForm4.Button1Click(Sender: TObject);

	begin

	Form1.IBDatabase1.Params.Clear;

	Form1.IBDatabase1.Params.Add('user_name='+Edit1.Text);

	Form1.IBDatabase1.Params.Add('password='+Edit2.Text);

	Form1.IBDatabase1.Params.Add('lc_ctype=WIN1251');

	Form1.IBDatabase1.Connected:=True;

	Form1.IBTransaction1.StartTransaction;

	Form1.IBDataSet1.Open;

	Form1.IBDataSet2.Open;

	Form1.IBDataSet3.Open;

	form4.Close;

	end;

	procedure TForm4.FormCreate(Sender: TObject);

	begin

	end;

	end.

	unit Unit5;

	interface

	uses

	Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

	Dialogs, DB, IBCustomDataSet, Grids, DBGrids;

	type

	TForm5 = class(TForm)

	DBGrid1: TDBGrid;

	DataSource1: TDataSource;

	IBDataSet1: TIBDataSet;

	procedure FormCreate(Sender: TObject);

	private

	{ Private declarations }

	public

	{ Public declarations }

	end;

	var

	Form5: TForm5;

	implementation

	uses unit1;

	{$R *.dfm}

	procedure TForm5.FormCreate(Sender: TObject);

	begin

	end;

	end.