Лаб раб ПОА 4э
.pdf11
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.
Сохраните приложение и запустите его.