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

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

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

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

Статистика

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


















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

Delphi. Урок 1.6. Программирование баз данных в 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.6.

Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад.  Создаем справочник «Продукты» с использованием полей Lookup.

На этом уроке мы создадим форму для справочника «Продукты»  нашего склада 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.

Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад. Создаем справочник «Продукты» с использованием полей Lookup.

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

Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад. Создаем справочник «Продукты» с использованием полей Lookup.

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

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

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

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

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

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

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

Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад. Создаем справочник «Продукты» с использованием полей Lookup.

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

Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад. Создаем справочник «Продукты» с использованием полей Lookup.

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

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

 Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад. Создаем справочник «Продукты» с использованием полей Lookup.

В поле 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.

 
После этого видим для формы «Продукты»:


Программирование баз данных в Delphi - создаем подчиненные формы для справочников программы склад. Создаем справочник «Продукты» с использованием полей Lookup.

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

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

 

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;

 
На этом урок окончен. Исходники к уроку можно скачать здесь.


Категория: База данных "Склад" | Добавил: xaramamburu (19.06.2011)
Просмотров: 15516 | Комментарии: 19 | Рейтинг: 5.0/5
Всего комментариев: 19
19  
перезапустил Делфи и всё получилось ))

18  
Добрый день! 
при создании нового поля выдаёт ошибку - "Data Field not permitted on open Dataset", подскажите пожалуйста, что не так?

0
17  
Если бы делали все как у меня, то все бы открывалось, у меня ведь открывается.  Ищите ошибки.)))

13  
Нубасовский вопрос, возможно вперед паровоза:
1. Для рекординга записей в грид можно использовать компонеты типа Edit и смежные?
2. Нужно ли индексировать поля, чтобы создать систему поиска в категории "продукция"? или не стоит, а просто через to do прогонять всё поля на возможные совпадения и вывод в сторонний грид

14  
1. Можно, заполняете поля Edit, потом добавляете новую запись в таблице и каждому полю таблицы присваиваете значения из соответствующего Edit. Можно использовать DBEdit ы,  их нужно подключить к базе, а затем создавая новую запись заполнять ее через DBEdit ы.
2. Для поиска данных можно воспользоваться фильтрацией в самом компоненте ADOTable, т.е. формировать строку для поиска загонять ее в свойство Filter затем допустим в событии OnKeyUp, например у Edit включать этот фильтр. Но лучше для фильтрации данных использовать компонент ADOQuery  и в грид выводить данные из запроса по событию OnKeyUp, например у Edit в котором будете вводит фразу для поиска.))))

15  
Ещё вопросик можно? как в теории подключить лукап (по артикулу к примеру) для ввода списание/пополнение склада, т.е привязаться к полю "продукция" или "артикул" ( это я примерно понимаю как), но вот как сделать так, чтобы при вводе в поле по событию onchange вылетала подсказка списком в низ. К примеру, начали вводить слово "ко", списком вылетает "конфеты, колбаса и т.д, всё что имеет "ко" в своих словах.

и с ВятГУ никак не связаны?)

16  
Не совсем понятно какой лукап вы имеете ввиду. Если это стандартный DBLookupCombobox, то в нем вроде нет функции поиска при вводе, но эта функция есть в DBLookupComboboxEh от EhLib, при вводе в поле лукап открывается подключенный к нему список полей из
соответствующей таблицы и курсор устанавливается на соответствующем
совпадении. И вообще если собрались писать базу то советую использовать
библиотеку EhLib, хотя в ней довольно много косяков, но зато отдельные компоненты например грид, лукап имеют большую функциональность.

По поводу ВятГУ (Политех), то я в нем учился лет 20 назад.)))))))

11  
Добрый вечер, у Вас очень хорошие уроки. Но у меня вопрос возник. Я пытаюсь написать свою программу. Есть форма Справочник организаций, у каждой организации есть неск своих контактных лиц. Как можно создать подчиненную форму к справочнику организаций так, чтобы открывалась форма справочник контактных лиц именно для этой организации. В спр конт лиц есть поле id_org, а в справочнике организаций есть поле id. Надо связать две формы в отношении id<->id_org. Не пойму как это сделать?

12  
Так же как в этой программе связаны таблицы Prihod и Storage смотрите урок 1.8.))))))))))))

9  
ПРОга отличная, у меня такой вопрос, мне надо сделать программу которая будет работать с двумя файлами Access, нужно реализовать все различные запросы, чтобы их программа обрабатывала и выдавала результаты? можете подсказать какой либо материал, или может есть готовые проги???? спасибо за ранее.

10  
Думаю, что ничего конкретного вы не не найдете. В большинстве книг по Delphi описывается лишь работа с компонентами и способы подключения их к базе. Вам нужно искать литературу не по Delphi, а по теории построения баз данных. А как то или иное реализовать в Delphi можно найти на форумах в интернете.))))))))))))

5  
Такой вопрос?
у меня форма группа товаров создана в UTF8 кодировке, и когда при добавлении нового товара закидываю наименовании группы (она определяться пи ид группы то есть цифровой) в место названия вопросительные знаки - не читает UTF8 (аналогично и в других формах)

подскажите как исправить кодировку

6  
Во первых как вы создали форму в UTF8 кодировке и почему именно UTF8?. Во вторых какая у вас версия Delphi?

7  
сама база создана в UTF то есть всё переведено на грузинском языке +когда код - предупреждения пишешь на UTF при сохранении форма сама меняет кодировку, пользуюсь Embarcadero® RAD Studio 2010
тут загвоздка одна - когда прога берёт из базы ид (на пример группа товаров) а прописывает имя группы только тогда выводиться вопросики

8  
К сожалению, пока посоветовать вам ничего не могу, потому что не сталкивался с такой проблемой. Если вы мне скинете ваш проект на почту, то попробую покопаться, может тогда что и посоветую. Скорее всего проблема связана с тем, что Delphi 2010 работает со строками unicode и при отображении информации необходимо преобразовывать utf8 в unicode, но это надо экспериментировать.)))))

3  
Свои проверки - мозгов не хватит:)) Программа проверяет записи по событию FormCloseQuery, т.е. когда вы пытаетесь закрыть форму по кнопке "Закрыть" - это понятно, но обидно то, что проверяет записи программа через раз, я по разному вводил данные и она то проверяет, то спокойно закрывает при не введённых записях. Почему так?

4  
Программа проверяет на не пусто, если в поле ни чего не вводилось то она без проблем это пропустит. Для этого нужно проверять еще и на null. Эту проверку вы можете сделать сами. Код и так достаточно громоздкий и для начинающих достаточно сложный.

1  
Когда мы В инспекторе объектов для 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;

ПРОГРАММА ПРОВЕРЯЕТ ЗАПОЛНЕННОСТЬ ПОЛЕЙ НЕ С СРАЗУ, ДОБАВЛЯЕШЬ ЗАПИСЬ, ПОТОМ УДАЛЯЕШЬ И ТОЛЬКО ТОГДА ОНА В ПРЕДЫДУЩИХ ЗАПИСЯХ ДЕЛАЕТ ПРОВЕРКУ!

2  
Программа проверяет записи по событию FormCloseQuery, т.е. когда вы пытаетесь закрыть форму по кнопке "Закрыть" или нажатию на крестик. При желании вы можете сделать свои проверки или убрать их совсем. Здесь приведен лишь один вариант из возможных реализаций проверки на заполнение данных.)))

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



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