Описание и привязка источников данных к набору данных
После того, как набор данных был описан, он всё ещё не содержит данные. Для заполнения набора данных необходимо связать буфер каждой временной таблицы из набора с соответствующим объектом-источником данных. Как только они связаны, набор данных готов к заполнению данными.
Источники данных рекомендуется описывать во встраиваемом файле, после чего в файле процедуры серверной части приложения необходимо добавить код для подключения источника данных к временной таблице.
Источник данных указывает откуда поступают данные для заполнения набора данных. Как правило, источник данных идентифицирует набор таблиц базы данных OpenEdge или может идентифицировать другую базу данных, доступную через OpenEdge DataServer в качестве источника данных. Это называется «управляемым» источником данных.
Для одного и того же набора данных может использоваться несколько разных источников данных. Например, предположим, что у вас есть региональные офисы, из которых необходимо получать какие либо-данные, накопленные за день. В этом случае необходимо описать каждый региональный офис в качестве источника данных. После чего в конце рабочего дня выполняется процедура со следующим алгоритмом:
- Подключение к источнику данных Офис-1.
- Скачивание данных.
- Отключение от источника данных Офис-1.
- Подключение к источнику данных Офис-2.
- Скачивание данных.
- Отключение от источника данных Офис-2.
- И так для каждого следующего офиса.
Описание источника данных
Источники данных описываются отдельно от набора данных и не передаются вместе с набором данных при его передаче из процедуры в процедуру. Это позволяет в любой момент переключать источник данных для извлечения информации из нескольких мест.
Упрощённый синтаксис описания источника данных:
DEFINE DATA-SOURCE <data-source-name> FOR [ QUERY <query-name> ] [ <source-table> [KEYS(<field>…]... ].
Параметр |
Назначение |
<data-source-name> | Название источника данных. |
<query-name> | Название необязательного запроса, который был описан вами ранее. |
<source-table> | Одна или несколько таблиц базы данных для источника данных. |
<field> | Поля, которые являются первичными ключами |
Примечание. Если вы хотите ограничить объём извлекаемых записей, то должны использовать запрос (QUERY). Например, предположим, что у вас есть набор данных, подготовленный для таблиц Customer, Order, OrderLine и Item. Используя запрос для таблицы Customer, вы можете получить данные по заказам только интересующих вас клиентов. Если вы не используете запрос, набор данных заполнится данными по всем клиентам и их заказам.
Следующий пример кода описывает источник данных с именем srcOrder и назначает таблицу Order в качестве источника.
/* srcOrder.i */ DEFINE DATA-SOURCE srcOrder FOR Order.
Если у вас есть подготовленный запрос, то вы можете привязать этот запрос к источнику данных, пример:
/* srcOrderQ.i */ DEFINE QUERY qOrder FOR Order. DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder.
В этом примере описывается запрос qOrder, который обращается к таблице Order, и затем описывается источник данных srcOrder, который связывается с запросом.
Подключение источника данных
После того как источник данных описан и прежде, чем он может быть использован для предоставления данных набору данных, он должен быть подключён. Метод ATTACH-DATA-SOURCE связывает буфер временной таблицы с его источником данных.
Упрощённый синтаксис подключения источника данных:
<buffer-handle>:ATTACH-DATA-SOURCE (<data-source-handle>).
Параметр |
Назначение |
<buffer-handle> | Хэндл (дескриптор) буфера временной таблицы в наборе данных. |
<data-source-handle> | Хэндл источника данных. Так же можно использовать оператор DATA-SOURCE data-source-name:HANDLE для указания хэндла. |
![]() |
Хэндл (англ. Handle) – дескриптор, т.е. число, с помощью которого можно идентифицировать ресурс. С помощью дескрипторов можно ссылаться на окна, объекты ядра, графические объекты и т.п. Можно провести аналогию с массивом: у нас имеется набор ресурсов, а HANDLE – это индекс, который указывает на конкретный ресурс. |
Вы также можете указать разные имена для временной таблицы и источника данных, а также поля для включения или исключения. Дополнительную информацию можно получить в справочной документации по OpenEdge.
В следующем примере кода источник данных srcOrder описан в отдельном встраиваемом файле srsOrderQ.i, а в процедуре fill_dataset.p источник данных подключается к буферу временной таблицы ttOrder.
Код описания источника данных:
/* srcOrderQ.i */ DEFINE QUERY qOrder FOR Order. DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder.
Код процедуры для подключения к источнику данных:
/* fill_dataset.p */ {include/dsOrder.i} {include/srcOrderQ.i} BUFFER ttOrder:ATTACH-DATA-SOURCE(DATA-SOURCE srcOrder:HANDLE).
В случае, если необходимо заполнить временную таблицу полями из нескольких исходных таблиц, то источник данных описывается и подключается так, как показано в коде ниже.
В этом примере кода:
- Временная таблица ttOrder заполняется данными из таблиц Order и Customer.
- Описание DATA-SOURCE содержит запрос, который содержит обе таблицы, и ключевые поля этих таблиц для связи.
- Метод ATTACH-DATA-SOURCE ссылается на источник данных srcOrder. Здесь также делается связка между полями базы данных Customer.Name и полем временной таблицы CustName. Это необходимо потому, что названия полей отличаются между базой данных и временной таблицей.
DEFINE TEMP-TABLE ttOrder NO-UNDO BEFORE-TABLE bttOrder FIELD OrderNum AS INTEGER FIELD CustName AS CHARACTER FORMAT "x(30)" INDEX OrderNum IS UNIQUE PRIMARY OrderNum. DEFINE DATASET dsOrder FOR ttOrder. DEFINE QUERY qOrder FOR Order, Customer. DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder Order KEYS (OrderNum), Customer KEYS (CustNum). BUFFER ttOrder:ATTACH-DATA-SOURCE (DATA-SOURCE srcOrder:HANDLE, "Customer.Name,CustName").
Следующий пример объединяет всё то, что вы узнали на этот момент. Пример содержит:
- Две временные таблицы (ttOrder и ttOrderLine).
- Набор данных, сформированный из двух таблиц (dsOrderOrderLine).
- Запрос (qOrder), который обращается к таблице Order.
- Источник данных для заполнения набора данных.
В примере также подключается источник данных перед подготовкой к заполнению набора данных.
/* ttOrder.i */ DEFINE TEMP-TABLE ttOrder NO-UNDO BEFORE-TABLE bttOrder FIELD OrderNum AS INTEGER FIELD OrderDate AS DATE FIELD ShipDate AS DATE FIELD PromiseDate AS DATE FIELD OrderTotal AS DECIMAL INDEX OrderNum IS UNIQUE PRIMARY OrderNum. /* ttOrderLine.i */ DEFINE TEMP-TABLE ttOrderLine NO-UNDO BEFORE-TABLE bttOrderLine FIELD OrderNum AS INTEGER FIELD LineNum AS INTEGER FIELD ItemNum AS INTEGER FIELD Price AS DECIMAL FIELD Qty AS INTEGER FIELD Discount AS INTEGER FIELD ExtendedPrice AS DECIMAL INDEX OrderNum_LineNum IS UNIQUE PRIMARY OrderNum LineNum. /* dsOrderOrderLine.i */ {include/ttOrder.i} {include/ttOrderLine.i} /* Описание набора данных */ DEFINE DATASET dsOrderOrderLine FOR ttOrder, ttOrderLine DATA-RELATION drOrderOrderLine FOR ttOrder, ttOrderLine RELATION-FIELDS (OrderNum, OrderNum). /* OrderOrderLine_DataSources.i */ /* Описание запроса */ DEFINE QUERY qOrder FOR Order. /* Описание источника данных*/ DEFINE DATA-SOURCE srcOrder FOR QUERY qOrder. /* Ссылается на запрос */ DEFINE DATA-SOURCE srcOrderLine FOR OrderLine. /* Ссылается на таблицу */ /* fill_dataset.p */ /* Описание набора данных и источника данных */ {include/dsOrderOrderLine.i} {include/OrderOrderLine_DataSources.i} /* Подключение источника данных */ BUFFER ttOrder:ATTACH-DATA-SOURCE (DATA-SOURCE srcOrder:HANDLE). BUFFER ttOrderLine:ATTACH-DATA-SOURCE (DATA-SOURCE srcOrderLine:HANDLE). /*Следующий шаг: заполнение набора данных и отключение от источника данных*/