1. RAP 架构
根据SAP官方的Big Picture,RAP架构分为数层,最简单的RAP报表(即只实现Query而没有Business Object的操作)只需要设计CDS Data Model, CDS Projection view, Service Definition, Service Binding即可,行为定义的部分后面再补充

RAP应用的运行时过程如下图所示,框架接管了大部分中间过程,开发人员只需关注在业务逻辑块

下图包含了几个对象之间的关联关系,自下而上依次开发就完事儿了,EML/Event由Behavior Pool中的class操作

2. 场景
此场景只包含最简单的RAP实现,使用单表Flight作为示例开发一个RAP报表
如果懒得跟着走一遍也可以用RAP Generator直接生成
右键ABAP Project->Generate ABAP Repository Object->OData UI Service,Referenced Object 选择透明表即可(透明表需要遵循RAP Generator的要求,加什么变更字段,报错信息里面有)
3. 开发
3.1 数据建模
使用CDS创建实体,实体中定义字段和与其他实体间的关系
- 右键Package-> New -> Data Definition
- 输入Name(ZI_Flight_Nadia), Description(Flight Entity)
- 选择TR号
- 选择Templates->defineViewEntity
使用Content Assistant(Window->Preference->Key->Content Assistant)可快速插入并重命名表字段
对业务对象建模的时候需要指定根实体,加上root关键字即可
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Flight Entity'
@Metadata.ignorePropagatedAnnotations: true
@ObjectModel.usageType:{
serviceQuality: #X,
sizeCategory: #S,
dataClass: #MIXED
}
define root view entity ZI_Flight_Nadia
as select from /dmo/flight
{
key carrier_id as CarrierId,
key connection_id as ConnectionId,
key flight_date as FlightDate,
@Semantics.amount.currencyCode: 'CurrencyCode'
price as Price,
currency_code as CurrencyCode,
plane_type_id as PlaneTypeId,
seats_max as SeatsMax,
seats_occupied as SeatsOccupied
}
3.2 数据投影
使用CDS创建投影视图,投影视图的目的是裁剪字段,将外部需要访问的字段暴露出去
使用CDS创建实体,实体中定义字段和与其他实体间的关系
- 右键Package-> New -> Data Definition
- 输入Name(ZC_Flight_Nadia), Description(Flight Consumption)
- 选择TR号
- 选择Templates->defineProjectionView
如果投影视图目标是根实体,投影视图也需要加上root关键字
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Flight Consume'
@Metadata.ignorePropagatedAnnotations: true
@Metadata.allowExtensions: true
define root view entity ZC_Flight_Nadia
as projection on ZI_Flight_Nadia
{
key CarrierId,
key ConnectionId,
key FlightDate,
@Semantics.amount.currencyCode: 'CurrencyCode'
Price,
CurrencyCode,
PlaneTypeId,
SeatsMax,
SeatsOccupied
}
3.3 定义UI
投影视图如果要发布为UI服务,需要通过注解定义UI元素
虽然可以直接在投影视图直接对字段定义UI,但建议的方式是将注解分离到Metadata文件中
如果在Metadata文件中定义UI,需要在上面的投影视图顶部加上注解,允许Metadata
@Metadata.allowExtensions: true
-
右键Package-> New -> Metadata Extension
-
输入Name(ZC_Flight_Nadia), Description(Flight Metadata)
-
选择TR号
-
选择Templates->annotateEntity
@Metadata.layer: #CORE
// 抬头信息
@UI:{
headerInfo:{
typeName: 'Flight',
typeNamePlural: 'Flights'
}
}annotate entity ZC_Flight_Nadia with
{// 报表Detais位置
@UI.facet: [{ id: 'Flight', label: 'Flight', type: #IDENTIFICATION_REFERENCE, position: 10 }]@UI.lineItem: [{ position: 10 }] // 报表行项目位置
@UI.identification: [{ position: 10 }] // Detais位置
CarrierId;@UI.lineItem: [{ position: 20 }]
@UI.identification: [{ position: 20 }] // Detais位置
ConnectionId;@UI.lineItem: [{ position: 30 }]
@UI.identification: [{ position: 30 }] // Detais位置
FlightDate;@UI.lineItem: [{ position: 40 }]
@UI.identification: [{ position: 40 }] // Detais位置
Price;@UI.lineItem: [{ position: 50 }]
@UI.identification: [{ position: 50 }] // Detais位置
CurrencyCode;@UI.lineItem: [{ position: 60 }]
@UI.identification: [{ position: 60 }] // Detais位置
PlaneTypeId;@UI.lineItem: [{ position: 70 }]
@UI.identification: [{ position: 70 }] // Detais位置
SeatsMax;@UI.lineItem: [{ position: 80 }]
@UI.identification: [{ position: 80 }] // Detais位置
SeatsOccupied;
}
3.4 服务定义
声明哪些投影视图、投影行为要被暴露出去
-
右键Package-> New -> Service Definition
-
输入Name(ZC_Flight_Nadia), Description(Flight Service Definition)
-
选择TR号
-
选择Templates->defineService
@EndUserText.label: 'Flight Service Definition'
define service ZSD_Flight_Nadia {
expose ZC_Flight_Nadia;
}
3.5 服务绑定
声明将服务以哪种形式暴露给外围(UI、API)
此处要暴露UI,选择OData V4 - UI
SAP建议使用OData V4以使用草稿视图及新功能,历史OData V2服务可选择逐步迁移为V4
- 右键Package-> New -> Service Binding
-
- 输入Name(ZC_Flight_Nadia)
- Description(Flight Service Binding)
- Binding Type: 选择OData V4 - UI
- Service Definition: 选择上一步创建的Service Definition
- 选择TR号
- 激活服务
- Publish
4. 测试
3.5 成功发布后,在右侧的面板选择Entity,再点击Preview可查看RAP报表预览


5. 发布Fiori服务
刚发现现在可以在Service Binding页面直接创建Fiori App应用,点击Create Fiori App,填写一些参数就行,SAP会自动新建 BSP Application
创建完成点击Fiori App即可,但是此时访问该端点会报403,因为没有配置通信场景
- 右键Package-> New -> Communication Scenarios
-
- 输入Name(ZC_Flight_Nadia)
- Description(Flight Service Binding)
- Finish
- 转到Inbound 页签
- 点击Add,添加Inbound Service
- Inbound Service ID是3.5 Service Binding的名字
- 回到Overview,右上角Publish Locally
此时再点击Fiori App即可查看了,但效果和预览界面没差
具体参考Tutorial的9-12: https://developers.sap.com/tutorials/abap-environment-business-service-provisioning.html