Я работаю с 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 являются первичными ключами.
Пример данных в таблицах
Чтобы продемонстрировать свою проблему, я добавляю несколько строк образцаdata:
Данные в 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-> Определения данных.
Определение 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
Простой расширенный запрос
Если развернуть в 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
(без начального '$').
ODataquery: /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