Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практическое задание типис(лаба5).doc
Скачиваний:
10
Добавлен:
10.11.2018
Размер:
779.26 Кб
Скачать
      1. 7.3.7 Структура, состав и описание модулей программного обеспечения

Прикладная программа создана средствами Delphi 6 и СУБД InterBase 6.0, поддерживающая стандарт SQL-92. Для работы программы необходимо создать таблицы, триггеры, хранимые процедуры и генераторы.

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

Create table BOOK

(isbn varchar(15) not null primary key,

title varchar(100),

authors varchar(50),

place_publish varchar(15),

publisher varchar(50),

year_publish integer check (year_publish between 1960 and 9999),

pags smallint,

cost integer,

spisanie varchar(3) check (spisanie in ("Да","Нет")),

category varchar(11) check (category in("Нет доступа","Низкий","Средний","Высокий")));

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

create table COPY

(inventar_num varchar(15) not null primary key,

isbn varchar(15) not null,

id_reader integer,

whereabouts varchar(30),

date_vid date,

date_vozv date,

spisanie varchar(3) check (spisanie in ("Да","Нет")));

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

create table READER

(id_reader varchar(15) not null primary key,

surname varchar(30),

name varchar(30),

secondname varchar(30),

date_of_born date,

address varchar(50),

work_phone varchar(15),

home_phone varchar(15),

category varchar(7) check (category in ("Низкий","Средний","Высокий","")));

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

create table CATALOG

(id_kw integer not null primary key,

name_kw varchar(30));

create table RELATION

(isbn varchar(15) not null,

id_kw integer not null,

primary key(isbn,id_kw));

Хранимая процедура pCheckBook проверяет наличие книги по заданному isbn, возвращает isbn, если книга найдена, или пустую строку, в противном случае:

create procedure pCheckBook (ip_isbn varchar(15))

returns (op_isbn varchar(15))

as

declare variable num integer;;

begin

op_isbn="";select count(*) from book where isbn=:ip_isbn into num;if (num<>0)

then op_isbn=:ip_isbn;end

Создание для таблицы CATALOG генератора (для таблиц InterBase отсутствуют автоинкрементный тип, обеспечивающий автоматическую установку уникальных значений, для этой цели используются генераторы):

create generator gID_KW;

set generator gID_KW to 6;

Создание триггера для таблицы CATALOG:

create trigger NEW_KW for CATALOG

active

before insert

as

begin

NEW.ID_KW=GEN_ID(gID_KW,1);;

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

create procedure pID_KWSearch(ip_name_kw varchar(30))

returns (op_id_kw integer)

as

begin

select id_kw from Catalog where name_kw= :ip_name_kw

into :op_id_kw;;

end;end;

Создание хранимой процедуры, которая проверяет возможность списания книги:

create procedure prov_spisanie (ip_isbn varchar(15))

returns (op_num integer)

as

begin

select count(*) from COPY where (isbn=:ip_isbn) and (id_reader is not null)

into op_num;;

end;

Создание триггера, который при удалении книги удаляет все экземпляры и связи с областями знаний:

create trigger DeleteBook for BOOK

active

after delete

as

begin

delete from COPY where COPY.isbn=BOOK.isbn;;

delete from RELATION where RELATION.isbn=BOOK.isbn;end;

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

create procedure

prov_reader (ip_idreader varchar(15))

returns (op_idreader varchar(15))

as

declare variable r integer;;

begin

select count(*) from reader where id_reader=:ip_idreader into r;if(r=1) then op_idreader=:ip_idreader; else op_idreader="";end;

Создание хранимой процедуры, которая выводит количество книг у читателя:

create procedure

book_reader (ip_idreader varchar(15))

returns (op_count integer)

as

begin

select count(*) from copy where id_reader=:ip_idreader into :op_count;;end;

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

create procedure pCheckCopy (ip_inv varchar(15))

returns (op_inv varchar(15))

as

declare variable num integer;;

begin

op_inv="";select count(*) from copy where (inventar_num=:ip_inv) and (id_reader is not null) into num;if (num<>0)

then op_inv=:ip_inv;end

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

create procedure

Dolg (ip_inv varchar(15),cur_dat date)

returns (op_daycount integer)

as

declare variable dat date;;

begin

select date_vozv from COPY where inventar_num=:ip_inv into dat;if(dat>=cur_dat) then op_daycount=0; else op_daycount=cur_dat-dat;end;

Создание хранимой процедуры, которая осуществляет поиск читателя по личным данным:

create procedure

prov_reader_po_fam (ip_fam varchar(30), ip_name varchar(30), ip_otch varchar(30), ip_data_rozhd timestamp)

returns (op_idreader varchar(15))

as

declare variable r integer;;

begin

select id_reader from reader where (surname=:ip_fam)

and (name=:ip_name) and (secondname=:ip_otch) and (date_of_born=:ip_data_rozhd)

into op_idreader;end

В данном учебном пособии приводится описание двух модулей программного обеспечения, обеспечивающих решение задачи Z121 (Регистрация читателя). Она разбивается на две подзадачи. Первую подзадачу Z1211 реализует процедура SearchReader. Ее входные параметры nom_chit, fam, name, otch, data_rozhd соответствуют атрибутам номер читательского билета, фамилия читателя, имя читателя, отчество читателя, дата рождения читателя соответственно.

function TForm1.SearchReader(nom_chit,fam,name,otch: string; data_rozhd: tdate): string;

var result1: string;

begin

if nom_chit<>''

then begin //поиск читателя по читательскому билету

Datamodule2.pProv_reader.ParamByName('ip_idreader').Value:=nom_chit;

Datamodule2.pProv_reader.Prepare;

Datamodule2.pProv_reader.ExecProc;

result1:=Datamodule2.pProv_reader.ParamByName('op_idreader').Value;

end

else begin //поиск читателя по личным данным

Datamodule2.pReaderPoFam.ParamByName('ip_fam').Value:=fam;

Datamodule2.pReaderPoFam.ParamByName('ip_name').Value:=name;

Datamodule2.pReaderPoFam.ParamByName('ip_otch').Value:=otch;

Datamodule2.pReaderPoFam.ParamByName('ip_data_rozhd').Value:=data_rozhd;

Datamodule2.pReaderPoFam.Prepare;

Datamodule2.pReaderPoFam.ExecProc;

result1:=Datamodule2.pReaderPoFam.ParamByName('op_idreader').Value;

end;

if result1<>'' then result:=result1 else result:='';

end;

Вторую подзадачу Z1212 реализует процедура Add_Reader. Входными параметрами которой являются: номер читательского билета, фамилия читателя, имя читателя, отчество читателя, дата рождения читателя, адрес читателя, рабочий телефон читателя, домашний телефон читателя, уровень доступа читателя. Все эти параметры вводит пользователь с клавиатуры в поля, расположенные на форме «Регистрация читателя» (Рисунок 7.14.).

procedure TForm17.Add_Reader();

var tmp_id: string;

begin

tmp_id:=Datamodule2.IBQueryREADER.FieldValues['id_reader'];

Datamodule2.IBQueryREADER.Post;

Datamodule2.IBQueryReaderSave;

Form17.initform;

end;

Схема взаимодействия двух подзадач Z1211 и Z1212 показана на рисунке 7.24 и реализуется в виде управляющего модуля, соответствующего задаче Z121.

Управляющая процедура, соответствующая задаче Z121, выглядит следующим образом:

procedure Main_ Z121()

var nom_chit, fam, name, otch: string;

data_rozhd: date;

address, home_phone, work_phone, category: string;

begin

Readln(nom_chit, fam, name, otch, data_rozhd);

nom_chit:=SearchReader(nom_chit, fam, name, otch, data_rozhd);

if nom_chit=’’ then writeln(“Читатель уже зарегистрирован”)

else

begin

Readln(fam, name, otch, data_rozhd, address, home_phone, work_phone, category);

AddReader(nom_chit, fam, name, otch, data_rozhd, address, home_phone, work_phone,

category);

end;

end;