- •Задание: Изучить процесс проектирования информационной системы и её процессов «Автоматизация учета получения и выдачи книг в библиотеке». Ответить на поставленные вопросы.
- •Введение
- •Системный анализ предметной области
- •Инфологическая модель предметной области
- •Составление перечня атрибутов предметной области
- •Определение сущностей Агрегация атрибутов в сущности
- •Определение первичных ключей
- •Нормализация сущностей
- •Определение связей
- •Графическое представление сущностей
- •Графическое изображение инфологической модели предметной области
- •Проектирование концептуальной модели предметной области
- •Преобразование сущностей в отношения
- •Установление свойств атрибутов
- •Определение внешних ключей
- •Реализация связей типа «многие-ко-многим»
- •Графическое изображение концептуальной модели предметной области
- •7.3.5 Функциональная спецификация системы
- •7.3.6 Состав и связь интерфейсов интерактивного взаимодействия
- •7.3.6.1 Форма «Библиотека»
- •7.3.6.2 Форма «Регистрация книги»
- •7.3.6.8 Форма «Выписка читателя»
- •7.3.6.9 Форма «Книги читателя»
- •7.3.6.10 Форма «Поиск книги»
- •7.3.6.11 Форма «Просмотр книг по областям знаний»
- •7.3.6.12 Форма «Должники»
- •7.3.6.13 Форма «Назначение штрафов»
- •7.3.6.14 Форма «Формирование акта списания книг»
- •7.3.7 Структура, состав и описание модулей программного обеспечения
- •7.3.8 Заключение
- •8. Библиография
- •Контрольные вопросы
-
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;