1. 在 SAP ABAP 事物码 SEGW 里创建 SAP OData 项目

从本文开始,我们迈出使用事物码 SEGW 开发 OData 服务的第一步。

我们会开发一个能够进行图书管理(Book Management) 的 OData 服务,首先创建一个图书实体的模型,也就是 ABAP Dictionary,事物码 SE11 里创建一个 ABAP 结构 (Structure), 取名为 ZTS_BOOK.

下图是事物码 SE11 的界面:

新建一个 Structure:

我们首先给这个结构创建一个 key 也就是主键字段,字段名为 BOOK_GUID, 类型的话,选择 ABAP 自带的 RAW 类型。为了能输入这个 ABAP 标准类型,我们点一下 Built-in Type,然后依次在 Data Type 和 Length 字段里维护 RAW 和 16:

依次维护其他字段:

  • BOOK_ID: 记录图书的 ID,类型为 CHAR,长度为 4 个字符。
  • BOOK_NAME: 记录图书的名称,类型为 SSTRING, 长度为 20 个字符。
  • AUTHOR_ID: 图书的作者 ID,类型为 CHAR, 长度为 4 个字符。
  • AUTHOR_NAME: 图书的作者名称,类型为 SSTRING, 长度为 20 个字符。
  • STOCK_NUMBER: 图书的库存数量,整型。

然后进入事物码 SEGW,新建一个项目:

项目名称维护成 ZBOOK_MANAGE, Project Type 维护成 Service with SAP Annotations,点击 Local Object 可以存储到本地 $tmp 开发包中。

然后我们会看到项目文件夹下多出了这几个新的文件夹:

我们对着 Data Model 文件夹下面的 Entity Types 单击右键,从右键菜单选择 Create.
这一步的目的是创建 OData 服务模型的实体类型,也就是 SAP 帮助文档上所说的 Entity Type.

因为 OData 是一种协议,可以基于很多高级编程语言实现,ABAP 是其中之一,因此采取 ABAP 实现的 OData 服务,其数据模型也是基于 ABAP DDIC 里创建的数据结构。接下来的步骤,我们就会把 SEGW 里创建的 OData 模型的 Entity Type,同 ABAP DDIC Structure 即 ZTS_BOOK 里的字段,建立起一一映射的关系。

Entity Type 的名称,维护成 Book:

点击 之后,看到如下界面,其中 ABAP Structure 栏下面是空的。

image

手动输入我们刚刚在 SE11 里创建的 ABAP Structure ZTS_BOOK 之后,使用快捷键 Ctrl + S 保存修改:

此时左边 Entity Type 文件夹下面,就会多出一个节点:Book

双击 Book 文件夹下面的 Properties 文件夹,发现是空的。此时我们要手动维护 Book 这个实体类型的每一个字段。

点击这个 Append Row 按钮,创建一个新的空行:

首先需要为 Entity Type 定义一个主键(key):在 Name 栏下面手动输入 book_guid, 把 Is Key 打上,表明 book_guid 属性为主键,然后在 Edm Type 字段,从 F4 help 里选择 Edm.Guid 这个类型。

接着需要维护这个属性是否支持在 OData 服务实现里被创建,被修改,被排序和是否允许其值为 Null.

因为 Edm.Guid 类型的值是形如这种16位的数字和字母组合的形式:00163EA720001ED29D9420A624836ED3,所以显然,这种数据格式一旦创建后,就不应被修改,所以 Updatable 不应该被选取。同理,SortableNullable 也不应被选取,因为对 GUID 排序不合理,GUID 也不应该允许 Null 作为初始值存在。

Filterable 即根据该字段搜索,对于 GUID 来说的话也不适合。

但是本教程后续步骤,我们的 OData 服务实现,会支持直接通过 OData 的方式创建新的 Book 数据,因此 Creatable 应该打上。

最后,需要为这个 Entity Type 属性字段,选择一个来自 ABAP 结构 ZTS_BOOK 中的 ABAP 字段。还是从 F4 Value Help 里选择 BOOK_GUID:

选定之后保存,结果如下:

重复上述步骤,将 ZTS_BOOK 其他的字段,也一一手动维护到 Entity Type Properties 文件夹下:

注意,ABAP DDIC 里的 CHAR 和 SSTRING 类型,在 OData Entity Type 里对应的类型,都为 Edm.String.

属性维护完毕之后,选中 ZBOOK_MANAGE 项目,从右键菜单里,选择 Check Consistency,确保没有 Error 即错误消息报出。

上图显示,有两条警告消息(Warning Message):Potential loss of data: EDM type is more restriction. Map instead to the ABAP type ‘CHAR[20]’.

这些警告消息的大意是,我们的 book_nameauthor_name, 选择的 Edm Type 类型为 Edm.String, 最大长度为 20,我们分别为这两个属性字段,绑定到了 ABAP 结构 ZTS_BOOK 的 BOOK_NAME 和 AUTHOR_NAME 字段,这两个 ABAP 字段的数据类型都是 SSTRING, 因为我们期望这两个字段需要区分大小写。而 SEGW 建议我们映射到类型为 CHAR 20 的 ABAP 字段。

对于这个警告消息,我们可以忽略。

Check Consistency 没有发现错误之后,我们从右键菜单,选择 Generate Runtime

弹出来 Model and Service Definition 的对话框。到目前为止,我们只是完成了 OData 模型的创建,这些模型还无法运行起来,还无法被外界消费。因此,我们通过上图的 Generate Runtime,自动生成 OData 元数据的实现类(MPC, Metadata Provider Class)和 OData 服务业务数据提供类(DPC,Data Provider Class):

点击 之后,SEGW 就会自动生成 MPC,MPC_EXT 和 DPC,DPC_EXT 四个 ABAP 类,在左边的 Runtime Artifacts 文件夹下就能看见。

MPC 和 DPC 的实现源代码,每当我们对 SEGW 里的工程,做修改之后,重新点击 Generate Runtime 之后,会自动被覆盖掉,代之以当前 SEGW 最新的设置对应的源代码。因此,MPC 和 DPC 并不是理想的开发人员编写业务逻辑的场所。

那么我们如果想对 SEGW 创建的 OData 模型的元数据,必须在 MPC_EXT 这个 ABAP 类里进行编程。MPC_EXT 类是 MPC 类的子类,在 MPC_EXT 里编写的代码,在 Generate Runtime 之后不会被覆盖掉。同理,OData 服务的业务逻辑,也应该编写在 DPC_EXT 类里, 而不是 DPC 类里。

至此我们完成了 SEGW 模型的创建,本教程下一步骤,我们将介绍如何对目前为止创建好的 OData 模型进行测试。

猜你喜欢

转载自blog.csdn.net/i042416/article/details/125768423