Поиск 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

0 ответов

Другие вопросы по тегам