Поиск OData в связанных таблицах SAP Core Data Service - PullRequest
0 голосов
/ 04 декабря 2018

Я работаю с 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

...