Упражнение 5.1: Создание процедуры обработчика событий
На этом практическом занятии мы закрепим полученные знания написав код, который будет обрабатывать события заполнения набора данных на стороне сервера. Затем напишем клиентский код для обработки событий изменения. И в завершение реализуем пакетное извлечение данных, написав клиентский и серверный код.
Занятие состоит из семи заданий на выполнение которых отводится примерно 60 минут.
Задание 1
В этом задании мы создадим внешнюю процедуру dsPO_EventHandlers.p, которая будет содержать серверный код обработчиков события для набора данных dsPO. Все действия выполняются в Progress Developer Studio for OpenEdge.
Шаг | Действие |
1 | Создайте новую ABL-процедуру с именем dsPO_EventHandlers.p в каталоге src/PurchaseOrder проекта Server. |
2 | Создайте внутреннюю процедуру с именем ExtendDiscount, которая будет выполняться после добавления в набор данных всех дочерних записей из таблицы POLine для записей из родительской таблицы PurchseOrder.
Сначала опишите встраиваемый файл с описанием набора данных dsPO, сразу после оператора BLOCK-LEVEL: {include/dsPO.i} Затем код самой процедуры в основном блоке: PROCEDURE ExtendDiscount: DEFINE INPUT PARAMETER DATASET FOR dsPO. END PROCEDURE. |
3 | Мы будем использовать вычисляемое поле POTotal для таблицы ttPurchaseOrder, которое будет содержать итоговую сумму всех элементов заказа. Но прежде это поле необходимо добавить во временную таблицу.
Поскольку мы используем общий встраиваемый файл с описанием временной таблицы ttPurchaseOrder во всех наших проектах, то нам достаточно изменить описание таблицы только в одном месте. Откройте в OpenEdge Editor файл ttpurchaseorder.i из каталога src/include проекта Shared. В описание таблицы ttPurchaseOrder перед описанием индекса добавьте описание поля POTotal с типом данных DECIMAL и инициализирующим значением 0. В итоге описание временной таблицы должно выглядеть так: DEFINE TEMP-TABLE ttPurchaseOrder NO-UNDO BEFORE-TABLE bttPurchaseOrder FIELD PONum AS INTEGER INITIAL 0 LABEL "PO Num" FIELD DateEntered AS DATE LABEL "Date Entered" FIELD SupplierIDNum AS INTEGER INITIAL 0 LABEL "Supplier ID" FIELD ReceiveDate AS DATE LABEL "Date Received" FIELD POStatus AS CHARACTER INITIAL "Ordered" LABEL "PO Status" FIELD POTotal AS DECIMAL INITIAL 0 INDEX PONum IS PRIMARY UNIQUE PONum ASCENDING . Сохраните и закройте файл ttpurchaseorder.i. |
4 | Выполните перекомпиляцию всех проектов.
Для этого в Developer Studio выполните пункт верхнего меню Project -> Clean, в открывшемся диалоговом окне выберите Clean all projects и щёлкните по кнопке OK. Во вкладке Console, которая находится внизу рабочего пространства, вы увидите лог компиляции. Проверьте наличие сообщений об ошибках во вкладке Problems. Если всё было сделано правильно, то ошибок не будет. |
5 | Вернитесь к файлу dsPO_EventHandlers.p и в тело внутренней процедуры ExtendDiscount добавьте код для перебора всех записей ttPOLine, которые соответствуют текущей записи ttPurchaseOrder. В каждой итерации добавьте 20 к текущему значению поля Discount для каждой записи ttPOLine. Обновите поле ExtendedPrice, как показано в коде ниже. Прибавьте полученное значение из поля ExtendedPrice таблицы POLine к полю POTotal таблицы PurchaseOrder.
Используйте следующий код: ttPurchaseOrder.POTotal = 0. FOR EACH ttPOLine WHERE ttPOLine.PONum = ttPurchaseOrder.PONum: ttPOLine.Discount = ttPOLine.Discount + 20. ttPOLine.ExtendedPrice = ( ttPOLine.Price - (.01 * ttPOLine.Discount * ttPOLine.Price) ) * ttPOLine.Qty. ttPurchaseOrder.POTotal = ttPurchaseOrder.POTotal + ttPOLine.ExtendedPrice. END. RETURN. |
6 | Сохраните файл и убедитесь в отсутствии ошибок компиляции. |