Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб раб ПОА 4э

.pdf
Скачиваний:
5
Добавлен:
14.03.2016
Размер:
1.21 Mб
Скачать

11

3.6 Уточнение списка полей и настройка параметров столбцов в DBGrid

Значение поля N_Prih необходимо для обеспечения уникальности в таблице Postuplenie и не несет никакой иной нагрузки. Поэтому данное поле не следует показывать в составе столбцов DBGrid2. Для этой цели сформируем список полей таблицы Postuplenie.

Сохраните форму приложения как “Main.раs”, а проект приложения как “Prog_2.dpr”. Выберите при помощи мыши компонент Table2 и нажмите правую кнопку мыши. В появившемся на экране всплывающем меню выберите элемент Fields Editor. В появившемся списке редактора полей нажмите правую кнопку мыши и во всплывающем меню выберите элемент меню Add Fields. Будет показан список всех полей таблицы БД Postuplenie.DB. Отметьте (при помощи мыши и кнопки Shift) все поля, кроме N_Prih и нажмите кнопку Add. Теперь список редактора полей будет включать все отмеченные поля.

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

Определение для набора данных списка полей в редакторе полей приводит к тому, что для каждого добавленного таким образом поля в приложении Delphi автоматически создает компонент Field (поле набора данных). Каждый такой компонент по умолчанию именуется уникальным именем – в качестве первой составляющей имени поля берется имя набора данных (Table2), а в качестве второй составляющей – имя поля в таблице БД. Так, компонент Field, соответствующий полю N_Zag, будет поименован как Table2N_Zag. Если в редакторе полей щелкнуть по имени соответствующего поля, в инспекторе объектов можно установить или изменить свойства поля, а также определить обработчики события для конкретного поля

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

12

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

Измените также порядок сортировки записей в наборе данных Table2. Для этого в инспек-

торе объектов установите свойство Table2.IndexFieldName в значение “Sort_Dat_PostN_Zag”

путем выбора из выпадающего списка, содержащего названия индексных полей, определенных для каждого существующего индекса таблицы Postuplenie.DB. После этого войдите еще раз в редактор колонок DBGrid2 и при помощи мыши “перетащите” столбец Data так, чтобы он предшествовал столбцу N_Zag. Откомпилируйте приложение и запустите его на выполнение. Набор данных Table2, ассоциированный с таблицей БД Postuplenie.DB, в приложении должен быть отсортирован по дате прихода, а внутри каждой даты прихода – по наименованию заготовки. Сохраните модуль в папке С:\Projects\Sklad_n\Program_2\ в файле “Main.раs”, а проект приложения – в файле “Prog_2.dpr”.

3.7. Определение визуальных компонентов для работы с полями записи набора дан-

ных

Сохраните модуль “Main.раs” в папке С:\Projects\Sklad_n\Program_3\, и там же сохраните проект “Prog_3.dpr”.

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

Добавьте в форму два компонента DBEdit (палитра компонентов Data Controls). Разместите компонент DBEdit1 под столбцом “Дата пост.”, а компонент DBEdit2 под столбцом “Количество”. Определите поле, к которому можно иметь доступ через компонент DBEdit1. Для этого установите значение его свойств – DataSource в DataSource2 и DataField в Dat_Post. Определите поле, к которому можно иметь доступ через компонент DBEdit2. Для этого установите значение его свойств – DataSource в DataSource2 и DataField в Kol_vo.

13

Для доступа к полю N_Zag потребуется компонент, который позволял бы вводить в поле N_Zag таблицы Postuplenie.DB значения полей N_Zag из таблицы Zagotovki.DB, и никакие другие значения. Для этой цели под столбцом “№ заготовки” компонента DBGrid2 разместите компонент DBLookupComboBox с именем по умолчанию компонент DBLookupComboBox1. Установите свойства этого компонента:

DataSource – в значение DataSource2; DataField – в значение N_Zag; ListSource – в значение DataSource1; ListField – в значение N_Zag; KeyField – в значение N_Zag.

Добавьте в приложение 5 компонентов кнопок Button (страница Standard палитры компонентов). Измените имена этих компонентов (свойство Name), используя инспектор объектов,

соответственно на InsertButton, EditButton, DeleteButton, PostButton, CancelButton. Измените за-

головки этих кнопок (свойство Caption), используя инспектор объектов, соответственно на “Добавить”, “Изменить”, “Удалить”, “Запомнить”. “Отменить”.

Выберите при помощи мыши кнопку InsertButton и два раза щелкните на ней. чтобы перейти в редактор кода. Определите для кнопки InsertButton обработчик события нажатия кноп-

ки, OnClick:

procedure TForm1.InsertButtonClick(Sender: TObject); begin

if Table2.State = dsBrowse then Table2.Insert;

end;

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

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

procedure TForm1.EditButtonClick(Sender: TObject); begin

if Table2.State = dsBrowse then Table2.Edit;

end;

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

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

procedure TForm1.DeleteButtonClick(Sender: TObject); begin

if Table2.State = dsBrowse THEN

if MessageDlg(‘Подтвердите удаление записи’, mtConfirmation,[mbYes, mbNo],0) = mrYes then

Table2.Delete;

end;

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

Определите обработчик нажатия кнопки PostButton: procedure TForm1.PostButtonClick(Sender: TObject);

14

begin

if Table2.State in [dsInsert, dsEdit] then Table2.Post;

end;

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

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

procedure TForm1.CancelButtonClick(Sender: TObject); begin

if Table2.State in [dsInsert, dsEdit] then Table2.Cancel;

end;

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

Для того чтобы набор данных нельзя было переводить в состояние добавления и изменения данных, а также удалять записи непосредственно из компонента DBGrid2, установим свой-

ство DBGrid2.ReadOnly в значение True.

Сохраните приложение и запустите его. При добавлении новой записи или корректировке существующей в поля можно заносить значения, используя ввод в компоненты DBEdit1, DBEdit2 и путем выбора из списка значений в компоненте DBLookupComboBox1. То же происходит при изменении записи. При удалении записи выдается окно диалога, требующего подтверждения удаления записи.

15

3.8 Реализация связи Master-Detail между наборами данных

Как известно, таблицы базы данных Zagotovki.DB и Postuplenie.DB находятся в отношении “один-ко-многим”. Поскольку была определена ссылочная целостность между этими таблицами, можно сделать так, чтобы при установке указателя на запись в наборе данных Table1 (ассоциированном с Zagotovki.DB) в наборе данных Table2 (ассоциированном с Postuplenie.DB) показывались только записи прихода текущего товара в Table1. Это реализуется через механизм связи наборов данных Master-Detail.

Для этого откройте проект “Prog_2.dpr”. В редакторе столбцов DBGrid2 сделайте столбец, соответствующий полю N_Zag, первым по счету в DBGrid2.

В инспекторе объектов для компонента Table2 установите значение свойства Master Source в DataSource1. Переместитесь на значение свойства MasterFields и нажмите кнопку эллипса. В появившемся окне Field Link Designer установите параметры связи. В поле Available Indexes выберите в качестве текущего индекса по полю N_Zag. В списке Detail Fields выберите поле N_Zag, в списке Master Fields выберем поле N_Zag и нажмите кнопку Add. В поле Joiner Fields будет сформировано выражение N_Zag N_Zag. Нажмите кнопку Ok.

Как можно заметить, в компоненте Table2 текущий индекс (свойство IndexFieldNames) заменен на индекс, построенный по полю N_Zag.

Сохраните приложение под именами “Main.pas” и “Prog_4.dpr” в папке С:\Projects\Sklad_n\Program_4\. Выполните приложение. Теперь в наборе данных Table2 показываются только записи по приходу товара, текущего в наборе данных Table1. Мало того, при добавлении записи в набор данных Table2 значение поля N_Zag по умолчанию берется равным значению поля N_Zag из текущей записи в наборе данных Table1.

16

3.9 Использование компонента Query для формирования набора данных из нескольких таблиц

Создайте новое приложение, выбрав в меню Delphi элемент File|New Application. Сохраните форму нового приложения как “Main. pas”, а само приложение как “Prog_4.dpr” в папке С:\Projects\Sklad_n\Program_4\.

Расположите на форме компонент Query (страница Data Access палитры компонентов). По умолчанию его имя Query1. Установите его свойство DatabaseName в Sklad_n. Расположите в форме компонент DataSource (имя DataSource1). Установите его свойство DataSet в значение Query1. Расположите в форме компонентDBGrid. Установите его свойство DataSource в значе-

ние DataSource1.

В инспекторе объектов для компонента Query1 найдите свойство SQL и нажмите кнопку эллипса. Затем в появившемся окне редактора наберите текст SQL-запроса.

SELECT P.Dat_Post, P.N_Zag, Z.Name, P.Kol_vo, Z.Material FROM Zagotovki Z, Postuplenie P

WHERE Z.N_Zag = P.N_Zag ORDER BY P.Dat_Post, P.N_Zag

После этого установите свойство Query1.Active в значение True.

Набор данных Query1 содержит сведения о поступлении заготовок на склад. В составе записи этого набора присутствуют поля Dat_Post (дата поступления), N_Zag (номер заготовки), Name (название заготовки), Kol_vo (количество заготовок), Material (материал заготовки). Как видно из текста запроса в свойстве SQL, набор данных “собирается” из двух таблиц БД Sklad_n

– Zagotovki.DВ и Postuplenie.DВ. При этом соединяются записи из этих таблиц БД, имеющие одинаковое значение поля N_Zag.

Сохраните приложение и запустите его.