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

相关推荐
SAP_奥维奥科技3 小时前
破局传统制造,赋能智能转型——机加工企业智能工厂升级实施方案重磅出炉
sap·智能制造·sap管理系统·sap管理系统软件·sap实施服务商推荐
SAP_奥维奥科技1 天前
如何选择适合自己企业的SAP实施服务商?
sap
SAP_奥维奥科技3 天前
详解SAP Business One:信用额度管理
sap·sap管理系统·sap business one·sap管理系统软件·sap实施服务商
爱喝水的鱼丶3 天前
SAP-ABAP:高效开发指南:全局唯一标识符ICF_CREATE_GUID函数的全面解析与实践
运维·服务器·开发语言·数据库·sap·abap·开发交流
LilySesy4 天前
【SAP-MOM项目】二、接口对接(中)
开发语言·python·pandas·restful·sap·abap
Lisson 34 天前
VF01修改实际开票数量增强
java·服务器·前端·abap
Henry-SAP5 天前
SAP(ERP) 组织结构业务视角解析
大数据·人工智能·sap·erp·sap pp
爱喝水的鱼丶7 天前
SAP-ABAP:掌握BAPI_OUTB_DELIVERY_CONFIRM_DEC:解锁SAP自动化发货的核心钥匙
运维·学习·sap·abap·交流学习
SAP_奥维奥科技8 天前
详解SAP Business One:采购费用的处理方式
sap