前言
如以下URL所示
http://services.odata.org/OData/OData.svc/Categories(1)/Products?$format=json,将返回类别为1的所有产品,这种访问方式在SAP
OData中通过建立多个模型之间的关联和导航的方式来实现。
通过这种方式我们可以获取销售订单/采购订单这类含有抬头和明细的单据明细。
本文将在上文 [ OData使用方法简介(一)
](http://mp.weixin.qq.com/s?__biz=MzkwNzUxNDQ5Mg==&mid=2247484512&idx=1&sn=e464e5d11b2e9a28579d67ae620a902a&chksm=c0d94373f7aeca651e1cb0bad62b59129a2f8d5a88edd516ef4dbfb9f1ecc34adbee76573c50&scene=21#wechat_redirect)
的基础上,使用公司和工厂两个实体模型来介绍关联和导航的使用方法。
OData创建
2. 进入SEGW选中ZTEST_ODATA服务,点击编辑,右键Plant,导入属性
3\. 勾选 ZSODATA_PLANT结构中新增的BUKRS字段
5.创建关联,右键 Associations,点击Create
6.如下图所示,输入关联名称,Company 1对N个 Plant
10 . 点击生成按钮,重新生成OData服务
2.修改PLANTSET_GET_ENTITY和PLANTSET_GET_ENTITYSET方法,
导航的属性在 it _navigation_path 入参中获取
METHOD plantset_get_entity. DATA: ls_filter LIKE LINE OF it_key_tab. DATA: lv_bukrs TYPE bukrs, lv_werks TYPE werks_d. IF it_navigation_path[] IS NOT INITIAL. READ TABLE it_navigation_path[ 1 ]-key_tab WITH KEY name = 'Bukrs' INTO ls_filter. IF sy-subrc IS INITIAL. lv_bukrs = ls_filter-value. ENDIF. READ TABLE it_navigation_path[ 1 ]-key_tab WITH KEY name = 'Werks' INTO ls_filter. IF sy-subrc IS INITIAL. lv_werks = ls_filter-value. ENDIF. ELSE. READ TABLE it_key_tab WITH KEY name = 'Bukrs' INTO ls_filter. IF sy-subrc IS INITIAL. lv_bukrs = ls_filter-value. ENDIF. READ TABLE it_key_tab WITH KEY name = 'Werks' INTO ls_filter. IF sy-subrc IS INITIAL. lv_werks = ls_filter-value. ENDIF. ENDIF. SELECT SINGLE bukrs werks name1 INTO er_entity FROM t001w JOIN t001k ON t001k~bwkey = t001w~bwkey WHERE bukrs = lv_bukrs AND werks = lv_werks. ENDMETHOD.METHOD plantset_get_entityset. DATA: ls_key_tab TYPE /iwbep/s_mgw_name_value_pair, lv_bukrs TYPE bukrs. DATA(lv_where) = io_tech_request_context->get_osql_where_clause_convert( ). READ TABLE it_key_tab WITH KEY name = 'Bukrs' INTO ls_key_tab. IF sy-subrc = 0. lv_bukrs = ls_key_tab-value. ENDIF. IF lv_bukrs IS NOT INITIAL. SELECT bukrs,werks,name1 FROM t001w JOIN t001k ON t001k~bwkey = t001w~bwkey WHERE bukrs = @lv_bukrs AND (lv_where) ORDER BY bukrs,werks INTO TABLE @et_entityset UP TO @is_paging-top ROWS OFFSET @is_paging-skip. ELSE. SELECT bukrs,werks,name1 FROM t001w JOIN t001k ON t001k~bwkey = t001w~bwkey WHERE (lv_where) ORDER BY bukrs,werks INTO TABLE @et_entityset UP TO @is_paging-top ROWS OFFSET @is_paging-skip. ENDIF. ENDMETHOD.OData测试
it _navigation_path 入参值如下
或者
4 .过滤$filter依旧有效