Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VBA_Labs.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
8.08 Mб
Скачать

Задание для самостоятельной работы

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

В базе данных Изделия имеется таблица ОТГРУЗКА, из которой должны выбираться записи с заданным значением в поле NTTN (номер накладной). Для размещения результата выборки должна быть создана таблица Ответ с полями НомерТТН(NTTN), КОД(KI), КОЛИЧЕСТВО(KOLO), СУММА(SUM_O).

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

Контрольные вопросы

  1. Какой метод, какого объекта используется для создания таблицы?

  2. Какой метод, какого объекта используется для создания поля таблицы?

  3. Какой метод используется для выполнения инструкций SQL языка оп­ределения данных?

  4. Какая инструкция SQL предназначена для создания структуры таблицы?

  5. Можно ли создать набор записей на основе запроса на языке SQL?

  6. Какой метод открывает режим добавления записей в набор записей типа таблица?

  7. Какой метод обновляет текущую запись набора?

  8. Какой метод делает текущей следующую запись набора?

  9. Какой метод, какого объекта позволяет получить номер перехваченной ошибки?

Лабораторная работа №7 Расчет в текущей записи однотабличной формы и обновление таблицы

Цель лабораторной работы: научиться производить расчеты в текущей записи однотабличной формы и обновлять таблицы.

Для выполнения упражнений по автоматизации расчетов (№ 7,8) необходимо открыть базу данных Изделия.

Пусть данные об изделиях хранятся в таблице IZD1 с ключом KI, содержа­щей сведения: о цене в поле CENA, текущем остатке в поле TOST и его стоимости в поле STOIM. Необходимо при изменении цены изделия автоматически пересчитывать и сохранять в таблице стои­мость остатка.

Для просмотра и корректировок данных об изделиях на основе таблицы IZD1 создана форма (рис. 7.1). Для того чтобы при изменении через форму зна­чений цены или текущего остатка изделия новое расчетное значение стои­мости остатка заносилось в таблицу, создадим процедуру обработки события После обновления (AfterUpdate) для поля CENA.

Рис. 7.1. Форма для работы с данными

Для создания процедуры достаточно выполнить следующие шаги:

1. Откройте форму в режиме конструктора и окно свойств поля цены -CENA . На вкладке События в строке После обновления (AfterUpdate) выберите значение [Процедура обработки события] и в конце строки щелкните на кнопке построителя. В открывшемся окне модуля формы (рис. 7.2) в шаблон процедуры обработки события Private Sub CENA_AfterUpdate для поля CENA запишите инструкцию присваивания STOIM = CENA * TOST.

2. Эта инструкция заносит в поле таблицы STOIM новое рассчитываемое значение.

3. Событие После обновления (AfterUpdate) для элемента управления Поле возникает после того, как пользователь ввел новое или изменил существующее значение в поле и перешел к другому элементу управления или выполнил команду Сохранить запись в меню Записи.

Рис. 7.2. Окно модуля формы

Задание для самостоятельной работы

Пусть данные об изделиях хранятся в таблице IZD1 с ключом KI, содержа­щей сведения: о цене в поле CENA, текущем остатке в поле TOST и его стоимости в поле STOIM. Необходимо при изменении текущего остатка автоматически пересчитывать и сохранять в таблице стои­мость остатка.

Контрольные вопросы

  1. Когда возникает событие После обновления?

  2. Что обеспечивает инструкция STOIM = CENA * TOST разобранная в лабораторной работе?

  3. Что обеспечивает присоединение процедуры обработки события?

  4. Когда происходит выполнение процедуры обработки события?

Лабораторная работа №8

Расчеты в текущих записях многотабличной формы и обновление таблиц

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

Пусть отгрузка товара со склада производится по документу Товаротранспортная накладная. В базе данных Изделия для просмотра, корректировки и ввода данных с этого документа создана многотабличная форма ТТН.

Форма создана на основе таблиц:

ТТН (соответствует общей части товаротранспортной накладной), которая содержит следующие поля:

• NTTN (ключ) — номер ТТН;

• DATAO — дата отгрузки;

• NPOL — наименование получателя;

• NOTPR — наименование отправителя;

• SUMMA — общая стоимость отгруженного по данной ТТН товара.

ОТГРУЗКА (соответствует спецификации ТТН), которая хранит данные об отгружаемых товарах и содержит следующие поля:

• NTTN — номер ТТН и KI — код отгружаемого товара (составной ключ);

• КОLO — количество отгружаемого товара;

• SUM_O — стоимость отгружаемого товара.

IZD (соответствует справочнику изделий), которая содержит следующие поля:

• KI (ключ) — код изделия;

• NI — наименование изделия;

• CENA — цена изделия.

Необходимо при изменении в форме количества в строках спецификации ТТН (поле КОLO), а также при добавлении или удалении некоторых строк автоматизировать расчет стоимости отгружаемого изделия SUM_O и общей стоимости отгруженных по данной ТТН изделий SUMMA. Результаты должны сохраняться в таблицах ТТН и ОТГРУЗКА.

1. Для расчета и обновления полей таблиц ТТН и ОТГРУЗКА при изменении в форме значения поля КОLO создайте процедуру обработки события После обновления (AfterUpdate) для поля КОLO.

Private Sub KOLO_AfterUpdate()

Вычитание из общей стоимости отгруженного товара в текущей записи главной части формы старого значения стоимости текущего изделия в подчиненной форме

Forms![TTH].SUMMA = Forms![TTH].SUMMA - SUM_0

Расчет новой стоимости текущего изделия в подчиненной форме

SUM_0 = CENA * KOLO

Увеличение общей стоимости отгруженного товара в текущей записи главной части формы на величину новой стоимости текущего изделия в подчиненной форме:

Forms![ТТН].SUMMA = Forms![ТТН].SUMMA + SUM_O

End Subз

2. Убедитесь, что эта процедура правильно производит расчет также при добавлении новой строки в подчиненную форму.

3. Для расчета и обновления данных в таблице при удалении строки из подчиненной формы создайте процедуру обработки события Удаление (Delete) для подчиненной формы.

Private Sub Form_Delete(Cancel As Integer)

Forms! [TTH] .SUMMA = Forms! [TTH].SUMMA - SUM_0

4. Для перехода к созданию процедуры Form_Delete щелкните на пере­сечении линеек в подчиненной форме и откройте ее Свойства. На вкладке События в строке Удаление (Delete) выберите значение [Проце­дура обработки события] и перейдите в окно модуля формы на процедуру обработки этого события.

Задание для самостоятельной работы

Необходимо, чтобы при изменении в форме ТТН значения поля ЦЕНА производился расчет стоимости отгружаемых товаров. Результаты должны сохраняться в таблицах ТТН и ОТГРУЗКА.

Контрольные вопросы

  1. Для чего создается процедура обработки события Удаление (Delete) для подчиненной формы?

  2. Что обеспечивает разобранная в лабораторной работе строка Forms![TTH].SUMMA = Forms![TTH].SUMMA - SUM_0

Лабораторная работа №9

Расчеты в записях подчиненной таблицы

Цель лабораторной работы: научиться производить расчеты в записях подчиненной таблицы.

Перед выполнением этого упражнения откройте базу данных Изделия_1.

Предположим, что изделие может храниться на нескольких складах. При этом справочная информация об изделиях хранится в таблице ИЗДЕЛИЯ, содержащей поля КОД (код изделия) и ЦЕНА, а данные о те­кущих остатках изделий на складах и их стоимости хранятся в подчиненной таблице ОСТАТОК с полями КОД (код изделия), КОД_СКЛАДА, ТЕК_ОСТ и СТОИМОСТЬ. Очевидно, в таблице ОСТАТОК для каждого из изделий может содержаться несколько записей.

В этом случае после изменения цены изделия должен автоматически проис­ходить перерасчет стоимости остатков на каждом складе, где имеется это изделие. То есть при обновлении поля ЦЕНА в таблице ИЗДЕЛИЯ должен автоматически происходить перерасчет поля СТОИМОСТЬ в соответствую­щих записях таблицы ОСТАТОК.

Эта задача не может ограничиться обработкой текущих записей, даже если построить форму, в которой источником записей главной части избрать таб­лицу ИЗДЕЛИЯ, а подчиненной - таблицу ОСТАТОК. Здесь требуется позаписевая обработки набора подчиненных записей.

Предположим, что для работы со справочником изделий и обновления поля ЦЕНА используется форма ИЗДЕЛИЯ, построенная на основе одноименной таблицы (рис. 9.1). Для решения поставленной задачи создайте про­цедуру обработки события После обновления (AfterUpdate) для поля ЦЕНА.

На примере решения поставленной задачи рассмотрим, как в процедурах может осуществляться позаписевая обработка данных. Познакомимся с объектами доступа к данным (объектная модель DАО) и их методами.

Рис. 9.1. Форма для работы со справочником изделий

В шаблон процедуры обработки события Private Sub ЦЕНА_AfterUpdate() для поля ЦЕНА запишите инструкции:

1. Сначала определите объектные переменные. Использование их вместо прямых ссылок на объекты позволит упростить текст программы. В данной процедуре понадобится объектная переменная типа Database хранения ссылки на объект, представляющий базу данных, и Recordset для хранения ссылки на объект, представляющий набор записей. Объект Recordset позволяет получить доступ к записям набора и имеет многочисленные методы, позволяющие обработать данные каждой его записи. Источником записей объекта Recordset может быть таблица, запрос или инструкция SQL.

Dim dbs As Database

Dim stab As Recordset

2. Используйте инструкцию Set для присваивания объектной переменной dbs значения ссылки на текущую базу данных CurrentDb(), а объектной переменной stab - значения ссылки на набор записей. Ссылку на набор записей формируйте с помощью метода OpenRecordset объекта Database.

В модели объектов DAO открытый объект Recordset входит в семейство Recordsets, которое в свою очередь включается в объект Database. При создании объекта Recordset он автоматически добавляется в семейство.

В качестве источника записей открываемого набора используйте таблицу ОСТАТОК, так как в записях этой таблицы нужно произвести перерасчет.

Set dbs = CurrentDb()

Set stab = dbs.OpenReccrdset ("ОСТАТОК", dbOpenTable)

3. Для вывода сообщения об изделии, для которого изменилась цена, запишите в процедуру следующую инструкцию:

MsgBox "Для изделия с кодом " & КОД & " новая цена " & ЦЕНА, vbOKOnly

Для ссылки на поля текущей формы достаточно использовать их имена КОД и ЦЕНА. Диалоговое окно, выводимое на экран этой инструкцией, представлено на рис. 9.2.

Рис. 9.2. Сообщение инструкции MsgBox

4. Для просмотра всех записей из набора с именем stab организуйте цикл Do Until <условие> <инструкции> Loop. При использовании в предложении Until (до) блок инструкций повторяется в цикле до тех пор, пока условие имеет значение [Ложь], после чего управление передается инст­рукции, следующей за Loop. При размещении Until в предложении Do условие проверяется до выполнения блока инструкций цикла. В качестве условия выполнения цикла запишите stab.eof. Свойство eof позволяет определить конечную границу в наборе записей stab, т. е. узнать, что записей в наборе не осталось.

Do Until stab.EOF

<инструкции>

Loop

5. Внутри цикла запишите инструкции, которые позволят последовательно просматривать записи набора и отобрать записи, связанные по полю КОД с текущей записью формы. Для отобранных записей обновите зна­чение поля СТОИМОСТЬ. Чтобы открыть доступ к редактированию за­писей набора, используйте метод Edit.

stab.Edit

6. Чтобы перейти к следующей записи набора и сделать ее текущей, ис­пользуйте метод MoveNext:

stab.MoveNext

Именно эта инструкция позволит дойти до конца набора и прекратить выполнение цикла. Без этой инструкции цикл стал бы бесконечным.

7. Между инструкцией, открывающей доступ к записи, и инструкцией, ме­няющей текущую запись, запишите инструкции:

If stab!КОД = КОД Then

stab!СТОИМОСТЬ = ЦЕНА * stab!TEK_OCT

stab.Update

End If

В условии инструкции If ... End If сравнивается значение КОД изделия в текущей записи набора со значением в текущей записи формы и, если они совпадают, выполняются:

• инструкция присваивания нового значения полю СТОИМОСТЬ в те­кущей записи набора stab;

• метод Update, обновляющий текущую запись набора.

8. Организуйте счетчик числа обновленных записей. Для этого определите числовую переменную Dim col AsInteger. До начала цикла присвойте ей значение, равное нулю col = 0. Внутри цикла в ряду инструкций следующих в предложении If End If за Then, каждый раз увеличивайте значение счетчика на 1, записав col = col + 1.

9. Для закрытия объекта Recordset после завершения работы с ним в цикле используйте метод Сlose, который к тому же приведет к исключению объекта из семейства:

stab.Close

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

MsgBox "Обновлено записей : " & Col, vbOKOnly

которая выведет на экран следующее диалоговое окно (рис. 9.3).

Рис. 9.3. Сообщение о числе обновленных записей

11. Для просмотра обновленных записей с результатами перерасчета стоимости в таблице ОСТАТОК запишите инструкции, открывающие одноименную форму (рис. 9.4):

Dim stDocName As String

Dim stLinkCriteria As String

stDocName = "ОСТАТОК"

stLinkCriteria = "[КОД]=" & "'" & Me![КОД] & "'"

DoCmd.OpenForm stDocName, , , stLinkCriteria

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

В целом процедура обработки события Private Sub ЦЕНА_AfterUpdate() может быть записана в следующем виде:

13. Для проверки синтаксиса инструкций, составляющих процедуру, выполните компиляцию загруженных модулей текущего проекта, воспользовавшись командой редактора VBA Debug | Compile <имя проектах>

14. Возвратитесь в Access, выполнив команду File | Close and Return to Microsoft Access.

15. Откройте форму ИЗДЕЛИЯ и, меняя значение цены в различных запи­сях, убедитесь, что процедура выполняется правильно.

16. Замените источник записей (таблицу ОСТАТОК) объекта Recordset с именем stab на инструкцию SQL, которая выполнит выборку из табли­цы ОСТАТОК записей, связанных с текущей записью формы ИЗДЕЛИЯ по полю КОД изделия. Для этого запишите инструкцию Set stab = dbs.OpenRecordset в следующем виде:

Set Stab = dbs.OpenRecordset("SELECT * FROM ОСТАТОК " & _

"WHERE КОД = ' " & Forms!ИЗДЕЛИЯ!КОД & " ' ")

Инструкция select выбирает все поля из таблицы ОСТАТОК и те записи, где КОД изделия равен коду изделия в текущей записи формы ИЗДЕЛИЯ. Ссылку на поле формы Forms!ИЗДЕЛИЯ!КОД можно заменить на Mе! КОД, поскольку при выполнении процедуры форма ИЗДЕЛИЯ яв­ляется активным объектом.

17. Поскольку полученный таким образом набор состоит только из тех за­писей, в которых требуется обновление значения [Стоимость], уберите из процедуры инструкцию If ...Then ... End If, с помощью которой из полного списка записей отбирались нужные.

18. Убедитесь, что процедура и теперь работает правильно.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]