Упражнение 3.2: Внутренняя процедура для извлечения данных
На предыдущих занятиях мы подготовили процедуру access_dsPO.p, которая заполняла набор данных, а затем записывала некоторое содержимое набора данных в файл. Теперь мы создадим новую внутреннюю процедуру с именем get_dsPO, которая принимает входящие параметры с условиями отбора данных для временных таблиц и возвращает набор данных в качестве OUTPUT-параметра.
Шаг | Действие |
1 | Добавьте в файл dsPO_procs.p после комментария Main Block описание процедуры с именем get_dsPO.
PROCEDURE get_dsPO: RETURN. END PROCEDURE. |
2 | Опишите параметры для в процедуры:
Добавьте следующий код в процедуру get_dsPO: DEFINE INPUT PARAMETER pPurchaseOrderFilter AS CHARACTER NO-UNDO. DEFINE INPUT PARAMETER pPOLineFilter AS CHARACTER NO-UNDO. DEFINE OUTPUT PARAMETER DATASET-HANDLE phdsPO. |
3 | Подключите источники данных к временным таблицам набора данных dsPO.
BUFFER ttPurchaseOrder:ATTACH-DATA-SOURCE (DATA-SOURCE srcPurchaseOrder:HANDLE). BUFFER ttPOLine:ATTACH-DATA-SOURCE (DATA-SOURCE srcPOLine:HANDLE). |
4 | Теперь подготовим запрос для данных из PurchaseOrder с использованием входящего параметра pPurchaseOrder в качестве условия отбора. Если значение параметра пустое, до просто используем запрос «FOR EACH PurchaseOrder». Если значение параметра не пустое, до добавим это значение к запросу.
IF pPurchaseOrderFilter = "" THEN QUERY qPurchaseOrder:QUERY-PREPARE("FOR EACH PurchaseOrder"). ELSE QUERY qPurchaseOrder:QUERY-PREPARE("FOR EACH PurchaseOrder WHERE " + pPurchaseOrderFilter). |
5 | Далее дополним атрибут FILL-WHERE-STRING значением из параметра pPOLineFilter.
IF pPOLineFilter <> "" THEN DATA-SOURCE srcPOLine:FILL-WHERE-STRING = DATA-SOURCE srcPOLine:FILL-WHERE-STRING + " AND " + pPOLineFilter. Внимание! Пробел перед оператором AND обязателен. |
6 | Мы знаем, что у клиента будет описание набора данных dsPO, поэтому мы исключим схему, передаваемую клиенту. Добавьте соответствующие операторы, чтобы указать, что никакая схема не будет передана с набором данных, когда она будет возвращена клиенту.
TEMP-TABLE ttPurchaseOrder:SCHEMA-MARSHAL = "NONE". TEMP-TABLE ttPOLine:SCHEMA-MARSHAL = "NONE". |
7 | Добавьте операторы заполнения набора данных и отключения источников данных.
DATASET dsPO:FILL(). BUFFER ttPurchaseOrder:DETACH-DATA-SOURCE(). BUFFER ttPOLine:DETACH-DATA-SOURCE(). |
8 | Присвойте исходящему параметру phdsPO хэндл набора данных dsPO.
phdsPO = DATASET dsPO:HANDLE. |
9 | Сохраните файл и убедитесь в отсутствии ошибок компиляции. Это процедура готова для вызова ABL-клиентом. |