如何从OData服务读取深度插入的子父层级子项数据?
解决方案:获取嵌套层级的子项数据
我看了你的问题,核心问题出在嵌套数据的读取层级逻辑错误,另外也需要确认OData关联配置是否正确。下面分两部分说明:
1. 修正读取代码的层级逻辑
你的Payload里,ITEMTOSERIALS是INVTOITEM的子集合(每个库存条目对应一组序列号数据),但你当前的代码直接从顶级的ls_deep中遍历ITEMTOSERIALS,这显然不符合数据结构的嵌套关系——它根本不在顶级层级,而是嵌套在每个INVTOITEM条目内部。
你需要把ITEMTOSERIALS的遍历逻辑放到INVTOITEM的循环内部,这样才能获取到对应条目的子项数据。修改后的代码示例如下:
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. " 在这里处理当前INVTOITEM下的ITEMTOSERIALS LOOP AT ls_item-ITEMTOSERIALS INTO ls_serials. MOVE-CORRESPONDING ls_serials TO ls_serials1. APPEND ls_serials1 TO lt_serials. " 如果需要处理Serialno数组,再嵌套一层循环 LOOP AT ls_serials-Serialno INTO ls_serial. " 这里可以单独处理每个序列号,比如存入另一个内表 ls_single_serial-serialno = ls_serial-Serialno. APPEND ls_single_serial TO lt_single_serials. ENDLOOP. ENDLOOP. ENDLOOP. ENDCASE.
2. 确认OData关联配置是否正确
除了代码逻辑,还要确保你的OData服务模型和数据提供者配置支持深度读取这个嵌套层级:
- EDMX模型检查:在你的OData服务的EDMX文件中,
INVTOITEM实体必须定义指向ITEMTOSERIALS的NavigationProperty,并且设置正确的Partner和Multiplicity属性。 - Data Provider配置:在你的OData数据提供者类(比如继承自
/IWBEP/CL_MGW_ABS_DATA的类)中,确保在处理深度插入时,允许扩展ITEMTOSERIALS导航属性。比如在CREATE_DEEP_ENTITY方法中,要正确解析嵌套的实体集合,或者在相关方法中配置允许读取关联的子实体。
额外注意点
你的Payload里Serialno是一个数组结构(每个ITEMTOSERIALS下有多个Serialno对象),所以如果需要单独处理每个序列号,还要在ITEMTOSERIALS的循环内部再嵌套一层遍历Serialno的逻辑,就像上面代码示例里的那样。
内容的提问来源于stack exchange,提问作者Pranita Jadhav
相关产品推荐
相关产品推荐

