在SAP Core Data Service的关联表中进行OData搜索

时间:2018-12-04 17:09:39

标签: odata sap cds

我正在使用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,我在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之后,我使用事务代码segw添加了ZCDS_A作为数据引用,并通过单击红色/白色圆圈生成了运行时对象。接下来,我通过右键单击该服务来打开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

0 个答案:

没有答案