Function 如何从odata服务读取子父级子级的深度插入值?
我试图通过关联和导航为多个表实现深度插入。我可以发布带有父级和子级值的数据,但我面临着为子级父级子级获取值的问题 这是我的有效载荷的样子Function 如何从odata服务读取子父级子级的深度插入值?,function,abap,gateway,Function,Abap,Gateway,我试图通过关联和导航为多个表实现深度插入。我可以发布带有父级和子级值的数据,但我面临着为子级父级子级获取值的问题 这是我的有效载荷的样子 { "d": { "Gjahr": "2019", "INVTODATE": [{ "Iblnr": " ", "Zldat": "2019-12-16T00:00:00" }], "INVTOITEM": [{ "M
{
"d": {
"Gjahr": "2019",
"INVTODATE": [{
"Iblnr": " ",
"Zldat": "2019-12-16T00:00:00"
}],
"INVTOITEM": [{
"Material": "254620",
"Item": "1",
"EntryQnt": "200",
"EntryUomIso": "EA",
"ITEMTOSERIALS": [{
"Item": "1",
"Serialno": [{
"Serialno": "233"
}, {
"Serialno": "233"
}]
}]
}]
}
}
在上面的有效负载中,“ITEMTOSERIALS”是“INVTOITEM”子对象的子对象。在这里,我可以在sub-parent(深度插入)之前获得发布的值
这是我用来获取深度插入值的代码
CASE lv_entityset_name.
WHEN 'INVENTORYSet'.
io_data_provider->read_entry_data( IMPORTING es_data = ls_deep ).
ls_inventory-iblnr = ls_deep-iblnr.
ls_inventory-gjahr = ls_deep-gjahr.
LOOP AT ls_deep-INVTODATE INTO ls_date.
ls_dates-zldat = ls_date-zldat.
ENDLOOP.
LOOP AT ls_deep-INVTOITEM INTO ls_item.
IF ls_item-entry_qnt EQ 0.
ls_item-zero_count = 'X'.
ELSE.
ls_item-entry_qnt = ls_item-entry_qnt.
ENDIF.
MOVE-CORRESPONDING ls_item TO ls_items.
APPEND ls_items TO lt_items.
ENDLOOP.
LOOP AT ls_deep-ITEMTOSERIALS INTO ls_serials.
MOVE-CORRESPONDING ls_serials TO ls_serials1.
APPEND ls_serials1 TO lt_serials.
ENDLOOP.
是否有任何解决方案来获取子父级子级值?或者我需要在关联中添加它吗?这不是对这个特定场景的回答(至少不是在
abap
中),而是关于使用odata服务和从导航属性检索数据的一般回答。至少这是我第一次发现这个问题时寻找的答案,当我在SAPUI5应用程序中寻找相同的信息时
当您调用odata服务时,默认情况下您在基本级别调用它,它不会从导航属性中检索任何内容(我听说它可以在OData4中自适应使用,但我没有亲自测试过)。要从导航
(关联
)检索数据,您需要在ODATA服务调用中使用展开
参数,以使其检索导航
结果
expand
是添加到服务调用中的通用odata参数,但其实现在不同的框架中有所不同。Abap可能使用特定的函数/方法来实现这一点,而SAPUI5实际上允许您使用通用的参数
您需要寻找的是如何在调用服务时使用的任何框架/语言中实现expand
参数。
示例不多:
假设您的服务将订单
返回到项目
,这些订单具有id
、相同级别的一些其他字段和导航属性
(或关联
)。
当您按id读取order时,您的服务调用将类似于Orders(id EQ 12345)
,您检索的实际数据将是:
Order: { id: 12345,
//otherFields
}
要从服务的导航属性(比如项目
)检索数据,您需要在服务调用中使用expand
参数,使服务调用看起来像订单(id EQ 12345)?$expand=项目
,现在也将返回项目
Order: { id: 12345,
//otherFields
items: [{<item data>},{<item data>}....]
}
顺序:{id:12345,
//其他领域
项目:[{},{}….]
}
如果需要扩展多个深层结构,只需将它们全部指定为$expand=items,BusinessPartner
,如果需要深入到更深的层,只需指定deepeset层$expand=BusinessPartner/Address
(将返回业务合作伙伴结构和业务合作伙伴结构中的地址结构
如果需要,您可以将后2项组合起来:$expand=items,BusinessPartner/Address
有答案