构建 OData 服务 [3]:创建 OData 服务

2021-11-07 23:34发布


          点击此处--->   EasySAP.com 群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)

在这篇文章中,您将学习使用 SEGW 创建 OData 服务。

这包括

  • 创建项目、实体类型、实体集和关联。

  • 生成项目

  • 实施代码

这是构建 OData 服务系列的第三篇文章。

  1. 构建 OData 服务 [1]:OData 概述

  2. 构建 OData 服务 [2]:了解 OData 服务

为了以传统方式创建 OData 服务,使用事务 SEGW SAP Gateway 可以嵌入到 ECC/S4 系统中,也可以是一个单独的系统。

在开始创建项目之前,我们需要分析要构建的应用程序以及数据模型应该是什么。让我们考虑一个简单的应用程序,它在第一个屏幕上显示承运人 ID 列表,在下一个屏幕上显示所选承运人的一些航班详细信息。

image.png

此应用程序的数据模型将 Carrier 作为一个实体,将 FlightSchedule / FlightDetails 作为另一个实体。

创建项目

交易代码:SEGW

单击创建图标并在弹出窗口中提供详细信息。如果您不想创建 TR,请选择Package and TRLocal Package

image.png

一个项目创建如下。

image.png

创建实体并添加属性


选择实体类型节点,右键单击并选择创建。


image.png

提供Entity Type Name作为 Carrier 和Entity Set Name作为 CarrierSet 并按 Enter。这将一次性创建实体类型和实体集。


image.png

image.png

创建实体类型属性

展开 Entity Type Carrier 并双击节点Properties


image.png

然后使用下面框中突出显示的按钮添加/附加或删除属性。添加属性时,您可以分配数据元素或内部类型,如下所示。

单击突出显示的按钮。

image.png

选择显式分配作为模式。

image.png

选择类别作为数据元素并在关联类型中添加数据元素名称。

image.png

您可以添加更多属性,例如运营商名称和货币。然后选择 CarrierID 作为 Key。

image.png

使用参考创建实体


另一种更容易创建实体的方法是引用字典结构或表。创建一个新的实体类型。


image.png

在Entity Type View中,添加引用ABAP结构名/表名。

image.png

然后使用选项右键单击> 导入> 属性

image.png

选择所需的属性,单击Next

image.png

选择 Keys,点击Finish

image.png

属性将按如下方式导入。

image.png

创建实体集


如前所述,我们可以获取与实体类型本身一起创建的实体集。


image.png

但是,如果您只先创建了 Entity Type 并且需要创建 Entity Set,那么选择Entity Set Node > Right Click > Create

image.png

创建关联

您创建了 Carrier 和 FlightSchedule 实体类型。为了定义它们的关系,应该创建关联。关联节点 > 右键单击 > 创建


image.png

接下来,为关联选择一个名称,如CarrierFlights,输入Principal Entity ie Carrier 和 Dependent Entity ie FlightSchedule


在这里,认为应用程序需要从承运人导航到其相关的航班时刻表。在某种程度上,我们需要从 Carrier 导航到 Flight Schedules。因此,还创建了一个导航属性。

Carrier 和 FlighSchedule 之间的基数是 1 对多,下面解释。

单击下一步


image.png

基数

主要实体的基数通常是一个,因为对于一个主要实体,我们可以拥有特定或多个从属实体。对于从属实体,我们可以使用以下基数。

  • 0..1 – 最多 1

  • 1 – 正好 1

  • 0..n – 许多

  • 1..n – 至少 1

在下一个弹出屏幕上,我们映射主体和从属实体之间的键。这可以被认为是 LEFT OUTER JOIN 中的 ON 条件。单击下一步

image.png

提供关联集名称,如 CarrierFlightsSet,然后单击Finish

image.png

关联和关联集已创建。

image.png

生成服务

现在您已经创建了实体类型、实体集、关联、导航属性和关联集,您可以生成项目。

image.png

模型提供者类和数据提供者类的类名称和基类名称以及技术模型名称、技术服务名称将自动填充。通常,您不必更改任何内容,但您可以更改以匹配您的命名约定。

进入


image.png

选择一个包或单击本地对象。

image.png

将生成项目。在日志中可以看到生成了Model Provider Classes和Data Provider Classes。我们将需要专注于类 ZCL_ZJP_DEMO_DPC_EXT,即数据提供者扩展。


image.png

可以从节点Runtime Artifacts访问运行时对象您可以从这里导航到运行时工件。

image.png

实施代码


使用服务之前的最后一步是编写代码来获取数据。由于 OData/Gateway 是一个框架,因此为每个实体创建了每个操作的一个方法。生成的数据提供程序扩展类如下所示。每个 EntitySet 有 5 个方法对应于 CRUD-Q 操作。其中 4 个与单个实体一起使用,它们是 CREATE、UPDATE、DELETE 和 GET。第五个即 GET_ENTITYSET 是返回实体集的查询操作。我们需要根据要求实现这些方法。

该类继承自 Data Provider Base 类,我们需要根据应用程序功能重新定义所需的方法。

image.png

如何重新定义?

选择一种方法,右键单击 > 选择重新定义。

image.png

在重新定义的方法的实现部分添加代码。

image.png

方法是用下面的代码实现的。这里使用 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.



添加代码,保存并激活方法。就是这样。我们的项目准备好了。下一步是在网关系统中注册和测试服务。这将在下一篇文章中介绍。

赞赏支持