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

相关推荐
山茶花开时。1 天前
[SAP] SAP MM模块学习路径
sap·mm
stone08238 天前
SAP - 使用CL_FDT_XL_SPREADSHEET将Excel文档导入到内表
sap
雨天行舟11 天前
abap调用deepseek接口 v3.0
http·ai·sap·abap·聊天·deepseek
stone082314 天前
SAP FICO程序 - 会计科目余额报表
sap
Henry-SAP14 天前
ERP(SAP) MRP 业务视角全局流程解析
人工智能·sap·软件需求·erp·sap pp
小羔羊的官方学习账号16 天前
SAP中工单控制关键配置点
sap·pp
SAP_奥维奥科技16 天前
奥维奥助力花园乳业数字化转型落地 以SAP B1破解全产业链管理难题
sap·sap管理系统·sap business one·sap管理系统软件·sap实施服务商
duangww17 天前
SAP ALV处理日元等转换因子问题
abap
sinat_3751122617 天前
ME_PROCESS_PO_CUST增强check
sap·abap·增强