我正在使用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是主键。
为演示我的问题,我添加了几行示例数据:
+-----------------------------+
| COLUMN_A1 (key) | COLUMN_A2 |
+-----------------+-----------+
| A | X |
| B | Y |
| C | Z |
+-----------------+-----------+
+-----------------------------+
| COLUMN_B1 (key) | COLUMN_B2 |
+-----------------+-----------+
| FOO | X |
| BAR | X |
| TEST | ASDFC |
+-----------------+-----------+
使用Eclipse Photon,我在ZMY_PACKAGE-> Core Data Services-> Data Definitions中创建了相应的CDS视图。
@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
}
@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。
如果我扩展到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": []
}
}
]
还可以使用查询参数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" : [
]
}
}
现在,这是棘手的部分:我想在查询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