SAP ABAP Odata
GetEntity和GetEntitys
- GetEntitys
创建Odata Project
- 导入结构
选择需要的字段
设定Key
勾选字段的creatable、updatable、sortable、nullable、filterable属性值。
再依上述步骤创建ZPOITEM结构和实体集
3. 创建ZPOHEADER和ZPOITEM的Association
两个实体集的关联字段,关联字段依情况填写,完了下一步点完成
生成服务对象
生成4个类,注册1个模型,1个服务
ZCL_ZTEST_ODATA1_MPC_EXT 数据处理增强类
接口逻辑主要处理类,在该类中重定义相应的方法来执行业务处理逻辑
ZCL_ZTEST_ODATA1_DPC_EXT 模型处理增强类
接口数据模型定义类,在该类中定义接口结构。基于Odata对象生成相应服务
注册服务并指定系统别名
注意:别名不跨client,所以需要将别名放入定制请求中,通过scc1传输到开发系统的其他client。最后也需要传输到测试和生产系统。
注意:odata接口服务传输到测试或生产系统后需要手动激活服务。可以点击下图中的Internet通信框架节点按钮再点击激活按钮,或者在SCIF下激活服务。
点击定制进入到修改别名视图,点击修改按钮后,选中别名服务行,再点击标示图按钮,选则传输后会弹出选中请求输入框,指定需要放入的定制请求后,点击包含在请求中,最后点击保存按钮后则别名正式被包含在了请求中。
然后将它包含到请求中再点击保存
服务注册完成之后,点击SAP Gateway Client(T-Code:/IWFND/GW_CLIENT)按钮进入测试页面
实现GetEntitys方法(取多条数据)
重定义Get_EntitySet方法,鼠标右键点击方法
(注:GET_ENTITYSET后缀的表示取数方法取多条数据,GET_ENTITY后缀的表示取单条)
IV_ENTITY_NAME区分大小写,与下面的保持一致
都转成大写,保持一致
实施重定义的方法
DATA:lr_ebeln TYPE RANGE OF ekko-ebeln,ls_ebeln LIKE LINE OF lr_ebeln,lv_top TYPE i,lv_skip TYPE i.es_response_context-count = lines( et_entityset ).lv_top = io_tech_request_context->get_top( ).lv_skip = io_tech_request_context->get_skip( ).CASE translate_entity_name( iv_entity_name ).WHEN 'ZPOHEADER'."filter 操作符eq , ne, le, lt , ge, gtIF it_filter_select_options[] IS NOT INITIAL.READ TABLE it_filter_select_options INTO DATA(lw_filter) WITH KEY property = 'Ebeln'.IF sy-subrc = 0.LOOP AT lw_filter-select_options INTO DATA(lw_range).MOVE-CORRESPONDING lw_range TO ls_ebeln.APPEND ls_ebeln TO lr_ebeln.ENDLOOP.ENDIF.ENDIF.SELECT * FROM ekkoWHERE ebeln IN @lr_ebelnORDER BY ebelnINTO CORRESPONDING FIELDS OF TABLE @et_entityset UP TO @lv_top ROWS OFFSET @lv_skip."sortIF it_order[] IS NOT INITIAL.READ TABLE it_order INTO DATA(lw_order) WITH KEY property = 'Ebeln'.IF sy-subrc = 0.CASE me->translate_entity_name( lw_order-order ).WHEN 'DESC'.SORT et_entityset BY ebeln DESCENDING.WHEN 'ASC'.SORT et_entityset BY ebeln ASCENDING.WHEN OTHERS.ENDCASE.ENDIF.ENDIF.WHEN OTHERS.ENDCASE.
Top,skip
Filter
Orderby
7. Get_entity
METHOD zpoheaderset_get_entity.CASE me->translate_entity_name( iv_entity_name ).WHEN 'ZPOHEADER'.READ TABLE it_key_tab INTO DATA(lw_key_tab) WITH KEY name = 'Ebeln'.IF sy-subrc = 0.DATA(lv_ebeln) = |{ lw_key_tab-value ALPHA = IN WIDTH = 10 }|.SELECT SINGLE * FROM ekko INTO CORRESPONDING FIELDS OF @er_entity WHERE ebeln = @lv_ebeln.ENDIF.ENDCASE.ENDMETHOD.
Association和Navigation
Association 和 Navigation主要是用来关联两个entity,比如先前例子中的header和item,我们想在获取header数据的同时,还获取其item的数据。
只需要在ITEM的GET_ENTITYSET方法实现即可。
- 重定义ITEM的方法
DATA:lr_ebeln TYPE RANGE OF ekko-ebeln,ls_ebeln LIKE LINE OF lr_ebeln,lr_ebelp TYPE RANGE OF ekpo-ebelp,ls_ebelp LIKE LINE OF lr_ebelp.CASE translate_entity_name( iv_entity_name ).WHEN 'ZPOITEM'.IF it_filter_select_options[] IS NOT INITIAL.READ TABLE it_filter_select_options INTO DATA(lw_filter) WITH KEY property = 'Ebeln'.IF sy-subrc = 0.LOOP AT lw_filter-select_options INTO DATA(lw_range).MOVE-CORRESPONDING lw_range TO ls_ebeln.APPEND ls_ebeln TO lr_ebeln.ENDLOOP.ENDIF.READ TABLE it_filter_select_options INTO lw_filter WITH KEY property = 'Ebelp'.IF sy-subrc = 0.LOOP AT lw_filter-select_options INTO lw_range.MOVE-CORRESPONDING lw_range TO ls_ebelp.APPEND ls_ebeln TO lr_ebelp[].ENDLOOP.ENDIF.ENDIF."Association和NavigationREAD TABLE it_key_tab INTO DATA(lw_key_tab) WITH KEY name = 'Ebeln'.IF sy-subrc = 0.DATA(lv_ebeln) = |{ lw_key_tab-value ALPHA = IN WIDTH = 10 }|.ENDIF.IF lv_ebeln IS NOT INITIAL.SELECT * FROM ekpo INTO CORRESPONDING FIELDS OF TABLE @et_entityset UP TO 500 ROWSWHERE ebeln = @lv_ebeln.ELSE.SELECT * FROM ekpo INTO CORRESPONDING FIELDS OF TABLE @et_entityset UP TO 500 ROWSWHERE ebeln IN @lr_ebeln AND ebelp IN @lr_ebelp.ENDIF.IF it_order[] IS NOT INITIAL.READ TABLE it_order INTO DATA(lw_order) WITH KEY property = 'Ebeln'.READ TABLE it_order INTO lw_order WITH KEY property = 'Ebelp'.IF sy-subrc = 0.CASE me->translate_entity_name( lw_order-order ).WHEN 'DESC'.SORT et_entityset BY ebeln DESCENDING.WHEN 'ASC'.SORT et_entityset BY ebeln ASCENDING.WHEN OTHERS.ENDCASE.ENDIF.ENDIF.WHEN OTHERS.ENDCASE.
- Expand实现
需重定义/IWBEP/IF_MGW_APPL_SRV_RUNTIME~GET_EXPANDED_ENTITY方法
"GET po itemTYPES: ty_item TYPE TABLE OF zcl_ztest_po_mpc_ext=>ts_zpoitem WITH DEFAULT KEY.TYPES: BEGIN OF ty_po_data.INCLUDE TYPE zcl_ztest_po_mpc_ext=>ts_zpoheader.TYPES: zpoitemset TYPE ty_item,END OF ty_po_data.DATA:ls_po_data TYPE ty_po_data,ls_header TYPE zcl_ztest_po_mpc_ext=>ts_zpoheader,lt_item TYPE ty_item.TYPES: ty_header TYPE TABLE OF zcl_ztest_po_mpc_ext=>ts_zpoheader WITH DEFAULT KEY.CASE translate_entity_name( io_tech_request_context->get_entity_set_name( ) ).WHEN 'ZPOHEADERSET'.READ TABLE it_key_tab INTO DATA(ls_key) WITH KEY name = 'Ebeln'.IF sy-subrc = 0.DATA(lv_ebeln) = |{ ls_key-value ALPHA = IN WIDTH = 10 }|.SELECT SINGLE * FROM ekko INTO CORRESPONDING FIELDS OF @ls_headerWHERE ebeln = @lv_ebeln.SELECT * FROM ekpo INTO CORRESPONDING FIELDS OF TABLE @lt_itemWHERE ebeln = @lv_ebeln.MOVE-CORRESPONDING ls_header TO ls_po_data.MOVE-CORRESPONDING lt_item[] TO ls_po_data-zpoitemset[].copy_data_to_ref( EXPORTING is_data = ls_po_dataCHANGING cr_data = er_entity ).ENDIF.WHEN OTHERS.ENDCASE.
Create方法实现
Create方法同上面一样,直接重定义对应的Create_Entity方法即可。
先定义结构,获取传来的参数
检查主键
METHOD check_ebeln.IF is_header-ebeln IS INITIAL.is_message = VALUE #( msgid = 'SY' msgno = '002' attr1 = '采购单为空' ).ENDIF.ENDMETHOD.
- 方法实施
io_data_provider->read_entry_data( IMPORTING es_data = gs_header ).gs_message = check_ebeln( gs_header ).IF gs_message IS INITIAL.MOVE-CORRESPONDING gs_header TO er_entity."返回数据ELSE.RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exceptionEXPORTINGtextid = gs_message.ENDIF.
主键为空,需报错
Update和Delete方法实现与Create一样
Create_Deep_Entity
重定义实现CREATE_DEEP_ENTITY方法,我们可以实现一起更新Navigation属性。比如前台创建PO 抬头和相应的行项目,传到后台可以通过此方法将抬头和行项目一起创建。
重定义/IWBEP/IF_MGW_APPL_SRV_RUNTIME~CREATE_DEEP_ENTITY方法
定义模型增强类(zcl_ztest_odata1_mpc_ext)中的类型
CLASS zcl_ztest_odata1_mpc_ext DEFINITIONPUBLICINHERITING FROM zcl_ztest_odata1_mpcCREATE PUBLIC .PUBLIC SECTION.TYPES:ty_t_po_data TYPE STANDARD TABLE OF zcl_ztest_odata1_mpc_ext=>ts_zpoitem WITH DEFAULT KEY .TYPES:BEGIN OF ty_po_data.INCLUDE TYPE zcl_ztest_odata1_mpc_ext=>ts_zpoheader.TYPES: toitem TYPE ty_t_po_data,END OF ty_po_data .PROTECTED SECTION.PRIVATE SECTION.
ENDCLASS.
- 实现方法Create_deep_entity
DATA:lv_compare_result TYPE /iwbep/if_mgw_odata_expand=>ty_e_compare_result.DATA:ls_po TYPE zcl_ztest_po_mpc_ext=>ty_po_data,ls_header TYPE ekko,lt_item TYPE TABLE OF ekpo,ls_item TYPE ekpo.CONSTANTS:lc_toitem TYPE string VALUE 'ToItem'."判断传入数据是否包含ITEM数据lv_compare_result = io_expand->compare_to_tech_names( lc_toitem ).IF lv_compare_result EQ /iwbep/if_mgw_odata_expand=>gcs_compare_result-match_no.io_data_provider->read_entry_data( IMPORTING es_data = ls_po ).MOVE-CORRESPONDING ls_po TO ls_header.MOVE-CORRESPONDING ls_po-toitem[] TO lt_item.copy_data_to_ref( EXPORTING is_data = ls_poCHANGING cr_data = er_deep_entity ).ENDIF.
SAP ABAP Odata相关推荐
- 17. 如何通过 SAP ABAP OData $expand 操作在同一个 HTTP 请求中返回多个节点的数据
本教程前一篇文章,我们已经完成了为了支持 OData 协议定义的 $expand 操作,而必须进行的 OData 模型层面的增强: 16. 如何修改 SAP ABAP OData 模型,使其支持 $e ...
- 26. SAP ABAP OData Gateway 框架里 /IWFND, /IWBEP 这些缩写代表了什么含义?
文章目录 GW FND BEP 本文参考链接 本教程前一篇文章 - 25. 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器,我们深入了 ...
- 6. 使用 Postman 工具高效管理和测试 SAP ABAP OData 服务
序言 本文介绍了 Postman 这个强大的 API 测试工具.当我们待测试的 SAP ABAP OData 服务需要通过 user Authentication 验证才能使用时,可以通过手动在 Po ...
- 如何通过 SAP ABAP OData $expand 操作在同一个 HTTP 请求中返回多个节点的数据试读版
正如本教程的开篇介绍文章SAP OData 开发教程 - 从入门到提高(包含 SEGW, RAP 和 CDP)所提到的,SAP OData 服务开发,从实现技术上来说,可以分为三大类.因此本教程也分为 ...
- 如何修改 SAP ABAP OData 模型,使其支持 $expand 操作试读版
正如本教程的开篇介绍文章SAP OData 开发教程 - 从入门到提高(包含 SEGW, RAP 和 CDP)所提到的,SAP OData 服务开发,从实现技术上来说,可以分为三大类.因此本教程也分为 ...
- 18. SAP ABAP OData 服务嵌套创建功能的实现步骤(Create Deep)
什么是 SAP ABAP OData 服务的嵌套创建功能?在很多 SAP 帮助文档里,这个功能的英文描述是 Create Deep,或者 Deep Insert. 我们通过一个现实的例子来讲解.下图是 ...
- 19. 如何使用 ABAP 程序消费 SAP ABAP OData 服务
本教程到目前为止,我们已经创建了一个支持增删改查的图书管理 OData 服务.本步骤介绍如何使用 ABAP 程序,来消费这个 OData 服务. 假设我们开发 OData 服务的 SAP ABAP 系 ...
- 16. 如何修改 SAP ABAP OData 模型,使其支持 $expand 操作
文章目录 OData 服务里 $expand 操作的应用场景 步骤1:创建一个新的 Entity Type Author 步骤2:创建一对 EntitySet 步骤3:创建一个新的 Associati ...
- SAP ABAP OData uri type为metadata的请求处理逻辑
Created by Jerry Wang, last modified on Oct 22, 2014 metadata请求入口: metadata只支持xml格式: 在metadata的读取操作中 ...
最新文章
- mysql英文版怎么调中文_MYSQL 5.6安装设置中英文翻译
- 关于Juniper ScreenOS MIP/VIP地址说明
- AIRec个性化推荐召回模型调参实战
- 电脑硬件:磁盘、RAID知识,网卡概念与主流硬件产品知识介绍
- 事业单位考试题库计算机网络,2015年事业单位计算机基础知识试题及答案
- es xxx_by_query
- 隐藏windows任务栏中的窗口显示
- android短信模板,短信服务 · Android – Bmob后端云
- sqlserver 操作技巧
- CS 系统框架二[增加默认启动以及代码打开窗体]
- python实现将文件夹/子文件夹中内容清空
- js实现相册翻页,滚动,切换,轮播功能
- mysql忘记密码时如何修改root用户密码
- mac电脑如何配置mysql环境变量
- 原生ajax上传获取进度,ajax上传图片获取进度
- excel 某个单元格不是等于空值,Excel返回第一个与所有非空单元格及统计数量,把空单元格替换为0...
- java动效_前端实现炫酷动效_Lottie-前端实现AE动效
- #中秋节#迅镭激光第四届中秋游园会活动精彩回顾
- 获取Windows操作系统版本和位数
- MT7687芯片资料MT7687原理图资料