Программное и аппаратное обеспечение программы
КУРСОВОЙ ПРОЕКТ
По ПМ. 02 Разработка, внедрение и адаптация программного обеспечения отраслевой направленности.
ТЕМА: «Информационная система кафе»
Содержание
Введение. 4
1. Описание алгоритма программы.. 5
1.1.Элементы формы.. 6
1.2.Входные и выходные данные. 11
1.3.Программное и аппаратное обеспечение программы.. 12
2. Руководство пользователя. 13
Заключение. 14
Список используемой литературы.. 15
Приложение . 16
Введение
В процессе работы предприятий быстрого обслуживания, кафе и др. в течении рабочего времени менеджерам приходится обслуживать большое количество клиентов. Причём в пиковые часы работы на менеджеров ложится повышенная нагрузка, что чревато стрессами и ошибками, которые в свою очередь приводят к подрыву производственного процесса.
Автоматизация части производственного процесса позволит разгрузить менеджеров, исключить ошибки. Позволит получить объективную информацию в плане наличия, цены, состава ингредиентов блюда. Позволит учесть объём и время принятия заказа. Вычислить итоговую сумму.
Для хранения данных о блюдах, заказах, меню и менеджерах целесообразно использовать базу данных. Система управления базами данных MySQL является идеальным решением для малых и средних приложений.
MySQL хранит информацию в отдельных таблицах, а не в одном большом хранилище, благодаря чему достигается высокая производительность и гибкость.
Сервер баз данных MySQL – очень быстрый, надежный и простой в эксплуатации сервер.
Для реализации приложения, с выше описанными возможностями, идеально подходит язык высокого уровня Delphi. Данная среда, располагает широким набором средств визуальной разработки приложений и средствами для работы с базами данных.
Описание алгоритма программы
Программа состоит из трёх форм. На главной форме размещены следующие компоненты:
1. компоненты TDataSetProvider, TClientDataSet, TDataSource для связи с набором данных;
2. пять компонентов TSQLQuery с заготовленными запросами к таблицам базы данных;
3. компонент TDBGrid для отображения данных;
4. компонент TDBNavigator для управления данными;
5. компонент TMainMenu для организации главного меню программы, при помощи которого пользователь получает доступ к таблицам и запросам.
Элементы формы
При запуске приложения форма имеет следующий вид:
Рисунок 1 - Главное окно программы
Из визуальных компонентов на ней представлены компонент TDBGrid для отображения данных хранящихся в таблицах или формируемых запросами, компонент TDBNavigator для навигации и управления записями,визуализированными компонентом TDBGrid и компонент TMainMenu содержащий пункты меню для выбора наборов данных и формирования запросов.
Выбор таблицы осуществляется при помощи пункта, главного меню программы «Данные»:
Рисунок 2 - Пункт "Данные", главного меню программы
При выборе пункта меню «Блюда», форма принимает следующий вид:
Рисунок 3 - Главное окно программы, после выбора набора данных "Блюда"
В данном случае, на форме отображаются данные, содержащиеся в таблице «Блюда», а именно название блюда, его вес и состав.
После выбора набора данных, панель навигации приняла активный вид. Ею можно воспользоваться, для управления данными.
При выборе пункта меню «Меню», форма принимает следующий вид:
Рисунок 4 - Главное окно программы, после выбора набора данных "Меню"
В этом случаем на форме отобразить информация о меню, а именно название блюда и цена в рублях.
При добавлении новой записи меню или редактировании существующей записи, открывается окно для ввода данных записи:
Рисунок 5 - Окно ввода данных записи меню
При выборе пункта меню «Заказы», форма принимает следующий вид:
Рисунок 6 - Главное окно программы, после выбора набора данных "Заказы"
В этом случаем на форме отобразится информация о заказах, а именно название блюда, количество, время заказа и фамилия менеджера, оформившего заказ.
Для добавления или редактирования записи таблицы «Заказы» открывается специальное окно:
Рисунок 7 - Окно для добавления/редактирования записи таблицы "Заказы"
При выборе пункта меню «Менеджеры», форма принимает следующий вид:
Рисунок 8 - Главное окно программы, после выбора набора данных "Менеджеры"
В этом случаем на форме отобразить информация о менеджерах, а именно фамилия, имя, отчество и телефон.
Пункт меню «Действия» содержит подпункт «К оплате…», позволяющий сформировать вычисляемый запрос к базе данных. При выборе данного пункта, форма принимает вид:
Рисунок 9 - Главное окно программы, после выбора пункта меню "К оплате..."
Механизм формирования данных для визуализации на форме, отличается от предыдущих. В описанных выше случаях данных просто выбирались из отдельных таблиц, в данном случае данные выбираются из группы таблиц, связанных общим признаком:
procedure TForm1.N9Click(Sender: TObject);
begin
_state := ST_NONE;
Caption := 'Итого';
try
ClientDataSet1.Close;
q.Close;
q.SQL.Text :=
'select orders.id_orders as "Номер заказа", dish.title as "Блюдо", ' +
'orders.cnt as "Количество", menu.price as "Цена", ' +
'(orders.cnt * menu.price) as "Итого" ' +
'from orders ' +
'left join dish on (orders.id_dish = dish.id_dish) ' +
'left join menu on (dish.id_dish = menu.id_dish)' +
'order by orders.id_orders';
q.Open;
q.FieldByName('Цена').AsCurrency;
q.FieldByName('Итого').AsCurrency;
DataSetProvider1.DataSet := q;
ClientDataSet1.Open;
DBGrid1.Columns[1].Width := 200;
except on e:Exception do
MessageBox(0, 'Ошибка запроса "Итого"!', 'Внимание', MB_OK + MB_ICONWARNING);
end;
DBGrid1.Options := DBGrid1.Options - [dgEditing];
end;
При помощи SQLзапроса, данные выбираются из таблиц, связываются, формируется вычисляемое поле.
Расчёт производится по формуле: Количество * Цена за единицу
Входные и выходные данные
В данной программе мы можем производить манипуляции с данными, хранящихся в таблицах базы данных. О блюдах, меню, заказах, и менеджерах, рассчитать итоговые суммы по заказам.
Выходные данные извлекаются из таблиц базы данных и визуализируются при помощи компонента DBGrid на форме.
Выходные данные вводятся с клавиатуры, или выбираются из списков возможных значений, в ячейки, компонента DBGrid на форме.
Программное и аппаратное обеспечение программы
минимальное
Требования для разработчика:
- процессор с тактовой частотой 600 Мгц;
- наличие монитора VGA с разрешением экрана 800x600;
- объём оперативной памяти 128 Мб
- операционная система WindowsXP;
- 5 МБ свободного места на жестком диске.
Руководство пользователя
Для работы в данной программе, необходимо:
1. Запустить исполняемый файл Cafe.exe на компьютере двойным щелчком
левой кнопки мыши. После чего на экране появится окно главной формы.
2. При помощи пункта, главного меню, «Данные» выбрать необходимую
таблицу, данные содержащиеся в таблице отобразятся на форме.
3. Произвести необходимые манипуляции с данными при помощи
навигатора, который активируется при выборе таблицы.
4. При помощи пункта, главного меню, «Действия…» сформировать запрос с
вычислением.
Закрыть программу при помощи пункта, главного меню, «Файл».
Заключение
В данной работе рассмотрен пример создания базы данных, для предприятия быстрого обслуживания, кафе или им подобных.
Изучены возможности языка высокого уровня по созданию и взаимодействию приложения с базой данных.
В разработанной базе данных предусмотрены таблицы для хранения информации о блюдах, меню, заказах и менеджерах.
В качестве системы управления базой данных использована СУБД MySQL, в качестве языка программирования Delphi 2010. Механизмом взаимодействия приложения с базой выбрана технология dbExpress.
Список используемой литературы
1. Давыдов В.Г. Программирование и основы алгоритмизации: учеб. пособие. – М.: Высш. шк., 2003. – 447 с.
2. Сухарев М. Delphi. Полное руководство. Включая версию 2010. – СПб.: Наука и техника, 2010. – 1035 с.
3. Фаронов В.В. Delphi. Программирование на языке высокого уровня: учеб. для вузов. – СПб.: Питер, 2009. – 640 с.
4. Истомин Е.П. Программирование на языках высокого уровня: учеб/ Е.П. Истомин, С.Ю. Неклюдов. – СПб: Изд-во Михайлова В.А., 2003. – 719 с.
5. Бобровский С.И. Delphi 7: Учебный курс. – СПб.: Питер, 2008. – 736 с.
6. Культин Н.Б. Delphi в задачах и примерах. – СПб.: БХВ-Петербург, 2007. – 288 с.
7. Архангельский А.Я. Программирование в Delphi: учебник по классическим версиям Delphi. – М.: Бином, 2008. – 804 с.
8. Фленов М.Е. Библия Delphi. – СПб.: БХВ-Петербург, 2009. – 799с.
9. Голованов М.Е. Создание компонентов в среде Delphi/ М.Е. Голованов, Е.О. Веселов. – БХВ-Петербург, 2004. – 320 с.
10. Фаронов В.В. Паскаль и Windows. - М.:МВТУ-ФЕСТО Дидактик, 1995. – 639 с.
Приложение 1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, ADODB, Grids, DBGrids, Menus, ExtCtrls, DBCtrls,
FMTBcd, DBClient, Provider, SqlExpr,
Mbd_MySql, uMenuRec, uOrderRec;
type
TForm1 = class(TForm)
Button1: TButton;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
Panel1: TPanel;
Panel2: TPanel;
dbNav: TDBNavigator;
N8: TMenuItem;
N9: TMenuItem;
qDish: TSQLQuery;
DataSetProvider1: TDataSetProvider;
ClientDataSet1: TClientDataSet;
qMenu: TSQLQuery;
qDishtitle: TStringField;
qDishweight: TFloatField;
qDishcompos: TStringField;
qDishid_dish: TIntegerField;
qMenuprice: TFloatField;
qMenutitle: TStringField;
qMng: TSQLQuery;
qMngid_manager: TIntegerField;
qMngf: TStringField;
qMngi: TStringField;
qMngo: TStringField;
qMngtel: TStringField;
qMenuid_menu: TIntegerField;
qMenuid_dish: TIntegerField;
qOrders: TSQLQuery;
qOrdersid_orders: TIntegerField;
qOrdersid_dish: TIntegerField;
qOrdersid_manager: TIntegerField;
qOrderscnt: TIntegerField;
qOrderscreated_at: TSQLTimeStampField;
qOrderstitle: TStringField;
qOrdersf: TStringField;
q: TSQLQuery;
procedure N2Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure ClientDataSet1AfterPost(DataSet: TDataSet);
procedure dbNavBeforeAction(Sender: TObject; Button: TNavigateBtn);
private
_state: integer;
_db: TMbd_MySql;
Public
end;
const
ST_NONE = 0;
ST_DISH = 1;
ST_MENU = 2;
ST_MNG = 3;
ST_ORDER = 4;
var
Form1: TForm1;
Implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
_state := ST_NONE;
_db := TMbd_MySql.Create;
_db.PutDoDirDll := ExtractFileDir(Application.ExeName);
_db.ConnectionFile := 'connekt';
end;
procedure TForm1.FormActivate(Sender: TObject);
var
res: Boolean;
begin
res := false;
// подключаемся к БД
try
if _db.ConnectDb('045595112_admin', 'admin') then
begin
//SQLQuery1.SQLConnection := _db.MySqlConnection;
//SQLQuery2.SQLConnection := _db.MySqlConnection;
//qDish.Open;
//qMenu.Open;
q.SQLConnection := _db.MySqlConnection;
qDish.SQLConnection := _db.MySqlConnection;
qMenu.SQLConnection := _db.MySqlConnection;
qOrders.SQLConnection := _db.MySqlConnection;
qMng.SQLConnection := _db.MySqlConnection;
res := true;
end
else
begin
MessageBox(0, 'Не удалось подключиться к базе данных.' + #13#10 + 'Программа будет закрыта.',
'Внимание', MB_ICONEXCLAMATION + MB_OK);
Application.Terminate;
end;
except on e:Exception do
MessageBox(0, 'Ошибка подключения к базе данных.' + #13#10 + 'Программа будет закрыта.',
'Внимание', MB_ICONERROR + MB_OK);
end;
if (not res) then
Close;
end;
procedure TForm1.N2Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.ClientDataSet1AfterPost(DataSet: TDataSet);
begin
if (ClientDataSet1.Active) then
ClientDataSet1.ApplyUpdates(0);
end;
procedure TForm1.dbNavBeforeAction(Sender: TObject; Button: TNavigateBtn);
var
sql: string;
begin
case _state of
ST_NONE: Abort;
ST_MENU:
begin
if (Button = nbInsert) then
begin
FormMenuRec.showNew(_db);
DataSource1.DataSet.Refresh;
Abort;
end;
if (Button = nbEdit) then
begin
with DBGrid1.DataSource.DataSet do
FormMenuRec.showEdit(_db, FieldByName('id_menu').AsInteger,
FieldByName('id_dish').AsInteger, FieldByName('price').AsCurrency);
DataSource1.DataSet.Refresh;
Abort;
end;
if (Button = nbDelete) then
begin
with DBGrid1.DataSource.DataSet do
sql := 'delete from menu where id_menu = ' +
FieldByName('id_menu').AsString;
if (_db.DdlExecute(sql) = 1) then
MessageBox(0, 'Запись успешно удалена.', 'Удаление', MB_ICONINFORMATION + MB_OK)
else
MessageBox(0, 'Не удалось удалить запись.', 'Ошибка', MB_ICONWARNING + MB_OK);
DataSource1.DataSet.Refresh;
Abort;
end;
end;
ST_ORDER:
begin
if (Button = nbInsert) then
begin
FormOrders.showNew(_db);
DataSource1.DataSet.Refresh;
Abort;
end;
if (Button = nbEdit) then
begin
with DBGrid1.DataSource.DataSet do
FormOrders.showEdit(_db, FieldByName('id_orders').AsInteger, FieldByName('id_dish').AsInteger,
FieldByName('id_manager').AsInteger, FieldByName('cnt').AsInteger);
DataSource1.DataSet.Refresh;
Abort;
end;
if (Button = nbDelete) then
begin
with DBGrid1.DataSource.DataSet do
sql := 'delete from orders where id_orders = ' + FieldByName('id_orders').AsString;
if (_db.DdlExecute(sql) = 1) then
MessageBox(0, 'Запись успешно удалена.', 'Удаление', MB_ICONINFORMATION + MB_OK)
else
MessageBox(0, 'Не удалось удалить запись.', 'Ошибка', MB_ICONWARNING + MB_OK);
DataSource1.DataSet.Refresh;
Abort;
end;
end;
end;
end;
{ Вывести таблицу Блюд }
procedure TForm1.N4Click(Sender: TObject);
begin
Caption := 'Блюда';
_state := ST_DISH;
ClientDataSet1.Close;
DataSetProvider1.DataSet := qDish;
ClientDataSet1.Active := true;
DBGrid1.Columns[0].Visible := false;
DBGrid1.Columns[1].Title.Caption := 'Наименование блюда';
DBGrid1.Columns[1].Width := 200;
DBGrid1.Columns[2].Title.Caption := 'Вес (г)';
DBGrid1.Columns[2].Width := 60;
DBGrid1.Columns[3].Title.Caption := 'Состав';
DBGrid1.Columns[3].Width := 400;
DBGrid1.Options := DBGrid1.Options + [dgEditing];
end;
{ вывести меню }
procedure TForm1.N5Click(Sender: TObject);
var
f: TField;
begin
Caption := 'Меню';
_state := ST_MENU;
ClientDataSet1.Close;
DataSetProvider1.DataSet := qMenu;
ClientDataSet1.Open;
DBGrid1.Columns[0].Visible := false;
DBGrid1.Columns[1].Visible := false;
DBGrid1.Columns[2].Title.Caption := 'Название блюда';
DBGrid1.Columns[2].Width := 200;
DBGrid1.Columns[3].Title.Caption := 'Цена (р)';
DBGrid1.Columns[3].Width := 60;
DBGrid1.Columns[3].Field.SetFieldType(ftCurrency);
DBGrid1.Options := DBGrid1.Options - [dgEditing];
end;// заказы
procedure TForm1.N6Click(Sender: TObject);
begin
Caption := 'Заказы';
_state := ST_ORDER;
ClientDataSet1.Close;
DataSetProvider1.DataSet := qOrders;
ClientDataSet1.Open;
DBGrid1.Columns[0].Visible := false;
DBGrid1.Columns[1].Visible := false;
DBGrid1.Columns[2].Visible := false;
DBGrid1.Columns[3].Title.Caption := 'Название блюда';
DBGrid1.Columns[3].Width := 200;
DBGrid1.Columns[4].Title.Caption := 'Кол-во';
DBGrid1.Columns[4].Width := 50;
DBGrid1.Columns[5].Title.Caption := 'Дата создания';
DBGrid1.Columns[5].Width := 120;
DBGrid1.Columns[5].Field.SetFieldType(ftDateTime);
DBGrid1.Columns[6].Title.Caption := 'Менеджер';
DBGrid1.Columns[6].Width := 100;
DBGrid1.Options := DBGrid1.Options - [dgEditing];
end;// менеджеры
procedure TForm1.N7Click(Sender: TObject);
begin
Caption := 'Менеджеры';
_state := ST_MNG;
ClientDataSet1.Close;
DataSetProvider1.DataSet := qMng;
ClientDataSet1.Open;
DBGrid1.Refresh;
DBGrid1.Columns[0].Visible := false;
DBGrid1.Columns[1].Title.Caption := 'Фамилия';
DBGrid1.Columns[1].Width := 200;
DBGrid1.Columns[2].Title.Caption := 'Имя';
DBGrid1.Columns[2].Width := 200;
DBGrid1.Columns[3].Title.Caption := 'Отчество';
DBGrid1.Columns[3].Width := 200;
DBGrid1.Columns[4].Title.Caption := 'Телефон';
DBGrid1.Columns[4].Width := 200;
DBGrid1.Options := DBGrid1.Options + [dgEditing];
end;
procedure TForm1.N9Click(Sender: TObject);
begin
_state := ST_NONE;
Caption := 'Итого';
try
ClientDataSet1.Close;
q.Close;
q.SQL.Text :=
'select orders.id_orders as "Номер заказа", dish.title as "Блюдо", ' +
'orders.cnt as "Количество", menu.price as "Цена", ' +
'(orders.cnt * menu.price) as "Итого" ' +
'from orders ' +
'left join dish on (orders.id_dish = dish.id_dish) ' +
'left join menu on (dish.id_dish = menu.id_dish)' +
'order by orders.id_orders';
q.Open;
q.FieldByName('Цена').AsCurrency;
q.FieldByName('Итого').AsCurrency;
DataSetProvider1.DataSet := q;
ClientDataSet1.Open;
DBGrid1.Columns[1].Width := 200;
except on e:Exception do
MessageBox(0, 'Ошибка запроса "Итого"!', 'Внимание', MB_OK + MB_ICONWARNING);
end;
DBGrid1.Options := DBGrid1.Options - [dgEditing];
end;
end.
Модуль uMenuRec:
unit uMenuRec;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
StdCtrls, ExtCtrls,
Mbd_MySql;
Type
TDishRec = class
id_dish: integer;
title: string;
end;
TFormMenuRec = class(TForm)
cbDish: TComboBox;
Panel1: TPanel;
edPrice: TEdit;
Label1: TLabel;
Label2: TLabel;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
_mode: integer; // 1 - new, 2 - edit
_db: TMbd_MySql;
_id_menu: integer;
public
procedure showNew(aDB: TMbd_MySql);
procedure showEdit(aDB: TMbd_MySql; id_menu: integer; id_dish: integer; price: Currency);
end;
var
FormMenuRec: TFormMenuRec;
Implementation
{$R *.dfm}
const
sql_req: string = 'select * from dish';// отмена
procedure TFormMenuRec.Button1Click(Sender: TObject);
begin
Close;
end;
// ok
procedure TFormMenuRec.Button2Click(Sender: TObject);
var
req: string;
rec: TDishRec;
begin
// проверка корректности введёных значений
if (cbDish.ItemIndex < 0) then
begin
MessageBox(0, 'Необходимо выбрать название блюда из списка.',
'Внимание', MB_ICONWARNING + MB_OK);
cbDish.SetFocus;
Exit;
end;
if (Length(edPrice.Text) <= 0) then
begin
MessageBox(0, 'Цена не может быть пустой.', 'Внимание', MB_ICONWARNING + MB_OK);
edPrice.SetFocus;
Exit;
end;
case _mode of
1: // new
begin
rec := cbDish.Items.Objects[cbDish.ItemIndex] as TDishRec;
req := 'insert into menu (id_dish, price) values(' + IntToStr(rec.id_dish) + ', ' + edPrice.Text + ')';
if (_db.DdlExecute(req) = 1) then
begin
MessageBox(0, 'Запись успешно добавлена.', 'Добавление', MB_ICONINFORMATION + MB_OK);
Close;
end
else
begin
MessageBox(0, 'Не удалось добавить запись.', 'Внимание', MB_ICONWARNING + MB_OK);
end;
end;
2: // edit
begin
rec := cbDish.Items.Objects[cbDish.ItemIndex] as TDishRec;
req := 'update menu set id_dish = ' + IntToStr(rec.id_dish) + ', price = ' + edPrice.Text + ' where id_menu = ' + IntToStr(_id_menu);
if (_db.DdlExecute(req) = 1) then
begin
MessageBox(0, 'Запись успешно изменена.', 'Изменение', MB_ICONINFORMATION + MB_OK);
Close;
end
else
begin
MessageBox(0, 'Не удалось изменить запись.', 'Внимание', MB_ICONWARNING + MB_OK);
end;
end;
end;
end;
procedure TFormMenuRec.showNew(aDB: TMbd_MySql);
var
rec: TDishRec;
begin
Caption := 'Добавить запись меню';
_mode := 1;
_db := aDB;
cbDish.Items.Clear;
cbDish.ItemIndex := -1;
edPrice.Text := '';
// SELECT запрос серверу с получением результата
aDB.M_Open(sql_req); // Делаем запрос и получаем набор данных
while aDB.M_NoEnd do // делаем пока не конец набора полей результата
begin
rec := TDishRec.Create;
rec.id_dish := aDB.M_Value('id_dish');
rec.title := aDB.M_Value('title');
cbDish.Items.AddObject(rec.title, rec);
aDB.M_Next; // переходим на следующие поле
end;
aDB.M_Close; // после получения данных уничтожаем полученный набор данных
ShowModal;
end;
procedure TFormMenuRec.showEdit(aDB: TMbd_MySql; id_menu: integer; id_dish: integer; price: Currency);
var
rec: TDishRec;
begin
Caption := 'Изменить запись меню';
_mode := 2;
_db := aDB;
_id_menu := id_menu;
cbDish.Items.Clear;
// SELECT зарос серверу с получением результата
aDB.M_Open(sql_req); // Делаем запрос и получаем набор данных
while aDB.M_NoEnd do // делаем пока не конец набора полей результата
begin
rec := TDishRec.Create;
rec.id_dish := aDB.M_Value('id_dish');
rec.title := aDB.M_Value('title');
cbDish.Items.AddObject(rec.title, rec);
if (rec.id_dish = id_dish) then
cbDish.ItemIndex := cbDish.Items.Count - 1;
aDB.M_Next; // переходим на следующие поле
end;
aDB.M_Close; // после получения данных уничтожаем полученный набор данных
edPrice.Text := CurrToStr(price);
ShowModal;
end;
end.
Модуль uOrderRec:
unit uOrderRec;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
StdCtrls, ExtCtrls,
Mbd_MySql;
type
TDishRec = class
id_dish: integer;
title: string;
end;
TMngRec = class
id_mng: integer;
fam: string;
end;
TFormOrders = class(TForm)
Label1: TLabel;
cbDish: TComboBox;
Label2: TLabel;
edCnt: TEdit;
Panel1: TPanel;
Button1: TButton;
Button2: TButton;
cbMng: TComboBox;
Label3: TLabel;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
_mode: integer; // 1 - new, 2 - edit
_db: TMbd_MySql;
_id_orders: integer;
procedure fillMngs();
procedure fillDishes();
public
procedure showNew(aDB: TMbd_MySql);
procedure showEdit(aDB: TMbd_MySql; id_orders, id_dish, id_mng: integer; cnt: integer);
end;
var
FormOrders: TFormOrders;
Implementation
{$R *.dfm}
procedure TFormOrders.fillMngs();
var
rec: TMngRec;
begin
cbMng.Items.Clear;
cbMng.ItemIndex := -1;
// заполняем менеджеров
_db.M_Open('select * from manager order by f'); // Делаем запрос и получаем набор данных
while _db.M_NoEnd do // делаем пока не конец набора полей результата
begin
rec := TMngRec.Create;
rec.id_mng := _db.M_Value('id_manager');
rec.fam := _db.M_Value('f');
cbMng.Items.AddObject(rec.fam, rec);
_db.M_Next; // переходим на следующие поле
end;
_db.M_Close; // после получения данных уничтожаем полученный набор данных
end;
procedure TFormOrders.Button1Click(Sender: TObject);
begin
Close;
end;
procedure TFormOrders.Button2Click(Sender: TObject);
var
req: string;
drec: TDishRec;
mrec: TMngRec;
begin
// проверка корректности введёных значений
if (cbDish.ItemIndex < 0) then
begin
MessageBox(0, 'Необходимо выбрать название блюда из списка.', 'Внимание', MB_ICONWARNING + MB_OK);
cbDish.SetFocus;
Exit;
end;
if (cbMng.ItemIndex < 0) then
begin
MessageBox(0, 'Необходимо выбрать менеджера из списка.', 'Внимание', MB_ICONWARNING + MB_OK);
cbMng.SetFocus;
Exit;
end;
if (Length(edCnt.Text) <= 0) then
begin
MessageBox(0, 'Кол-во не может быть пустым.', 'Внимание', MB_ICONWARNING + MB_OK);
edCnt.SetFocus;
Exit;
end;
drec := cbDish.Items.Objects[cbDish.ItemIndex] as TDishRec;
mrec := cbMng.Items.Objects[cbMng.ItemIndex] as TMngRec;
case _mode of
1: // new
begin
req := 'insert into orders (id_dish, id_manager, cnt) values(' + IntToStr(drec.id_dish) + ', ' + IntToStr(mrec.id_mng) + ', ' + edCnt.Text + ')';
if (_db.DdlExecute(req) = 1) then
begin
MessageBox(0, 'Запись успешно добавлена.', 'Добавление', MB_ICONINFORMATION + MB_OK);
Close;
end
else
begin
MessageBox(0, 'Не удалось добавить запись.', 'Внимание', MB_ICONWARNING + MB_OK);
end;
end;
2: // edit
begin
req := 'update orders set id_dish = ' + IntToStr(drec.id_dish) + ', id_manager = ' + IntToStr(mrec.id_mng) + ', cnt = ' + edCnt.Text + ' where id_orders = ' + IntToStr(_id_orders);
if (_db.DdlExecute(req) = 1) then
begin
MessageBox(0, 'Запись успешно изменена.', 'Изменение', MB_ICONINFORMATION + MB_OK);
Close;
end
else
MessageBox(0, 'Не удалось изменить запись.', 'Внимание', MB_ICONWARNING + MB_OK);
end;
end;
end;
procedure TFormOrders.fillDishes();
var
rec: TDishRec;
begin
cbDish.Items.Clear;
cbDish.ItemIndex := -1;
// заполняем менеджеров
_db.M_Open('select * from menu left join dish on menu.id_dish = dish.id_dish order by title'); // Делаем запрос и получаем набор данных
while _db.M_NoEnd do // делаем пока не конец набора полей результата
begin
rec := TDishRec.Create;
rec.id_dish := _db.M_Value('id_dish');
rec.title := _db.M_Value('title');
cbDish.Items.AddObject(rec.title, rec);
_db.M_Next; // переходим на следующие поле
end;
_db.M_Close; // после получения данных уничтожаем полученный набор данных
end;
procedure TFormOrders.showNew(aDB: TMbd_MySql);
begin
Caption := 'Создаие заказа';
_mode := 1;
_db := aDB;
edCnt.Text := '1';
fillMngs;
fillDishes;
ShowModal;
end;
procedure TFormOrders.showEdit(aDB: TMbd_MySql; id_orders, id_dish, id_mng: integer; cnt: integer);
var
rec: TDishRec;
i: Integer;
begin
Caption := 'Изменение заказа';
_mode := 2;
_db := aDB;
_id_orders := id_orders;
fillMngs;
fillDishes;
for i := 0 to cbDish.Items.Count - 1 do
if (TDishRec(cbDish.Items.Objects[i]).id_dish = id_dish) then
cbDish.ItemIndex := i;
for i := 0 to cbMng.Items.Count - 1 do
if (TMngRec(cbMng.Items.Objects[i]).id_mng = id_mng) then
cbMng.ItemIndex := i;
edCnt.Text := intToStr(cnt);
ShowModal;
end;
end.