SAP OData(一)简单创建与发布odata

news2024/9/21 22:27:50
一,事务码SEGW

该事务码以project的概念来组织OData服务,并以project为整体来生成并发布。系统中预置了一些project可供我们参考,例如crm_opportunity,crm_task等等。

新建project,我们需要填写project名字以及所属package,还需要关注的是下图ProjectType和GenerationStrategy的可选项。

Project Type:1&2主要区别是维护注解的方式不同,4为OData4.0

Generate Strategy:1-Standard 2-for OData4.0

二,EntityType

EntityType可以理解为接口的结构,有点类似PI中配置的MessageType。右键【Entity Types】创建,或者导入(表,结构)或参考CDS

Properties:是结构的各个字段。

NavigationProperties:可选,建立Association之后会出现,用于entity之间导航。

【Name】暴露到接口的字段名,区分大小写。注意与后面的AbapFieldName用途各异

【IsKey】是否关键字

【EdmType】Edm预定义的元数据

【Precision】有效数位数;【Scale】小数位数;如123.45,有效位数5小数位数2

【MaxLength】用于限定字符型长度,abap ddic中的char和string都是对应ODataEntityType中的Edm.String

【UnitProperty】用于指定数量或金额列所参考的单位字段

【Create,Update】OData接口字段行为的限制,例如主键字段通常可创建,不可修改

【Sorted】字段是否支持$orderby操作

【Nullable】edm属性,Null可作为字段初始值,如主键字段不可空

【Filter】字段支持OData的$filter操作

【Lable】文本描述;【LableEdit】可以参考数据元素等带出文本描述

【CompType】用于嵌入下一级结构,此时EdmType就不能填了;DataModel右键--创建--CompType也是结构,不过没有Key字段指定

【ABAP Field Name】【ABAPType】Gateway内部运行时使用,为entity生成的abap数据结构是按这个名字,在后续abap编程也是用这个字段名

【Semantics】元数据的语义

<!--上面对字段的配置,形成如下接口元数据--> 
<!--https://.../sap/opu/odata/sap/Y_TEST_ODATA4_SRV/$metadata--> 
<Property Name="telephone" Type="Edm.String" Nullable="false" MaxLength="30" sap:label="Telephone number" sap:creatable="true" sap:updatable="true" sap:filterable="true" sap:semantics="tel" />

三,EntitySet

EntitySet都是基于EntityType的,就像表基于结构一样,EntitySet也是接口暴露出来的对象,该对象又具有增删改查等动作

【Lable】【LableEdit】【Semantics】与上一小节一样

【增,改,删】接口实体允许动作

【Pageable】分页

【Address】允许用URL直接访问对象,否则只能从父节点开始逐步导航到对象

【Search】支持OpenSearch,在Get请求中使用查询条件

【Subscription】允许订阅,在DataObject改变时会收到通知

【RequiredFilter】对象不能直接访问,必须带$filter表达式

<app:collection href="ItemSet" sap:content-version="1" sap:addressable="false" sap:pageable="false"> 
<atom:title type="text">ItemSet</atom:title> 
<sap:member-title>Item</sap:member-title> 
</app:collection>

四,生成运行时对象

在创建EntitySet时,下图Service Implementation会自动生成对应同名项目。

右键--生成运行时对象,系统会根据已定义的EntitySet生成ModelProvider类(MPC,MPC_EXT)以及DataProvider类(DPC,DPC_EXT);

MPC模型提供类将上面配置字段行为等数据对象化,帮助生成metadata。我们通常不用修改它们,改上面配置重新生成就好

DPC数据提供类中生成的方法分别对应了【Create,Delete,GetEntity,GetEntitySet,Update】;

_DPC为抽象父类,如果实体已经确定了数据源如CDS,生成方法将具有取数内容,这些方法是protected可继承重写的

_DPC_EXT为子类可以重写方法来实现我们自己的逻辑。Odata重生成不会覆盖*_EXT方法

服务对象_SRV,用于注册服务,服务路径中也能看到它 https://.../sap/opu/odata/sap/Y_TEST_ODATA4_SRV/ItemSet

模型对象_MDL,注释模型_ANNO_MDL通常来自CDS的生成

五,重写方法

不同的HTTP方法会调用不同的entity方法,GET会根据参数不同调用get_entity或get_entityset,POST会调用create_entity创建一个entity,PUT调用update_entity用于更新一个entity注意没传值的字段会被覆盖为空,PATCH会先调用get_entity查到一个entity(查不到直接报错返回)然后调用update_entity据说只会修改报文中给定的值不会出现覆盖为空值,DELETE调用delete_entity删除一个entity。

5.1 重写get_entityset

该方法是返回一个实体集的(多行),我们重写*_DPC_EXT~*_GET_ENTITYSET,默认返回xml报文,想要json用【?$format=json】

      • IT_FILTER_SELECT_OPTIONS该参数用于OData的$filter方法【http://..._srv/entityset?$filter=(MATNR eq 'XA01' and QUANT le '2')】注意字段名大小写也要根据EntityType,eq/and/or/not等操作符必须小写,eq不能用=来代替,其他操作符还有【ne不等,lt小于,le小等,gt大于,ge大等】。注意IT_FILTER_SELECT_OPTIONS不支持or操作符,因为它会把条件拆成但是字段之间的or/and却没有办法表示,对于这种情况请直接用参数IV_FILTER_STRING,因为它就是URL中原始的没解析的filter条件
      • IS_PAGING用于限定取数位置【http://..._srv/entityset?$inlinecount=allpages&$top=1&$skip=2】,$top取多少行,$skip跳过多少行再取数,URL后面的指令都已$开始,指令之间用&连接
//select * into table lt_db from ytest.
IF is_paging IS NOT INITIAL.
    et_entityset = VALUE #( FOR ls_db IN lt_db FROM is_paging-skip + 1 TO is_paging-skip + is_paging-top ( docno = ls_db-docno
                                                itmno = ls_db-itmno
                                                matnr = ls_db-matnr
                                                detailinfo-quant = ls_db-quant
                                                detailinfo-unit  = ls_db-unit ) ).
     
ENDIF.
      • IT_KEY_TAB:主键值,在本方法get_entityset中这个参数好像没值,在下面get_entity取单一entity时有值
      • IT_ORDER用于支持$orderby方法【http://..._srv/entityset?$orderby=ITMNO,QUANT】,默认为asc升序,可以显式为某个字段指定为降序排列【$orderby=ITMNO desc】注意中间的空格因URLcode编码要转换为【%20】
DATA:lt_otab TYPE abap_sortorder_tab. 
lt_otab = VALUE #( for ls_order in it_order ( name = ls_order-property descending = cond #( when ls_order-order eq 'desc' then abap_true else abap_false ) ) ). 
SORT et_data BY (lt_otab). //排序结果表

5.2 重写get_entity

该方法是返回单个实体(单行),在URL中指定实体的Key值就会触发这个方法【http://..._srv/entityset(DOCNO='1001',ITMNO='0020')】,每个KeyField都必须指定值(因为要唯一确定一条记录),否则服务出错。如果Key只有一个字段可以简化成【http://..._srv/entityset('1001'】

URL中指定Key值会转化为参数IT_KEY_TAB中的键值对

5.3 重写create_entity

注意只能处理一个entity,http方法使用POST,body内容可以是JSON格式也可以是XML,我们可以用get_entity得到的报文改一下

在方法中使用data_provider将报文直接反序列化为entity,然后进行常规存表等操作

DATA: ls_entity LIKE er_entity.
DATA: ls_return TYPE bapiret2,
      lt_return TYPE STANDARD TABLE OF bapiret2.

io_data_provider->read_entry_data( IMPORTING es_data = ls_entity ).
"写入数据库,此外还要将这条数据返回给消费端,参考get_entity即可"
 
"$. Region Error Msg return
ls_return-type    = 'E'.
ls_return-id      = 'F2'.
ls_return-number  = '001'.
ls_return-message = 'Save failed, line item may already exist'.
APPEND ls_return TO lt_return.

mo_context->get_message_container( )->add_messages_from_bapi(
          it_bapi_messages = lt_return
          iv_determine_leading_msg = /iwbep/if_message_container=>gcs_leading_msg_search_option-first ) .
RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception
  EXPORTING
    textid            = /iwbep/cx_mgw_busi_exception=>business_error
    message_container = mo_context->get_message_container( ).
"$. Endregion Error Msg return

5.4 重写update_entity

该方法用于更新一个entity,更新entity的操作对应的http方法参考SEGW建模5 OData更新操作,首先URL中要指定Key值【http://..._srv/entityset(DOCNO='1001',ITMNO='0020')】,然后报文body里面包含了entity数据(与create类似的body)

5.5 重写delete_entity

URL中要指定Key值【http://..._srv/entityset(DOCNO='1001',ITMNO='0020')】,一般不需要body

六,基于RFC生成ODATA

首先创建RFC省略,在SEGW右键DataModel--Import--RFC/BORinterface,填写EntityType名,选择RFC,RFC的参数结构会带出如下图显示,选择需要生成的结构

结构导入为EntityType之后需要设定KeyField,

七,发布OData服务

进入事务码/n/IWFND/MAINT_SERVICE,点击按钮【Add Service】,我们看到如下图右侧的窗口。

首先【系统别名】填写Local,表示在本系统搜索Odata服务的实现;【技术服务名称】填写前面生成的Odata服务名;点击3所查到的OData服务会显示在4,选中4处的服务并点击按钮5,在弹出的窗口中填写开发包并保存即可。

如果勾选【联合部署】即本地部署不再有路由配置(不勾选则填系统别名),然后点击【添加所选服务】

系统别名配置:spro--SAP NetWeaver--SAP Gateway--OData Channel--Configuration--Connection Settings--SAP Gateway to SAP System--Manage SAP System Aliases

回到维护服务页面,找到刚创建的服务,Int通讯框架节点可以看到新服务在SICF中的位置,点击GatewayClient。如果要删除服务,先需要将SICF中的服务节点删掉,然后在这个维护服务页面点【删除服务】

在Gateway Client中,我们把URL后面改为$metadata可以获得接口的描述文件(类似wsdl),点击EntitySet选择后执行,可以取得接口数据。

八,查看日志

错误日志事务码:/N/IWFND/ERROR_LOG

Gateway应用日志:/N/IWFND/APPS_LOG

系统日志:SM21

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1381498.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FlinkCDC的分析和应用代码

前言&#xff1a;原本想讲如何基于Flink实现定制化计算引擎的开发&#xff0c;并以FlinkCDC为例介绍&#xff1b;发现这两个在表达上不知以谁为主&#xff0c;所以先分析FlinkCDC的应用场景和技术实现原理&#xff0c;下一篇再去分析Flink能在哪些方面&#xff0c;做定制化计算…

案例109:基于微信小程序的高校寻物平台设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

SpringBoot之优化高并发场景下的HttpClient并提升QPS

HttpClient优化思路 使用连接池&#xff08;简单粗暴&#xff09; 长连接优化&#xff08;特殊业务场景&#xff09; httpclient和httpget复用 合理的配置参数&#xff08;最大并发请求数&#xff0c;各种超时时间&#xff0c;重试次数&#xff09; 异步请求优化&#xff0…

【开源】基于JAVA+Vue+SpringBoot的校园电商物流云平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 商品数据模块2.3 快递公司模块2.4 物流订单模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 商品表3.2.2 快递公司表3.2.3 物流订单表 四、系统展示五、核心代码5.1 查询商品5.2 查询快递公司5.3 查…

数据结构链表完整实现(负完整代码)

文章目录 前言引入1、链表定义及结构链表的分类3、单向不带头链表实现实现完整代码 4、带头双向循环链表实现实现完整代码 前言 引入 在上一篇文章中&#xff0c;我们认识了顺序表&#xff0c;但是在许多情况中&#xff0c;顺序表在处理一些事件时还存在许多问题&#xff0c;比…

P1067 [NOIP2009 普及组] 多项式输出————C++

目录 [NOIP2009 普及组] 多项式输出题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 解题思路Code运行结果 [NOIP2009 普及组] 多项式输出 题目描述 一元 n n n 次多项式可用如下的表达式表示&#xff1a; f ( x ) a n x n a …

现代 C++ 及 C++ 的演变

C 活跃在程序设计领域。该语言写入了许多新项目&#xff0c;而且据 TIOBE 排行榜数据显示&#xff0c;C 的受欢迎度和使用率位居第 4&#xff0c;仅次于 Python、Java 和 C。 尽管 C 在过去二十年里的 TIOBE 排名都位居前列&#xff08;2008 年 2 月排在第 5 名&#xff0c;到…

行为型设计模式——迭代器模式

迭代器模式 迭代器模式也是非常的简单&#xff0c;定义如下&#xff1a; 提供一个对象来顺序访问聚合对象中的一系列数据&#xff0c;而不暴露聚合对象的内部表示。 相信大家都使用过类似下面的迭代器&#xff1a; List<String> list new ArrayList<>(); Iterat…

Seata TC端协调全局事务

1、Seata server注册器 //来自RM分支事务注册 super.registerProcessor(MessageType.TYPE_BRANCH_REGISTER, onRequestProcessor, messageExecutor); //开启全局事务 super.registerProcessor(MessageType.TYPE_GLOBAL_BEGIN, onRequestProcessor, messageExecutor); //提交全…

MySQL夯实之路-事务详解

事务四大特性 事务需要通过严格的acid测试。Acid表示原子性&#xff0c;一致性&#xff0c;隔离性&#xff0c;持久性。 原子性&#xff08;atomicity&#xff09; 事务是不可分割的最小单元&#xff0c;对于整个事务的操作&#xff0c;要么全部提交成功&#xff0c;要么全部…

Linux———ps命令详解

目录 ps 命令&#xff08;"process status" 的缩写。&#xff09; 常用选项和参数&#xff1a; a&#xff1a;显示所有用户的进程&#xff0c;包括其他用户的进程。​ u&#xff1a;显示详细的进程信息&#xff0c;包括进程的所有者、CPU 使用率、内存使用量等。…

白嫖aws创建Joplin server服务器

网上有很多的Joplin服务器的搭建教程&#xff0c;但是基本都是抄来抄去&#xff0c;对初学者实在是太不友好了。 话不多说&#xff0c;说干就干&#xff0c;自己从头找资料搭了一个&#xff0c;这可能是全网最好的Joplin服务器搭建教程了。 aws服务器 aws的服务器还是很香的&…

MAVROS的进一步理解

一、Mavros简介 顾名思义&#xff0c; mavros就是mavlinkros。mavros是PX4官方提供的一个运行于ros下收发mavlink消息的工具&#xff0c;利用mavros可以发送mavlink消息给飞控(可以控制飞机)&#xff0c;并且可以从飞控中接受数据(例如&#xff1a;飞控的位置速度 IMU数据等等…

论文阅读_训练大模型用于角色扮演

英文名称: Character-LLM: A Trainable Agent for Role-Playing 中文名称: 角色-LLM&#xff1a;训练Agent用于角色扮演 文章: [https://arxiv.org/abs/2310.10158](https://arxiv.org/abs/2310.10158) 作者: Yunfan Shao, Linyang Li, Junqi Dai, Xipeng Qiu 机构: 复旦大学…

使用numpy处理图片——分离通道

大纲 读入图片分离通道堆叠法复制修改法 生成图片 在《使用numpy处理图片——滤镜》中&#xff0c;我们剥离了RGB中的一个颜色&#xff0c;达到一种滤镜的效果。 如果我们只保留一种元素&#xff0c;就可以做到PS中分离通道的效果。 读入图片 import numpy as np import PIL.…

【UE Niagara学习笔记】04 - 火焰喷射时的黑烟效果

目录 效果 步骤 一、创建烟雾材质 二、添加新的发射器 三、设置新发射器 3.1 删除Color模块 3.2 减少生成的粒子数量 3.3 设置粒子初始颜色 3.4 设置烟雾的位置偏移 3.5 设置烟雾淡出 在上一篇博客&#xff08;【UE Niagara学习笔记】03 - 火焰喷射效果&#xf…

【开源】基于JAVA+Vue+SpringBoot的医院门诊预约挂号系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2 科室医生档案模块2.1.3 预约挂号模块2.1.4 医院时政模块 2.2 可行性分析2.2.1 可靠性2.2.2 易用性2.2.3 维护性 三、数据库设计3.1 用户表3.2 科室档案表3.3 医生档案表3.4 医生放号…

5文件操作

包含头文件<fstream> 操作文件三大类&#xff1a; ofstream : 写文件ifstream &#xff1a;读文件fstream : 读写文件 5.1文本文件 -文件以ascii的形式存储在计算机中 5.1.1写文件 步骤&#xff1a; 包含头文件 #include "fstream"创建流对象 ofs…

【Linux运维】LVM和RAID学习及实践

LVM和RAID学习及实践 背景LVM简介新加硬盘的操作RAID-磁盘阵列应用场景RAID0RAID1其他结构RAID制作RAID 小结 背景 某台服务器的磁盘管理需要自己动手处理&#xff0c;找了一些资料也踩了一些坑&#xff0c;在这里记录一下&#xff0c;先介绍一下LVM和RAID这两个东西。在计算机…

Java实现在线编辑预览office文档

文章目录 1 在线编辑1.1 PageOffice简介1.2 前端项目1.2.1 配置1.2.2 页面部分 1.3 后端项目1.3.1 pom.xml1.3.2 添加配置1.3.3 controller 2 在线预览2.1 引言2.2 市面上现有的文件预览服务2.2.1 微软2.2.2 Google Drive查看器2.2.3 阿里云 IMM2.2.4 XDOC 文档预览2.2.5 Offic…