Файл: Задачи автоматизации и характеристика существующих бизнес процессов.pdf
Добавлен: 20.05.2023
Просмотров: 448
Скачиваний: 3
СОДЕРЖАНИЕ
Глава 1. Исследование предметной области и предприятия
1.1. Характеристика предприятия и его деятельности
1.2. Организационная структура управления предприятием
1.3. Выбор комплекса задач автоматизации и характеристика существующих бизнес процессов
Глава 2. Информационное обеспечение задачи
2.1. Информационная модель и ее описание
2.2. Используемые классификаторы и системы кодирования
2.3. Характеристика нормативно-справочной, входной и оперативной информации
2.4. Характеристика результатной информации
Глава 3. Программное обеспечение задачи
3.1. Общие положения (дерево функций и сценарий диалога)
3.3. Структурная схема пакета (дерево вызова программных модулей)
Рисунок 3.5. Таблица "Зал"
Особенностью данной таблицы является наличие поля счетчика "Kod_ADO". Оно не является необходимым для базы данных, но наличие ключа в таблицы является требованием технологии ADO, поэтому формальное присутствие данного поля является необходимостью. Таблица характерна большим числом полей. Каждое кресло в зале отражается полем в таблице "Zal".
3.3. Структурная схема пакета (дерево вызова программных модулей)
Рисунок 3.6. Схема вызовов программных модулей
3.4. Описание программных модулей
ОПИШИТЕ текстом программные модели, а эту схему перенесите в ПРИЛОЖЕНИЕ
Глава 4. Контрольный пример реализации проекта и его описание
ПОДПИСИ ВСЕХ РИСУНКОВ - ШРИФТ VERDANA
У каждого проекта должна быть первая запускаемая форма, которая создается автоматически. Другие формы могут создаваться на этапе выполнения из разработанных классов. В данном проекте формой запуска является frmMDI - основная форма-контейнер. остальные формы запускаются на этапе выполнения.
Рисунок 4.1. Настройка автоматически создаваемых форм в проекте.
На основной форме находится главное меню программы. Именно из него создаются экземпляры объектов из созданных классов на этапе разработки приложения. Например, окно "Мероприятия" создается с помощью такой процедуры:
procedure TfrmMDI.mSpekClick(Sender: TObject);
begin
Application.CreateForm(TfrmSpek,frmSpek);
end;
С помощью этой команды создается объект frmSpek из класса TfrmSpek. После создания объект-форма становится автоматически видимой и метод show в данном случае применять не нужно. Остальные формы вызываются аналогичным образом.
Рисунок 4.2. Основное меню на этапе разработки.
На основной форме имеются два графических объекта, рисунок в которые загружается в событии onCreate, когда происходит создание формы:
procedure TfrmMDI.FormCreate(Sender: TObject);
begin
frmMDI.mSpek.visible:=false; // Прячем меню
frmMDI.mSean.visible:=false;
frmMDI.mZal.visible:=false;
frmMDI.mAdm.visible:=false;
frmMDI.mVih.visible:=false;
TekPapka:=getcurrentdir; //Путь к текущей папке
PathBD:=getcurrentdir+'\BD\Teatr.mdb';
Application.Icon.LoadFromFile(TekPapka+'\Draws\application.ico');
img_Zal.Picture.LoadFromFile(TekPapka+'\Draws\Zal.png');
imgVihod.Picture.LoadFromFile(TekPapka+'\Draws\Vihod.png');
imgVihod.Top:=0;
imgVihod.Left:=frmMDI.Width - 100; //ставим кнопку выхода справа
end;
В этой процедуре так же определяется путь к текущей папке, который заносится в строковую переменную глобального типа для ее дальнейшего использования в приложении.
Так же при создании главной формы необходимо спрятать все пункты меню, ведь неизвестно, будет ли осуществлен вход под записью администратора или под записью пользователя.
После события onCreate наступает событие onShow, которое показывает созданную форму. В обработчике этого события создаем окно для ввода логина и пароля
procedure TfrmMDI.FormShow(Sender: TObject);
begin
Application.CreateForm(TfrmLogPass,frmLogPass);
end;
Рисунок 4.3. Форма авторизации с установленным на ней компонентом TQuery.
Форма авторизации содержит два поля, которые связаны с полями базы данных. Поле "Логин" представляет из себя поле с раскрывающимся списком. Чтобы не допустить ошибок ввода информация в нем доступна только для чтения, то есть, можно только выбирать мышью.
Для доступа к данным таблицы используется компонент TQuery. В обработчике события OnCreate записывается строка подключения к базе данных:
procedure TfrmLogPass.FormCreate(Sender: TObject);
var
KolZap: integer;
TekZap: integer;
i: integer; // Счетчик
begin
//Подключаемся к Таблице LogPass
adoLogPass.Close;
adoLogPass.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;
Data Source='''+PathBD+'''';
adoLogPass.SQL.Clear;
adoLogPass.SQL.add('SELECT * FROM LogPass');
adoLogPass.Active:=true;
//Заполняем логинами раскрывающийся список
cboLogin.Clear;
KolZap:=adoLogPass.RecordCount;
adoLogPass.First;
TekZap:=adoLogPass.RecNo;
for i:=TekZap to KolZap do
begin
cboLogin.Items.Add(adoLogPass.fieldbyname('Login').AsString);
adoLogPass.Next;
end;
end;
После подключения к таблице заполняется свойство SQL этого объекта. В нем пишется команда выбора данных SELECT. Так же в процедуре используется счетчик для заполнения раскрывающегося списка всеми значениями, которые есть в таблице, в соответствующем поле.
Процедура onClick кнопки "Вход" проверяет какой логин и пароль были введены в поле. И, если был осуществлен вход под системной записью администратора, то показывается все меню. если был выполнен вход под учетной записью пользователя, то показывается только меню "Схема зала" и "Выход".
procedure TfrmLogPass.cmdVhodClick(Sender: TObject);
var
cLogin: String; //Содержит в себе выбранный пользователем логин
cPassword: String; //Содержит введенный пароль
lTip: Boolean;
begin
cLogin:=cboLogin.Text;
cPassword:=trim(txtPassword.Text);
//Проверяем пароль на истинность
adoLogPass.First;//Ставим указатель на первую запись таблицы
adoLogPass.Locate('Login', cLogin,[]);// Находим в таблице запись с выбранным логином
lTip:=adoLogPass.fieldbyname('Status').AsBoolean; //Считываем текущий статус логина
if adoLogPass.fieldbyname('Password').AsString = cPassword then //Если пароль совпадает с введенным, то
begin
if lTip=true then //Если найденный логин является администратором, то
begin // Показываем все меню
Admin_User:='Admin';
frmMDI.mSpek.visible:=true;
frmMDI.mSean.visible:=true;
frmMDI.mZal.visible:=true;
frmMDI.mAdm.visible:=true;
frmMDI.mVih.visible:=true;
end
else //Иначе скрываем пункты Мероприятия, Сеансы и Администрирование
begin
Admin_User:='User';
frmMDI.mSpek.visible:=false;
frmMDI.mSean.visible:=false;
frmMDI.mZal.visible:=true;
frmMDI.mAdm.visible:=false;
frmMDI.mVih.visible:=true;
end;
frmLogPass.close; //Закрываем форму логина/пароля
end else //Иначе
begin
showmessage('Пароль не верный! Обратитесь к администратору системы!');
end;
end;
После входа необходимо заполнить данные о мероприятиях.
Рисунок 4.4. Форма "Мероприятия"
Поля формы "Мероприятия" аналогичным образом связываются с таблицей БД через набор данных. Подключение набора данных к таблице происходит так же в обработчике события onCreate. Для того, чтобы можно было добавить или удалить афишу с поля, на форме присутствуют две одноименные кнопки. Процедура загрузки рисунка в компонент TImage выглядит следующим образом:
procedure TfrmSpek.cmd_Load_AfishaClick(Sender: TObject);
var
jpg: TJPEGImage;
bmp: TBitmap;
begin
//if openpicturedialog1.Execute then
//dbimage1.Picture.LoadFromFile(openpicturedialog1.filename);
if OpenpictureDialog1.Execute then
begin
jpg := TJPEGImage.Create;
bmp := TBitmap.Create;
try
jpg.LoadFromFile(OpenpictureDialog1.FileName);
bmp.Assign(jpg);
ADOSpek.Edit;
ADOSpek.FieldByName('Afisha_Spek').Assign(bmp);
ADOSpek.Post;
finally
jpg.Free;
bmp.Free;
end;
end;
end;
Поскольку этот компонент может работать только с файлами формата BMP, а для удобства нужен формат JPEG, то в данной процедуре происходит "отождествление" этих форматов.
Процедура кнопки удалить афишу:
procedure TfrmSpek.Button9Click(Sender: TObject);
begin
ADOSpek.Edit;
ADOSpek.FieldByName('Afisha_Spek').asvariant:=Null;
ADOSpek.Post;
end;
Для добавления записи используется кнопка "Добавить":
procedure TfrmSpek.cmdDobClick(Sender: TObject);
begin
ADOSpek.append; //Добавляем запись в набор данных
txtName_Spek.SetFocus;//Устанавливаем фокус на первое поле
end;
Процедура кнопки сохранить проверяет ,если набор данных находится в режиме вставки или редактирования, то сохраняем запись в наборе данных и выводим число всех записей в таблице и номер текущей записи.
procedure TfrmSpek.Button7Click(Sender: TObject);
begin
if txtName_Spek.text='' then
showmessage('Не указано наименование спектакля!')
else
try
if (ADOSpek.state=dsedit) or (ADOSpek.State=dsinsert) then ADOSpek.post;
lblKol.Caption:='Всего записей: '+inttostr(ADOSpek.RecordCount);//Считываем количество записей в таблице
lblTek.Caption:='Текущая запись: '+inttostr(ADOSpek.recno);//Считываем номер текущей записи
except
//showmessage('Заготовка под возможный код ошибки');
end;
end;
Подобным образом работаю кнопки "Удалить" и кнопки навигации по записям. Только в каждой из них используется свой метод.
В нижней части окна имеется блок с поиском записей.
Процедура кнопки фильтр:
procedure TfrmSpek.cmdFilterClick(Sender: TObject);
begin
if rbName.Checked=true then
begin;
adoSpek.close;
adoSpek.SQL.Clear;
//Отбираем записи, которые содержат символы, введенные в поле Наименование
adoSpek.SQL.add('SELECT * FROM Spek WHERE Name_Spek like ''%'+txtName_Spek_Poisk.text+'%''');
adoSpek.Open;
lblKol.Caption:='Всего записей: '+inttostr(adoSpek.RecordCount);//Считываем количество записей в таблице
lblTek.Caption:='Текущая запись: '+inttostr(adoSpek.recno);//Считываем номер текущей записи
end;
if rbOpis.Checked=true then
begin;
adoSpek.close;
adoSpek.SQL.Clear;
//Отбираем записи, которые содержат символы, введенные в поле Описание
adoSpek.SQL.add('SELECT * FROM Spek WHERE Opis_Spek like ''%'+txtOpis_Spek_Poisk.text+'%''');
adoSpek.Open;
lblKol.Caption:='Всего записей: '+inttostr(adoSpek.RecordCount);//Считываем количество записей в таблице
lblTek.Caption:='Текущая запись: '+inttostr(adoSpek.recno);//Считываем номер текущей записи
end;
end;
Фильтр ищет записи по неполному совпадению. За это отвечает оператор like в команде SELECT при отборе записей в набор данных.
В зависимости от того, какой переключатель установлен, поиск осуществляется либо по описанию, либо по наименованию мероприятия.
Кнопка "Все" возвращает набор данных к исходному состоянию:
procedure TfrmSpek.cmdVseClick(Sender: TObject);
begin
adoSpek.Close;
adoSpek.SQL.Clear;
adoSpek.SQL.add('SELECT * FROM Spek');
adoSpek.Open;
//Считываем число записей и номер текущей записи в таблице
lblKol.Caption:='Всего записей: '+inttostr(adoSpek.RecordCount);//Считываем количество записей в таблице
lblTek.Caption:='Текущая запись: '+inttostr(adoSpek.recno);//Считываем номер текущей записи
end;
При закрытии формы происходит событие onClose. В нем необходимо предусмотреть закрытие всех наборов данных, которые открывались при создании формы. Это предотвратит утечку памяти компьютера.
procedure TfrmSpek.FormClose(Sender: TObject; var Action: TCloseAction);
begin
adoSpek.Close;
action:=caFree;
end;
ПО умолчанию формы в Delphi не закрываются, а сворачиваются. Поэтому для их уничтожения из памяти в MDI приложении следует прописывать параметр action:=caFree;
Форма "Сеансы" работает аналогичным образом. Ее особенностью является использование объекта DBGrid для табличного представления данных из полей таблиц.
Рисунок 4.5. Форма "Сеансы"
Следующей основной формой является форма "Схема зала"
Рисунок 4.6. Форма "Схема зала"
На этапе разработки у данной формы видны множества объектов доступа к данным TQuery.
Один объект осуществляет доступ к таблице Zal и связывает каждое кресло формы frmZal с логическим полем таблицы Zal. Состояние True данного поля свидетельствует о том, что кресло занято, False - что свободно.
Запись значения из False в True осуществляется нажатием мышью на кресле и записано в процедуре:
procedure TfrmZal.pMesto_1_1Click(Sender: TObject);
var
nkod_Sean: integer;
begin
try
nkod_Sean:=dbLookup_Name_Sean.keyvalue;
//Переходим к первой записи набора adoZal
adozal.First;
//Ищем запись с кодом сеанса, который выбран в списке сеансов
if adozal.locate('Kod_Sean', nKod_Sean,[]) then
begin
adozal.Edit; //Переводим запись в режим редактирования
//Если место 1_1 фальшь, то устанавливаем его в истину
// и меняем цвет на зеленый.
if adozal.FieldByName('Mesto_1_1').AsBoolean=false then
begin
adozal.FieldByName('Mesto_1_1').AsBoolean:=True;
pMesto_1_1.Color:=clGreen;
end;
adozal.Post;
end;
except
showmessage('Выберите сеанс из списка!');
end;
end;
Такой обработчик прописан у каждого кресла.
Набор данных ADOLookup_Name_Sean служит для заполнения поля "Сеансы". для этого в диспетчере свойств устанавливаются следующие значения:
Рисунок 4.7. Привязка поля списка к набору данных через объект Data Source.
Остальные наборы данных служат для печати билета, для вывода афиши и подсчета статистики.
Ниже приведен фрагмент кода кнопки "обновить статистику"
procedure TfrmZal.cmd_Obn_StatClick(Sender: TObject);
var
iStetchik: integer;
iProd: integer; //Число проданных билетов
nkod_Sean: integer; //Код сеанса
iRad: integer;
iMesto: integer;
sRad: string;
sMesto: string;
sMestoPolnoe: string;
begin
nkod_Sean:=dbLookup_Name_Sean.keyvalue;