RAP - 报表示例

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创建实体,实体中定义字段和与其他实体间的关系

  1. 右键Package-> New -> Data Definition
  2. 输入Name(ZI_Flight_Nadia), Description(Flight Entity)
  3. 选择TR号
  4. 选择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创建实体,实体中定义字段和与其他实体间的关系

  1. 右键Package-> New -> Data Definition
  2. 输入Name(ZC_Flight_Nadia), Description(Flight Consumption)
  3. 选择TR号
  4. 选择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
  1. 右键Package-> New -> Metadata Extension

  2. 输入Name(ZC_Flight_Nadia), Description(Flight Metadata)

  3. 选择TR号

  4. 选择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 服务定义

声明哪些投影视图、投影行为要被暴露出去

  1. 右键Package-> New -> Service Definition

  2. 输入Name(ZC_Flight_Nadia), Description(Flight Service Definition)

  3. 选择TR号

  4. 选择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

  1. 右键Package-> New -> Service Binding
    • 输入Name(ZC_Flight_Nadia)
    • Description(Flight Service Binding)
    • Binding Type: 选择OData V4 - UI
    • Service Definition: 选择上一步创建的Service Definition
  2. 选择TR号
  3. 激活服务
  4. Publish

4. 测试

3.5 成功发布后,在右侧的面板选择Entity,再点击Preview可查看RAP报表预览

5. 发布Fiori服务

刚发现现在可以在Service Binding页面直接创建Fiori App应用,点击Create Fiori App,填写一些参数就行,SAP会自动新建 BSP Application

创建完成点击Fiori App即可,但是此时访问该端点会报403,因为没有配置通信场景

  1. 右键Package-> New -> Communication Scenarios
    • 输入Name(ZC_Flight_Nadia)
    • Description(Flight Service Binding)
  2. Finish
  3. 转到Inbound 页签
  4. 点击Add,添加Inbound Service
  5. Inbound Service ID是3.5 Service Binding的名字
  6. 回到Overview,右上角Publish Locally

此时再点击Fiori App即可查看了,但效果和预览界面没差

具体参考Tutorial的9-12: https://developers.sap.com/tutorials/abap-environment-business-service-provisioning.html

相关推荐
爱喝水的鱼丶14 小时前
SAP-ABAP:数据类型与数据对象(8篇) 第七篇:进阶优化篇——基于类型与对象特征的性能优化技巧
运维·数据库·学习·性能优化·sap·abap·开发交流
爱喝水的鱼丶2 天前
SAP-ABAP:数据类型与数据对象(8篇) 第四篇:关系映射篇——从类型定义到对象实例的转化逻辑
开发语言·数据库·学习·sap·abap
爱喝水的鱼丶2 天前
SAP-ABAP:ABAP函数 NUMBER_GET_NEXT 详解:从编号范围对象获取下一个编号
运维·数据库·学习·sap·abap
爱喝水的鱼丶3 天前
SAP-ABAP:数据类型与数据对象 第二篇:底层逻辑篇——数据类型的分类体系与底层存储原理
运维·开发语言·学习·sap·abap
HeathlX4 天前
SAP-BTP :(7)RAP-EML
abap
爱喝水的鱼丶5 天前
SAP-ABAP:新手入门篇——从0到1写出你的第一个ABAP Hello World程序并完成调试运行
运维·服务器·数据库·学习·sap·abap
爱喝水的鱼丶6 天前
SAP-ABAP:第二篇:实操避坑篇——ABAP Hello World程序创建、语法校验到调试运行全流程指南
运维·服务器·数据库·学习·sap·abap
清风雅雨8 天前
SAP-PP 物料标准成本发布异常不能生产报工CKMLPP改表解决方案
sap
HeathlX9 天前
SAP-BTP :(5)RAP-CDS VIEW发布ODATA UI Service
abap
HeathlX10 天前
SAP-BTP :(4)RAP-创建CDS DATA模型映射和拓展
abap