Поиск OData в связанных таблицах SAP Core Data Service
Я работаю с SAP Core Data Services (CDS) и борюсь с запросами OData в полях, которые являются частью связанного представления / таблиц.
Вот минимальный (не) рабочий пример:
Табличные Определения
Я создал две таблицы с именами "ZTABLE_A" и "ZTABLE_B".
ZTABLE_A содержит два столбца ("COLUMN_A1", "COLUMN_A2") и ZTABLE_B ("COLUMN_B1", "COLUMN_B2").
Все столбцы имеют встроенный тип данных CHAR, длина 50. COLUMN_A1 и COLUMN_B1 являются первичными ключами.
Пример данных в таблицах
Чтобы продемонстрировать мою проблему, я добавляю несколько строк примеров данных:
Данные в ZTABLE_A
+-----------------------------+
| COLUMN_A1 (key) | COLUMN_A2 |
+-----------------+-----------+
| A | X |
| B | Y |
| C | Z |
+-----------------+-----------+
Данные в ZTABLE_B
+-----------------------------+
| COLUMN_B1 (key) | COLUMN_B2 |
+-----------------+-----------+
| FOO | X |
| BAR | X |
| TEST | ASDFC |
+-----------------+-----------+
Используя Eclipse Photon, я создал соответствующие представления CDS в ZMY_PACKAGE->Core Data Services->Definitions Data.
Определение ZCDS_A (с ассоциацией)
@AbapCatalog.sqlViewName: 'ZCDSVIEW_A'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Obligatory Label A'
@OData.publish: true
@Search.searchable: true
define view ZCDS_A as select from ztable_a
association [1..*] to ZCDS_B on ztable_a.column_a2 = ZCDS_B.column_b2
{
@Search.defaultSearchElement: true
key ztable_a.column_a1,
@Search.defaultSearchElement: true
ztable_a.column_a2,
@Search.defaultSearchElement: true
ZCDS_B
}
Определение ZCDS_B (просто)
@AbapCatalog.sqlViewName: 'ZCDSVIEW_B'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Obligatory Label B'
@OData.publish: true
@Search.searchable: true
define view ZCDS_B as select from ztable_b
{
@Search.defaultSearchElement: true
key column_b1,
@Search.defaultSearchElement: true
column_b2
}
После активации обоих CDS я добавил ZCDS_A в качестве ссылок на данные, используя код транзакции. segw
и сгенерировал объекты во время выполнения, щелкнув красный / белый круг. Затем я открыл клиент SAP Gateway, щелкнув правой кнопкой мыши сервис. Теперь я могу запросить ZCDS_A с использованием OData.
OData Queries
Простой расширенный запрос
Если я расширяюсь до ZCDS_B, я получаю результат, как и ожидалось.
Запрос OData: /sap/opu/odata/SAP/ZMY_PACKAGE/ZCDS_A?$format=json&$expand=toZCDS_B
Он содержит все записи ZTABLE_A и две записи ZTABLE_B, которые вложены в запись со значением 'X' ZTABLE_A в COLUMN_A2.
[
{
"__metadata": { ... },
"column_a1": "A",
"column_a2": "X",
"toZCDS_B": {
"results": [
{
"__metadata": "__metadata": { ... },
"column_b1": "BAR",
"column_b2": "X"
},
{
"__metadata": {... },
"column_b1": "FOO",
"column_b2": "X"
}
]
}
},
{
"__metadata": { ... },
"column_a1": "B",
"column_a2": "Y",
"toZCDS_B": {
"results": []
}
},
{
"__metadata": { ... },
"column_a1": "C",
"column_a2": "Z",
"toZCDS_B": {
"results": []
}
}
]
Искать в полях ZTABLE_A
Также возможно использовать параметр запроса search
(без начального '$').
Запрос OData: /sap/opu/odata/SAP/ZMY_PACKAGE/ZCDS_A?$format=json&$expand=toZCDS_B&search=B
Как и ожидалось, это возвращает список только с одним результатом из ZTABLE_A, который содержит "B" в качестве значения. Эта запись в ZTABLE_A не связана ни с одной записью в ZTABLE_B.
{
"__metadata" : { ... },
"column_a1" : "B",
"column_a2" : "Y",
"toZCDS_B" : {
"results" : [
]
}
}
Проблема: поиск по полям ZTABLE_B
Теперь вот сложная часть: я хотел бы запрашивать поля связанных ZCDS_B / ZTABLE_B при запросе ZCDS_A.
Запрос OData: /sap/opu/odata/SAP/ZMY_PACKAGE/ZCDS_A?$format=json&$expand=toZCDS_B&search=FOO
Я ожидаю такой результат, как:
{
"__metadata": { ... },
"column_a1": "A",
"column_a2": "X",
"toZCDS_B": {
"results": [
{
"__metadata": {... },
"column_b1": "FOO",
"column_b2": "X"
}
]
}
}
Но возвращается только пустой список:
"results" : [ ]
В чем проблема? Я пометил оба представления и их отдельные поля как доступные для поиска с помощью @Search.searchable: true
аннотация или @Search.defaultSearchElement: true
соответственно. Разве нельзя запросить вложенные таблицы?
ABAP версия 7.50