Содержание
Урок 1.1. Пишем программу складского учета.
Будем писать программу учета продуктов на складе по средней цене прихода. А для этого нам
нужно научиться работать с базами данных. Начнем работу с создания базы в MS
Access 2007.
Урок 1.2. Создаем главную форму программы склад.
На этом
уроке мы создадим главную форму для нашего склада. Создадим подключение, к
базе, используя компонент TADOConnection. Используемые компоненты (
TADOConnection ).
Урок 1.3. Создаем главную форму программы склад.
На этом
уроке мы продолжим создание главной формы для нашего склада. Разместим
основные компоненты, создадим меню... Используемые компоненты (TADOTable,
TMainMenu).
Урок 1.4. Создаем подчиненные формы для
справочников программы склад.
На этом
уроке мы создадим форму для справочника "Единицы измерения" нашего склада.
Используемые компоненты (TButton, TDBGrid, TDataSource ).
Урок 1.5. Создаем подчиненные формы для
справочников программы склад.
На этом
уроке мы создадим форму для справочника «Категории продуктов» и
«Поставщики» нашего склада. Используемые компоненты (TButton, TDBGrid,
TDataSource ).
Урок 1.6. Создаем подчиненные формы для
справочников программы склад.
На этом
уроке мы создадим форму для справочника «Продукты» нашего склада c
использованием поле Lookup из других таблиц. Используемые компоненты (TButton,
TDBGrid, TDataSource ).
Урок 1.7. Создаем формы прихода продуктов на склад.
На этом
уроке мы создадим формы прихода продуктов на склад. Приход продуктов будет
состоять из трех форм. В первой мы будем хранить данные о приходе. Во
второй, данные о продуктах для каждого прихода. Третья – форма для выбора
продуктов. Используемые компоненты (TButton, TDBGrid, TADOTable, TADOQuery,
DataModule).
Урок 1.8. Создаем формы прихода продуктов на склад.
На этом
уроке мы создадим вторую форму, в которой будут отражаться данные о
продуктах для каждого прихода. Используемые компоненты (TButton, TDBGrid,
TADOTable, TADOQuery, DataModule, TDateTimePicker, TDBLookupComboBox).
Урок 1.9. Создаем формы прихода продуктов на склад.
На этом
уроке мы создадим последнюю форму для прихода продуктов. В ней будет
происходить выбор продуктов прихода. Используемые компоненты (TButton,
TDataSource, TDateTimePicker, TDBLookupComboBox, TDBEdit).
Урок 1.10. Программирование баз данных в Delphi -
создаем формы прихода продуктов на склад.
На этом
уроке мы напишем процедуры для обработки событий для наших форм прихода,
созданных на уроках 1.7. – 1.9.
Урок 1.6.
Программирование
баз данных в Delphi - создаем подчиненные формы для справочников программы
склад. Создаем справочник «Продукты» с
использованием полей Lookup.
На этом уроке мы создадим форму для справочника «Продукты» нашего склада 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;
|
На этом урок окончен. Исходники к уроку можно скачать здесь.
|