Среда, 22.11.2017, 01:51
Приветствую Вас Гость

Не ошибается тот, кто ничего не делает.
Но и ничего не делать - ошибка.

Эмиль Кроткий

Меню сайта
Категории раздела
База данных "Склад" [14]
Статьи, связанные с программированием баз данных
Форма входа

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0


















Тиц
Главная » Статьи » Базы данных » База данных "Склад"

Delphi. Урок 1.5. Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад.
Содержание

Урок 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.13. Программирование баз данных в Delphi (Создаем модуль печати данных о приходе и расходе).
На этом уроке мы реализуем  печать данных прихода, расхода и состояния склада.  Печать будем реализовывать через MS Excel, то есть это будет не совсем печать, а экспорт данных в MS Excel, а там пользователь может сам выбрать, печатать или сохранить отчет. В начале приготовим шаблоны  MS Excel, в которые будем выводить отчеты

Урок 1.14. Программирование баз данных в Delphi (Создаем модуль для сжатия и восстановления базы данных).


Урок 1.5.

Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад

На этом уроке мы создадим форму для справочника «Категории продуктов» и «Поставщики»  нашего склада.

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

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

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

Caption -> Категории продуктов;

FormStyle -> fsMDIChild;

Name -> Form_product_group;


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

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

Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад

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

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

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

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

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

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

 

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

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

DataSet -> Form_general.table_product_group;

Name -> product_group.

 

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

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

DataSource -> product_group.

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

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

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

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

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

DisplayLabel -> Категория продуктов;

DisplayWidth -> 30;
 

После этого видим для формы «Категории продуктов»:
Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад

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

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


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

end;

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


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

 end;


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


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

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

procedure TForm_product_group.FormActivate(Sender: TObject);
begin
//установка фокуса при активации формы
dbgrid1.SetFocus;
end;

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

procedure TForm_product_group.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
//процедура закрытия формы
  Action:=cafree;
end;

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


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

end;

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

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

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

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


procedure TForm_general.N3Click(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_product_group.Create(Application);
end;

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


Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад


Создаем форму для справочника «Поставщики»

 

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

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

Caption -> Поставщики;

FormStyle -> fsMDIChild;

Name -> Form_postav_ik;

 

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

Пропишем Uses general; после раздела implementation в программном модуле unit postav_ik,а в программном модуле unit general главной формы пропишем Uses ed_izmer, product_group, postav_ik;

Размещаем на форме компоненты как показано на рисунке:


Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад

Далее все делаем аналогично, как для предыдущего справочника. А я приведу лишь код для обработки событий.

Для кнопки «Новая запись»


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

end;

Для кнопки «Удалить запись» 

 

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

Для кнопки «Закрыть»

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

end;

Для события FormActivate формы Form_postav_ik


procedure TForm_postav_ik.FormActivate(Sender: TObject);
begin
//установка фокуса при активации формы

dbgrid1.SetFocus;

end;

Для события FormClose формы Form_postav_ik

procedure TForm_postav_ik.FormClose(Sender: TObject; var Action: TCloseAction);
begin
//процедура закрытия формы
  Action:=cafree;

end;

Для события FormCloseQuery  формы Form_postav_ik

 
procedure TForm_postav_ik.FormCloseQuery(Sender: TObject;
 
var CanClose: Boolean);
//проверка на наличие пустых записей перед закрытием, если такие записи найдены то отменяем закрытие формы
begin
 if dbgrid1.DataSource.DataSet.RecordCount<>0  then begin
     if not (form_general.table_postav_ik.Locate('postav_ik_name','',[loCaseInsensitive,loPartialKey])) then  begin form_general.table_postav_ik.edit;form_general.table_postav_ik.post; end
                                                             else begin ShowMessage('
У
Вас есть не заполненные записи');CanClose:=false;dbgrid1.SetFocus;end;
                                                    
end;
end;

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

Для главной формы Form_general при нажатии на кнопку Категории продуктов выпадающего меню

 
procedure TForm_general.N5Click(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_postav_ik.Create(Application);
end;
Запускаем проект и заполняем справочник данными.

Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад

Скачать исходники проекта можно здесь.


Категория: База данных "Склад" | Добавил: xaramamburu (16.06.2011)
Просмотров: 13192 | Комментарии: 6 | Рейтинг: 4.0/5
Всего комментариев: 6
3  
Некоторые из введенных данных в справочнике не сохраняются. в чем проблема?

4  
Не очень понятно, что вы имеете ввиду (т.е. когда данные не сохраняются, опишите конкретно проблему), но здесь вы данные вводите прямо в таблицу. Для сохранения введенных данных нужно выполнить команду post у соответствующей таблицы. Можно для этого сделать отдельную кнопочку и после каждого ввода постить введенные данные. В данном варианте пост происходит автоматический при создании новой записи и при нажатии кнопки закрыть, вроде пока проблем с сохранением не было. Лучше конечно для ввода данных использовать специальные поля типа TEdit или DBEdit  и через них заносить данные в таблицу.))))))

5  
Когда снова открываю справочник не хватает данных, которые были введены ранее!!!

6  
Проверьте в исходниках к уроку, там эта ошибка проявляется? Если нет, то значит вы делаете, что то не то. Попробуйте создать кнопку и повесить на нее следующий код:
form_general.table_postav_ik.post;
Только имя таблицы укажите свое, если оно у вас другое. Попробуйте во время работы открывать саму базу в Access и посмотреть вносятся ли данные в соответствующую таблицу.)))

1  
Здравствуйте! А можно для совсем квадратных объяснить, как добавить проверку на null?

2  
Как то так:
if not (form_general.table_postav_ik.Locate('postav_ik_name','',[loCaseInsensitive,loPartialKey])) and not (form_general.table_postav_ik.Locate('postav_ik_name',null,[loCaseInsensitive,loPartialKey])) then begin form_general.table_postav_ik.edit;form_general.table_postav_ik.post; end
else begin ShowMessage('У Вас есть не заполненные записи');CanClose:=false;dbgrid1.SetFocus;end;
smile

Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
Наш опрос
Оцените мой сайт
Всего ответов: 532
Уголок общения



Copyright MyCorp © 2017Конструктор сайтов - uCoz