Упражнение 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-клиентом. |

