我正在使用 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 后,我使用事务代码添加 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 版