UI5-学习篇-5-SAP创建OData服务-Structure

时间:2022-09-28 12:51:07

本文介绍SAP后端系统基于数据结构创建OData服务过程。

1.创建数据字典

 UI5-学习篇-5-SAP创建OData服务-Structure

2.创建OData service

 2.1创建Gateway service project

 事务码:SEGW

 UI5-学习篇-5-SAP创建OData服务-Structure

 点击Create Project 按钮

 UI5-学习篇-5-SAP创建OData服务-Structure

 UI5-学习篇-5-SAP创建OData服务-Structure

 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:注册服务,测试服务

 2.2创建Data Model

 2.2.1创建Entity

 选中Data Model,右键,Import->DDIC Structure

 UI5-学习篇-5-SAP创建OData服务-Structure

 输入Entity Name以及数据表结构 ZRICO_USR,若勾选Create Default entity set则自动创建Entity set

 UI5-学习篇-5-SAP创建OData服务-Structure

 选中所有字段,点击NEXT

 UI5-学习篇-5-SAP创建OData服务-Structure

 选择字段MANDT、USRID为主键,并将Name值按照规范首字符需大写,如下图所示。

 UI5-学习篇-5-SAP创建OData服务-Structure

 点击Finish

 UI5-学习篇-5-SAP创建OData服务-Structure

 完成后查看Entity属性

 UI5-学习篇-5-SAP创建OData服务-Structure

 2.2.2调整Entity Sets

 设置Entity集合可CRUD UI5-学习篇-5-SAP创建OData服务-Structure

 2.3Generate runtime objects

 选中项目名,右键Generate Runtime

 UI5-学习篇-5-SAP创建OData服务-Structure

 保持所有值默认,点击Continue按钮,运行

 UI5-学习篇-5-SAP创建OData服务-Structure

 系统生成Runtime objects

 UI5-学习篇-5-SAP创建OData服务-Structure

 2.4服务注册

 若之前已创建了Gateway Service别名,则在Service Maintenance下可以看到。

 UI5-学习篇-5-SAP创建OData服务-Structure

 此时Register Status是没有状态的,点击Register按钮

 UI5-学习篇-5-SAP创建OData服务-Structure

 选择系统别名LOCAL

 UI5-学习篇-5-SAP创建OData服务-Structure

 确认后,完成服务注册,状态已经改变。

 UI5-学习篇-5-SAP创建OData服务-Structure

 2.5测试OData Service

 可以通过Browser或是Sap Gateway Client进行测试。

 点击Maintain进入激活并维护服务界面:

 UI5-学习篇-5-SAP创建OData服务-Structure

 UI5-学习篇-5-SAP创建OData服务-Structure

 调用浏览器测试,如下图所示,测试成功:

UI5-学习篇-5-SAP创建OData服务-Structure

 浏览器测试可能存在问题:

 A.点击 Call Browser 按钮,系统显示 host name 或 port 没有配置好,使用事务码 SMICM,然后通过菜单 Goto -> Services,看看主机和端口是否配置好,是否启用。

 B.如果服务器没有在 Internet 上公开,这个 host name 不能通过 Internet 网进行访问,则需要设置本机的 hosts 文件,让本机指向这个域名。hosts 文件的位置在 C:\Windows\System32\drivers\etc 文件夹中。

 Gateway客户端测试:

UI5-学习篇-5-SAP创建OData服务-Structure

 UI5-学习篇-5-SAP创建OData服务-Structure

 客户端测试,当前连接出错,未配置Fiori外部服务环境,可跳过,不影响后续测试,正常测试如下: UI5-学习篇-5-SAP创建OData服务-Structure

 2.6服务实现

 服务实现是指提供 CRUD 的具体实现,因为读取数据的时候,存在 Entity 和 EntitySet,SAP 一般把读取 Entity 叫做 Read,把读取 EntitySet 叫做 Query。

 在 SEGW 界面中 展开 Service Implementation:

 UI5-学习篇-5-SAP创建OData服务-Structure

 需要编写具体的代码,这样外部才能实现对 SAP 数据的增删改查。

OData Operation HTTP Method What it meant to an ABAPer
Create POST Insert <table> from <workarea>
Read GET Select Single * From <table> into <workarea>
Update PUT/PATCH Update <table> set <workarea>
Delete DELETE Delete from <table>
Query GET Select *  From <table> Into Table
Function Import GET/POST Everything covered by GET and POST. But only use if scenario does not fit into CRUDQ operations.

 2.6.1Query重定义

 首先我们来看看 GetEntitySet 方法的编写过程。

 选中GetEntitySet(Query) ,右键,Go to Abap Workbench

 UI5-学习篇-5-SAP创建OData服务-Structure

 系统提示:

 UI5-学习篇-5-SAP创建OData服务-Structure

 点击确认按钮,进入如下界面:

 UI5-学习篇-5-SAP创建OData服务-Structure

 选中ZUSERSET_GET_ENTITYSET方法,右键,重定义,改写该方法实现过程(其他方法改写类似)

 UI5-学习篇-5-SAP创建OData服务-Structure

 方法代码改写:

 UI5-学习篇-5-SAP创建OData服务-Structure

  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 = .
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内表结构。

 UI5-学习篇-5-SAP创建OData服务-Structure

 修改完成后激活。

 然后通过Browser浏览器进行测试: 

UI5-学习篇-5-SAP创建OData服务-Structure

 可以通过Gateway客户端测试:从 SEGW 进入服务维护和 Gateway client 界面。也可以通过另外的事务码:Service maintain: /IWFND/MAINT_SERVICE。这两个事务码比较

 怪,不通过/o 系统提示错误。所以应该输入 /O/IWFND/MAINT_SERVICE,SAP Gateway client: /o/iwfnd/gw_client。

 Postman使用前请先查看口令及CSRF获取过程:

 UI5-学习篇-7-Postman测试SAP OData Services

 通过Postman进行测试(Postman工具后续会大量使用):

UI5-学习篇-5-SAP创建OData服务-Structure

 测试成功。

 

 2.6.2Read重定义

 选中GetEntity(Read),进入ABAP工作台

 UI5-学习篇-5-SAP创建OData服务-Structure

 UI5-学习篇-5-SAP创建OData服务-Structure

 改写方法ZUSERSET_GET_ENTITY:

 UI5-学习篇-5-SAP创建OData服务-Structure

 激活后,通过Postman测试:

 http://XXX.XXXXXXXXX.com:8000/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/ZUSERSet(Mandt='300',Usrid='1')?$format=json UI5-学习篇-5-SAP创建OData服务-Structure

 测试成功。

 2.6.3Create重定义

 选中Create,右键进入ABAP工作台

 UI5-学习篇-5-SAP创建OData服务-Structure

 方法 ZUSERSET_CREATE_ENTITY重定义:

 UI5-学习篇-5-SAP创建OData服务-Structure

 代码重写:

 UI5-学习篇-5-SAP创建OData服务-Structure

 Postman测试,需注意以下几个问题:

 ♦ Logon Error Message:Postman测试过程中登录失败,需维护账号密码,删除Cookies.

 ♦CSRF token validation failed:CSRF问题请关注https://blogs.sap.com/2014/07/11/issues-with-csrf-token-and-how-to-solve-them/

 ♦The Data Services Request contains SystemQueryOptions that are not allowed for this Request Type:

  请关注:https://blogs.sap.com/2014/03/06/let-s-code-crudq-and-function-import-operations-in-odata-service/

 ♦Run transaction /IWFND/ERROR_LOG on SAP Gateway hub system and search for entries with the timestamp above for more details:

 上述问题以下测试环节会讲解。

 Create服务测试过程:

 <1>执行GET读取单个实体/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/ZUSERSet(Mandt='300',Usrid='1')
 <2>单击“用作请求”按钮
 <3>更新您的请求属性。
 <4>选择HTTP方法作为POST
 <5>执行/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/ZUSERSet

 Postman测试过程:

 <1>执行GET读取单个实体/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/ZUSERSet(Mandt='300',Usrid='1')

   设置权限:SAP前端系统登录账号/密码

   设置Headers参数 KEY:X-CSRF-Token  VALUE: Fetch

UI5-学习篇-5-SAP创建OData服务-Structure

UI5-学习篇-5-SAP创建OData服务-Structure

   执行SEND后获取CSRF Token值:a-LzHGGnL0PMiFGjzzhgvw==

   同时拷贝执行结果:

UI5-学习篇-5-SAP创建OData服务-Structure

UI5-学习篇-5-SAP创建OData服务-Structure

 <2>执行为/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/ZUSERSet

   上一步获取了两个信息:CSRF值 及XML结果

   此步骤采用POST方式提交Create服务地址:   

UI5-学习篇-5-SAP创建OData服务-Structure

UI5-学习篇-5-SAP创建OData服务-Structure

   执行SEND后,获取执行结果,如下图所示,执行成功。

UI5-学习篇-5-SAP创建OData服务-Structure

 2.6.4Update重定义

 选中Update,右键,进入ABAP工作台

 UI5-学习篇-5-SAP创建OData服务-Structure

 UI5-学习篇-5-SAP创建OData服务-Structure

 UI5-学习篇-5-SAP创建OData服务-Structure

 保存后激活。

 Postman测试过程:

 设置参数如下UI5-学习篇-5-SAP创建OData服务-Structure

 调整记录值:

UI5-学习篇-5-SAP创建OData服务-Structure

 执行SEND,返回空值 UI5-学习篇-5-SAP创建OData服务-Structure

  查询数据表记录,如下图所示,当前记录已被更新,执行成功。

UI5-学习篇-5-SAP创建OData服务-Structure

  2.6.5Delete重定义

  选中Delete,右键,进入ABAP工作台

  UI5-学习篇-5-SAP创建OData服务-Structure

  UI5-学习篇-5-SAP创建OData服务-Structure

  代码重写:

  UI5-学习篇-5-SAP创建OData服务-Structure

  代码调整后激活。

  Postman测试:

  采用DELETE方式  UI5-学习篇-5-SAP创建OData服务-Structure

  执行完成后,查询该记录,提示该记录未找到,即已删除成功。

UI5-学习篇-5-SAP创建OData服务-Structure

 2.7Function Import函数导入

  如果操作不适合CRUD方案,那么您可以通过函数导入来执行。

  选中DataModel,右键,Create,Function Import

  UI5-学习篇-5-SAP创建OData服务-Structure

  输入导入名称,例如:需要根据用户名NAME查询其他信息

  UI5-学习篇-5-SAP创建OData服务-Structure

  确认后,Function Imports节点下显示创建的名称。

  UI5-学习篇-5-SAP创建OData服务-Structure

  调整Function Imports相关参数:

  Return type Kind:Entity type     Return type: ZUSER

  Return Cardinality:返回值为实体集合,则选择 0...n

  HTTP:Get方式  

  UI5-学习篇-5-SAP创建OData服务-Structure

  为Function Import创建导入参数:

  双击Function Import Parameters,

  UI5-学习篇-5-SAP创建OData服务-Structure

  选择创建按钮,输入参数名:UsrName,参数类型Edm.String,最大长度值

    UI5-学习篇-5-SAP创建OData服务-Structure

  完成后保存。

  查看元数据中相关参数定义,地址(替换域名):

  http://gxx.xxxxx.com:8000/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/$metadata

  通过Postman测试如下:  UI5-学习篇-5-SAP创建OData服务-Structure

  如上图所示,已显示FunctionImport节点参数。

  下一步进行方法重定义:

  UI5-学习篇-5-SAP创建OData服务-Structure

  UI5-学习篇-5-SAP创建OData服务-Structure

  代码改写完成后激活,然后通过Postman进行测试(地址域名替换):

  http://gXXX.XXXXX.com:8000/sap/opu/odata/sap/ZRICO_STRU_USR_SRV/UserByName?UsrName='12'UI5-学习篇-5-SAP创建OData服务-Structure