Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Лабораторная работа № 6. Для дальнейшей работы подготовим контейнер DataModule5






СОЗДАНИЕ ЭКРАННЫХ ФОРМ ДЛЯ ВВОДА ДАННЫХ В БД

Цель занятия:

Для дальнейшей работы подготовим контейнер DataModule5. Из палитры компонентов Delphi на странице Data Access добавим невизуальный компонента TTаblе, установим значения свойств DatabaseName (псевдоним БД) в PRIMER при помощи выпадающего списка или введя его вручную. В Tаblе3 установим значение свойства TableName (имя таблицы БД) в PRIHOD.DB. После этого установим значение свойства Active в True. Расположим компонента TDataSource, установим свойство DataSet (имя набора данных) компонента DataSource3 в значение Table3. Добавление невизуальных компонентов для связи с таблицей PRIHOD.DB в контейнер обязательно, т.к. аналогичные компоненты в контейнере DataModule взаимно связаны и в дальнейшем может произойти циклическое обращение.

Добавим в форму №2 компонент TDBGrid из палитры компонентов Data Controls. Установим свойство DataSource компонента TDBGrid в значение DataSource3, предварительно добавив имя модуля Unit5 в текст модулей unit формы №2.

Теперь сделаем так, чтобы к полям записи в наборе данных Table3 можно было обращаться не только из сетки компонента DBGrid1, а из отдельных визуальных компонентов, позволяющих осуществлять доступ к отдельным полям записи набора данных.

Добавим в форму №2 два компонента TDBEdit (палитра компонентов Data Controls). Определим поле, к которому можно иметь доступ через компонент DBEdit1. Для этого установим значение его свойств - DataSource в DataSource3 и DataField в DatPrih. Определим поле, к которому можно иметь доступ через компонент DBEdit2. Для этого установим значение его свойств - DataSource в DataSource3 и DataField в Kolvo.

Для доступа к полю Material нам нужен более сложный компонент, который позволял бы вводить в поле Material таблицы Prihod.DB значения полей Material из таблицы Materialy.DB, и никакие другие значения. Для этой цели разместим компонент TDBLookupComboBox с именем по умолчанию DBLookupComboBox1. Установим свойства этого компонента:

- DataSource - в значение DataModule5.DataSource3;

- DataFiled - в значение Material;

- List Source - в значение DataModule5.DataSource1

- ListField - в значение Material;

- KeyField - в значение Material.

 

Добавление кнопок управления данными БД на экранной форме

Далее на экранной форме можно создать набор кнопок, которые позволят проводить навигацию по таблицам БД и управлять ее состоянием, т.е. ее записями.

Для этого в приложение добавим пять компонентов кнопок TButton (страница Standard палитры компонентов). Изменим имена этих компонентов (свойство Name), используя инспектор объектов, соответственно на InsertButton, EditButton, DeleteButton, PostButton, CancelButton. Изменим заголовки этих кнопок (свойство Caption), используя инспектор объектов, соответственно на " Добавить", " Изменить", " Удалить", " Запомнить", " Закрыть" (рис. 27).

 

 

Рис.27. Форма с визуальными компонентами для работы с полями текущей записи набора данных

 

Выберем при помощи мыши кнопку InsertButton и два раза щелкнем на ней. После этого мы перейдем в редактор кода и определим для кнопки InsertButton обработчик события нажатия кнопки, OnClick:

procedure TForm2.InsertButtonClick(Sender: TObject);

begin

DataModule5.Table3.Insert;

end;

Метод Insert переводит набор данных Table1 в состояние добавления записи dsInsert. Ввод значений полей осуществляется в компонентах DBEdit1, DBLookupComboBox1, DBEdit2. Для этого необходимо, чтобы набор данных находился в режиме просмотра dsBrowse.

Определим обработчик нажатия кнопки EditButton:

procedure TForm2.EditButtonClick(Sender: TObject);

begin

DataModule5.Table3.Edit;

end;

Метод Edit переводит набор данных Table1 в состояние добавления записи dsEdit. Редактирование значений полей осуществляется в компонентах DBEdit1,

DBLookupComboBox1, DBEdit2. Для этого необходимо, чтобы набор данных находился в режиме просмотра dsBrowse.

Определим обработчик нажатия кнопки DeleteButton:

procedure TForm2.DeleteButtonClick(Sender: TObject);

begin

IF MessageDlg('Подтвердите удаление записи', mtConfirmation, [mbYes, mbNo], 0) = mrYes THEN DataModule5.Table3.Delete;

end;

Если набор данных Table1 находится в режиме просмотра записей dsBrowse, вызывается окно диалога (при выполнении функции MessageDlg); если пользователь нажимает кнопку Yes, происходит удаление текущей записи в наборе данных Table1.

Определим обработчик нажатия кнопки PostButton:

procedure TForm2.PostButtonClick(Sender: TObject);

begin

DataModule5.Table3.Post;

end;

Если набор данных находится в режиме добавления новой записи или редактирования, происходит выполнение метода набора данных Post, который запоминает текущее состояние записи в таблице БД. После запоминания набор данных переводится в режим просмотра dsBrowse.

Определим обработчик нажатия кнопки CancelButton:

procedure TForm2.CancelButtonClick(Sender: TObject);

begin

close;

Form1.Visible: =true;

end;

Если набор данных находится в режиме добавления новой записи или редактирования, происходит выполнение метода набора данных Cancel, который отменяет запоминание записи в таблице БД и переводит набор данных в режим просмотра и переходит на форму меню.

Для того чтобы набор данных нельзя было переводить в состояние добавления и изменения данных, а также удалять записи непосредственно из компонента DBGrid1, установим свойство DBGrid1.ReadOnly в значение True. После этого запустим приложение на выполнение. При добавлении новой записи или при корректировке существующей в поля можно заносить значения, используя ввод в компоненты DBEdit1, DBEdit2 и путем выбора из списка значений в компоненте DBLookupComboBox1 (рис. 28). То же происходит при изменении записи.

 

 

 

Рис.28. Добавление новой записи

 

При удалении записи выдается окно диалога (рис. 29).

 

 

Рис.29. Окно подтверждения удаления записи

 

Создание более сложной экранной формы для представления содержания БД

 

Варианты модификации TDBGrid на экранной форме.

Как можно заметить, значение поля N_Prih необходимо для обеспечения уникальности в таблице Prihod и не несет никакой иной нагрузки. Поэтому данное поле лучше не показывать в составе столбцов DBGrid2. Для этой цели сформируем список полей таблицы Prihod. В Delphi имеются две возможности указать, какие из полей таблицы БД следует использовать в приложении для набора данных.

Первый способ состоит в использовании по умолчанию всех полей из таблицы БД, с которой ассоциирован этот набор данных. Этот способ всегда используется по умолчанию и, следовательно, был неявно использован и нами при создании наборов данных Table1 и Table2.

Второй способ состоит в использовании подмножества полей таблицы БД, с которой ассоциирован набор данных. Для этой цели используется редактор полей набора данных, который позволяет включить в состав обрабатываемых для набора данных полей все поля или подмножество полей таблицы БД.

Выберем в контейнере DataModule5 при помощи мыши компонент Таblе2 и нажмем правую кнопку мыши. В появившемся на экране всплывающем меню выберем элемент Fields Editor. В появившемся списке редактора полей (пока он пуст, рис. 30.а) нажмем правую кнопку мыши и во всплывающем меню выберем элемент меню Add Fields. Будет показан список всех полей таблицы БД Prihod.DB. Отметим (при помощи мыши и кнопки Shift) все поля, кроме N_Prih (рис. 30.6) и нажмем кнопку Add. Теперь список редактора полей будет включать все отмеченные поля (рис. 30.в).

 

 

а) б) в)

Рис.30. Работа с редактором полей:

а) пустой список редактора полей; б) добавление полей; в) заполненный список редактора полей

 

Как можно заметить, в составе столбцов в компоненте DBGrid2 на форме №3 теперь присутствуют только те поля, которые добавлены для набора данных Table2 в редакторе полей (рис. 31).

Определение для набора данных списка полей в редакторе полей (нажатие правой кнопки мыши по компоненту Таblе2) приводит к тому, что для каждого добавленного таким образом поля в приложении Delphi автоматически создает компонент TField (поле набора данных). Каждый такой компонент по умолчанию именуется уникальным именем - в качестве первой составляющей имени поля берется имя набора данных (Таblе2), а в качестве второй составляющей - имя поля в таблице БД. Так, компонент TField соответствующий полю Material, будет поименован как Table2Material. Если в редакторе полей щелкнуть по имени соответствующего поля, в инспекторе объектов можно установить или изменить свойства поля, а также определить обработчики события для конкретного поля.

 

 

 

Рис.31. Состав полей DBGrid2 определяется списком редактора полей

 

Изменим параметры компонента DBGrid2 так, чтобы названия его столбцов содержали русские наименования. Для этого нажмем правой кнопкой мыши на компоненте DBGrid2, и во всплывающем меню вые элемент Columns Editor. На экране появится окно редактора стол компонента (рис. 32.а). Для того чтобы изменить характеристики стол в TDBGrid, нужно перейти от неявно определяемых столбцов к определяемым. Для этого нужно щелкнуть по кнопке Add All Fields, в результате чего будут добавлены столбцы, каждый из которых соответствует полю, определенному в редакторе полей компонента Table2 (рис. 32.б).

 

 

Рис.32. а) пустой список столбцов DBGrid2;

б) заполненный список столбцов

 

 

Что бы изменить заголовок каждого столбца, следует выбрать при помощи мыши имя столбца в редакторе столбцов, и в инспекторе объектов раскрыть список свойства Title (для чего следует щелкнуть мышью по крестику рядом с именемсвойства). В элементе Caption этого списка содержится заголовок столбца; изменим соответствующим образом заголовки и затем выйдем из редактора столбцов DBGrid2. То же проделаем для набора данных Table1 (рис. 33).

 

 

Рис.33. Установка заголовков столбцов DBGrid 1 и 2

 

Аналогичные изменения проделаем и в форме №2.

Изменим также порядок сортировки записей в наборе данных Таblе3 в форме №2. Для этого в инспекторе объектов компонента Table3 (в DataModule5)установим свойство IndexFieldNames в значение " DatPrih; Material" путем выбора из выпадающего списка, содержащего названия индексных полей, определенных для каждого существующего индекса таблицы Prihod.DB. После этого войдем еще раз в редактор колонок DBGrid и при помощи мыши " перетащим" столбец DatPrih так, чтобы он предшествовал столбцу Material. Откомпилируем приложение и запустим его на выполнение. Как видно из рис. 34, набор данных Table2, ассоциированный с таблицей БД Prihod.DB, в приложении отсортирован по дате прихода, а внутри каждой даты прихода - по наименованию материала.

 

 

Рис.34. Материалы отсортированы по дате поступления

 

 

Создание вычисляемых полей на экранной форме

Если необходимо в форме №3 создать вычисляемое поле, значение которого вычисляется по значениям других полей, поступают так:

1. В редакторе полей необходимо создать новое поле, пометив его как Calculated. Для этого нужно перейти в DataModule5, сделать текущим (при помощи мыши) необходимый НД (Table2), нажать правую кнопку мыши, выбрать в меню Field Editor и снова нажать правую кнопку мыши и выбрать в меню New Field. Затем в окне диалога необходимо указать имя поля, его тип и для строковых полей – длину (рис. 35).

 

 

Рис.35. Окно определения свойств нового поля

 

Для нового поля будет создан компонент TField, доступ к которому отныне можно осуществлять в редакторе полей.

2. Для компонента НД (Table2), к которому принадлежит вычисляемое поле, необходимо определить обработчик события OnCalcFields.

Например, для НД Table2, ассоциированному с ТБД “Приход”, будем заносить в вычисляемое поле Table2Vychisl значение “Да”, если в поле Table2Kolvo этой записи содержится значение больше 100. В противном случае в поле Table2Vychisl будем заносить пустое значение:

procedure TDataModule5.Table2CalcFields(DataSet: TDataSet);

begin

IF Table2Kolvo.Value > 100 Then

Table2Vychisl.AsString: = 'Да'

ELSE

Table2Vychisl.AsString: = ' ';

end;

Если свойство набора данных AutoCalcFields установлено в True, событие OnCalcFields наступает и при модификации значений невычисляемых полей в режимах dsInsert и dsEdit данного НД или НД, реляционно с ним связанного (когда установлены ограничения целостности в самой ТБД, а не тогда, когда они подразумеваются).

Процедура-обработчик события OnCalcFields содержит реализацию алгоритма вычисления значения вычисляемого поля или группы полей. Необходимо помнить, что в этом обработчике значение может быть присвоено только вычисляемому полю и не может – полю, определенному в структуре БД (приложение показано на рис. 36).

 

 

Рис.36. Вид запущенного приложения

 

Замечание. Иногда бывает необходимым присваивать вычисляемым полям значения, не содержащиеся в полях других таблиц. Иными словами, иногда бывает полезным записывать в вычисляемые поля значение некоторых переменных формы. Например, пусть мы добавляем записи в НД Tbl, по некоторому алгоритму рассчитывая значения поля Summa. Пусть для расчета значения поля Summa используется переменная TekOstatok. И мы хотим значение TekOstatok для каждой записи занести в вычисляемое поле TblTO.

И здесь встречается одна сложность: занесение значения в вычисляемое поле производится в обработчике события OnCalcFields и это происходит в то время, когда значения локальной переменной TekOstatok уже утрачены.

В этой ситуации в процессе выполнения алгоритма, добавляющего записи в Tbl, приходится запоминать значения локальной переменной в каком-либо динамическом списке, а затем извлекать из него соответствующие элементы в обработчике события OnCalcFields, присваивая значения этих элементов полю TblTO.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.