Упражнение 5.6: Пакетирование на стороне сервера
Задание 6
В этом задании мы подготовим описание набора данных и серверную процедуру для пакетного извлечения данных из таблицы Customer.
Шаг |
Действие |
1 | В каталоге src/include проекта Shared создайте встраиваемый файл dsCustomer.i и добавьте в него код с описанием временной таблицы ttCustomer и набора данных dsCustomer.
DEFINE TEMP-TABLE ttCustomer NO-UNDO BEFORE-TABLE bttCustomer FIELD CustNum AS INTEGER INITIAL "0" LABEL "Cust Num" FIELD Name AS CHARACTER LABEL "Name" FIELD Address AS CHARACTER LABEL "Address" FIELD Address2 AS CHARACTER LABEL "Address2" FIELD City AS CHARACTER LABEL "City" FIELD State AS CHARACTER LABEL "State" FIELD PostalCode AS CHARACTER LABEL "Postal Code" FIELD Country AS CHARACTER INITIAL "USA" LABEL "Country" FIELD Contact AS CHARACTER LABEL "Contact" FIELD Phone AS CHARACTER LABEL "Phone" FIELD SalesRep AS CHARACTER LABEL "Sales Rep" FIELD CreditLimit AS DECIMAL INITIAL "1500" LABEL "Credit Limit" FIELD Balance AS DECIMAL INITIAL "0" LABEL "Balance" FIELD Terms AS CHARACTER INITIAL "Net30" LABEL "Terms" FIELD Discount AS INTEGER INITIAL "0" LABEL "Discount" FIELD Comments AS CHARACTER LABEL "Comments" FIELD Fax AS CHARACTER LABEL "Fax" FIELD EmailAddress AS CHARACTER LABEL "Email" FIELD CreditHold AS LOGICAL INITIAL "no" FIELD TZOffset AS INTEGER INITIAL "0" INDEX Comments Comments ASCENDING INDEX CountryPost Country ASCENDING PostalCode ASCENDING INDEX CustNum IS PRIMARY UNIQUE CustNum ASCENDING INDEX Name Name ASCENDING INDEX SalesRep SalesRep ASCENDING . DEFINE DATASET dsCustomer FOR ttCustomer. |
2 | В каталоге src/AppServer проекта сервер создайте каталог Batching. |
3 | В каталоге Batching создайте ABL-процедуру fetchCustomer.p. |
4 | В новой процедуре добавьте:
{include/dsCustomer.i} DEFINE DATA-SOURCE srcCustomer FOR Customer. DEFINE INPUT PARAMETER pBatchSize AS INTEGER NO-UNDO. DEFINE INPUT-OUTPUT PARAMETER prowRestart AS ROWID NO-UNDO. DEFINE OUTPUT PARAMETER DATASET FOR dsCustomer. |
5 | Свяжите временную таблицу ttCustomer c источником данных srcCustomer.
BUFFER ttCustomer:ATTACH-DATA-SOURCE(DATA-SOURCE srcCustomer:HANDLE). |
6 | Добавьте код для установки размера пакета для временной таблицы ttCustomer на основе значения входного параметра pBatchSize.
BUFFER ttCustomer:BATCH-SIZE = pBatchSize. |
7 | Добавьте код для установки RESTART-ROWID для источника данных. Установите его только в случае, если параметр prowRestart не определён.
IF prowRestart NE ? THEN DATA-SOURCE srcCustomer:RESTART-ROWID = prowRestart. |
8 | Установите FILL-MODE в EMPTY для ttCustomer, если этот код работает режиме PERSISTENT.
IF THIS-PROCEDURE:PERSISTENT THEN BUFFER ttCustomer:FILL-MODE = "EMPTY". |
9 | Заполните набор данных.
DATASET dsCustomer:FILL(). |
10 | После операции FILL установите для параметра prowRestart значение следующего ROWID в источнике данных.
prowRestart = DATA-SOURCE srcCustomer:NEXT-ROWID. |
11 | Отключите ttCustomer от источника данных, после чего добавьте оператор RETURN.
BUFFER ttCustomer:DETACH-DATA-SOURCE(). RETURN. |
12 | Итоговый код процедуры fetchCustomer.p
{include/dsCustomer.i} DEFINE DATA-SOURCE srcCustomer FOR Customer. DEFINE INPUT PARAMETER pBatchSize AS INTEGER NO-UNDO. DEFINE INPUT-OUTPUT PARAMETER prowRestart AS ROWID NO-UNDO. DEFINE OUTPUT PARAMETER DATASET FOR dsCustomer. BUFFER ttCustomer:ATTACH-DATA-SOURCE(DATA-SOURCE srcCustomer:HANDLE). BUFFER ttCustomer:BATCH-SIZE = pBatchSize. IF prowRestart NE ? THEN DATA-SOURCE srcCustomer:RESTART-ROWID = prowRestart. IF THIS-PROCEDURE:PERSISTENT THEN BUFFER ttCustomer:FILL-MODE = "EMPTY". DATASET dsCustomer:FILL(). prowRestart = DATA-SOURCE srcCustomer:NEXT-ROWID. BUFFER ttCustomer:DETACH-DATA-SOURCE(). RETURN. |
13 | Сохраните изменения и убедитесь в отсутствии ошибок компиляции. |