- •Введение
- •2.1.1 Алгоритм работы модуля анализа данных
- •3.1 Проектирование таблиц и схемы базы данных
- •3.6 Выводы
- •4.3.2 Расчет затрат на зарплату персонала
- •4.3.3 Определение цены на программный продукт
- •4.4.2 Сервисное обслуживание
- •4.4.3 Риски
- •4.4.4 Финансовый план
- •4.4.5 Расчет безубыточности
- •4.5 Выводы
- •5 Безопасность и экологичность программного продукта
- •5.1 Вредные и опасные факторы, воздействующие на оператора
- •5.1.1 Микроклимат производственного помещения
- •5.1.3 Вибрации
- •5.1.4 Электромагнитные поля и излучения
- •5.1.5 Электробезопасность
- •5.1.6 Освещение рабочего места
- •5.2 Организация рабочего места оператора
- •5.4 Утилизация производственных отходов
- •5.5 Выводы
- •Заключение
- •Список литературы и нормативных документов
- •А.2 Установка программы
3.1 Проектирование таблиц и схемы базы данных
Все данные, с которыми работает пользователь системы, хранятся в базе данных MS Access. При загрузке приложения происходит подключение к базе данных (bd.mdb), которая является основным хранилищем данных программного продукта.
Организация хранения данных о заказах представлена на рисунке 3.1.
Рисунок 3.1 – Организация хранения данных о заказах
Главной таблицей базы данных является таблица main, в которой хранятся данные о заказах СТО. Структура данных таблицы main представлена на рисунке 3.2.
Рисунок 3.2 – Структура данных таблицы main
Каждая запись таблицы book состоит из следующих полей: «FIO mastera» – бригада рабочих, «Model» – модель автомобиля, «N avto» – номер автомобиля, «Vid raboty» – вид ремонтных работ, «Tip raboty» – ремонтная работа, «Cena» – стоимость услуг, «Data priema» – дата приема заказа, «Data sdachi» – дата выдачи заказа, «addwork» – дополнительные работы с автомобилем, «Cost_add» – стоимость дополнительных работ.
Данные о ценовых категориях услуг СТО хранятся в таблице Price. Структура данных таблицы Price представлена на рисунке 3.3.
Рисунок 3.3 – Структура данных таблицы Price
Каждая запись таблицы Price состоит из следующих полей: «Model» – информация о модели автомобиля, «Vid» – вид работы, «Tip» – тип работы, «Nch» – нормо-часы, «Stavka» – ставка нормо-часа, «Cena» – стоимость услуг.
В данной БД используются следующие таблицы-справочники: masters, works, types, models.
В справочнике masters хранится информация о бригадах СТО. Структура данных справочника masters представлена на рисунке 3.4.
Рисунок 3.4 – Структура данных справочника masters
В справочнике works хранится информация о видах работ, производимых СТО. Структура данных справочника works представлена на рисунке 3.5.
Рисунок 3.5 – Структура данных справочника works
В справочнике types хранится информация о бригадах СТО. Структура данных справочника types представлена на рисунке 3.6.
Рисунок 3.6 – Структура данных справочника types
3.2 Технология разработки модуля редактирования информации
Функция редактирования подразумевает добавление, изменение и удаление информации. Добавление новой записи в базу данных подразумевает ввод информации на форму, представленную на рисунке 3.7.
Рисунок 3.7 – Добавление новой записи в базу данных
Программный код, соответствующий процедуре добавления информации, представлен в листинге 3.1.
Листинг 3.1 – Процедура добавления информации
procedure TFEdit.BitBtn2Click(Sender: TObject);
begin
if DBEdit2.Text <> '' then begin
DataModule2.main.insert;
end
else ShowMessage('Ввод новой записи уже активирован!');
DateTimePicker1.Date:= now;
DataModule2.mainDatapriema.Text := DateToStr(DateTimePicker1.Date);
Edit9.Text:= 'Нет';
Edit10.Text:= '0,00';
DBEdit12.Text:= 'Нет';
DBEdit15.Text:= '0,00';
end;
//сохранить
procedure TFEdit.Button7Click(Sender: TObject);
var dates, datef, number, addwork, s1, s2: string; cost, costadd: Real;
er: integer;
begin
try
//запоминание текущих значений таблицы
s1 := FormatDateTime('dd/mm/yyyy', DataModule2.mainDatapriema.AsDateTime);
DateTimePicker1.Date:= strtodate(s1) ;
s2 := FormatDateTime('dd/mm/yyyy', DataModule2.maindatasdachi.AsDateTime);
DateTimePicker2.Date:= strtodate(s2) ;
number:= DBEdit2.Text; //номер авто
cost:= StrToFloat(Edit8.Text); //цена
costadd:= StrToFloat(DBEdit15.Text); //дополнительная стоимость
addwork:= DBEdit12.Text; //дополнительные работы
edit4.Text:= DBLookupComboBox2.Text; //фио
edit5.Text:= DBLookupComboBox3.Text; //модель
edit7.Text:= ComboBox3.Text; //вид
edit6.Text:= ComboBox2.Text; //тип
//активирование запроса на добавление ФИО
DataModule2.NewFIO.Active:=false;
DataModule2.NewFIO.SQL.Clear;
DataModule2.NewFIO.SQL.Text:='select * from masters where master='+QuotedStr(Edit4.Text);
DataModule2.NewFIO.Active:=true;
//активирование запроса на добавление вида работы
DataModule2.NewVid.Active:=false;
DataModule2.NewVid.SQL.Clear;
DataModule2.NewVid.SQL.Text:='select * from works where [vid raboty]='+QuotedStr(Edit7.Text);
DataModule2.NewVid.Active:=true;
//активирование запроса на добавление модели
DataModule2.NewModel.Active:=false;
DataModule2.NewModel.SQL.Clear;
DataModule2.NewModel.SQL.Text:='select * from models where model='+QuotedStr(Edit5.Text);
DataModule2.NewModel.Active:=true;
//активирование запроса на добавление типа работы
DataModule2.NewTip.Active:=false;
DataModule2.NewTip.SQL.Clear;
DataModule2.NewTip.SQL.Text:='select * from types where tip='+QuotedStr(Edit6.Text);
DataModule2.NewTip.Active:=true;
//перевод таблицы в режим добавления записи
DataModule2.main.Insert;
//добавление записей
DataModule2.mainFIOmastera.AsInteger:= DataModule2.NewFIOid.AsInteger; //фио мастера
DataModule2.mainModel.AsInteger:= DataModule2.NewModelid.AsInteger; //модель авто
DataModule2.mainVidraboty.AsInteger:= DataModule2.NewVidid.AsInteger; //вид работы
DataModule2.mainTipraboty.AsInteger:= DataModule2.NewTipid.AsInteger; //тип работы
dbedit4.Text := DateToStr(DateTimePicker1.Date);
dbedit5.Text := DateToStr(DateTimePicker2.Date);
dbedit2.Text:= number; //номер авто
dbedit3.Text:= FloatToStr(cost); //стоимость
dbedit12.Text:= 'Нет'; //дополнительная работа
dbedit15.Text:= FloatToStr(costadd); //дополнительная стоимость
//сохранение изменений
DataModule2.main.Post;
except
er:=1;
end; end;
procedure TFEdit.Button1Click(Sender: TObject);
var dates, datef, number, addwork, s1, s2: string; costadd, cost: real;
er:integer;
begin
try
//запоминание текущих значений таблицы
s1 := FormatDateTime('dd/mm/yyyy', DataModule2.mainDatapriema.AsDateTime);
DateTimePicker1.Date:= strtodate(s1) ;
s2 := FormatDateTime('dd/mm/yyyy', DataModule2.maindatasdachi.AsDateTime);
DateTimePicker2.Date:= strtodate(s2) ;
number:= DBEdit2.Text; //номер авто
cost:= StrToFloat(DBEdit3.Text); //цена
costadd:= StrToFloat(Edit10.Text); //дополнительная стоимость
addwork:= Edit9.Text; //дополнительные работы
edit4.Text:= DBLookupComboBox2.Text; //фио
edit5.Text:= DBLookupComboBox3.Text; //модель
edit7.Text:= DBLookupComboBox4.Text; //вид
ComboBox1.Text:= DataModule2.mainTipRaboty2.Text;
edit6.Text:= ComboBox1.Text; //тип
//активирование запроса на добавление ФИО
DataModule2.NewFIO.Active:=false;
DataModule2.NewFIO.SQL.Clear;
DataModule2.NewFIO.SQL.Text:='select * from masters where master='+QuotedStr(Edit4.Text);
DataModule2.NewFIO.Active:=true;
//активирование запроса на добавление вида работы
DataModule2.NewVid.Active:=false;
DataModule2.NewVid.SQL.Clear;
DataModule2.NewVid.SQL.Text:='select * from works where [vid raboty]='+QuotedStr(Edit7.Text);
DataModule2.NewVid.Active:=true;
//активирование запроса на добавление модели
DataModule2.NewModel.Active:=false;
DataModule2.NewModel.SQL.Clear;
DataModule2.NewModel.SQL.Text:='select * from models where model='+QuotedStr(Edit5.Text);
DataModule2.NewModel.Active:=true;
//активирование запроса на добавление типа работы
DataModule2.NewTip.Active:=false;
DataModule2.NewTip.SQL.Clear;
DataModule2.NewTip.SQL.Text:='select * from types where tip='+QuotedStr(Edit6.Text);
DataModule2.NewTip.Active:=true;
//перевод таблицы в режим добавления записи
DataModule2.main.Append;
//добавление записей
DataModule2.mainFIOmastera.AsInteger:= DataModule2.NewFIOid.AsInteger; //фио мастера
DataModule2.mainModel.AsInteger:= DataModule2.NewModelid.AsInteger; //модель авто
DataModule2.mainVidraboty.AsInteger:= DataModule2.NewVidid.AsInteger; //вид работы
DataModule2.mainTipraboty.AsInteger:= DataModule2.NewTipid.AsInteger; //тип работы
dbedit4.Text := DateToStr(DateTimePicker1.Date);
dbedit5.Text := DateToStr(DateTimePicker2.Date);
dbedit2.Text:= number; //номер авто
dbedit12.Text:= addwork; //дополнительная работа
dbedit15.Text:= FloatToStr(costadd); //дополнительная стоимость
DataModule2.mainCena.Text:= '0';
//сохранение изменений
DataModule2.main.Post;
except
er:=1;
end; end;
procedure TFEdit.Button21Click(Sender: TObject);
begin
FDialog.Show;
if FDialog.Edit1.Text = '1' then begin
DateTimePicker1.Visible:= false;
DateTimePicker2.Visible:= false;
End; end;
procedure TFEdit.Button25Click(Sender: TObject);
begin
with DataModule2.Price do begin
DataModule2.Price.First;
while not DataModule2.Price.Eof do begin
if ((DataModule2.PriceMod.Text = DBLookupComboBox3.Text) and
(DataModule2.PriceVidr.Text = DBLookupComboBox4.Text) and
(DataModule2.PriceTipr.Text = combobox1.Text)) then begin
Edit12.Text := DataModule2.PriceCena.Text;
Edit12.Visible:= true;
end;
DataModule2.Price.Next;
end; end; end;
procedure TFEdit.Button26Click(Sender: TObject);
var s1: string;
begin
if Edit13.Text = '' then
MessageBox(FEdit.Handle,'Сначала укажите номер авто в поле фильтра!','Внимание!!!', MB_OK)
Else begin
FFind.Show;
FFind.Edit2.Text:= Edit13.Text;
s1 := FormatDateTime('dd/mm/yyyy', DataModule2.mainDatapriema.AsDateTime);
FFind.DateTimePicker1.Date:= strtodate(s1) ;
end; end;
procedure TFEdit.Button27Click(Sender: TObject);
begin
with DataModule2.Price do begin
DataModule2.Price.First;
while not DataModule2.Price.Eof do begin
if ((DataModule2.PriceMod.Text = DBLookupComboBox3.Text) and
(DataModule2.PriceVidr.Text = ComboBox3.Text) and
(DataModule2.PriceTipr.Text = combobox2.Text)) then
Edit8.Text := DataModule2.PriceCena.Text;
DataModule2.Price.Next;
end; end; end;
procedure TFEdit.Button22Click(Sender: TObject);
begin
with DataModule2.Price do begin
DataModule2.Price.First;
while not DataModule2.Price.Eof do begin
if ((DataModule2.PriceMod.Text = DBLookupComboBox7.Text) and
(DataModule2.PriceVidr.Text = DBLookupComboBox5.Text) and
(DataModule2.PriceTipr.Text = combobox7.Text)) then begin
Edit14.Text := DataModule2.PriceCena.Text;
Edit14.Visible:= true;
DataModule2.main.Edit;
DataModule2.mainCena.Text:= Edit14.Text;
DataModule2.main.Post;
end;
DataModule2.Price.Next;
end; end; end;
procedure TFEdit.BitBtn1Click(Sender: TObject);
var er:integer;
begin
try
if Edit12.Text <> '' then DataModule2.mainCena.Text:= Edit12.Text;
Edit12.Visible:= false;
if DBEdit12.Text = '' then DBEdit12.Text:= 'Нет';
if DBEdit15.Text = '' then DBEdit15.Text:= '0';
if ((DataModule2.mainModel_avto.Text='') or (DataModule2.mainNavto.Text='') or (DataModule2.mainRabota.Text='') or (DataModule2.mainCena.Text='') or (DataModule2.mainFIO.Text='') or
(DataModule2.mainTipRaboty2.Text=''))
then ShowMessage('В таблице имеется пустое значение поля!')
Else begin
dataModule2.main.Post;
Edit13.Text:= DataModule2.mainNavto.Text;
end;
except
er:=1;
end;
3.3 Технология разработки модуля фильтрации информации
3.3.1 Технология разработки модуля фильтрации по номеру автомобиля
Фильтрация по номеру автомобиля позволяет составить отчет о проделанной работе по данному автомобилю. В отчет можно включить временной интервал. Результаты фильтрации показаны на рисунке 3.8.
Рисунок 3.8 – Фильтр по номеру автомобиля
Программный код, соответствующий процедуре фильтрации информации по номеру автомобиля, представлен в листинге 3.2.
Листинг 3.2 – Фильтр по номеру автомобиля
procedure TFFind.Button1Click(Sender: TObject);
var j: integer; s, s1: string; c1, c: integer;
begin
s := FormatDateTime('mm/dd/yyyy', DateTimePicker1.Date);
for j:= 0 to length(s) do
if s[j]='.' then s[j]:= '/';
s1:=DatetoStr(DateTimePicker1.Date);
// суммирование стоимости дополнительных работ
Edit2.Text:= DataModule2.mainNavto.Text;
DataModule2.main.Active:=true;
DataModule2.main.First;
c1:= 0;
while not DataModule2.main.Eof do begin
if ((DataModule2.mainNavto.AsString = Edit2.Text)
and (DataModule2.mainCost_add.Text <> '0')
and (DataModule2.mainDatapriema.AsString = s1 )) then begin
c1:= c1 + DataModule2.mainCost_add.AsInteger;
end;
DataModule2.main.Next;
end;
Edit1.Text:= IntToStr(c1);
//суммирование стоимости работ, которые не дополнительные
DataModule2.main.First;
while not DataModule2.main.Eof do begin
if ((DataModule2.mainNavto.AsString = Edit2.Text)
and (DataModule2.mainCena.Text <> '0')
and (DataModule2.mainDatapriema.AsString = s1 )) then begin
c:= c + DataModule2.mainCena.AsInteger;
end;
DataModule2.main.Next;
end;
//суммирование общей стоимости работ
c:= c + c1;
Edit3.Text:= IntToStr(c);
//вставка в таблицу результата подсчета
DataModule2.rezerv.Edit;
DataModule2.rezervrezerv.Text:= Edit1.Text;
DataModule2.rezervrezsum.Text:= Edit3.Text;
DataModule2.rezerv.Post;
//фильтр по дате приема
// передача значений фильтра в скл-таблицу для печати отчета
Edit2.Text:= DataModule2.mainNavto.Text;
DataModule2.FiltrPrice.Active:= false;
DataModule2.FiltrPrice.SQL.Clear;
DataModule2.FiltrPrice.SQL.Text:= 'select * from main,models,works, types,masters where (main.model=models.id)and(main.[FIO mastera]=masters.id) and(works.id=types.vid)and(main.[tip raboty]= types.id) and(main.[cena]>0)and(main.[data priema]=#'+s+'#)and(main.[N avto]='+QuotedStr(Edit2.Text)+')';
DataModule2.FiltrPrice.Active:= true;
RvProject2.Execute;
//очистить прошлые результаты таблицы
DataModule2.rezerv.Edit;
DataModule2.rezerv.ClearFields;
DataModule2.rezerv.Post;
end;
Результатом выполнения данной процедуры является отчет о проделанной работе по данному автомобилю, пример которого представлен на рисунке 3.9.
Рисунок 3.9 – Отчет о проделанной работе по данному автомобилю
3.3.2 Технология разработки модуля фильтрации информации об итогах выручки СТО
Фильтрация информации об итогах выручки СТО позволяет составить отчет о проделанной работе определенной бригады. В отчет можно включить временной интервал. Результаты фильтрации показаны на рисунке 3.8.
Рисунок 3.8 – Фильтрация информации об итогах выручки СТО
Программный код, соответствующий процедуре фильтрации об итогах выручки СТО, представлен в листинге 3.3.
Листинг 3.3 – Фильтрация информации об итогах выручки СТО
procedure TFeveryDayItog.Button2Click(Sender: TObject);
var c1: currency; s1:string;
begin
c1:= 0;
DataModule2.main.Active:=true;
DataModule2.main.First;
while not DataModule2.main.Eof do begin
s1:=DatetoStr( FeveryDayItog.DateTimePicker1.Date);
if DataModule2.mainDatapriema.AsString =s1 then begin
c1:= c1 + DataModule2.mainCena.AsCurrency + DataModule2.mainCost_add.AsCurrency;
end;
DataModule2.main.Next;
end;
Edit1.Text:= CurrToStr(c1) + ',00 руб.';
end;
//подсчет прибыли за день по мастеру
procedure TFeveryDayItog.Button3Click(Sender: TObject);
var c2: currency; s2, s1 :string;
begin
c2:= 0;
DataModule2.main.Active:=true;
DataModule2.main.First;
while not DataModule2.main.Eof do begin
s1:=DatetoStr(FeveryDayItog.DateTimePicker1.Date);
s2:= FeveryDayItog.ComboBox1.Text;
if ((DataModule2.mainDatapriema.AsString =s1)
and (DataModule2.mainFIO.AsString = s2)) then
c2:= c2 + DataModule2.mainCena.AsCurrency + DataModule2.mainCost_add.AsCurrency;
DataModule2.main.Next;
end;
Edit2.Text:= CurrToStr(c2) + ',00 руб.';
end;
procedure TFeveryDayItog.FormClick(Sender: TObject);
begin
DataModule2.main.Refresh;
ComboBox1.Refresh;
end;
procedure TFeveryDayItog.Button5Click(Sender: TObject);
var j: integer;
begin i:=0;
//фильтр по дате приема
s := FormatDateTime('mm/dd/yyyy', DateTimePicker1.Date);
for j:= 0 to length(s) do
if s[j]='.' then s[j]:= '/';
DBGrid2.Visible:= true;
DBNavigator2.Visible:= true;
DataModule2.FiltrDateMaster.Active:= false;
DataModule2.FiltrDateMaster.SQL.Clear;
DataModule2.FiltrDateMaster.SQL.Text:=
'select * from main,models,works,types,masters where (main.model= models.id) and(main.[FIO mastera]=masters.id)and(works.id=types.vid) and(main.[tip raboty]=types.id)and(main.[data priema]=#'+s+'#)';
DataModule2.FiltrDateMaster.Active:= true;
if DataModule2.FiltrDateMaster.Active = true then i:=1;
end;
procedure TFeveryDayItog.Button1Click(Sender: TObject);
var j: integer;
begin
s := FormatDateTime('mm/dd/yyyy', DateTimePicker1.Date);
for j:= 1 to 10 do
if s[j]='.' then s[j]:= '/';
// фильтр по дате и мастеру
DBGrid2.Visible:= true;
DBNavigator2.Visible:= true;
DataModule2.FiltrDateMaster.Active:= false;
DataModule2.FiltrDateMaster.SQL.Clear;
DataModule2.FiltrDateMaster.SQL.Text:= 'select [master],[N avto], works.[Vid raboty],types.[Tip raboty]from main,masters,works,types where (main.[FIO mastera]=masters.id)and(works.id=types.vid)and(main.[tip raboty]=types.id)and(main.[vid raboty]=works.id)and[data priema]= #'+s+'#';
DataModule2.FiltrDateMaster.Active:= true;
if DataModule2.FiltrDateMaster.Active = true then
i:=1;
end;
procedure TFeveryDayItog.Button6Click(Sender: TObject);
begin
if i<>1 then ShowMessage('Не указан диапазон фильтра!')
else
RvProject3.Execute;
end;
Результатом выполнения данной процедуры является отчет об итогах выручки СТО за указанные сутки, пример которого представлен на рисунке 3.10.
Рисунок 3.10 – Отчет об итогах выручки СТО
3.3.3 Технология разработки модуля фильтрации прайс-листа
Фильтрация прайс-листа позволяет упростить работу с довольно большими объемами ценовых категорий и вывести на печать конкретную информацию. Результаты фильтрации показаны на рисунке 3.11.
Рисунок 3.11 – Фильтрация прайс-листа
Программный код, соответствующий процедуре фильтрации прайс-листа, представлен в листинге 3.4.
Листинг 3.4 – Фильтрация прайс-листа
procedure TFprice.FormActivate(Sender: TObject);
var i: integer;
begin
ComboBox1.Clear;
ComboBox2.Clear;
DBNavigator2.Visible:= false;
//заполнение списка видами работ
DataModule2.works.First;
while not (DataModule2.works.Eof) do begin
combobox1.Items.Add(DataModule2.works['vid raboty']);
DataModule2.works.Next;
end;
//заполнение списка моделями
DataModule2.models.First;
while not (DataModule2.models.Eof) do begin
combobox2.Items.Add(DataModule2.models['model']);
DataModule2.models.Next;
end;
end;
procedure TFprice.FormClick(Sender: TObject);
begin
DataModule2.main.Refresh;
end;
procedure TFprice.FormCreate(Sender: TObject);
begin
DataModule2.main.Refresh;
end;
procedure TFprice.Button4Click(Sender: TObject);
begin
//фильтр по моделям авто
DBGrid2.Visible:= false;
DBNavigator2.Visible:= true;
DataModule2.priceModel.Active:= false;
DataModule2.priceModel.SQL.Clear;
DataModule2.priceModel.SQL.Text:=
'select distinct * from price,models,works,types where (price.model=models.id)and(price.vid=works.id)and(price.tip=types.id)and (models.model='+QuotedStr(Combobox2.Text)+')';
DataModule2.priceModel.Active:= true;
if DataModule2.priceModel.Active= true then
i:= 1;
end;
procedure TFprice.Button2Click(Sender: TObject);
begin
//убрать фильтрацию
DBGrid2.Visible:= true;
DBNavigator2.Visible:= false;
end;
procedure TFprice.Button3Click(Sender: TObject);
begin
//фильтр по виду работ
DBGrid2.Visible:= false;
DBNavigator2.Visible:= true;
DataModule2.priceModel.Active:= false;
DataModule2.priceModel.SQL.Clear;
DataModule2.priceModel.SQL.Text:=
'select distinct * from price,models,works,types where (price.model=models.id)and(price.vid=works.id)and(price.tip=types.id)and(works.[vid raboty]='+QuotedStr(ComboBox1.Text)+')';
DataModule2.priceModel.Active:= true;
if DataModule2.priceModel.Active = true then
i:= 1;
end;
procedure TFprice.Button1Click(Sender: TObject);
begin
//фильтр по видам работ и модели авто
DBGrid2.Visible:= false;
DBNavigator2.Visible:= true;
DataModule2.priceModel.Active:= false;
DataModule2.priceModel.SQL.Clear;
DataModule2.priceModel.SQL.Text:=
'select distinct * from price,models,works,types where (price.model=models.id)and(price.vid=works.id)and(price.tip=types.id)and(models.model='+QuotedStr(Combobox2.Text)+')and(works.[vid raboty]='+QuotedStr(ComboBox1.Text)+')';
DataModule2.priceModel.Active:= true;
if DataModule2.priceModel.Active = true then
i:= 1;
end;
procedure TFprice.Button6Click(Sender: TObject);
begin
if i<>1 then
ShowMessage('Не указан диапазон фильтра!')
else
RvProject5.Execute;
end;
procedure TFprice.Button7Click(Sender: TObject);
begin
FEditPrice.Show;
end;
procedure TFprice.Button8Click(Sender: TObject);
begin
if i<>1 then
ShowMessage('Не указан диапазон фильтра!')
else
RvProject1.Execute;
end;
procedure TFprice.Button9Click(Sender: TObject);
begin
if i<>1 then ShowMessage('Не указан диапазон фильтра!')
else RvProject6.Execute;
end;
Результатом выполнения данной процедуры является печать прайс-листа, где данными для фильтрации являлись значения модели автомобиля и вид работ. Пример фильтрации представлен на рисунке 3.12.
Рисунок 3.12 – Печать прайс-листа по результатам фильтрации
3.4 Технология разработки модуля планирования работ по ремонту и обслуживанию автомобиля
Модуль планирования работ по ремонту и обслуживанию автомобиля позволяет определить степень загруженности бригад и выбрать из списка свободных бригад команду, которая будет работать с новым заказом. График работ также можно просмотреть за определенную дату, как показано на рисунке 3.13.
Рисунок 3.13 – График загруженности бригад автосервисного центра
Программный код, соответствующий процедуре формирования графика загруженности бригад автосервисного центра, представлен в листинге 3.5.
Листинг 3.5 – Процедура формирования графика загруженности бригад автосервисного центра
procedure TGrafic.FormActivate(Sender: TObject);
var j: integer;
begin
master_string:='';
s_now := FormatDateTime('mm/dd/yyyy',Date);
for j:= 0 to length(s_now) do
if s_now[j]='.' then s_now[j]:= '/';
DataModule2.Plan.Active := false;
DataModule2.Plan.SQL.Clear;
DataModule2.Plan.SQL.Text :=
'select distinct [master],[N avto],works.[Vid raboty],types.[Tip] from main,masters,works,types where (main.[FIO mastera]=masters.id)and(works.id=types.vid)and(main.[tip raboty]=types.id)and main.[data priema]=#'+s_now+'#';
DataModule2.Plan.Active := true;
DataModule2.Plan2.Active := false;
DataModule2.Plan2.SQL.Clear;
DataModule2.Plan2.SQL.Text :='select distinct [master] from main, masters, works,types where (main.[FIO mastera]=masters.id)and (works.id= types.vid)and(main.[tip raboty]=types.id)and main.[data priema]=#'+s_now+'#';
DataModule2.Plan2.Active := true;
end;
procedure TGrafic.BitBtn2Click(Sender: TObject);
var i: integer; id:integer; st:string;
begin
s := FormatDateTime('mm/dd/yyyy', DateTimePicker1.Date);
for i:= 0 to length(s) do
if s[i]='.' then s[i]:= '/';
DataModule2.Plan.Active := false;
DataModule2.Plan.SQL.Clear;
DataModule2.Plan.SQL.Text :=
'select distinct [master],[N avto],works.[Vid raboty],types.[Tip] from main,masters,works,types where (main.[FIO mastera]=masters.id)and(works.id=types.vid)and(main.[tip raboty]=types.id)and main.[data priema]=#'+s+'#';
DataModule2.Plan.Active := true;
DataModule2.Plan2.Active := false;
DataModule2.Plan2.SQL.Clear;
DataModule2.Plan2.SQL.Text :=
'select distinct [master] from main,masters,works,types where (main.[FIO mastera]=masters.id)and(works.id=types.vid)and(main.[tip raboty]=types.id) and main.[data priema]=#'+s+'#';
DataModule2.Plan2.Active := true;
with DataModule2.free do begin
Active:=false;
st:='';
DataModule2.Plan2.First;
for id:=1 to DataModule2.plan2.RecordCount do begin
if id=1 then st:=QuotedStr(DataModule2.Plan2master.AsString) else st:=st+','+QuotedStr(DataModule2.Plan2master.AsString);
DataModule2.Plan2.Next;
end;
SQL.Text:=
'select [master],id from masters where not([master] in ('+st+'))';
Active:=true;
end;
end;
3.5 Технология разработки процедуры создания резервной копии базы данных
Создание резервной копии базы данных позволяет восстановить данные в случае их утери вследствие программного или аппаратного сбоя. Форма для создания резервной копии базы данных представлена на рисунке 3.14.
Рисунок 3.14 – Форма для создания резервной копии базы данных
Программный код создание резервной копии базы данных представлен в листинге 3.6.
Листинг 3.6 – Создание резервной копии базы данных
procedure TFservis.Button1Click(Sender: TObject);
begin
CopyFile('bd.mdb','reserve.bac',false); end;
procedure TFservis.Button2Click(Sender: TObject);
begin
FDialogZagr.Show; end;