
- •230103 «Автоматизированные системы обработки информации и управления»
- •Работа с таблицами Создание таблицы в режиме конструктора
- •Практическая часть
- •1. Таблица product_group, которая содержит следующие поля:
- •2. Таблица products, которая содержит следующие поля:
- •3. Таблица prihod, которая содержит следующие поля:
- •4. Таблица ed_izmer, которая содержит следующие поля:
- •5. Таблица postav_ik, которая содержит следующие поля:
- •Вопросы для контроля
- •Литература
- •Лабораторная работа № 2
- •Теоретическая часть
- •Практическая часть
- •Практическая часть
- •Практическая часть
- •Вопросы для контроля
- •Литература
- •Лабораторная работа № 5
- •Теоретическая часть
- •Практическая часть
- •Создаем форму для справочника «Поставщики»
- •Практическая часть
- •Вопросы для контроля
- •Литература
- •Лабораторная работа № 7
- •Теоретическая часть
- •Практическая часть
- •Вопросы для контроля
- •Литература
- •Лабораторная работа № 8
- •Теоретическая часть
- •Практическая часть
- •Вопросы для контроля
- •Литература
- •Лабораторная работа № 9
- •Теоретическая часть
- •Практическая часть
- •Практическая часть
- •Вопросы для контроля
- •Литература
- •Лабораторная работа № 11
- •Теоретическая часть
- •Практическая часть
- •Вопросы для контроля
- •Литература
- •Лабораторная работа № 12
- •Теоретическая часть
- •Практическая часть
- •Практическая часть
- •Вопросы для контроля
- •Литература
- •Лабораторная работа № 14
- •Теоретическая часть
- •Практическая часть
- •Вопросы для контроля
- •Литература
- •Лабораторная работа № 15
- •Теоретическая часть
- •Практическая часть
- •Вопросы для контроля
- •Литература
Практическая часть
На этом уроке мы создадим форму для справочника «Продукты» нашего склада c использованием поле Lookup из других таблиц.
Процесс создания данных форм аналогичен созданию формы для справочника «Единицы измерения», смотри предыдущие уроки. Поэтому описывать буду достаточно кратко.
Создаем новую форму File->New->Form –Delphi
В инспекторе объектов устанавливаем следующие свойства для новой формы
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; |