Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
laboratornye_raboty.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2.27 Mб
Скачать

Практическая часть

На этом уроке мы создадим форму для справочника «Продукты»  нашего склада c использованием поле Lookup  из других таблиц.

Процесс создания данных форм аналогичен созданию формы для справочника «Единицы измерения», смотри предыдущие  уроки. Поэтому описывать буду достаточно кратко.

Создаем новую форму File->New->FormDelphi

В инспекторе объектов  устанавливаем следующие свойства для новой формы

Caption -> Продукты;

FormStyle -> fsMDIChild;

Name -> Form_products;

 

Сохраните модуль с именем products.

Пропишем Uses general; после раздела implementation в программном модуле unit products.

А в программном модуле unit general главной формы пропишем Uses ed_izmer, product_group, products;

Далее размещаем на форме следующие компоненты

Три кнопки TButton из вкладки Standart

В инспекторе объектов для Button1 устанавливаем свойство  Caption  -> Новая запись;

для Button2 устанавливаем  свойство  Caption  -> Удалить запись;

для Button3 устанавливаем  свойство  Caption  -> Закрыть.

 

Из вкладки Data Access помещаем на форму компонент TDataSource.

В инспекторе объектов для него устанавливаем  следующие свойства:

DataSet -> Form_general.table_products;

Name -> products.

 

А из вкладки Data Controls помещаем на форму компонент TDBGrid.

В инспекторе объектов для него устанавливаем  следующие свойства:

DataSource -> products.

Если поля таблицы не отображаются в DBGrid,возможно у вас отключено (False) свойство Active главной форме в инспекторе объектов компонента table_products  (TADOtable), установите Active -> True.

Сейчас мы переименуем поля нашей таблице. Для этого перейдем на главную форму проекта.

Выберем компонент table_products  (ADOTable) и в структуре (Structure) -> products -> Fields -> щелкнем правой кнопкой мыши и выберем Add all fields.

Для полей id, id_product_group, id_ed_izmer  в инспекторе объектов устанавливаем  свойство Visible->False,

затем выбираем поле product_name и в инспекторе объектов устанавливаем у него свойства

DisplayLabel -> Продукт;

DisplayWidth -> 30;

 

затем выбираем поле time_hraneniya  и в инспекторе объектов устанавливаем у него свойства

DisplayLabel -> Время хранения;

DisplayWidth -> 20;

 

Далее создаем выпадающее поле Lookup для просмотра данных из справочника «Категории продуктов».

 

Для этого в структуре (Structure) -> products -> Fields -> щелкнем правой кнопкой мыши и выберем New  field.

После этого видим:

В поле Name: пишем product_group;

в поле Type: выбираем String;

выбираем поле Lookup;

в Key Fields:выбираем id_product_group;

в Dataset: выбираем table_product_group;

в Lookup Keys: выбираем id;

а в Result Field: выбираем product_name  жмем ОК

В инспекторе объектов для созданного поля свойство DisplyLabel-> Категория продукта, DisplyWidth-> 24 и перемещаем поле мышкой в позицию после поля product_name.

Далее создаем выпадающее поле Lookup для просмотра данных из справочника «Единицы измерения» .

Для этого в структуре (Structure) -> products -> Fields -> щелкнем правой кнопкой мыши и выберем New  field. и заполняем:

 

В поле Name: пишем ed_izmer;

в поле Type: выбираем String;

выбираем поле Lookup;

в Key Fields:выбираем id_ed_izmer;

в Dataset: выбираем table_ed_izmer;

в Lookup Keys: выбираем id;

а в Result Field: выбираем ed_name  жмем ОК

 

В инспекторе объектов для созданного поля свойство DisplyLabel-> Единица измерения, DisplyWidth-> 24 и перемещаем поле мышкой в позицию после поля product_group.

 

Теперь пишем обработчики событий для кнопок.

Щелкнем дважды мышкой по кнопке «Новая запись» и пишем следующий код:

  procedure TForm_products.Button1Click(Sender: TObject); begin  //новая запись form_general.table_products.Append; dbgrid1.SetFocus end;

 

Щелкнем дважды мышкой по кнопке «Удалить запись» и пишем следующий код:

 

procedure TForm_products.Button2Click(Sender: TObject); //удаление записи begin //если записи отсутствуют то выводим сообщение, иначе удаляем запись   if dbgrid1.DataSource.DataSet.RecordCount<>0  then        begin         if (MessageBox(Handle, 'Удаление записей может привести к нарушению работы всей базы данных. Удалить запись?', 'Внимание !!!', MB_YESNO)=  IDYES) then            form_general.table_products.Delete        end                                                 else ShowMessage('Нет записей для удаления'); end;

  Щелкнем дважды мышкой по кнопке «Закрыть» и пишем следующий код:

  procedure TForm_products.Button3Click(Sender: TObject); begin //закрытие формы Close; end;

  В инспекторе объектов для Form_products  событие FormActivate пишем:

 procedure TForm_products.FormActivate(Sender: TObject); begin //так  как таблица продукты использует данные из таблиц единицы измерения и категории продуктов //то мы должны проверить заполнены они или нет if form_general.table_ed_izmer.RecordCount=0 then begin  ShowMessage('У Вас не заполнен справочник "Единиц измерения". Для продолжения работы Вам необходимо заполнить справочник.');close;end else begin if form_general.table_product_group.RecordCount=0 then begin  ShowMessage('У Вас не заполнен справочник "Категории продуктов". Для продолжения работы Вам необходимо заполнить справочник.'); close;end else begin //обновляем данные form_general.table_ed_izmer.Refresh; form_general.table_product_group.Refresh; //установка фокуса при активации формы dbgrid1.SetFocus; end; end; end;

 

В инспекторе объектов для Form_products  событие FormClose пишем:

procedure TForm_products.FormClose(Sender: TObject; var Action: TCloseAction); begin

//процедура закрытия формы

Action:=cafree; end;

  В инспекторе объектов для Form_products  событие FormCloseQuery пишем:

  procedure TForm_products.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin //проверка на наличие пустых записей перед закрытием, если такие записи найдены то отменяем закрытие //формы if dbgrid1.DataSource.DataSet.RecordCount<>0  then begin   //по полю продукт    if (form_general.table_products.Locate('product_name','', [loCaseInsensitive,loPartialKey])) then  begin ShowMessage('У Вас есть не заполненные записи в поле "Продукт"');CanClose:=false; dbgrid1.SetFocus;end    else begin    //по полю категория продукта    if (form_general.table_products.Locate('id_product_group',null, [loCaseInsensitive,loPartialKey])) then   begin ShowMessage('У Вас есть не заполненные записи в поле "Категория продукта"'); CanClose:=false;dbgrid1.SetFocus;end    else begin    //по полю единица измерения    if (form_general.table_products.Locate('id_ed_izmer',null, [loCaseInsensitive,loPartialKey])) then begin  ShowMessage('У Вас есть не заполненные записи в поле "Единицы измерения"'); CanClose:=false;dbgrid1.SetFocus;end    else begin    //по полю дата хранения    if (form_general.table_products.Locate('time_hraneniya',null,[loCaseInsensitive,loPartialKey])) then begin  ShowMessage('У Вас есть не заполненные записи в поле "Время хранения"');CanClose:=false;dbgrid1.SetFocus;end    else begin     form_general.table_products.edit;form_general.table_products.post;    end;    end;    end;    end; end; end;

Внимание для более корректной работы по полю 'product_name' необходимо добавить проверку на null (т.е. в поле данные не вводились совсем).

Сейчас сделаем запуск справочника «Продуктов» из главной формы. Для этого выбираем в меню Project -> Options

Выбираем Forms и перемещаем Form_products из Auto-create forms  в Avalable forms.

Переходим на главную форму, щелкаем мышкой по компоненту MainMenu1, а затем по пункту Продукты

  И пишем следующий обработчик события:

 procedure TForm_general.N4Click(Sender: TObject); begin f:=0; //проверяем, активна ли наша форма if ActiveMDIChild.Caption<>'Продукты' then begin //если нет то ищем ее среди неактивных  и если находим, то показываем ее for i:=0 to form_general.MDIChildCount-1 do if form_general.MDIChildren[i].Caption='Продукты' then begin MDIChildren[i].Show;f:=1;end; end                                                else f:=1; //если форма еще не создана, то создаем ее if f<>1 then Tform_products.Create(Application); end;

  Вот и все готово, запускаем проект и заполняем справочник данными.

Но теперь возникает другая проблема, так наш справочник «Продуктов» связан с другими справочниками, то при удалении из них данных возникнут проблемы и со справочником «Продуктов».  Поэтому в справочниках «Категории продуктов» и «Единицы измерения», пред удаление записи мы должны проверить используется ли эта запись в справочнике «Продуктов» и  если используется то запретить удаление.

Изменим процедуру удаления записи в справочнике «Категории продуктов»

Щелкнем дважды мышкой по кнопке «Удалить запись» на форме «Категории продуктов» и пишем следующий код:

procedure TForm_product_group.Button2Click(Sender: TObject);  //удаление записи begin //если записи отсутствуют то выводим сообщение, иначе удаляем запись   if dbgrid1.DataSource.DataSet.RecordCount<>0  then        begin   if (MessageBox(Handle, 'Удаление записей может привести к нарушению работы всей базы данных. Удалить запись?', 'Внимание !!!', MB_YESNO)=  IDYES) then   if (form_general.table_products.Locate('id_product_group', form_general.table_product_group.FieldByName('id').Value, [loCaseInsensitive, loPartialKey])) then ShowMessage('Нельзя удалить данную категорию продуктов, так как она используется в справочнике продуктов.')          else  form_general.table_product_group.Delete        end                                                 else ShowMessage('Нет записей для удаления'); end;

  Изменим процедуру  удаления записи в справочнике «Единицы измерения»

Щелкнем дважды мышкой по кнопке «Удалить запись» на форме «Единицы измерения»  и пишем следующий код:

procedure TForm_ed_izmer.Button2Click(Sender: TObject); //удаление записи begin //если записи отсутствуют то выводим сообщение, иначе удаляем запись   if dbgrid1.DataSource.DataSet.RecordCount<>0  then      begin   if (MessageBox(Handle, 'Удаление записей может привести к нарушению работы всей базы данных. Удалить запись?', 'Внимание !!!', MB_YESNO)=  IDYES) then   if (form_general.table_products.Locate('id_ed_izmer', form_general.table_ed_izmer.FieldByName('id').Value, [loCaseInsensitive, loPartialKey])) then ShowMessage('Нельзя удалить данную единицу измерения, так как она используется в справочнике продуктов.')            else form_general.table_ed_izmer.Delete        end                                                 else ShowMessage('Нет записей для удаления'); end;

 

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]