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

Кудравцев Создание баз данных 2010

.pdf
Скачиваний:
83
Добавлен:
16.08.2013
Размер:
2.65 Mб
Скачать

«Мониторы», то в списке товаров выводятся мониторы, т.е. происходит динамическое изменение списка «Товар» в зависимости от выбранного типа товара.

Рис. 3.5. Форма «Тип_Товар»

Реализацию данного механизма можно представить в виде нескольких этапов:

1.Создать запрос (рис. 3.6) на выборку товаров определенного типа

Рис. 3.6. Запрос на выборку товаров определенного типа

SQL вариант запроса:

SELECT Tovar.Name

FROM Tip_Tovara INNER JOIN Tovar ON Tip_Tovara.Id_Tip =

Tovar.Id_Tip

WHERE Tip_Tovara.Id_Tip=[Forms]![Тип_Товар]![Tip_Tovara];

81

Как видно, в качестве условия отбора строк из таблицы Tovar использует значение из элемента управления [Tip_Tovara], т.е. из поля со списком «Tip_Tovara».

2.Назначить данный запрос в качестве источника строк полю со списком «Tovar» (рис. 3.7).

Рис. 3.7. Источник строк поля со списком «Tovar»

3.В поле со списком «Tip_Tovara» на вкладке события в строке Выход добавить макрос Обновление (ОбновитьSQL) элемента Tovar (рис. 3.8).

Рис. 3.8. Добавление макроса Обновление

82

Динамическое изменение «Текстового поля»

Рассмотрим механизм динамического изменения (пересчета) содержимого ‗Текстового поля‘ при изменении значений в других ‗Текстовых полях‘. Форма «Заказ» (рис. 3.9) предназначена для формирования заказов клиентов. При выборе товара автоматически появляется его цена. При вводе количества вычисляется сумма, которая также пересчитывается при изменении цены (персонально для некоторых клиентов).

Рис. 3.9. Форма «Заказ» для формирования заказов клиентов

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

1. Изменение – для поля со списком Товар (имя объекта –

Id_Tov):

Private Sub Id_Tov_Change()

[Cena] = Id_Tov.Column(2) [Summa] = [Cena]* [Kol_vo]

End Sub

Выражение Id_Tov.Column(2) означает, что используется 3-й столбец (а это как раз цена) из поля со списком Id_Tov, для которого источником строк является таблица Tovar, в которой 3-м столбцом является Цена товара.

83

2. Выход – для полей Цена и Количество:

Private Sub Cena_Change()

[Summa] = [Cena] *[Kol_vo]

End Sub

Private Sub Kol_vo_Exit(Cancel As Integer)

[Summa] = [Cena] *[Kol_vo]

End Sub

В выражении [Summa] = [Cena] *[Kol_vo] структуры [Summa], [Cena] и т.д. применяются для доступа к значениям соответствующих полей.

Назначение обработчиков событий осуществляется с помощью панели свойств соответствующих элементов управления

(рис. 3.10).

Рис. 3.10. Назначение обработчиков событий

Параметрические запросы в формах

Рассмотрим форму (рис. 3.11), которая позволяет выводить с помощью параметрического запроса все заказы оформленные для выбранной фирмы.

84

Рис. 3.11. Форма Фирма-Заказ

Для реализации данных возможностей нужно выполнить следующие действия:

1. Создать запрос с именем «ЗапросЗаказ»:

SELECT Zakaz.N_Zak, Zakaz.Data

FROM Zakaz

WHERE (((Zakaz.Id_Kl)=[Forms]![Фирма_Заказ]![Klient]));

в котором условие отбора задано через значение поля со списком «Klient» (т.е. идентификатор выбранной фирмы).

2.Указать в качестве источника записей основной формы «Фирма-Заказ» данный запрос «ЗапросЗаказ».

3.Создать подчиненную форму (подчиненная форма «Zakaz») с источником записей запрос – «ЗапросЗаказ».

4.В поле со списком «Klient» на вкладке события в строке Изменение добавить макрос Обновление (ОбновитьЗапрос) оставив поле имя элемента пустым.

Отображение взаимосвязанной информации

Рассмотрим форму (рис. 3.12), которая позволяет динамически отображать взаимосвязанную информацию, а именно: для выбранного клиента (элемент управления «Поле со списком») отображаются все заказы клиента (элемент управления «подчиненная форма»), а при выборе заказа динамически изменяется состав заказа (элемент управления «подчиненная форма»).

85

Рис. 3.12. Форма Клиент_Заказ_Состав_Заказа

Этапы построения данной формы:

1. С помощью мастера построения таблиц строится главная форма «Klient», содержащая две подчиненные:

«Zakaz» подчиненная форма;

«Sostav» подчиненная форма.

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

2. Изменяются атрибуты элемента управления «Поле со спи-

ском: Name»:

на вкладке «Данные» очистить свойство «Данные»; на вкладке «Данные» в качестве источника строк указать табли-

цу Klient (рис. 3.13);

86

Рис. 3.13. Вкладка «Данные» поля со списком «Name»

на вкладке «Макет» указать Число столбцов равным двум; на вкладке «Макет» указать Ширину столбцов равной нулю

(рис. 3.14)

Рис. 3.14. Вкладка «Макет» поля со списком «Name»

3. Создается обработчик события «Изменение» элемента управления «Поле со списком» (рис. 3.15):

Private Sub Name_Change()

Me.Zakaz_подчиненная_форма.Requery

End Sub

87

Рис. 3.15. Вкладка «События» поля со списком «Name»

Как видно, данный обработчик содержит всего одну строку, в которой вызывается метод Requery для подчиненной формы «Zakaz_подчиненная_форма». Ключевое слово «Me» используется для обращения к объектам формы.

В базе данных для именования подчиненных форм используется следующее правило: <Главная форма>_<Подчиненная фор-

ма>_Pod. Например, Klient – Главная форма, Klient_Zakaz_Pod –

подчиненная форма, содержащая заказы клиентов. Klient_Zakaz_Sostav_Pod подчиненная форма содержащая состав заказов клиентов. Список форм и их названий представлен на рис. 3.16.

Рис. 3.16. Список форм и их названий БД «Заказ»

88

Многопараметрические запросы

Рассмотрим форму (рис. 3.17), в которой динамически изменяется содержимое таблицы отгрузки товаров за период при изменении содержимого поля со списком «Клиент», а также полей «Дата начала» и «Дата окончания». Кроме того, в поле «Итого» динамически вычисляется соответствующая сумма столбца «Факт_отгрузка».

Многопараметрические запросы для динамического отображение взаимосвязанной информации с использованием ‗Поля со списком‘

Рис. 3.17. Форма учета отгрузки товаров клиентам

Для реализации данных возможностей нужно сформировать многопараметрический запрос и выполнить следующие действия:

1.Создать главную форму с элементами управления Клиент (тип — ‗Поле со списком‘, имя — Klient), Дата начала — (тип — ‗Тектовое поле‘, имя — Dat1), Дата окончания — (тип — ‗Тектовое поле‘, имя — Dat2).

2.Создать многопараметрический запрос (для таблицы – подчиненной формы), в котором в качестве параметров выступают значения элементов управления (рис. 3.18). Для корректного указания параметрических значений (имен элементов управления) удобно воспользоваться построителем выражений, предварительно открыв главную форму, так как при этом проще получить доступ к ее элементам управления.

89

Рис. 3.18. Многопараметрический запрос

SQL вариант запроса:

SELECT [Отгрузка-приход].Id_менеджера, [Отгрузкаприход].Дата_отгрузки, [Отгрузка-приход].План_отгрузка, [От- грузка-приход].Факт_отгрузка

FROM Магазины INNER JOIN [Отгрузка-приход] ON Магазины.Id = [Отгрузка-приход].Id_магазин

WHERE ((([Отгрузка-приход].Дата_отгрузки) Between

[Forms]![Форма1]![Dat1] And [Forms]![Форма1]![Dat2]) AND ((Магазины.Id)=[Forms]![Форма1]![Klient]))

ORDER BY [Отгрузка-приход].Дата_отгрузки;

3. Создать многопараметрический запрос для текстового поля «Итого», в котором в качестве параметров выступают значения элементов управления (рис. 3.19).

Рис. 3.19. Многопараметрический запрос

90