ABAP RESTful Application Programming Model (RAP) 实战指南

作者:郑德鼎 约 5 分钟阅读 更新日期:2025-07-07 1 年前更新 标签:ABAP, RAP, S/4HANA, Fiori
目录

一、RAP 概述

ABAP RESTful Application Programming Model(RAP)是 SAP 推出的现代化 ABAP 应用开发框架,用于在 SAP S/4HANA、SAP BTP ABAP Environment 等平台上构建企业级业务应用和扩展。RAP 将 CDS 数据模型、业务对象行为、OData 服务暴露和 Fiori 用户体验整合为一体,使开发者能够用统一的模型完成从数据建模到 UI 生成的端到端开发。

RAP 适用于 AS ABAP 7.56 及以上版本、SAP S/4HANA Cloud(Public/Private Edition)以及 SAP BTP ABAP Environment。

二、RAP 核心架构

RAP 应用由以下几个核心层次组成:

三、Managed vs Unmanaged 场景

场景特点适用场景
Managed RAP 框架自动处理持久化、锁、ETag、草稿等标准逻辑 新建业务对象,无需集成旧代码
Unmanaged 开发者自行实现所有业务逻辑,RAP 仅负责服务暴露 封装已有业务逻辑或复杂遗留功能
Managed with Unmanaged Save 结合两者优势,RAP 处理校验和确定,自定义保存逻辑 需要自定义持久化但希望复用 RAP 标准行为的场景

四、开发步骤与代码示例

4.1 定义 CDS 数据模型

@AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: 'Travel BO View' define root view entity ZI_Travel_R as select from ztravel composition [0..*] of ZI_Booking_R as _Booking { key travel_id, agency_id, customer_id, begin_date, end_date, booking_fee, total_price, currency_code, description, overall_status, @Semantics.systemDateTime.localInstanceLastChangedAt: true last_changed_at, @Semantics.systemDateTime.localInstanceCreatedAt: true created_at, _Booking }

4.2 定义业务对象行为

managed implementation in class zbp_i_travel_r unique; strict ( 2 ); define behavior for ZI_Travel_R alias Travel persistent table ztravel early numbering lock master authorization master ( instance ) etag master last_changed_at { create; update; delete; field ( readonly ) travel_id, last_changed_at, created_at; field ( mandatory ) agency_id, customer_id, begin_date, end_date; determination setTravelId on save { create; } determination calculateTotalPrice on modify { field booking_fee; } validation validateCustomer on save { field customer_id; } action acceptTravel result [1] $self; action rejectTravel result [1] $self; mapping for ztravel { travel_id = travel_id; agency_id = agency_id; customer_id = customer_id; begin_date = begin_date; end_date = end_date; booking_fee = booking_fee; total_price = total_price; currency_code = currency_code; description = description; overall_status = overall_status; last_changed_at = last_changed_at; created_at = created_at; } }

4.3 实现行为方法

CLASS zbp_i_travel_r DEFINITION PUBLIC ABSTRACT FINAL FOR BEHAVIOR OF zi_travel_r. ENDCLASS. CLASS zbp_i_travel_r IMPLEMENTATION. ENDCLASS. CLASS lhc_travel DEFINITION INHERITING FROM cl_abap_behavior_handler. PRIVATE SECTION. METHODS get_instance_authorizations FOR INSTANCE AUTHORIZATION IMPORTING keys REQUEST requested_authorizations FOR travel RESULT result. METHODS setTravelId FOR DETERMINE ON SAVE IMPORTING keys FOR travel~setTravelId. METHODS validateCustomer FOR VALIDATE ON SAVE IMPORTING keys FOR travel~validateCustomer. METHODS acceptTravel FOR MODIFY IMPORTING keys FOR ACTION travel~acceptTravel RESULT result. ENDCLASS. CLASS lhc_travel IMPLEMENTATION. METHOD setTravelId. " 自动编号逻辑 SELECT SINGLE MAX( travel_id ) FROM ztravel INTO @DATA(lv_max_id). LOOP AT keys ASSIGNING FIELD-SYMBOL(<key>). -travel_id = lv_max_id + 1. ENDLOOP. ENDMETHOD. METHOD validateCustomer. " 客户存在性校验 READ ENTITIES OF zi_travel_r IN LOCAL MODE ENTITY travel FIELDS ( customer_id ) WITH CORRESPONDING #( keys ) RESULT DATA(lt_travel). LOOP AT lt_travel INTO DATA(ls_travel). SELECT SINGLE FROM /dmo/customer FIELDS customer_id WHERE customer_id = @ls_travel-customer_id INTO @DATA(lv_customer). IF sy-subrc <> 0. APPEND VALUE #( %tky = ls_travel-%tky ) TO failed-travel. APPEND VALUE #( %tky = ls_travel-%tky %msg = new_message_with_text( severity = if_abap_behv_message=>severity-error text = '客户不存在' ) ) TO reported-travel. ENDIF. ENDLOOP. ENDMETHOD. METHOD acceptTravel. MODIFY ENTITIES OF zi_travel_r IN LOCAL MODE ENTITY travel UPDATE FIELDS ( overall_status ) WITH VALUE #( FOR key IN keys ( %tky = key-%tky overall_status = 'A' ) ) FAILED failed REPORTED reported. READ ENTITIES OF zi_travel_r IN LOCAL MODE ENTITY travel ALL FIELDS WITH CORRESPONDING #( keys ) RESULT DATA(lt_travel). result = VALUE #( FOR travel IN lt_travel ( %tky = travel-%tky %param = travel ) ). ENDMETHOD. ENDCLASS.

4.4 暴露 OData V4 服务

define service ZUI_Travel_R { expose ZC_Travel_R as Travel; expose ZC_Booking_R as Booking; expose /DMO/I_Agency as Agency; expose /DMO/I_Customer as Customer; }

五、Fiori Elements 集成

通过 Service Binding 暴露 OData V4 服务后,可以使用 Fiori Elements 快速生成应用:

  1. 在 ADT 或 BAS 中创建 Service Binding,选择 OData V4 - UI 协议。
  2. 激活 Service Binding,获取服务 URL。
  3. 使用 Fiori Application Generator,选择 List Report Object Page 模板。
  4. 连接到已激活的 OData V4 服务,选择主实体。
  5. 通过 CDS 注释(@UI.lineItem、@UI.identification 等)控制 UI 布局和行为。
annotate view ZC_Travel_R with { @UI.facet: [ { id: 'Travel', purpose: #STANDARD, type: #IDENTIFICATION_REFERENCE, label: 'Travel', position: 10 } ] @UI.lineItem: [ { position: 10, importance: #HIGH } ] @UI.identification: [ { position: 10 } ] travel_id; @UI.lineItem: [ { position: 20, importance: #HIGH } ] @UI.identification: [ { position: 20 } ] agency_id; @UI.lineItem: [ { position: 30, importance: #HIGH, label: 'Status' } ] overall_status; }

六、最佳实践

学习建议:官方教程 "Developing a RAP Business Object" 和 "Building a Fiori App with RAP" 是入门 RAP 的最佳起点,建议配合 SAP BTP Trial 或 S/4HANA 开发环境动手实践。

七、总结

RAP 是 SAP S/4HANA 时代 ABAP 开发的核心编程模型。它统一了数据建模、业务逻辑、服务暴露和 UI 消费,使开发者能够更高效地构建云就绪、可扩展的业务应用。掌握 RAP 是现代 SAP 技术顾问和开发者的必备能力。