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

有答案