Файл: Проектирование реализации операций бизнес- процесса «Движение библиотечного фонда».pdf
Добавлен: 26.05.2023
Просмотров: 339
Скачиваний: 3
СОДЕРЖАНИЕ
1. Характеристика комплекса задач
1.1. Выбор комплекса задач автоматизации
1.2. Характеристика существующих бизнес –процессов
1.3. Характеристика документооборота, возникающего при решении задачи
1.4. Обоснование проектных решений
1.5. Обоснование проектных решений по программному обеспечению
2 глава. ПРОЕКТНАЯ ЧАСТЬ Информационное обеспечение задачи
2.1. Информационная модель и её описание
2.2. Характеристика нормативно-справочной, входной и оперативной информации
2.3. Характеристика результатной информации
2.4. Программное обеспечение задачи
Приложение 1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBTables, StdCtrls, Mask,
ComCtrls, Menus,ShellAPI,DateUtils,IniFiles;
type
TForm1 = class(TForm)
DBGrid1: TDBGrid;
DataSource1: TDataSource;
Table1: TTable;
Button1: TButton;
Button2: TButton;
Edit2: TEdit;
Edit3: TEdit;
Button3: TButton;
Button4: TButton;
Button5: TButton;
DataSource2: TDataSource;
Table2: TTable;
DBGrid2: TDBGrid;
Button6: TButton;
MaskEdit3: TMaskEdit;
MaskEdit4: TMaskEdit;
Button7: TButton;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
DataSource3: TDataSource;
Table3: TTable;
Button8: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
DBGrid3: TDBGrid;
MainMenu1: TMainMenu;
Options1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
Button9: TButton;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure Button9Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N8Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
i:integer;
implementation
uses Unit2, Unit3;
{$R *.dfm}
function ReadIni(ASection, AString : String) : String;
var //Функция чтения данных из INI файла
sIniFile: TIniFile;
sPath : String[60];
const
S = 'xyz'; { стандартная строка для выдачи ошибок чтения }
begin
sPath:={'c:\Library_DB'}ExtractFileDir(Application.ExeName);
sIniFile := TIniFile.Create(sPath + '\Options.INI');
Result := sIniFile.ReadString(ASection, AString, S); { [Section] String=Value }
sIniFile.Free;
end;
procedure WriteIni(ASection, AString, AValue : String);
var //Процедура записи данных в INI файл
sIniFile: TIniFile;
sPath : String[60];
begin
sPath:={'c:\Library_DB'}ExtractFileDir(Application.ExeName);
sIniFile := TIniFile.Create(sPath + '\Options.INI');
sIniFile.WriteString(ASection, AString, AValue);; { [Section] String=Value }
sIniFile.Free;
end;
procedure TForm1.FormCreate(Sender: TObject);
var t3:Longint;
begin
t3:=GetTickCount div 1000; //Вркмя показа заставки
while (GetTickCount div 1000)<t3+3 do;
//Подключение таблиц и их активизация
Table1.DatabaseName:=ExtractFileDir(Application.ExeName){'c:\Library_DB'}+'\DB\';
Table1.TableName:='DB_Books.db';
Table2.DatabaseName:=ExtractFileDir(Application.ExeName){'c:\Library_DB'}+'\DB\';
Table2.TableName:='DB_Readers.db';
Table3.DatabaseName:=ExtractFileDir(Application.ExeName){'c:\Library_DB'}+'\DB\';
Table3.TableName:='DB_Out.db';
Table1.Active:=true;
Table2.Active:=true;
Table3.IndexName:='qqq'; //Связывание таблиц
Table3.IndexFieldNames:='Number_R';
Table3.MasterFields:='Number';
Table3.Active:=true;
RadioButton1.Checked:=true;
//Установки для отображения таблиц
DBGrid1.Columns.Items[1].Width:=200;
DBGrid1.Columns.Items[2].Width:=200;
DBGrid1.Columns.Items[3].Width:=200;
DBGrid1.Columns.Items[4].Width:=70;
DBGrid2.Columns.Items[1].Width:=200;
DBGrid2.Columns.Items[2].Width:=200;
DBGrid3.Columns.Items[0].Width:=75;
DBGrid3.Columns.Items[1].Visible:=false;
DBGrid3.Columns.Items[2].Width:=200;
DBGrid3.Columns.Items[3].Width:=80;
DBGrid3.Columns.Items[4].Width:=85;
DBGrid3.Columns.Items[5].Width:=85;
DBGrid1.Columns[0].Title.Caption:='Номер';
DBGrid1.Columns[1].Title.Caption:='Название';
DBGrid1.Columns[2].Title.Caption:='Автор';
DBGrid1.Columns[3].Title.Caption:='Издательство';
DBGrid1.Columns[4].Title.Caption:='Год издания';
DBGrid2.Columns[0].Title.Caption:='Номер';
DBGrid2.Columns[1].Title.Caption:='Ф.И.О';
DBGrid2.Columns[2].Title.Caption:='Адрес';
DBGrid2.Columns[3].Title.Caption:='Телефон';
DBGrid3.Columns[0].Title.Caption:='Номер книги';
DBGrid3.Columns[2].Title.Caption:='Название';
DBGrid3.Columns[3].Title.Caption:='Дата выдачи';
DBGrid3.Columns[4].Title.Caption:='Дата возврата';
DBGrid3.Columns[5].Title.Caption:='Сумма штрафа';
Button9.Click; //Пересчет и заполнение поля Fine
CreateDir(ExtractFileDir(Application.ExeName)+'\Temp');
end;
procedure TForm1.Button1Click(Sender: TObject);
begin //Удаление записей из таблицы DB_Books.db (Table1)
if Table1.RecordCount>0 then
if MessageDlg('Удалить запись о данной книге?',mtWarning,[mbYes,mbNo],0)= mrYes then
Table1.Delete
else Abort;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin//Вызов формы для заполнения данных о новой книге
Form2.WindowState:=wsNormal;
Form2.Show;
Form2.Button2.Visible:=false;
Form2.Button1.Visible:=true;
Form2.Button3.Visible:=false;
Form2.Caption:='Добавление книги в каталог';
end;
procedure TForm1.Button4Click(Sender: TObject);
begin //Дабавление данных о новом читателе
if RadioButton2.Checked=true then Abort;
if (trim(MaskEdit3.Text)<>'') and (trim(Edit2.Text)<>'') and (trim(Edit3.Text)<>'') then
begin
if Form1.Table2.Locate('Number',trim(MaskEdit3.Text),[])=true then
begin
MessageDlg('Билет с таким номером уже существует!',mtError,[mbOK],0);
Abort;
end;
if Form1.Table2.Locate('FNP',trim(MaskEdit3.Text),[])=true then
begin
MessageDlg('Читатель с такой фамилией уже зарегестрироан',mtInformation,[mbOK],0);
Abort;
end;
Form1.Table2.Insert;
Form1.Table2.FieldByName('Number').AsInteger:=strtoint(trim(MaskEdit3.Text));
Form1.Table2.FieldByName('FNP').AsString:=trim(Edit2.Text);
Form1.Table2.FieldByName('Adress').AsString:=trim(Edit3.Text);
if trim(MaskEdit4.Text)<>'' then Form1.Table2.FieldByName('Phone').AsInteger:=strtoint(trim(MaskEdit4.Text));
Form1.Table2.Post;
end
else MessageDlg('Заполните необходимые поля!',mtInformation,[mbOK],0);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin //Поиск читателя по введенным реквизитам
if trim(MaskEdit3.Text)<>'' then
begin
Form1.Table2.Locate('Number',trim(MaskEdit3.Text),[loPartialKey]);
Abort;
end;
if trim(Edit2.Text)<>'' then
begin
Form1.Table2.FilterOptions:=[foCaseInsensitive];
Form1.Table2.Filter:='FNP = '''+trim(Edit2.Text)+'*''';
Form1.Table2.Filtered:=true;
end;
if trim(Edit2.Text)='' then Form1.Table2.Filtered:=false;
if trim(Edit3.Text)<>'' then
begin
Form1.Table2.Locate('Adress',trim(Edit3.Text),[loPartialKey,loCaseInsensitive ]);
Abort;
end;
if trim(MaskEdit4.Text)<>'' then
begin
Form1.Table2.Locate('Phone',trim(MaskEdit4.Text),[loPartialKey]);
Abort;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin //Удаление записи о читателе (Table2) и
//каскадное удаление всех подчиненных записей из Table3
if (RadioButton1.Checked=true) and (Table2.RecordCount>0) then
if MessageDlg('Удалить запись о данном читателе?',mtWarning,[mbYes,mbNo],0)= mrYes then
begin
Table3.First;
for i:=1 to Table3.RecordCount do
begin
Table3.Delete;
Table3.Next;
end;
Table2.Delete
end
else Abort;
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
begin//Показ таблицы "Список читателей"
DBGrid2.Visible:=true;
DBGrid3.Visible:=false;
Label5.Caption:='Список читателей';
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
begin//Показ списка книг взятых указанным читателем
DBGrid2.Visible:=false;
DBGrid3.Visible:=true;
Label5.Caption:='Читатель: '+Form1.Table2.FieldByName('FNP').AsString+'. Список взятых книг:';
end;
procedure TForm1.Button6Click(Sender: TObject);
begin//Показ Form3 для заполнения ее
//полей редактирования
if RadioButton2.Checked=true then
begin
Form3.WindowState:=wsNormal;
Form3.Show;
Form3.Button1.Visible:=true;
Form3.Button2.Visible:=false;
Form3.Caption:='Заполнение карточки читателя';
end;
end;
procedure TForm1.Button8Click(Sender: TObject);
begin //Удаление книги из списка книг взятых
//указанным читателем
if (RadioButton2.Checked=true) and (Table3.RecordCount>0) then
if MessageDlg('Удалить эти данные?',mtWarning,[mbYes,mbNo],0)= mrYes then
Table3.Delete
else Abort;
end;
procedure TForm1.Button7Click(Sender: TObject);
begin //Вызов формы Form2 для поиска книг по имени автора
Form2.WindowState:=wsNormal;
Form2.Show;
Form2.Button2.Visible:=true;
Form2.Button1.Visible:=false;
Form2.Button3.Visible:=false;
Form2.Caption:='Поиск книг';
end;
procedure TForm1.N1Click(Sender: TObject);
var i2,t,i3:integer;HTMLStr: TStringList;
n_r,sh: array [1..100000] of integer;
path:string;
begin
t:=-10; //Первая строчка, первого пункта главного меню
i3:=1; //Вывод на экран списка должников и суммы штрафа
for i2:=1 to i3 do
sh[i2]:=0;
Form1.Table3.IndexName:=''; //Удаление связи таблиц
Form1.Table3.IndexFieldNames:='';
Form1.Table3.MasterFields:='';
Form1.Table3.FilterOptions:=[foCaseInsensitive];
Form1.Table3.Filter:='Fine > 0'; //Установка фильтра
Form1.Table3.Filtered:=true; //Долг>0
Form1.Table3.IndexFieldNames:='Number_r';
Form1.Table3.First;//Просмотр всех записей отфильтрованной
//таблицы и запоминание номеров должников в массив
for i2:=1 to Form1.Table3.RecordCount do
begin
if Form1.Table3.FieldByName('Number_r').AsInteger<>t then
begin
n_r[i3]:=Form1.Table3.FieldByName('Number_r').AsInteger;
t:=n_r[i3]; //Добавление должника в массив
i3:=i3+1;
end;
sh[i3-1]:=sh[i3-1]+Form1.Table3.FieldByName('Fine').AsInteger;
//Сумма штрафа для данного должника
Form1.Table3.Next;
end;
Form1.Table3.Filtered:=false; //Отмена фильтрации
Form1.Table3.IndexName:='qqq'; //и востановление связи таблиц
Form1.Table3.IndexFieldNames:='Number_R';
Form1.Table3.MasterFields:='Number';
HTMLStr:=TStringList.Create;//Создание файла отчета
HTMLStr.Clear; //формат:HTML
HTMLStr.Add('<HTML>');
HTMLStr.Add('<HEAD>');
HTMLStr.Add('<TITLE>'+''+'</TITLE>');
HTMLStr.Add('</HEAD>');
HTMLStr.Add('<H1 align=center> Должники и сумма штрафа на '+datetostr(Date)+'</H1>');
HTMLStr.Add('<table border=1 cellspacing=0 cellpadding=0 width=100%>');
HTMLStr.Add('<tr>');
HTMLStr.Add('<td width=10%>'+'<b>Номер</b>'+'</td>');
HTMLStr.Add('<td width=70%>'+'<b>Ф.И.О</b>'+'</td>');
HTMLStr.Add('<td width=20%>'+'<b>Сумма штрафа</b>'+'</td>');
HTMLStr.Add('</tr>');
for i2:=1 to i3-1 do
begin
Form1.Table2.Locate('Number',n_r[i2],[]);
HTMLStr.Add('<tr>');
HTMLStr.Add('<td>'+inttostr(i2)+'</td>');
HTMLStr.Add('<td>'+Table2.Fields[1].DisplayText+'</td>');
HTMLStr.Add('<td>'+inttostr(sh[i2])+'</td>');
HTMLStr.Add('</tr>');
end;
HTMLStr.Add('</table>');
HTMLStr.Add('</BODY>');
HTMLStr.Add('</HTML>');
path:=ExtractFileDir(Application.ExeName)+'\Temp\Fine.html';
HTMLStr.SaveToFile({'c:\1.html'}path); //Сохранение на жесткий диск
HTMLStr.Free;
ShellExecute(Application.MainForm.Handle,PChar('open'),PChar({'c:\1.html'}path),nil,nil,SW_SHOWNORMAL);
//и вывод на экран
end;
procedure TForm1.N2Click(Sender: TObject);
begin //Вторая строчка, первого пункта главного меню
//Вызов второй формы для поиска читателей, которые
//должны сдать книги в определенную дату
Form3.WindowState:=wsNormal;
Form3.Show;
Form3.Button1.Visible:=false;
Form3.Button2.Visible:=true;
Form3.Caption:='Поиск читателей, которые должны сдать книги в определенную дату';
end;
procedure TForm1.N3Click(Sender: TObject);
begin //Третья строчка, первого пункта главного меню
//Вызов второй формы для
//поиска всех книг определенного автора
Form2.WindowState:=wsNormal;
Form2.Show;
Form2.Button3.Visible:=true;
Form2.Button1.Visible:=false;
Form2.Button2.Visible:=false;
Form2.Caption:='Поиск всех книг определенного автора';
end;
procedure TForm1.Button9Click(Sender: TObject);
var nd,f,i2:integer;
begin //Пересчет суммы штрафа для всех должников
//на сегодняшний день
try
f:=strtoint(ReadIni('Fine','Fine'));
except
MessageDlg('Файл Options.ini не найден',mtError,[mbOK],0);
WriteIni('Fine','Fine',InputBox('Размер штрафа','Введите штраф, взимаемый за один день пользования книгой дольше установленного срока','10'));
end;
Form1.Table3.IndexName:=''; //
Form1.Table3.IndexFieldNames:='';
Form1.Table3.MasterFields:='';
Form1.Table3.First;
for i2:=1 to Form1.Table3.RecordCount do
begin
if strtodate(Form1.Table3.FieldByName('Date_return').AsString)<Date then
begin
nd:=DaysBetween(strtodate(Form1.Table3.FieldByName('Date_return').AsString),Date);
Form1.Table3.Edit;
Form1.Table3.FieldByName('Fine').AsInteger:=nd*f;
Form1.Table3.Post;
end;
Form1.Table3.Next;
end;
Form1.Table3.IndexName:='qqq'; //
Form1.Table3.IndexFieldNames:='Number_R';
Form1.Table3.MasterFields:='Number';
end;
procedure TForm1.N5Click(Sender: TObject);
begin //Изменение размера штрафа
//(запись в INI файл Options.ini)
WriteIni('Fine','Fine',InputBox('Размер штрафа','Введите штраф, взимаемый за один день пользования книгой дольше установленного срока',ReadIni('Fine','Fine')));
end;
procedure TForm1.N7Click(Sender: TObject);
begin
Application.HelpFile:={'c:\Library_DB\'}ExtractFileDir(Application.ExeName)+'\Help_User';
Application.HelpCommand(Help_Contents,0);
end;
procedure TForm1.N8Click(Sender: TObject);
begin
Application.HelpFile:={'c:\Library_DB\'}ExtractFileDir(Application.ExeName)+'\Help_Prog';
Application.HelpCommand(Help_Contents,0);
end;
end.
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Mask, StdCtrls,unit1, DB, DBTables,Printers,ShellAPI;
type
TForm2 = class(TForm)
Edit3: TEdit;
Edit4: TEdit;
MaskEdit1: TMaskEdit;
Edit1: TEdit;
MaskEdit2: TMaskEdit;
Button1: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
implementation
{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin//Добавление новой (записи) книги в базу данных Table1
if (trim(MaskEdit1.Text)<>'') and (trim(Edit1.Text)<>'')
{and (trim(Edit3.Text)<>'') and (trim(Edit4.Text)<>'') and
(trim(MaskEdit2.Text)<>'')} then
begin
if Form1.Table1.Locate('Number',trim(MaskEdit1.Text),[])=true then
begin
MessageDlg('Книга с таким номером уже существует!',mtError,[mbOK],0);
Abort;
end;
Form1.Table1.Insert;
Form1.Table1.FieldByName('Number').AsInteger:=strtoint(trim(MaskEdit1.Text));
Form1.Table1.FieldByName('Title').AsString:=trim(Edit1.Text);
Form1.Table1.FieldByName('Writer').AsString:=trim(Edit3.Text);
Form1.Table1.FieldByName('Publish').AsString:=trim(Edit4.Text);
if (trim(MaskEdit2.Text)<>'') then Form1.Table1.FieldByName('Year').AsInteger:=strtoint(trim(MaskEdit2.Text));
Form1.Table1.Post;
end
else MessageDlg('Заполните необходимые поля!',mtInformation,[mbOK],0);
end;
procedure TForm2.Button2Click(Sender: TObject);
begin //Фильтрация по имени автора
if trim(Edit3.Text)<>'' then
begin
Form1.Table1.FilterOptions:=[foCaseInsensitive];
Form1.Table1.Filter:='Writer = '''+trim(Edit3.Text)+'*''';
Form1.Table1.Filtered:=true;
end;
if trim(Edit3.Text)='' then Form1.Table1.Filtered:=false;
end;
procedure TForm2.Button3Click(Sender: TObject);
var i2:integer;HTMLStr: TStringList;
path:string;
begin //Сохранение в файл и вывод на экран списка всех книг
//указанного автора
if trim(Edit3.Text)='' then
begin
MessageDlg('Введите имя автора!',mtInformation,[mbOK],0);
Abort;
end;
Form1.Table1.FilterOptions:=[foCaseInsensitive];
Form1.Table1.Filter:='Writer = '''+trim(Edit3.Text)+'''' ;
Form1.Table1.Filtered:=true;
if Form1.Table1.RecordCount=0 then
begin
MessageDlg('Не найдена ни одна книга данного автора!',mtInformation,[mbOK],0);
Form1.Table1.Filtered:=false;
Abort;
end;
HTMLStr:=TStringList.Create;//
HTMLStr.Clear;
HTMLStr.Add('<HTML>');
HTMLStr.Add('<HEAD>');
HTMLStr.Add('<TITLE>'+''+'</TITLE>');
HTMLStr.Add('</HEAD>');
HTMLStr.Add('<H1 align=center> Автор: '+ Edit3.Text+'. Cписок книг:'+'</H1>');
HTMLStr.Add('<table border=1 cellspacing=0 cellpadding=0 width=100%>');
HTMLStr.Add('<tr>');
HTMLStr.Add('<td width=10%>'+'<b>Номер</b>'+'</td>');
HTMLStr.Add('<td width=70%>'+'<b>Название</b>'+'</td>');
HTMLStr.Add('</tr>');
for i2:=1 to Form1.Table1.RecordCount do
begin
HTMLStr.Add('<tr>');
HTMLStr.Add('<td>'+inttostr(i2)+'</td>');
HTMLStr.Add('<td>'+Form1.Table1.Fields[1].DisplayText+'</td>');
HTMLStr.Add('</tr>');
Form1.Table1.Next;
end;
HTMLStr.Add('</table>');
HTMLStr.Add('</BODY>');
HTMLStr.Add('</HTML>');
path:=ExtractFileDir(Application.ExeName)+'\Temp\list.html';