SAP创建ODATA服务-Structure
1、创建数据字典
进入se11创建透明表ZRICO_USR,并创建对应字段
2、创建OData service
-
首先创建Gateway service project,事务码:SEGW,点击Create Project 按钮
Gateway service Project分四个部分:
♦ Data Model: 数据模型,主要包括 Entity type,( 比如说 product entity,customer entity 等),Entity set (Entity 的集合,多笔数据) 和 Association (Entity 之间的关联)
♦ Service Implementation: Entity set 的 CRUD 实现
♦ Runtime Artifacts:基于Entity set 的代码框架,包括数据模型 (Data model),数据提供者 (Data provider)
♦ Service maintenance:注册服务,测试服务
-
创建Data Model
-
创建Entity
选中Data Model,右键,Import->DDIC Structure
输入Entity Name以及数据表结构 ZRICO_USR,若勾选Create Default entity set则自动创建Entity set,然后next
选中所有字段,点击next
选择字段MANDT、USRID为主键,并将Name值按照规范首字符需大写,如下图所示。
点击finish,如下图所示:
完成后查看Entity属性
-
调整Entity Sets
设置Entity集合可CRUD
-
-
设置Entity集合可CRUD
选中项目名,右键Generate Runtime
保持所有值默认,点击Continue按钮,运行
系统生成Runtime objects
-
服务注册
若之前已经创建了Gateway Service别名,则在Service Maintenance下可以看到
此时Register Status是没有状态的,点击Register按钮
选择系统别名LOCAL
确认后,完成服务注册,状态已经改变。
-
测试OData Service
可以通过Browser或者SAP Gateway Client 进行测试,点击Maintain进入激活并维护服务界面
调用浏览器测试,如下图所示,测试成功:
浏览器测试可能存在问题:
A.点击 Call Browser 按钮,系统显示 host name 或 port 没有配置好,使用事务码 SMICM,然后通过菜单 Goto -> Services,看看主机和端口是否配置好,是否启用。
B.如果服务器没有在 Internet 上公开,这个 host name 不能通过 Internet 网进行访问,则需要设置本机的 hosts 文件,让本机指向这个域名。hosts 文件的位置在 C:\Windows\System32\drivers\etc 文件夹中。
Gateway客户端测试:
客户端测试,当前连接出错,未配置Fiori外部服务环境,可跳过,不影响后续测试,正常测试如下:
-
服务实现
服务实现是指提供 CRUD 的具体实现,因为读取数据的时候,存在 Entity 和 EntitySet,SAP 一般把读取 Entity 叫做 Read,把读取 EntitySet 叫做 Query,
在SEGW界面中展开Service Implementation:
需要编写具体的代码,这样外部才能实现对SAP数据的增删改查。
OData Operation | HTTP Method | What it meant to an ABAPer |
---|---|---|
Create | POST | Insert from
|
Read | GET | Select Single * From into
|
Update | PUT/PATCH | Update set
|
Delete | DELETE | Delete from
|
Query | GET | Select * From Into Table
|
Function Import | GET/POST | Everything covered by GET and POST. But only use if scenario does not fit into CRUDQ operations. |
-
Query重定义
首先我们开看看GetEntitySet方法的编写过程 。选中GetEntitySet(Query),右键,Go to Abap Workbench
系统提示:
点击确认,进入下列界面:
选中ZUSERSET_GET_ENTITYSET方法,右键,重定义,改写该方法实现过程(其他方法改写类似)
改写里面的逻辑:
method zuserset_get_entityset. data: ls_filter type /iwbep/s_mgw_select_option, ls_select_options type /iwbep/s_cod_select_option. data: lt_range_usrid type table of zrange_vhl. field-symbols: <fs_range_usrid> type zrange_vhl. read table it_filter_select_options into ls_filter with key property = 'Usrid'. if sy-subrc = 0. loop at ls_filter-select_options into ls_select_options. append initial line to lt_range_usrid assigning <fs_range_usrid>. move-corresponding ls_select_options to <fs_range_usrid>. unassign <fs_range_usrid>. endloop. endif. select * from zrico_usr into corresponding fields of table et_entityset where usrid in lt_range_usrid. endmethod.
其中ET_ENTITYSET是类方法预设的参数,基于ZRICO_USR内表结构。
修改完成后激活,然后通过浏览器进行测试或者Gateway客户端测试
同时,也可以通过Postman测试SAP OData Services,后面会大量使用Postman来测试
-
Read重定义
选中GetEntity,同理进入对应的类,改写ZUSERSET_GET_ENTITY:代码如下
method ZUSERSET_GET_ENTITY. * RAISE EXCEPTION TYPE /iwbep/cx_mgw_not_impl_exc * EXPORTING * textid = /iwbep/cx_mgw_not_impl_exc=>method_not_implemented * method = 'ZUSERSET_GET_ENTITY'. data lv_usrid type zrico_usr-usrid. data: ls_key_tab type /iwbep/s_mgw_name_value_pair, ls_usr type zrico_usr. read table it_key_tab with key name = 'Usrid' into ls_key_tab. if sy-subrc = 0. lv_usrid = ls_key_tab-value. endif. select single * from zrico_usr into er_entity where usrid = lv_usrid. endmethod.
执行结果hanas1.hand-china.com:2550/sap/opu/odata/sap/ZRICO_STRU_USR1_SRV/zuserSet(Mandt=‘200’,Usrid=‘123’)?$format=xml:如下
-
Create重定义
选中Create,右键进入ABAP工作台,方法 ZUSERSET_CREATE_ENTITY重定义,代码如下:
method ZUSERSET_CREATE_ENTITY. * RAISE EXCEPTION TYPE /iwbep/cx_mgw_not_impl_exc * EXPORTING * textid = /iwbep/cx_mgw_not_impl_exc=>method_not_implemented * method = 'ZUSERSET_CREATE_ENTITY'. data ls_usr type zrico_usr. io_data_provider->read_entry_data( importing es_data = er_entity ). MOVE-CORRESPONDING er_entity to ls_usr. insert zrico_usr from ls_usr. endmethod.
-
Update重定义
选中Update,右键,进入工作台,方法ZUSERSET_UPDATE_ENTITY重定义,代码如下:
METHOD zuserset_update_entity. * RAISE EXCEPTION TYPE /iwbep/cx_mgw_not_impl_exc * EXPORTING * textid = /iwbep/cx_mgw_not_impl_exc=>method_not_implemented * method = 'ZUSERSET_UPDATE_ENTITY'. DATA: ls_usr TYPE zrico_usr. io_data_provider->read_entry_data( IMPORTING es_data = er_entity ). MOVE-CORRESPONDING er_entity TO ls_usr. MODIFY zrico_usr FROM ls_usr. ENDMETHOD.
-
Delete重定义
选中Delete,右键,进入ABAP工作台,方法ZUSERSET_DELETE_ENTITY重定义,代码如下:
METHOD zuserset_delete_entity. * RAISE EXCEPTION TYPE /iwbep/cx_mgw_not_impl_exc * EXPORTING * textid = /iwbep/cx_mgw_not_impl_exc=>method_not_implemented * method = 'ZUSERSET_DELETE_ENTITY'. DATA: lv_usrid TYPE zrico_usr-usrid. DATA:ls_key_tab TYPE /iwbep/s_mgw_name_value_pair, ls_usr TYPE zrico_usr. READ TABLE it_key_tab WITH KEY name = 'Usrid' INTO ls_key_tab. IF sy-subrc = 0. lv_usrid = ls_key_tab-value. ENDIF. DELETE FROM zrico_usr WHERE usrid = lv_usrid. ENDMETHOD.
-
Function Import 函数导入
如果操作不适合CRUD方案,那么您可以通过函数导入来执行。选中DataModel,右键,Create,Function Import
输入导数名称,例如:需要根据用户名NAME查询其他信息
确认后,Function Imports节点下显示创建的名称。
调用Function imports相关参数:
Return type Kind:Entity type Return type: ZUSER
Return Cardinality:返回值为实体集合,则选择 0…n
HTTP:Get方式
为Function Import创建导入参数:双击Function Import Parameters,
选择传建按钮,输入参数名:Us人Name,参数类型Edm.String,最大长度值
完成后保存
然后可以在Postman或者调用浏览器测试,可获得类似的结果
然后通过类似的方法给对应的方法重定义再进行测试即可
下一步重定义方法:
代码如下:
然后通过Postman测试:
http://gXXX.XXXXX.com:8000/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/UserByName?UsrName=‘12’