本篇笔记主要用于记录学习OData时的学习总结,不定期更新。这一片主要介绍了OData的创建与CTS之间的绑定、测试等相关内容。
OData 学习笔记
一、创建Gateway的五个步骤
1.OData Service Definition
OData服务定义。
2.Data Model Definition(MPC)
OData模型定义。Model Import、RFC/BOR、DDIC、File、Search Help。
3.Service Generation
服务生成。SRV Class自动生成。
4.Service Implementation(DPC)
服务实施。Read、Create、Delete和Update等。
5.Service Registration and Activation
服务注册和启用。
二、OData创建
1.TCODE
SEGW
2.输入必输项
- **Project:**项目名称
- **Description:**项目描述
- Package:项目存放的包
3.默认项
- Generation Strategy
- Project Type
三、导入数据模型
导入数据模型的四种方式:
1.Data Model From File(文件数据模型)
通过上传一个文件(.edmx或.xml包含可在服务生成器项目中重用的预定义数据)。
2.DDIC Structure(DDIC结构)
将现有的ABAP结构作为复杂类型或实体类型重用。包括Views、Database Tables、Structure。
3.RFC/BOR Interface(RFC/BOR接口)
实现RFC或BOR生成器。
4.Search Help(搜索帮助)
导入与模型关联的搜索帮助并在项目中重用。
四、DDIC Structure创建数据模型
DDIC形式是通过将现有的ABAP结构作为复杂类型或实体类型重用。即是用SE11中存在的Views、Database Tables、Structure等作为数据模型使用。这种方式也是OData创建数据模型的最常用的形式之一。
1.选择DDIC创建数据模型
2.选择数据模型表
本次使用Sflight表作为数据模型表进行演示。
3.选择需要操作的字段
4.设置主键字段
设置主键字段时,建议设置成和ABAP TABLE一样的主键,并且需要确保ABAP Name 与Name(Entity Property Name)的名字保持一致。
5.设置各个Property字段的属性
在进行完上面的操作之后,点击Entity Types文件夹,可以在其中看到我们刚刚创建的名字叫UserInfo的数据模型。按照图片中提示的点击内容,设置相应字段的属性。设置完属性之后点击图中的激活按钮。
关于该表格中的各项属性的含义可以参照下面的第七项读取数据模型的属性(Entity Types)中的内容。
五、设置OData的增删改查方法
实现CRUD的方式有很多,可以使用Function、CDS和重写OData中的类方法。本次介绍较常使用的重写类的方式。
1.打开Runtime Artifacts文件夹
选择带有DPC_EXT的类,右键选择“Go To ABAP Workbench”。进入该类的SE80状态。
2.在左侧的工具栏中按照下图的内容选择需要重定义的方法
需要重写的有5个方法,分别对应CRDU:
- Create:(Entity Types Name)_CREATE_ENTITY
- Read:(Entity Types Name)_GET_ENTITY(单条) (Entity Types Name)_GET_ENTITYSET(多条)
- Delete:(Entity Types Name)_DELETE_ENTITY
- Update:(Entity Types Name)_UPDATE_ENTITY
选择重定义的方法之后会在Methods文件下新建一个文件夹Redefinitions,此处存放的是重定义的方法。
(1)重写创建方法
(2)重写修改方法
(3)重写删除方法
(4)编写查询数据用CDS
如图中的文字,在此处设置字段的变量,如果使用到WHERE中,则在前端使用CDS时这几个参数必须作为必输参数传递到后端查询数据。但是前端很多时候是不确定使用哪些字段进行查询的。所以建议在创建CDS时,不要设置WHERE条件中的参数,除非业务需要。
(5)将OData与CDS相关联
在Data Model文件上右键选择Reference —> Data Source
在弹出的框中填入CDS的视图名称,此处可以使用搜索帮助。
(6)CDS与查询数据的关系
OData中查询数据有两种方式,一种是查询单条数据使用的GetEntity,一种是查询多条数据所使用的GetEntitySet。而当绑定CDS之后,CDS会自动与这两种数据查询Method相关联。当前端发送请求数据的请求后,会自动调用CDS并结合Fieter中的筛选数据对数据进行筛选。详细的可以参照OData的测试
六、Entity Types & Entity Set
1.Entities
- Entity Types:定义如名字、类型、Key等属性(ex .Employee等)
- Entities:Entity Types的实例
- Entity Key:会unique地定义Entities,用于定义其他Entities之间的关系(ex.CustomerId,OrderId)
- Entity Set:可以使用数据模型的基本单位
- 利用Entity Types生成Entity Set
- 一个Entity Set包含Create、Delete、Update、GetEntitySet(Query)、GetEntity(Read)共5个基本METHOD。
2.Associations
定义两个或多个Entity Type关系
七、读取数据模型的属性(Entity Types)
Field | Annotation | Description |
---|---|---|
Createable | sap:createable | 对应Entity Type Field值输入设定。勾选该属性在执行创建的时候可以由前台录入数据来填充(比如客户编码);若不勾选,则在前台执行创建时,由后台指定数据来填充(比如销售订单编码等),一般Key字段都会勾选 |
Updateable | sap:updateable | 对应Entity Type Field值修改设定。勾选该属性,在执行更新的时候可以由前台录入数据来填充(比如手机号);若不勾选,则在前台执行更新时,由后台指定数据来填充(比如时间戳/日期等) |
Deleteable | N/A | 是否勾选并不影响 |
Sortable | sap:sortable | 对应Entity Type Field值排序设定,勾选后,则可以使用Sorderby查询(比如Sorderby = CustomerName) |
Nullable | Nullable | 对应Entity Type Field值排序设定,勾选后,则可以使用Sorderby查询(比如Sorderby = CustomerName) |
Filterable | sap:filterable | 对应Entity Type Field值Filter许可。勾选后则可以使用Sfilter查询(比如Sfilter = orderNumber eq ‘1234’) |
Name | N/A | property的名字 |
Key | N/A | 是否是对应property的Key |
Edm Core Type | N/A | property的类型经常使用的类型:Edm.String(字符串)Edm.DateTime(日期)Edm.Decimal(数字)Edm.Time(时间) |
Label | N/A | UI上要显示的Label Text |
ABAP Field | N/A | 生成property时参考的ABAP Field名。生成Entity Type时参考ABAP Object生成的话,可以使用对应字段及字段所参照的Date Element属性进行modeling(ex.Alpha conversion等)->设计时需要明示要参考的ABAP字段 |
八、Entity Set的属性设置
Field | Annotation | Description |
---|---|---|
Createable | sap:createable | 可以通过Http的post方法来执行创建数据 |
Updateable | sap:updateable | 可以通过Http的put方法来执行更新数据 |
Deleteable | sap:deletable | 可以通过Http的delete方法来执行删除数据 |
Pageable | sap:pageable | 勾选后可以支持分页查询,比如指定页面数据的条目数和大小,跳过指定条目数等(top/skip) |
Addressable | sap:addressable | 是否勾选表示,可以直接导航到相关EntitySet(即是否可以使用navigation) |
Searchable | sap:searchable | 是否勾选表示,可以支持search语句的使用(比如productSet?search=’box’) |
Subrchable | N/A | 是否勾选表示在修改的时候是否同时支持对其下属关联属性的修改,一般用于RFC/BOR等 |
RequiresFilter | sap:requiresfilter | 是否勾选表示是否支持Filter语句 |
![Entity Set属性说明](OData学习笔记/Entity Set属性说明.PNG)
九、关联关系Association
1.关联关系介绍
从下面的图中可以看到YLPP_TEST_EXPAND3_SRV中含有三个Entity Types和两个Association。其中,在图片的右侧,可以清楚的看到Association。其中HeaderToItem是将Entity Types中的Header和Item关联起来。同理,Association中的ItemToProduct是将Entity Types中的Item和Product关联起来。也可以看到他们之间的对应关系。
2.关联关系的创建
(1)当当前OData还没有关联关系时先按照下图所示的方式新建一个关联关系
(2)填写该页面的内容
完全创建好关联关系需要三个步骤。
- Principal Entity:建立关联的起始字段设置
- Dependent Entity:从关联起始字段到该关联字段结束的字段设置
- Cardinality:关联关系一对多、多对一等设置
- Navigation Property:关联关系的向导设置
Cardinality | Description |
---|---|
0 .. 1 | 记录可有可无,最多一条记录 |
1 | 必须存在一条记录 |
0 .. n | 记录可有可无,可有n条记录 |
1 .. n | 至少存在一条记录,可有n条记录 |
①第一个步骤——填写关联的数据模型和设置关联属性
可以在对话框的左上角看到当前步骤1
②第二个步骤——设置关联相关的字段
③第三个步骤
创建Association Set
当创建完成之后会在页面下方提示如下信息
3.Navigation导航
在生成Association时,系统会自动生成一个Navigation。在Entity Types中展开刚刚设置的起始模型可以看到Navigation Properties可以下拉,下拉后可以找到刚刚创建的Navigation Properties。双击后可以看到对应的关系,此处的ABAP Field Name十分重要。
4.使用Association的理由
Header数据和Item数据都存在时,很多情况都是以Header数据为基准查找Item数据,这种情况:
(1)创建Header数据和Item数据混合在一起的Entity Types(这种情况保存数据时,需要区分Header数据和Item数据);
(2)创建Header Entity Set和Item Entity Set后读取Header数据并以Key值为基准依次连接Item Entity Set(这种情况如果两个Entity Set之间)没有连接的话,需要调用两次Model)
这时为了在UI上方便读取Header Entity Set和Item Entity Ser,通过Navigation进行Modeling操作。
十、Gateway Service生成
1.登记Gateway Service
登记Gateway Service后,系统会自动生成以下各类,建议不要修改Class Name
- **DPC:**数据提供程序类
- **DPC_EXT:**数据提供程序类扩展
- **MPC:**模型提供程序类
- **MPC_EXT:**模型提供程序类扩展
- **SRV:**OData服务识别
2.生成类介绍
MPC和MPC_EXT:当用户访问该服务的metadata(元数据)时,他们负责把通过ABAP DDIC Structure描述的metadata信息转化为odata协议规范的格式并返回。当对odata进行修改后,点击“generate”图标,MPC的代码会重新生成。如果开发者需要在model上添加一些额外信息时,那么需要在MPC_EXT里通过ABAP代码实现。MPC_EXT是MPC的子类,在重新生成odata时,此部分代码不会被覆盖。
**DPC和DPC_EXT:**包含了odata服务的实现,实际上就是基于OData的CRUD操作。我们通过重新定义DPC_EXT类方法,来实现CRUD。
十一、Gateway Service测试
1.测试路径
打开OData文件目录下的Service Maintenance 文件,双击GW_HUB点击右侧画面中的SAP Gateway Client按钮。
2.注册Service
在测试时可能会遇到报错说该服务没有注册系统。此时按照图中红框标记的点击Register按钮或使用TCODE /IWFND/MAINT_SERVICE。
(1)Register 按钮
点击对勾后需要绑定存放Service的包,该界面和下面的绑定包的界面一致。
(2)TOCDE
使用TCODE后进入相应的界面,点击上方的Add Service按钮。
点击对应按钮后进入一个新界面,在上方的输入框中输入ODATA中项目的名称并在其后添加“_SRV”,详细的参照下图。
点击注册的按钮需要绑定存放的包。
3.测试
注册完成之后,再次点击SAP Gateway Client按钮进入测试界面。
(1)查询数据
在界面上选择请求方式为GET的请求方式,因为我们使用的是CDS的方式进行的数据查询,所以不能使用Data Model 中的Entity Types进行数据查询。点击界面上的EntitySets按钮。添加请求的路径为CDS。再点击Add URI Option按钮添加数据格式为’JSON‘格式。最后点击执行按钮Execute。
- EntitySets按钮
- Add URI Option按钮
- 执行效果如下图所示
接下来介绍添加筛选条件的查询方式,其实也就是在URI的后面添加关键字filter然后后接字段的筛选条件。
因为我们的筛选条件是查询carrid 字段等于 AA,connid 字段等于0064的数据,所以可以从下面的返回结果集中看到数据确实是所需要的数据。
(2)新增数据
新增数据选择的请求方式是POST请求方式。因为我们的新增逻辑是放在重写的实现类中的。所以本次需要使用Data Model 中的Entity Types进行数据的新建操作。和查询数据进行的操作类似,先点击EntitySets按钮。添加请求的路径为想要新建的Entity Types。再点击Add URI Option按钮添加数据格式为’JSON‘格式。最后点击执行按钮Execute。
然后在左下角的框中输入想要新增的数据内容。此处有一个注意事项。在编写Json对象字符串时,使用的是左侧为字段名:右侧为字段值。但是此处的字段名称需要和Data Model 中的Entity Types 的Properties中的字段名称保持一致。下面放上对比图。
接下来放完整的请求JSON对象数据
最后同样点击Execyte按钮可以查看到最后执行的效果图。
数据库查询检测是否成功新建成功。
(3)修改数据
因为操作和过程基本都是如出一辙的,所以就直接放出不同的地方URI,另外请求方式需要设置成PUT,修改数据需要在URI中传入修改数据的主键,然后再左下角的框中输入修改的各项字段值即可,本次修改前4个数字字段值为40。
从数据库中也可以查看到对应字段值的修改。
(4)删除数据
删除数据和修改数据基本一致,不过请求方式是DELETE。