点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
在这篇文章中,您将学习使用 SEGW 创建 OData 服务。
这包括
创建项目、实体类型、实体集和关联。
生成项目
实施代码
这是构建 OData 服务系列的第三篇文章。
构建 OData 服务 [1]:OData 概述
构建 OData 服务 [2]:了解 OData 服务
为了以传统方式创建 OData 服务,使用事务 SEGW
。SAP Gateway 可以嵌入到 ECC/S4 系统中,也可以是一个单独的系统。
在开始创建项目之前,我们需要分析要构建的应用程序以及数据模型应该是什么。让我们考虑一个简单的应用程序,它在第一个屏幕上显示承运人 ID 列表,在下一个屏幕上显示所选承运人的一些航班详细信息。
此应用程序的数据模型将 Carrier 作为一个实体,将 FlightSchedule / FlightDetails 作为另一个实体。
创建项目
交易代码:SEGW
单击创建图标并在弹出窗口中提供详细信息。如果您不想创建 TR,请选择Package and TR或Local Package。
一个项目创建如下。
创建实体并添加属性
选择实体类型节点,右键单击并选择创建。
提供Entity Type Name作为 Carrier 和Entity Set Name作为 CarrierSet 并按 Enter。这将一次性创建实体类型和实体集。
创建实体类型属性
展开 Entity Type Carrier 并双击节点Properties。
然后使用下面框中突出显示的按钮添加/附加或删除属性。添加属性时,您可以分配数据元素或内部类型,如下所示。
单击突出显示的按钮。
选择显式分配作为模式。
选择类别作为数据元素并在关联类型中添加数据元素名称。
您可以添加更多属性,例如运营商名称和货币。然后选择 CarrierID 作为 Key。
使用参考创建实体
另一种更容易创建实体的方法是引用字典结构或表。创建一个新的实体类型。
在Entity Type View中,添加引用ABAP结构名/表名。
然后使用选项右键单击> 导入> 属性
选择所需的属性,单击Next。
选择 Keys,点击Finish。
属性将按如下方式导入。
创建实体集
如前所述,我们可以获取与实体类型本身一起创建的实体集。
但是,如果您只先创建了 Entity Type 并且需要创建 Entity Set,那么选择Entity Set Node > Right Click > Create。
创建关联
您创建了 Carrier 和 FlightSchedule 实体类型。为了定义它们的关系,应该创建关联。关联节点 > 右键单击 > 创建。
接下来,为关联选择一个名称,如CarrierFlights,输入Principal Entity ie Carrier 和 Dependent Entity ie FlightSchedule。
在这里,认为应用程序需要从承运人导航到其相关的航班时刻表。在某种程度上,我们需要从 Carrier 导航到 Flight Schedules。因此,还创建了一个导航属性。
Carrier 和 FlighSchedule 之间的基数是 1 对多,下面解释。
单击下一步。
基数
主要实体的基数通常是一个,因为对于一个主要实体,我们可以拥有特定或多个从属实体。对于从属实体,我们可以使用以下基数。
0..1 – 最多 1
1 – 正好 1
0..n – 许多
1..n – 至少 1
在下一个弹出屏幕上,我们映射主体和从属实体之间的键。这可以被认为是 LEFT OUTER JOIN 中的 ON 条件。单击下一步。
提供关联集名称,如 CarrierFlightsSet,然后单击Finish。
关联和关联集已创建。
生成服务
现在您已经创建了实体类型、实体集、关联、导航属性和关联集,您可以生成项目。
模型提供者类和数据提供者类的类名称和基类名称以及技术模型名称、技术服务名称将自动填充。通常,您不必更改任何内容,但您可以更改以匹配您的命名约定。
击进入。
选择一个包或单击本地对象。
将生成项目。在日志中可以看到生成了Model Provider Classes和Data Provider Classes。我们将需要专注于类 ZCL_ZJP_DEMO_DPC_EXT,即数据提供者扩展。
可以从节点Runtime Artifacts访问运行时对象。您可以从这里导航到运行时工件。
实施代码
使用服务之前的最后一步是编写代码来获取数据。由于 OData/Gateway 是一个框架,因此为每个实体创建了每个操作的一个方法。生成的数据提供程序扩展类如下所示。每个 EntitySet 有 5 个方法对应于 CRUD-Q 操作。其中 4 个与单个实体一起使用,它们是 CREATE、UPDATE、DELETE 和 GET。第五个即 GET_ENTITYSET 是返回实体集的查询操作。我们需要根据要求实现这些方法。
该类继承自 Data Provider Base 类,我们需要根据应用程序功能重新定义所需的方法。
如何重新定义?
选择一种方法,右键单击 > 选择重新定义。
在重新定义的方法的实现部分添加代码。
方法是用下面的代码实现的。这里使用 7.4 之前的语法,因为代码很小,并且更侧重于理解 OData 而不是 7.4。
CARRIERSET_GET_ENTITY
DATA ls_key TYPE /iwbep/s_mgw_name_value_pair. READ TABLE it_key_tab INTO ls_key WITH KEY name = 'CarrierID'. IF sy-subrc EQ 0. SELECT SINGLE carrid carrname currcode FROM scarr INTO (er_entity-carrierid, er_entity-carriername, er_entity-currency) WHERE carrid = ls_key-value. IF sy-subrc NE 0. RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception EXPORTING message = 'No Data Found'. ENDIF. ELSE. RETURN. ENDIF.
CARRIERSET_GET_ENTITYSET
DATA : lt_scarr TYPE STANDARD TABLE OF scarr, ls_scarr TYPE scarr, ls_entity TYPE zcl_zjp_demo_mpc=>ts_carrier. SELECT * FROM scarr INTO TABLE lt_scarr. "sy-subrc check skipped LOOP AT lt_scarr INTO ls_scarr. ls_entity-carrierid = ls_scarr-carrid. ls_entity-carriername = ls_scarr-carrname. ls_entity-currency = ls_scarr-currcode. APPEND ls_entity TO et_entityset. ENDLOOP.
FLIGHTSCHEDULESE_GET_ENTITYSET
DATA ls_key TYPE /iwbep/s_mgw_name_value_pair. CASE iv_source_name. WHEN 'Carrier'. "Called from Association READ TABLE it_key_tab INTO ls_key WITH KEY name = 'CarrierID'. IF sy-subrc EQ 0. SELECT * FROM spfli INTO CORRESPONDING FIELDS OF TABLE et_entityset WHERE carrid = ls_key-value. ENDIF. WHEN 'FlightScheduleSet'. "Called directly - check filters "This code is not implemented now - it will be demonstrated in the posts to follow WHEN OTHERS. RETURN. ENDCASE.
添加代码,保存并激活方法。就是这样。我们的项目准备好了。下一步是在网关系统中注册和测试服务。这将在下一篇文章中介绍。