1

我正在使用 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的se11截图

ZTABLE_B的se11截图

表格中的示例数据

为了演示我的问题,我添加了几行示例数据:

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,我在 ZMY_PACKAGE->Core Data Services->Data Definitions 中创建了相应的 CDS 视图。

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 Client。现在,我可以使用 OData 查询 ZCDS_A。

OData 查询

普通扩展查询

如果我扩展到 ZCDS_B,我会收到预期的结果。

OData查询: /sap/opu/odata/SAP/ZMY_PACKAGE/ZCDS_A?$format=json&$expand=toZCDS_B

它包含 ZTABLE_A 的所有条目和 ZTABLE_B 的两个条目,它们嵌套在 COLUMN_A2 中 ZTABLE_A 的值为“X”的条目中。

[
  {
    "__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_A 时查询相关 ZCDS_B / ZTABLE_B 的字段。

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 版

4

0 回答 0