Разработка базы данных

Примечаниеот автора: пишите отзывы и предложения по адресу. Очень интересно, как вы зацените эту работу. Программа введена в эксплуатацию
Загрузить архив:
Файл: ref-13893.zip (566kb [zip], Скачиваний: 57) скачать

Министерство образования

Российской Федерации

Хабаровский Государственный Технический Университет

Кафедра программного обеспечения вычислительной

техники и автоматизированных систем

пояснительная записка

к курсовой работе

ПО ДИСЦИПЛИНЕ «БАЗЫ ДАННЫХ»

Выполнил:

  студент гр. ПО-02

    Самойленко Павел

Проверил:

к.т.н., доцент

     Саринков А. А.

Хабаровск 2002г.


Задание

Разработка клиент – серверного приложения.

Введение в технологию клиент-сервер

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

Преимущества архитектуры клиент – сервер:

o Большинство вычислительных процессов происходит на сервере, что снижает требования к вычислительной мощности клиента.

o Снижается сетевой трафик, так как пересылаются не все данные, а только запрошенные.

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

o Сервер реализует управление транзакциями и предотвращаетпопытки одновременного изменения одних и тех же данных.

Сервер базы данных

При выборе сервера базы данных я остановился на промышленном сервере InterBase. InterBase – «родной» сервер для Delphi. Для доступа к нему не нужно устанавливать дополнительных драйверов. Все данные хранятся на сервере в файле baze.gdb.

Предметная область

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

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

Структура таблиц и связей между ними:


Рис. 1

Форматы полей в таблицах:

CREATE TABLE CHASTT (

KOD INTEGER NOT NULL,

VCH VARCHAR(20) NOT NULL

)

CREATE TABLE MODELL (

KOD3 INTEGER NOT NULL,

MODEL VARCHAR(160) NOT NULL,

K2 INTEGER

)

CREATE TABLE NAIMM (

KOD2 INTEGER NOT NULL,

NAIM VARCHAR(160) NOT NULL,

K1 INTEGER

)

CREATE TABLE RAZDELL (

KOD1 INTEGER NOT NULL,

RAZDEL VARCHAR(160) NOT NULL

)

CREATE TABLE SVODKA (

KOD5 INTEGER NOT NULL,

SERNO VARCHAR(20),

K4 INTEGER NOT NULL,

SER FLOAT,

ZOL FLOAT,

PT FLOAT,

PG FLOAT,

DVIP CHAR(4),

DVVOD CHAR(4),

DSPIS CHAR(4),

SROK SMALLINT,

KATEGOR SMALLINT,

CENA FLOAT,

PRIMECH CHAR(200),

K3 INTEGER

)

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

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

CREATE TRIGGER NOVOE FOR RAZDELL BEFORE INSERT POSITION 0 AS

BEGIN

new.kod1 = gen_id(gen1,1);

END

Удаленными процедурами не пользовался – хватило возможностей sql запросов для реализации всех потребностей.

Задал индексы по полям: Modell.model, naimm.naim, chastt.vch, razdell.razdel для увеличения скорости выполнения запросов.

Проектирование приложения в среде Delphi

Используемые средства

Приложение было написано в среде Delphi 7 на компьютере Athlon 1600+XP, что очень плохо, потому что приложение написано для компьютера, намного уступающего по мощности моему. Платформа БД – InterBase 6.0.

Формы


Первая форма типа DataModule – “DM”, на которой располагаются не визуальные компонента доступа к данным. Вид формы на этапе проектирования:

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

Назначение компонентов:

o IBDataBase1 – создает соединение с БД InterBase. Есть свойство DataBaseName, которое указывает имя физической БД, с которой связан компонент. При связи с удаленной БД по протоколу TCP/IP имя записывается в формате <имя сервера>:<имя файла БД>; по протоколу NetBios – в формате \<имя сервера><имя файла БД>; по протоколу SPX– в формате <имя сервера>@<имя файла БД>. При запуске приложения расположение БД берется из файла del.ini:

Inii := TIniFile.Create(getcurrentdir+'del.ini');

try

   str:=Inii.ReadString( 'Baza', 'Put', '');

   ibdatabase1.databaseName:=str;

   IBDatabase1.Connected:=true;

   IBTransaction1.Active:=true;

   IBTable1.Active:=true;

   IBTable2.Active:=true;

   IBTable3.Active:=true;

IBTable4.Active:=true;

   IBTable5.Active:=true;

   IBTable44.Active:=true;

Текст файла del.ini, если БД на локальном компьютере в папке D:interBase:

[Baza]

Put=D:interBasebase.gdb

Следущее использованное свойство – Params, которое содержит список параметров, которые передаются серверу в момент соединения:

USER_NAME=SYSDBA

PASSWORD=masterkey

lc_ctype=WIN1251

Тут задается имя пользователя и пароль – окно с запросом пароля при подключении не появляется.

o IBTranzaction1 – транзакция

o IBTable~ - аналог TTable. Отличается тем, что работает быстрее и грузит данные по надобности.

o IBQyery~ - аналог TQuery.

o OPDial – окно выбора файла – для загрузки запроса из файла.

При попытке сохранения записи в таблицу Svodkaзапускается процедура:

procedure TDM.IBTable1BeforePost(DataSet: TDataSet);

begin

if ibtable1.fieldbyname('K4').AsString='' then begin

    MessageDlg('Введите номер воинской части',mterror,[mbok],0);

    ibtable1.fieldbyname('K4').FocusControl;

    abort;

end;

if ibtable1.fieldbyname('SerNo').AsString='' then begin

    MessageDlg('Введитесерийныйномераппарата!', mterror, [mbok],0);

    ibtable1.fieldbyname('SerNo').FocusControl;

    abort;

end;

if ibtable1.fieldbyname('K3').AsString='' then begin

    MessageDlg('Введитемодельаппарата!',mterror,[mbok],0);

    ibtable1.fieldbyname('K3').FocusControl;

    abort;

end;

   if ibtable1.State=dsinsert then IBTable1. FieldByName('KOD5'). AsInteger:=-1; (*)

end;

Нужна для предотвращения занесения nullв поля SerNo,K3,K4, по которым можно однозначно идентифицировать запись в наборе данных svodka (по ним можно построить ключ).

Еще один нюанс – если убрать строку (*), то при добавлении новой записи будет выдаваться ошибка, что не заполнено поле, на которое стоит ограничение notnull. Эта ошибка возникает, потому что сервер interBaseгенерирует уникальное значение в поле “KOD5” после сохранения, а до сохранения он проверяет значение в поле “KOD5”, записи, полученной от клиентского приложения на пустое значение, то есть до генерации не доходит. Для того, чтобы этого избежать мы при добавлении новой записи заносим в поле “KOD5” любое числовое значение, которое все равно потом триггером поменяется на уникальное. Аналогичное действие мы проводим для всех таблиц.

FormMainи FormVvod2

FormMain – основная, родительская форма для всех остальных форм. Управление отображением дочерних окон внутри родительской осуществляется с помощью Api функции ShowWindow.

FormVvod2 – экранная форма с отображением параметров одного конкретно взятого прибора. Навигация идет по таблице Svodka, с которой связан компонент IBTable1 из формы DM. Воинская часть и модель отображаются с помощью связи компонента TLookupKomboBoxиз компонентов IBTable44 и IBTable5 соответственно.



Вид форм при работе программы:

FormVvod


Вид формы при работе программы:

В форме отображаются записи таблицы svodka, с которой связан компонент IBTable1. Добавил поля Lookup в компонент IBTable и в таблице появились поля выбора воинской части и модели аппарата.

Vch

В форме – список всех воинских частей.

Вид:



Svazka


Вид формы:

С помощью галочки «Связанный набор» можно устанавливать или убирать связь между таблицами “Раздел”, “Наименование” и “Модель”. Тип связей: “Наименование” подчиненная для “Раздела”, а “Модель” – подчиненная для “Наименования”. Процедуракликана CheckBox:

procedure TSvazka.CheckClick(Sender: TObject);

begin

if check.Checked then begin

    svazka.Caption:='Редактирование связанных таблиц: Раздел->Наименование->Модель';

    dm.IBTable3.active:=false;

    dm.IBTable4.active:=false;

    dm.IBTable3.IndexFieldNames:='K1';

    dm.IBTable3.MasterSource:=dm.DataSource2;

   dm.IBTable4.IndexFieldNames:='K2';

    dm.IBTable4.MasterSource:=dm.DataSource3;

    dm.IBTable3.active:=true;

    dm.IBTable4.active:=true;

end

else begin

    svazka.Caption:='Редактирование не связанных таблиц';

    dm.IBTable3.MasterSource:=nil;

  dm.IBTable3.IndexFieldNames:='NAIM';

    dm.IBTable4.MasterSource:=nil;

    dm.IBTable4.IndexFieldNames:='MODEL';

end;

end;

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

Avt и Opr

О авторе и о программе.

ZaprVibr


Вид формы:

Форма нужна для выбора типа запроса(а по запросу формируем отчет).

Запросы

Поиск не списанного или списанного аппарата


Данные запросы почти полностью одинаковы, рассмотрим поиск не списанного аппарата.

Вид формы:

DbGrid связана с Zapr1 через DZapr.

Текстзапроса:

select kod5,vch,model,serno,dvip,cena

from SVODKA,CHASTT,MODELL

whereK4 in

   (select KOD

    from CHASTT

    where UPPER(VCH) like upper(:pvch)

    )    and (UPPER(serno) like upper(:pserno))

               and (dspis is null)

                       andK3 in

                       (select KOD3

                        from Modell

                        where UPPER(Model) like upper(:pmodel)

                        )

and svodka.k4=chastt.kod and svodka.k3=modell.kod3

order by vch

Тут используются вложенные запросы. Параметры берутся из полей edit. Для независимости от регистра используем процедуру UPPER. Процедура нажатия на кнопку «Выполнить»:

with dm do begin

Zapr1.Active:=false;

if ch1.Checked then zapr1.ParamByName('pvch').Value:= '%'+edit1.Text+'%'

    else zapr1.ParamByName('pvch').Value:='%%';

if ch2.Checked then zapr1.ParamByName('pserno').Value:= '%'+edit2.Text+'%'

    else zapr1.ParamByName('pserno').Value:='%%';

if ch3.Checked then zapr1.ParamByName('pmodel').Value: ='%'+edit3.Text+'%'

    else zapr1.ParamByName('pmodel').Value:='%%';

  Zapr1.Active:=true;

  label2.Caption:=inttostr(zapr1.RecordCount);

end;

При нажатии на кнопку просто задаются параметры sqlзапросу. В SQL используется оператор Like – для поиска по части строки символы %, стоящие в начале и в конце параметра означают, что вместо них могут стоять любые другие.

Работает запрос так: ищутся такие записи в svodka, у которых K4 и K3 находятся из вложенных запросов как коды записей с частичным совпадением не ключевых полей с заданными параметрами “pvch” и “pmodel”, и серийный номер частично совпадает с “pserno”.

Аппарат является не списанным, если в поле “DSpis” (Дата списания) содержится значение null. Если нам надо найти списанный аппарат, то запрос будет почти такой же, только DSpisisnot null. Поэтому поиск списанного аппарата я рассматривать не буду.

Отобранные записи сортируются по номеру воинской части (Orderby vch).

Кнопка «Перейти» нужна для перехода в таблице IBTable1 к аппарату, который является текущим в таблице отобранных с помощью запроса аппаратов. Процедура нажатия на кнопку «Перейти»:

procedure TZ1.SpeedButton1Click(Sender: TObject);

begin

dm.IBTable1.Locate('KOD5',vararrayof([dm.zapr1.FieldByName('kod5').Value]),[]);

  ShowWindow(formvvod2.Handle, SW_SHOW);

formvvod2.Show;

end;

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


Поиск аппарата по группам


После выбора данного вида поиска на экране появляется форма “Svazka”, дополненная несколькими элементами. Ее вид:

Добавились 3 CheckBox – для выбора по какому критерию мы будем отбирать аппараты. Одновременно больше одного критерия быть выбрано не может. Процедура нажатия на кнопку «Выполнить»:

procedure TSvazka.SpeedButton2Click(Sender: TObject);

begin

with dm do begin

    Zapr3.Active:=false;

    zapr3.SQL.Clear;

    zapr3.SQL.Add('select *');

    zapr3.SQL.Add('from naimm,modell,chastt,svodka');

    if c3.Checked then begin

      zapr3.SQL.Add('where svodka.k3= '+dm.ibtable4.fieldbyname('KOD3').AsString);

      zapr3.SQL.Add('and modell.kod3= '+dm.ibtable4.fieldbyname('KOD3').AsString);

      zapr3.SQL.Add('and modell.k2=naimm.kod2');

      zapr3.SQL.Add('and svodka.k4=chastt.kod');

    end

    else if c2.Checked then begin

      zapr3.SQL.Add('where svodka.k3=modell.kod3');

      zapr3.SQL.Add('and naimm.kod2= '+dm.ibtable3.fieldbyname('KOD2').AsString);

      zapr3.SQL.Add('and modell.k2= '+dm.ibtable3.fieldbyname('KOD2').AsString);

      zapr3.SQL.Add('and svodka.k4=chastt.kod');

    end

    else if c1.Checked then begin

      zapr3.SQL.Add('where svodka.k3=modell.kod3');

      zapr3.SQL.Add('and modell.k2=naimm.kod2');

      zapr3.SQL.Add('and naimm.k1= '+dm.ibtable2.fieldbyname('KOD1').AsString);

      zapr3.SQL.Add('and svodka.k4=chastt.kod');

    end;

    zapr3.SQL.Add('andsvodka.k4=chastt.kod');

    zapr3.SQL.Add('order by vch');

    if c1.Checked or c2.Checked or c3.Checked then Zapr3.Active:=true

    else messagedlg('Надо выделить хоть одну категорию!',mtinformation,[mbok],0);

    z3.label2.Caption:=inttostr(zapr3.RecordCount);

end;

    ShowWindow(z3.Handle, SW_SHOW);

    z3.Show;

end;

Процедура заполняет sql запрос компонента zapr3 и выводит на экран форму “Z3” с результатом:

В этой форме таблица связанна с zapr3, а кнопка «Перейти» работает также как кнопка, описанная выше. Количество отобранных записей выводится с помощью метода recordcount.

Загрузка запроса из файла.

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

Пример:

Текст запроса в файле «Все из сводки.sql»:

select *

from svodka

/* грузит все из таблицы сводки */


Форма с результатами:

Список аппаратов в определенной части

Для этого запроса меня просили сделать отчет. Запрос показывает все аппараты в заданной воинской части со всеми их характеристиками.

Поиск идет по неполному совпадению (Like). Но если нужен отчет, то надо задать номер воинской части полностью (чтоб по нескольким воинским частям выборки не произошло).



Вид формы:

Текст sql запроса:

select vch,razdel,naim,model,serno,dspis,dvvod,cena,ser,zol,pt,pg,kod5

from chastt,razdell,naimm,modell,svodka

where

chastt.vch like :par   

and         svodka.k4=chastt.kod

and         svodka.k3=modell.kod3

and         naimm.kod2=modell.k2

and         razdell.kod1=naimm.k1

order by vch,razdel,naim,model,dspis

Этот запрос я сделал без подзапросов (не знаю что быстрее, наверное быстрее без подзапросов, зато с подзапросами нагляднее).

Формирование отчета.

В Delphi 7 отчеты делаются уже не с помощью компонентов QReport, а с помощью RaveReport. Вкладки QReportбольше не существует. Так как система Delphi 7 вышла недавно, то пришлось разбираться по справке. В общем то принципы остались те же – разбитие документа на несколько полос и т. д. Для работы с отчетами на форме расположено два не визуальных компонента - RvProject1, с помощью которого идет связь с файлом проекта и RvDataSetConnection1 – связь с набором данных. Файл проекта строится с помощью утилиты RaveDesigner. Отчет при проектировании выглядит так:


Я сформировал отчет, выровнял и сохранил как otch4.rav.


Вид отчета при работе приложения:

Отчет вызывается по нажатии на кнопку «Отчет» через метод executeкомпонента rvproject1.

Заключение

Самый сложный этап – формирование таблиц, связей между ними, ссылочной целостности. Типы данных в InterBase какие-то «корявые». Float – точность 7 знаков. Если вносишь десятичную дробь, целая часть у которой равна нулю, то в дробной части гарантируется точность до 7 знаков после запятой. Например, если внести 0.123, а потом сохранить запись, то в этом поле будет число 0.1230000004233858, что конечно же не наглядно и прибавляет программисту лишней головной боли. Тип varchar – доставляет пробелов до длины строки – опять неудобства – если максимальная длина строки – 120 символов, а там допустим слово из 5 букв, то будет сохранено слово+115 пробелов перед ним, теперь смотрим в поле – видим пусто (если поле длиной меньше 120 символов). При попытке переформировать таблицу данные исчезают. Возможно это неудобство InterBase, но есть системы и лучше – MSSQLServer, Oracl. После соединения с сетевой базой данных работа с ней мало чем отличается от работы с локальной базой данных.

Я получил приложение, которое осуществляет все виды операций с удаленной базой данных, такие, как вставка, удаление, выборка данных. Подключение идет через стандартные сетевые протоколы к серверу баз данных InterBase. Если сравнивать локальные и сетевые базы данных, то, на мой взгляд, будущее за сетевыми базами данных, а локальные базы будут уходить в прошлое. Причина – широкое распространение локальных сетей и сети Internet. Проще подключиться к сети, сформировать запрос и тут же получить нужные данные, чем хранить все на своем компьютере. Как видно из моей работы, с помощью объектно-ориентированного программирования строить сложное приложение становится все проще и проще, растут мощности компьютеров, объемы ОЗУ и ПЗУ и приложения работают с базами данных все быстрее и быстрее.


Список используемой литературы:

1.«Microsoft® Access 2000», И.А. Харитонова, В.Д. Михеева, издательство «БХВ - Петербург», 1999

2.«Базы данных: Учебный курс», С.В. Глушаков, Д.В. Ломотько, ООО «Издательство АСТ», 2000

3.«Delphi 5 Руководство разработчика баз данных», В.В. Фаронов, П.В. Шумаков, издательство «Нолидж», 2001

4.«Работа с базами данных в Delphi», В.Э. Гофман, А.Д. Хомоненко, «БХВ - Петербург», 2000

5.«Microsoft SQL Server 7 для профессионалов», Е. Мамаев, А. Вишневский, 2000

6.Файлы справки по Delphi7.


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

unit Unit1;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus;

type
TFormMain = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    N12: TMenuItem;
    N13: TMenuItem;
    procedure N10Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N13Click(Sender: TObject);
    procedure N12Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
FormMain: TFormMain;

implementation

uses Unit4, Unit2, Unit6, Unit5, Unit7, Unit13, Unit14;

{$R *.dfm}

procedure TFormMain.N10Click(Sender: TObject);
begin
with svazka do begin
    Caption:='Редактированиесвязанныхтаблиц: Раздел->Наименование->Модель';
    C1.Visible:=false;       dbgrid1.ReadOnly:=false;
    C2.Visible:=false;       dbgrid2.ReadOnly:=false;
    C3.Visible:=false;       dbgrid3.ReadOnly:=false;
    SpeedButton2.Visible:=false;
end;
ShowWindow(Svazka.Handle, SW_SHOW);
svazka.Show;
end;

procedure TFormMain.N7Click(Sender: TObject);
begin
ShowWindow(formvvod.Handle, SW_SHOW);
formvvod.Show;
end;

procedure TFormMain.N8Click(Sender: TObject);
begin
ShowWindow(formvvod2.Handle, SW_SHOW);
formvvod2.Show;
end;

procedure TFormMain.N9Click(Sender: TObject);
begin
ShowWindow(vch.Handle, SW_SHOW);
vch.Show;
end;

procedure TFormMain.N6Click(Sender: TObject);
begin
close;
end;

procedure TFormMain.N3Click(Sender: TObject);
begin
ShowWindow(zaprvibr.Handle, SW_SHOW);
zaprvibr.Show;
end;

procedure TFormMain.N13Click(Sender: TObject);
begin
ShowWindow(avtor.Handle, SW_SHOW);
avtor.Show;
end;

procedure TFormMain.N12Click(Sender: TObject);
begin
ShowWindow(Opr.Handle, SW_SHOW);
Opr.Show;
end;

end.

unit Unit2;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, ExtCtrls, DBCtrls;

type
TFormVvod = class(TForm)
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
    { Private declarations }
public
    { Public declarations }
end;

var
FormVvod: TFormVvod;

implementation

uses Unit3, Unit4;

{$R *.dfm}

procedure TFormVvod.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(Formvvod.Handle, SW_HIDE);
action:=canone;
end;

end.

unit Unit3;



interface

uses
SysUtils, Classes, DB, IBCustomDataSet, IBTable, IBDatabase, Qdialogs,
IBQuery, Dialogs,inifiles;

type
TDM = class(TDataModule)
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    IBTable1: TIBTable;
    IBTable2: TIBTable;
    IBTable3: TIBTable;
    IBTable4: TIBTable;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    DataSource3: TDataSource;
    DataSource4: TDataSource;
    IBTable5: TIBTable;
    DataSource5: TDataSource;
    IBTable1KOD5: TIntegerField;
    IBTable1SERNO: TIBStringField;
    IBTable1K4: TIntegerField;
    IBTable1SER: TFloatField;
    IBTable1ZOL: TFloatField;
    IBTable1PT: TFloatField;
    IBTable1PG: TFloatField;
    IBTable1DVIP: TIBStringField;
    IBTable1DVVOD: TIBStringField;
    IBTable1DSPIS: TIBStringField;
    IBTable1SROK: TSmallintField;
    IBTable1KATEGOR: TSmallintField;
    IBTable1CENA: TFloatField;
    IBTable1PRIMECH: TIBStringField;
    IBTable1K3: TIntegerField;
    IBTable44: TIBTable;
    DataSource44: TDataSource;
    IBTable1Look4: TStringField;
    IBTable1Look3: TStringField;
    Zapr1: TIBQuery;
    DZapr: TDataSource;
    Zapr1VCH: TIBStringField;
    Zapr1MODEL: TIBStringField;
    Zapr1SERNO: TIBStringField;
    Zapr1DVIP: TIBStringField;
    Zapr1CENA: TFloatField;
    Zapr1KOD5: TIntegerField;
    Zapr2: TIBQuery;
    IBStringField1: TIBStringField;
    IBStringField2: TIBStringField;
    IBStringField3: TIBStringField;
    IBStringField4: TIBStringField;
    FloatField1: TFloatField;
    IntegerField1: TIntegerField;
    Zapr2DSPIS: TIBStringField;
    Zapr2PRIMECH: TIBStringField;
    DZapr2: TDataSource;
    Zapr3: TIBQuery;
    DZapr3: TDataSource;
    Zapr3NAIM: TIBStringField;
    Zapr3MODEL: TIBStringField;
    Zapr3VCH: TIBStringField;
    Zapr3SERNO: TIBStringField;
    Zapr3DSPIS: TIBStringField;
    Zapr3CENA: TFloatField;
    Zapr3KOD5: TIntegerField;
    Zapr4: TIBQuery;
    DZapr4: TDataSource;
    Zapr4VCH: TIBStringField;
    Zapr4RAZDEL: TIBStringField;
    Zapr4NAIM: TIBStringField;
    Zapr4MODEL: TIBStringField;
    Zapr4SERNO: TIBStringField;
    Zapr4DSPIS: TIBStringField;
    Zapr4DVVOD: TIBStringField;
    Zapr4CENA: TFloatField;
    Zapr4SER: TFloatField;
    Zapr4ZOL: TFloatField;
    Zapr4PT: TFloatField;
    Zapr4PG: TFloatField;
    Zapr5: TIBQuery;
    DZapr5: TDataSource;
    OpDial: TOpenDialog;
    Zapr4KOD5: TIntegerField;
    procedure IBTable2BeforePost(DataSet: TDataSet);
    procedure IBTable3BeforePost(DataSet: TDataSet);
    procedure IBTable4BeforePost(DataSet: TDataSet);
    procedure IBTable2AfterPost(DataSet: TDataSet);
    procedure IBTable3AfterPost(DataSet: TDataSet);
    procedure IBTable4AfterPost(DataSet: TDataSet);
    procedure IBTable5BeforePost(DataSet: TDataSet);
    procedure IBTable5AfterPost(DataSet: TDataSet);
    procedure IBTable1BeforePost(DataSet: TDataSet);
    procedure IBTable1AfterPost(DataSet: TDataSet);
    procedure DataModuleCreate(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
DM: TDM;
implementation

uses Unit4;

{$R *.dfm}

procedure TDM.IBTable2BeforePost(DataSet: TDataSet);
begin
if ibtable2.State=dsinsert then IBTable2.FieldByName('KOD1').AsInteger:=-1;
end;

procedure TDM.IBTable3BeforePost(DataSet: TDataSet);
var str:ansistring;
begin
if ibtable2.State=dsinsert then begin   // еслиунасверхняятаблицаврежимевставки
    str:=ibtable3.fieldbyname('NAIM').AsString;
    ibtable3.Cancel;
    ibtable2.Post;
    ibtable3.Append;
    ibtable3.fieldbyname('NAIM').AsString:=str;
end;
if ibtable3.State=dsinsert then IBTable3.FieldByName('KOD2').AsInteger:=-1;
end;

procedure TDM.IBTable4BeforePost(DataSet: TDataSet);
var str:ansistring;
begin
if ibtable3.State=dsinsert then begin   // еслиунасверхняятаблицаврежимевставки
    str:=ibtable4.fieldbyname('MODEL').AsString;
    ibtable4.Cancel;
    ibtable3.Post;
    ibtable4.Append;
    ibtable4.fieldbyname('MODEL').AsString:=str;
end;
    if ibtable4.State=dsinsert then IBTable4.FieldByName('KOD3').AsInteger:=-1;
end;

procedure TDM.IBTable2AfterPost(DataSet: TDataSet);
begin
ibtable2.Close;    ibtable2.open;     ibtable2.Last;
end;

procedure TDM.IBTable3AfterPost(DataSet: TDataSet);
begin
ibtable3.Close;     ibtable3.open;        ibtable3.Last;
end;

procedure TDM.IBTable4AfterPost(DataSet: TDataSet);
begin
ibtable4.Close;     ibtable4.open;     ibtable4.Last;
end;

procedure TDM.IBTable5BeforePost(DataSet: TDataSet);
begin
if ibtable5.State=dsinsert then IBTable5.FieldByName('KOD').AsInteger:=-1;
end;

procedure TDM.IBTable5AfterPost(DataSet: TDataSet);
begin
ibtable5.Close;    ibtable5.open;       ibtable5.Last;
end;

procedure TDM.IBTable1BeforePost(DataSet: TDataSet);
begin
if ibtable1.fieldbyname('K4').AsString='' then begin
    MessageDlg('Введитеномервоинскойчасти',mterror,[mbok],0);
    ibtable1.fieldbyname('K4').FocusControl;
    abort;
end;
if ibtable1.fieldbyname('SerNo').AsString='' then begin
    MessageDlg('Введитесерийныйномераппарата!',mterror,[mbok],0);
    ibtable1.fieldbyname('SerNo').FocusControl;
    abort;
end;
if ibtable1.fieldbyname('K3').AsString='' then begin
    MessageDlg('Введитемодельаппарата!',mterror,[mbok],0);
    ibtable1.fieldbyname('K3').FocusControl;
    abort;
end;
    if ibtable1.State=dsinsert then IBTable1.FieldByName('KOD5').AsInteger:=-1;
end;

procedure TDM.IBTable1AfterPost(DataSet: TDataSet);
begin
ibtable1.Close;    ibtable1.open;       ibtable1.Last;
end;

procedure TDM.DataModuleCreate(Sender: TObject);
var
Inii: TIniFile;
str:ansistring;
begin
Inii := TIniFile.Create(getcurrentdir+'del.ini');
try
   str:=Inii.ReadString( 'Baza', 'Put', '');
   ibdatabase1.databaseName:=str;
   IBDatabase1.Connected:=true;
   IBTransaction1.Active:=true;
   IBTable1.Active:=true;
   IBTable2.Active:=true;
   IBTable3.Active:=true;
   IBTable4.Active:=true;
   IBTable5.Active:=true;
   IBTable44.Active:=true;
finally
    inii.Free;
end;
end;

end.

unit Unit4;


interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, StdCtrls, ExtCtrls, DBCtrls, Buttons;

type
TSvazka = class(TForm)
    DBGrid1: TDBGrid;
    DBGrid2: TDBGrid;
    DBGrid3: TDBGrid;
    DBNavigator1: TDBNavigator;
    DBNavigator2: TDBNavigator;
    DBNavigator3: TDBNavigator;
    Check: TCheckBox;
    C1: TCheckBox;
    C2: TCheckBox;
    C3: TCheckBox;
    SpeedButton2: TSpeedButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure CheckClick(Sender: TObject);
    procedure C3Click(Sender: TObject);
    procedure C2Click(Sender: TObject);
    procedure C1Click(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Svazka: TSvazka;

implementation

uses Unit3, Unit10;

{$R *.dfm}

procedure TSvazka.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(Svazka.Handle, SW_HIDE);
action:=canone;
dm.IBTable44.Close;     dm.IBTable44.Open;
end;

procedure TSvazka.CheckClick(Sender: TObject);
begin
if check.Checked then begin
    svazka.Caption:='Редактированиесвязанныхтаблиц: Раздел->Наименование->Модель';
    dm.IBTable3.active:=false;
    dm.IBTable4.active:=false;
    dm.IBTable3.IndexFieldNames:='K1';
   dm.IBTable3.MasterSource:=dm.DataSource2;
    dm.IBTable4.IndexFieldNames:='K2';
    dm.IBTable4.MasterSource:=dm.DataSource3;
    dm.IBTable3.active:=true;
    dm.IBTable4.active:=true;
end
else begin
    svazka.Caption:='Редактированиенесвязанныхтаблиц';
    dm.IBTable3.MasterSource:=nil;
    dm.IBTable3.IndexFieldNames:='NAIM';
    dm.IBTable4.MasterSource:=nil;
    dm.IBTable4.IndexFieldNames:='MODEL';
end;
end;

procedure TSvazka.C3Click(Sender: TObject);
begin
if c3.Checked then begin
c2.Checked:=false;
c1.Checked:=false;
end;
end;

procedure TSvazka.C2Click(Sender: TObject);
begin
if c2.Checked then begin
c3.Checked:=false;
c1.Checked:=false;
end;
end;

procedure TSvazka.C1Click(Sender: TObject);
begin
if c1.Checked then begin
c2.Checked:=false;
c3.Checked:=false;
end;
end;

procedure TSvazka.SpeedButton2Click(Sender: TObject);
begin
with dm do begin
    Zapr3.Active:=false;
    zapr3.SQL.Clear;
{
select *
from naimm,modell,chastt,svodka
where     svodka.k3=modell.kod3
and         modell.k2=naimm.kod2
and         naimm.k1=24
and         svodka.k4=chastt.kod
order by vch
}
    zapr3.SQL.Add('select *');
    zapr3.SQL.Add('from naimm,modell,chastt,svodka');
    if c3.Checked then begin
{where     svodka.k3=41
and         modell.kod3=41
and         modell.k2=naimm.kod2
and         svodka.k4=chastt.kod}
      zapr3.SQL.Add('where svodka.k3='+dm.ibtable4.fieldbyname('KOD3').AsString);
      zapr3.SQL.Add('and modell.kod3='+dm.ibtable4.fieldbyname('KOD3').AsString);
      zapr3.SQL.Add('and modell.k2=naimm.kod2');
      zapr3.SQL.Add('and svodka.k4=chastt.kod');
    end
    else if c2.Checked then begin
      zapr3.SQL.Add('where svodka.k3=modell.kod3');
      zapr3.SQL.Add('and naimm.kod2='+dm.ibtable3.fieldbyname('KOD2').AsString);
      zapr3.SQL.Add('and modell.k2='+dm.ibtable3.fieldbyname('KOD2').AsString);
      zapr3.SQL.Add('and svodka.k4=chastt.kod');
    end
    else if c1.Checked then begin
      zapr3.SQL.Add('where svodka.k3=modell.kod3');
      zapr3.SQL.Add('and modell.k2=naimm.kod2');
      zapr3.SQL.Add('and naimm.k1='+dm.ibtable2.fieldbyname('KOD1').AsString);
      zapr3.SQL.Add('and svodka.k4=chastt.kod');
    end;
    zapr3.SQL.Add('and  svodka.k4=chastt.kod');
    zapr3.SQL.Add('order by vch');
    if c1.Checked or c2.Checked or c3.Checked then Zapr3.Active:=true
    else messagedlg('Надовыделитьхотьоднукатегорию!',mtinformation,[mbok],0);
    z3.label2.Caption:=inttostr(zapr3.RecordCount);
end;
    ShowWindow(z3.Handle, SW_SHOW);
    z3.Show;
end;

end.

unit Unit5;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids;

type
TVch = class(TForm)
    DBGrid1: TDBGrid;
    DBNavigator1: TDBNavigator;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Vch: TVch;

implementation

uses Unit2, Unit3;

{$R *.dfm}

procedure TVch.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(vch.Handle, SW_HIDE);
action:=canone;
end;

end.

unit Unit6;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBCtrls, StdCtrls, ExtCtrls, Mask;

type
TFormVvod2 = class(TForm)
    Label1: TLabel;
    DBNavigator1: TDBNavigator;
    DBLookupComboBox1: TDBLookupComboBox;
    Label2: TLabel;
    DBLookupComboBox2: TDBLookupComboBox;
    Label3: TLabel;
    DBEdit1: TDBEdit;
    Bevel1: TBevel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    DBComboBox1: TDBComboBox;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    DBEdit6: TDBEdit;
    DBEdit7: TDBEdit;
    DBEdit8: TDBEdit;
    DBEdit9: TDBEdit;
    DBEdit10: TDBEdit;
    DBEdit11: TDBEdit;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
    { Private declarations }
public
    { Public declarations }
end;

var
FormVvod2: TFormVvod2;

implementation

uses Unit3;

{$R *.dfm}

procedure TFormVvod2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(Formvvod2.Handle, SW_HIDE);
action:=canone;
end;

end.

unit Unit7;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Buttons;

type
TZaprVibr = class(TForm)
    RG: TRadioGroup;
    SpeedButton1: TSpeedButton;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure SpeedButton1Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
ZaprVibr: TZaprVibr;

implementation

uses Unit8, Unit9, Unit4, Unit11, Unit12;

{$R *.dfm}

procedure TZaprVibr.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(Handle, SW_HIDE);
action:=canone;
end;

procedure TZaprVibr.SpeedButton1Click(Sender: TObject);
begin
case rg.ItemIndex of
0:begin
    ShowWindow(z1.Handle, SW_SHOW);
    z1.Show;
end;
1:begin
    ShowWindow(z2.Handle, SW_SHOW);
    z2.Show;
end;
2:begin
svazka.Caption:='Поискзаписейпоразделу, наименованиюилиразделу';
    with svazka do begin
      C1.Visible:=true;       dbgrid1.ReadOnly:=true;
      C2.Visible:=true;       dbgrid2.ReadOnly:=true;
      C3.Visible:=true;       dbgrid3.ReadOnly:=true;
      SpeedButton2.Visible:=true;
    end;
    ShowWindow(Svazka.Handle, SW_SHOW);
    svazka.Show;
end;
3:begin
    ShowWindow(z4.Handle, SW_SHOW);
    z4.Show;
end;
4:begin
    ShowWindow(z5.Handle, SW_SHOW);
    z5.Show;
end;
end;
close;
end;

end.

unit Unit8;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, Buttons, StdCtrls;

type
TZ1 = class(TForm)
    SpeedButton2: TSpeedButton;
    DBGrid1: TDBGrid;
    Ch1: TCheckBox;
    Ch2: TCheckBox;
    Ch3: TCheckBox;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    SpeedButton1: TSpeedButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure SpeedButton2Click(Sender: TObject);
    procedure Ch1Click(Sender: TObject);
    procedure Ch2Click(Sender: TObject);
    procedure Ch3Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure DBGrid1DblClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Z1: TZ1;

implementation

uses Unit3, Unit6;

{$R *.dfm}

procedure TZ1.SpeedButton2Click(Sender: TObject);
begin
with dm do begin
Zapr1.Active:=false;
if ch1.Checked then zapr1.ParamByName('pvch').Value:='%'+edit1.Text+'%'
    else zapr1.ParamByName('pvch').Value:='%%';
if ch2.Checked then zapr1.ParamByName('pserno').Value:='%'+edit2.Text+'%'
    else zapr1.ParamByName('pserno').Value:='%%';
if ch3.Checked then zapr1.ParamByName('pmodel').Value:='%'+edit3.Text+'%'
    else zapr1.ParamByName('pmodel').Value:='%%';
Zapr1.Active:=true;
  label2.Caption:=inttostr(zapr1.RecordCount);
end;
end;

procedure TZ1.Ch1Click(Sender: TObject);
begin
edit1.Enabled:=ch1.Checked;
end;

procedure TZ1.Ch2Click(Sender: TObject);
begin
edit2.Enabled:=ch2.Checked;
end;

procedure TZ1.Ch3Click(Sender: TObject);
begin
edit3.Enabled:=ch3.Checked;
end;

procedure TZ1.SpeedButton1Click(Sender: TObject);
begin
dm.IBTable1.Locate('KOD5',vararrayof([dm.zapr1.FieldByName('kod5').Value]),[]);
ShowWindow(formvvod2.Handle, SW_SHOW);
formvvod2.Show;
end;

procedure TZ1.DBGrid1DblClick(Sender: TObject);
begin
speedbutton1.Click;
end;

procedure TZ1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dm.Zapr1.Active:=false;
ShowWindow(Handle, SW_HIDE);
action:=canone;
end;

end.

unit Unit9;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, Buttons;

type
TZ2 = class(TForm)
    SpeedButton2: TSpeedButton;
    SpeedButton1: TSpeedButton;
    Label1: TLabel;
    Label2: TLabel;
    DBGrid1: TDBGrid;
    Ch1: TCheckBox;
    Ch2: TCheckBox;
    Ch3: TCheckBox;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure SpeedButton2Click(Sender: TObject);
   procedure Ch1Click(Sender: TObject);
    procedure Ch2Click(Sender: TObject);
    procedure Ch3Click(Sender: TObject);
    procedure SpeedButton1Click(Sender: TObject);
    procedure DBGrid1DblClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Z2: TZ2;

implementation

uses Unit3, Unit6;

{$R *.dfm}

procedure TZ2.SpeedButton2Click(Sender: TObject);
begin
with dm do begin
Zapr2.Active:=false;
if ch1.Checked then zapr2.ParamByName('pvch').Value:='%'+edit1.Text+'%'
    else zapr2.ParamByName('pvch').Value:='%%';
if ch2.Checked then zapr2.ParamByName('pserno').Value:='%'+edit2.Text+'%'
    else zapr2.ParamByName('pserno').Value:='%%';
if ch3.Checked then zapr2.ParamByName('pmodel').Value:='%'+edit3.Text+'%'
    else zapr2.ParamByName('pmodel').Value:='%%';
Zapr2.Active:=true;
  label2.Caption:=inttostr(zapr2.RecordCount);
end;
end;

procedure TZ2.Ch1Click(Sender: TObject);
begin
edit1.Enabled:=ch1.Checked;
end;

procedure TZ2.Ch2Click(Sender: TObject);
begin
edit2.Enabled:=ch2.Checked;
end;

procedure TZ2.Ch3Click(Sender: TObject);
begin
edit3.Enabled:=ch3.Checked;
end;

procedure TZ2.SpeedButton1Click(Sender: TObject);
begin
dm.IBTable1.Locate('KOD5',vararrayof([dm.zapr1.FieldByName('kod5').Value]),[]);
ShowWindow(formvvod2.Handle, SW_SHOW);
formvvod2.Show;
end;

procedure TZ2.DBGrid1DblClick(Sender: TObject);
begin
speedbutton1.Click;
end;

procedure TZ2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dm.Zapr2.Active:=false;
ShowWindow(Handle, SW_HIDE);
action:=canone;
end;

end.

unit Unit10;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DBCtrls, StdCtrls, ExtCtrls, Grids, DBGrids, Buttons;

type
TZ3 = class(TForm)
    DBGrid1: TDBGrid;
    Label1: TLabel;
    Label2: TLabel;
    SpeedButton1: TSpeedButton;
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure DBGrid1DblClick(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Z3: TZ3;

implementation

uses Unit3, Unit6;

{$R *.dfm}

procedure TZ3.SpeedButton1Click(Sender: TObject);
begin
dm.IBTable1.Locate('KOD5',vararrayof([dm.zapr3.FieldByName('kod5').Value]),[]);
ShowWindow(formvvod2.Handle, SW_SHOW);
formvvod2.Show;
end;

procedure TZ3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dm.Zapr3.Active:=false;
ShowWindow(Handle, SW_HIDE);
action:=canone;
end;

procedure TZ3.DBGrid1DblClick(Sender: TObject);
begin
speedbutton1.Click;
end;

end.

unit Unit11;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Grids, DBGrids, RpRave, RpDefine, RpCon,
RpConDS;

type
TZ4 = class(TForm)
    DBGrid1: TDBGrid;
    Edit1: TEdit;
    SpeedButton2: TSpeedButton;
    SpeedButton1: TSpeedButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    SpeedButton3: TSpeedButton;
    RvDataSetConnection1: TRvDataSetConnection;
    RvProject1: TRvProject;
    procedure SpeedButton2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure SpeedButton1Click(Sender: TObject);
    procedure DBGrid1DblClick(Sender: TObject);
    procedure SpeedButton3Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Z4: TZ4;

implementation

uses Unit3, Unit6;

{$R *.dfm}

procedure TZ4.SpeedButton2Click(Sender: TObject);
begin
with dm do begin
Zapr4.Active:=false;
zapr4.ParamByName('par').Value:='%'+edit1.text+'%';
Zapr4.Active:=true;
label2.Caption:=inttostr(zapr4.RecordCount);
end;
end;

procedure TZ4.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dm.Zapr4.Active:=false;
ShowWindow(Handle, SW_HIDE);
action:=canone;
end;

procedure TZ4.SpeedButton1Click(Sender: TObject);
begin
dm.IBTable1.Locate('KOD5',vararrayof([dm.zapr4.FieldByName('kod5').Value]),[]);
ShowWindow(formvvod2.Handle, SW_SHOW);
formvvod2.Show;
end;

procedure TZ4.DBGrid1DblClick(Sender: TObject);
begin
speedbutton1.Click;
end;

procedure TZ4.SpeedButton3Click(Sender: TObject);
begin
rvproject1.Execute;
end;

end.

unit Unit12;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, Grids, DBGrids, StdCtrls;

type
TZ5 = class(TForm)
    SpeedButton2: TSpeedButton;
    DBGrid1: TDBGrid;
    Label1: TLabel;
    Label2: TLabel;
    procedure SpeedButton2Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Z5: TZ5;

implementation

uses Unit3;

{$R *.dfm}

procedure TZ5.SpeedButton2Click(Sender: TObject);
var fil:ansistring;
begin
with dm do begin
    zapr5.SQL.Clear;
    Zapr5.Active:=false;
    opdial.execute;
    fil:=opdial.filename;
    zapr5.SQL.LoadFromFile(fil);
    try Zapr5.Active:=true;
    except begin
    messagedlg('Ошибкавформате sql запроса',mterror,[mbok],0);
    end;
    end;
    label2.Caption:=inttostr(zapr5.RecordCount);
end;
end;

procedure TZ5.FormClose(Sender: TObject; var Action: TCloseAction);
begin
dm.Zapr5.Active:=false;
ShowWindow(Handle, SW_HIDE);
action:=canone;
end;

end.

unit Unit13;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls;

type
TAvtor = class(TForm)
    Bevel1: TBevel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Image1: TImage;
    Label6: TLabel;
    procedure FormClick(Sender: TObject);
    procedure Image1Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
    { Private declarations }
public
    { Public declarations }
end;

var
Avtor: TAvtor;

implementation

{$R *.dfm}

procedure TAvtor.FormClick(Sender: TObject);
begin
close;
end;

procedure TAvtor.Image1Click(Sender: TObject);
begin
close;
end;

procedure TAvtor.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(Handle, SW_HIDE);
action:=canone;
end;

end.

unit Unit14;



interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
ToPr = class(TForm)
    Memo1: TMemo;
    procedure Memo1Click(Sender: TObject);
    procedure FormClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
    { Private declarations }
public
    { Public declarations }
end;

var
oPr: ToPr;

implementation

{$R *.dfm}

procedure ToPr.Memo1Click(Sender: TObject);
begin
close;
end;

procedure ToPr.FormClick(Sender: TObject);
begin
close;
end;

procedure ToPr.FormClose(Sender: TObject; var Action: TCloseAction);
begin
ShowWindow(Handle, SW_HIDE);
action:=canone;
end;

end.