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 应用由以下几个核心层次组成:
| 场景 | 特点 | 适用场景 |
|---|---|---|
| Managed | RAP 框架自动处理持久化、锁、ETag、草稿等标准逻辑 | 新建业务对象,无需集成旧代码 |
| Unmanaged | 开发者自行实现所有业务逻辑,RAP 仅负责服务暴露 | 封装已有业务逻辑或复杂遗留功能 |
| Managed with Unmanaged Save | 结合两者优势,RAP 处理校验和确定,自定义保存逻辑 | 需要自定义持久化但希望复用 RAP 标准行为的场景 |
@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
}
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;
}
}
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.
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;
}
通过 Service Binding 暴露 OData V4 服务后,可以使用 Fiori Elements 快速生成应用:
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;
}
RAP 是 SAP S/4HANA 时代 ABAP 开发的核心编程模型。它统一了数据建模、业务逻辑、服务暴露和 UI 消费,使开发者能够更高效地构建云就绪、可扩展的业务应用。掌握 RAP 是现代 SAP 技术顾问和开发者的必备能力。