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
GetEntity和GetEntitys GetEntitys 创建Odata Project 导入结构 选择需要的字段 设定Key 勾选字段的creatable、updatable、sortable、nullable、filterable属性值。 再依上述步骤创建ZPOITEM结构和实体集 3. 创建ZPOHEADER和ZPOITEM的Association 两个实体集的关联字段&…...
Android native ASAN 排查内存泄漏
一、概述 android 对native - c/c 的调试和排查是比较难受的一件事。我看周遭做window , linux 甚至ios的调试排查起c的代码都比较方便。习惯了app开发去熟悉native是各种痛苦,最主要是排查问题上。后续有时间打算整理下native 的错误排查使用ÿ…...

Django项目开发
一.认识NoSQL 1.SQL 关系型数据库 结构化: 定义主键,无符号型数据等关联的:结构化表和表之间的关系通过外键进行关联,节省存储空间SQL查询:语法固定 SELECT id,name,age FROM tb_user WHERE id1 ACID 2.NoSQL 非关系型数据库 Re…...
Debezium系列之:深入理解Debezium Server和Debezium Server实际应用案例详解
Debezium系列之:深入理解Debezium Server和Debezium Server实际应用案例详解 一、认识Debezium Server二、下载Debezium Server三、解压Debezium Server四、查看Debezium Server目录五、Debezium Server配置六、Debezium Server启动输出样式七、源配置八、格式配置九、Transfo…...

IDE2022源码编译tomcat
因为学习需要,我需要源码编译运行tomcat对其源码进行一个简单的追踪分析。由于先前并未接触过java相关的知识,安装阻力巨大。最后请教我的开发朋友才解决了最后的问题。将其整理出来,让大家能够快速完成相关的部署。本文仅解决tomcat-8.5.46版…...

214 情人节来袭,电视剧 《点燃我温暖你》李峋同款 Python爱心表白代码,赶紧拿去用吧
大家好,我是徐公,六年大厂程序员经验,今天为大家带来的是动态心形代码,电视剧 《点燃我温暖你》同款的,大家赶紧看看,拿去向你心仪的对象表白吧,下面说一下灵感来源。 灵感来源 今天ÿ…...
数据库范式
基本概念 函数依赖 x→yx\rightarrow yx→y,当确定xxx的时候,yyy也可以确定 例: 学号→\rightarrow→姓名,当知道了学号,就知道了学生姓名 学号,课程号→\rightarrow→成绩,当知道了学号和课程号ÿ…...

CUDA中的底层驱动API
文章目录CUDA底层驱动API1. Context2. Module3. Kernel Execution4. Interoperability between Runtime and Driver APIs5. Driver Entry Point Access5.1. Introduction5.2. Driver Function Typedefs5.3. Driver Function Retrieval5.3.1. Using the driver API5.3.2. Using …...

【博客616】prometheus staleness对PromQL查询的影响
prometheus staleness对PromQL查询的影响 1、prometheus staleness 官方文档的解释: 概括: 运行查询时,将独立于实际的当前时间序列数据选择采样数据的时间戳。这主要是为了支持聚合(sum、avg 等)等情况,…...

多传感器融合定位十三-基于图优化的建图方法其二
多传感器融合定位十二-基于图优化的建图方法其二3.4 预积分方差计算3.4.1 核心思路3.4.2 连续时间下的微分方程3.4.3 离散时间下的传递方程3.5 预积分更新4. 典型方案介绍4.1 LIO-SAM介绍5. 融合编码器的优化方案5.1 整体思路介绍5.2 预积分模型设计Reference: 深蓝学院-多传感…...

linux 服务器线上问题故障排查
一 线上故障排查概述 1.1 概述 线上故障排查一般从cpu,磁盘,内存,网络这4个方面入手; 二 磁盘的排查 2.1 磁盘排查 1.使用 df -hl 命令来查看磁盘使用情况 2.从读写性能排查:iostat -d -k -x命令来进行分析 最后一列%util可以看到每块磁盘写入的程度,而rrqpm/s以及…...

Sandman:一款基于NTP协议的红队后门研究工具
关于Sandman Sandman是一款基于NTP的强大后门工具,该工具可以帮助广大研究人员在一个安全增强型网络系统中执行红队任务。 Sandman可以充当Stager使用,该工具利用了NTP(一个用于计算机时间/日期同步协议)从预定义的服务器获取并…...

【SSL/TLS】准备工作:HTTPS服务器部署:Nginx部署
HTTPS服务器部署:Nginx部署1. 准备工作2. Nginx服务器YUM部署2.1 直接安装2.2 验证3. Nginx服务器源码部署3.1 下载源码包3.2 部署过程4. Nginx基本操作4.1 nginx常用命令行4.2 nginx重要目录1. 准备工作 1. Linux版本 [rootlocalhost ~]# cat /proc/version Li…...

微搭低代码从入门到精通11-数据模型
学习微搭低代码,先学习基本操作,然后学习组件的基本使用。解决了前端的问题,我们就需要深入学习后端的功能。后端一般包括两部分,第一部分是常规的数据库的操作,包括增删改查。第二部分是业务逻辑的编写,在…...

【算法基础】前缀和与差分
😽PREFACE🎁欢迎各位→点赞👍 收藏⭐ 评论📝📢系列专栏:算法💪种一棵树最好是十年前其次是现在1.什么是前缀和前缀和指一个数组的某下标之前的所有数组元素的和(包含其自身&#x…...

LTD212次升级 | 官网社区支持PC端展示 • 官网新增证件查询应用,支持条形码扫码查询
1、新增证件查询应用,支持条形码扫码查询; 2、新增用户社区PC端功能; 01证件查询应用 1、新增证件查询应用功能 支持证件信息录入、打印功能,支持条形码扫码识别。 后台管理操作路径:官微中心 - 应用 - 证件查询 …...

【安全】nginx反向代理+负载均衡上传webshell
目录 一、负载均衡反向代理下上传webshell Ⅰ、环境搭建 ①下载蚁剑,于github获取官方版: ②下载docker&docker-compose ③结合前面启动环境 ④验证 负载均衡下webshell上传 一、负载均衡反向代理下上传webshell 什么是反向代理? 通常的代…...

线程池框架
这是之前有做的一个可以接受用户传入任意类型的任务函数和任意参数,并且能拿到任务对应返回值的一个线程池框架,可以链接成动态库,用在相关项目里面。一共实现了两版,都是支持fixed和cached模式的,半同步半异步的&…...

【TCP的拥塞控制】基于窗口的拥塞控制
TCP的拥塞窗口CWND大小和传输轮次n的关系如下所示。(本题10分) cwnd12481632333435363738394041422122232425261248N1234567891011121314151617181920212223242526 问题: (1)慢开始阶段的时间间隔?&#…...

STP协议基础
STP协议技术来源二层环路及危害二层交换机网络的冗余性与环路人为错误导致的二层环路二层环路带来的问题STP生成树协议STP概述STP基本概念桥ID根桥COSTRPC(Root Path Cost)根路径开销PORT ID端口IDBPDU桥协议数据单元STP的计算过程(1…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...