Упражнение 5.5: Подготовка кода для тестирования обработчика события изменения
Задание 5
В этом задании мы добавим код во внешнюю процедуру access_dsPO_procs.p, с которой работали ранее. Мы загрузим процедуру с обработчиком событий в качестве персистентной и свяжем таблицу ttPOLine с обработчиков, созданным в предыдущем задании. Далее создадим тестовый сценарий, в котором получим с сервера набора данных, изменим некоторые записи ttPOLine и проверим, что обработчик событий выполнил необходимые изменения.
Шаг |
Действие |
1 | Откройте файл access_dsPO_procs.p в OpenEdge Editor. Напомним, что мы уже определили хэндл процедуры hProcs для хранения загруженной серверной процедуры для доступа к базе данных. Добавьте описание ещё одной переменной hdsEventHandlers, которая будет содержать хэндл для внешней процедуры с обработчиками событий.
Добавьте следующий код в секцию описания переменных (Definitions): DEFINE VARIABLE hdsEventHandlers AS HANDLE NO-UNDO. |
2 | Установите значение hdsEventHandlers путём запуска процедуры dsPO_ClientEventHandlers.p в качестве перситентной.
Добавьте следующий код после оператора установки хэндла hProc: /* загрузить процедуру обработчика событий */ RUN PurchaseOrder/dsPO_ClientEventHandlers.p PERSISTENT SET hdsEventHandlers. |
3 | Добавьте следующий комментарий в конец процедуры, перед блоком очистки.
/*------------------------------------------------------ Упражнение 5.5 Тестирование события набора данных ROW-UPDATE ------------------------------------------------------*/ |
4 | Очистите набор данных и извлеките с сервера все данных. Для извлечения используйте процедуру, которая не использует обработчик события обновления.
DATASET dsPO:EMPTY-DATASET (). /* Запросить все данные с сервера */ RUN get_dsPO IN hProc ("", "",OUTPUT DATASET dsPO). |
5 | Откройте вывод в файл C:\OpenEdge\WRK\ProDataSets\log\RowUpdateHandler_dsPO.txt
OUTPUT TO "C:\OpenEdge\WRK\ProDataSets\log\RowUpdateHandler_dsPO.txt". |
6 | Свяжите обработчик событий BackOrder с событием ROW-UPDATE таблицы ttPOLine.
BUFFER ttPOLine:SET-CALLBACK-PROCEDURE("ROW-UPDATE", "BackOrder", hdsEventHandlers). |
7 | Активируйте отслеживание изменений для таблицы ttPOLine.
TEMP-TABLE ttPOLine:TRACKING-CHANGES = TRUE. |
8 | Добавьте код для прохождения по записям таблицы ttPOLine, у которых значения POLineStatus равно «Ordered» и ItemNum равно 33.
Сохраните значения полей PONum, ItemNum и POLineStatus для каждой записи в файл. Затем измените значение ItemNum на 50. FOR EACH ttPOLine WHERE ttPOLine.POLineStatus = "Ordered" AND ttPOLine.ItemNum = 33: DISPLAY ttPOLine.PONum ttPOLine.ItemNum ttPOLine.POLineStatus. ttPOLine.ItemNum = 50. END. |
9 | Деактивируйте отслеживание изменений для таблицы ttPOLine.
TEMP-TABLE ttPOLine:TRACKING-CHANGES = FALSE. |
10 | Добавьте код для создания набора изменений и сделайте вызов серверной процедуры update_dsPO. Вам не нужно объединять изменения после вызова update_dsPO, но необходимо удалить набор данных изменений, поскольку он больше не нужен.
CREATE DATASET hChangeDataSet. hChangeDataSet:CREATE-LIKE( DATASET dsPO:HANDLE). hChangeDataSet:GET-CHANGES(DATASET dsPO:HANDLE). RUN update_dsPO IN hProc (INPUT-OUTPUT DATASET-HANDLE hChangeDataSet). DELETE OBJECT hChangeDataset. |
11 | Очистите набор данных и извлеките с сервера все данных.
DATASET dsPO:EMPTY-DATASET (). /* Запросить все данные с сервера */ RUN get_dsPO IN hProc ("", "",OUTPUT DATASET dsPO). |
12 | Добавьте код для прохождения по записям таблицы ttPOLine, у которых значение поля ItemNum равно 50. Сохраните значения полей PONum, POLine и POLineStatus в файл.
MESSAGE "***После извлечения для подтверждения изменений ***". FOR EACH ttPOLine WHERE ttPOLine.ItemNum = 50 NO-LOCK: DISPLAY ttPOLine.PONum ttPOLine.ItemNum ttPOLine.POLineStatus. END. |
13 | Закройте вывод в файл
OUTPUT CLOSE. |
14 | Сохраните изменения и убедитесь в отсутствии ошибок компиляции. |
15 | Выполните эту процедуру.
Проверьте содержимое файла. Для записей с ItemNum 50 изменился ли статус POLineStatus на «Back Ord»? Обратите внимание, что не для всех записей с ItemNum 50 изменился статус, а только для тех, у которых ItemNum был изменён с 33 на 50. |