Next Generation BO in RAP

Gliederung:

Ab Netweaver 7.54 wird ein Business Object  (BO) für Datenänderungen im ABAP RESTfull Application Programming Model benötigt. Das neue BO Konzept geht weiter als BOPF. Hier geben wir nur einen Überblick und empfehlen den OpenSAP Kurs (Folien und Videos):

Die bisherige BOPF Daten (Struktur, Hierarchie, Queries) und Verhalten (Aktionen, Ermittlungen, Validierung) werden nun durch

  • Die Struktur (Datenteil) wird durch eine Hierarchie von Core Data Services (CDS) views oder view Entities mit einem Wurzelknoten (root CDS Entity). Damit können Read-Only Anwendungen (Queries) generiert werden.
  • Für Datenänderungen werden das Verhalten durch die Standard-Operationen Create, Create by Association, Update, Delete geprägt. Für kundendefiniertes Verhalten müssen die Operationen Actions, Validations, Determinations, Functions, Locks, Messages in Behavior Definitions (CDS BDEF) und Behavior implementation mit nativer ABAP Unterstützung implementiert werden.
  • Bei der Laufzeit haben wir die Szenarien managed, managed with draft, unmanaged.
rap_bo_content

Datenmodellierung

Core Data Services (CDS Views, Data Definitions) werden für Beschreibung der Datenstruktur und Abfragen (Queries) verwendet.

Bemerkung:

  • Bis S/4 HANA 1909 (e.g. Entwickler Demo) muss mit CDS views gearbeitet werden.
  • ab S/4 HANA 2020 (e.g. Cloud Version) können CDS View Entities verwendet werden.

Für ein Business Objekt für gesetztliche Feiertage wird in der Eclipse-Umgebung wird eine Datenbank-Tabelle mit 5 Spalten definiert:

@EndUserText.label : 'Public Holiday Table'
@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #LIMITED
define table ycalholidayeyjfc {
  key client : mandt not null;
  key holiday_id : ycal_holiday_id_eyjfc not null;
  month_of_holiday : ycal_month_eyjfc;
  day_of_holiday : ycal_day_eyjfc;
  changedat : timestampl;
}

Eine darauf aufbauende CDS View sieht so aus

@AbapCatalog.sqlViewName: 'YCAL_IHOLIDEYJFC'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'CDS View for Public Holidays'
define root view ycal_i_holiday_eyjfc 
as select from ycalholidayeyjfc
composition [0..*] of ycal_i_holitxt_eyjfc as _HolidayTxt 
association [0..1] to ycal_i_holitxt_eyjfc as _DefaultText
on _DefaultText.holiday_id = $projection.holiday_id
and _DefaultText.spras = $session.system_language
{
//ycalholidayeyjfc
@Semantics.user.createdBy: true
key holiday_id,

@Semantics.user.lastChangedBy: true
month_of_holiday,

@Semantics.systemDateTime.lastChangedAt: true
day_of_holiday,
 
_DefaultText.fcal_description as HolidayDescription,

@Semantics.systemDateTime.lastChangedAt: true
changedat,

_HolidayTxt
}

Bei einer Read-Only-Anwendung können ausgehend vom CDS-View ein oData-Entry Point und eine UI5 App generiert werden. Ein Business Object (BO) wird in RAP für Datenänderungen benötigt.

rap_bo_runtime

ABAP Behavior Definition Language

Das Verhalten wird in CDS Behavior Definition (BDEF)-Projektionen deklariert und in einer behavior implementation als ABAP Code beschrieben. Dabei wird EML verwendet, eine Erweiterung der ABAP .

Im managed Szenario sind die Operationen CREATE, READ, UPDATE, DELETE ohne Aufwand unterstützt. Andere Operationen (Actions) werden in Klassen implementiert.

managed implementation in class ybp_cal_i_holiday_eyjfc unique;

define behavior for ycal_i_holiday_eyjfc alias HolidayRoot
persistent table YCALHOLIDAYEYJFC
lock master
with additional save
//authorization master ( instance )
//etag master <field_name>
{
create;
update;
delete;

determination det_create_and_change_texts on save
{ field HolidayDescription; }
}

define behavior for YCAL_I_HOLITXT_EYJFC alias HolidayText
persistent table ycalholitxteyjfc
lock dependent ( holiday_id = holiday_id )
{
update; delete;
field( readonly ) holiday_id;
}

 

Die Implementation unterscheidet strikt die Interaktion-Phase mit lokale Handler Klassen und die Verbuchungsphase mit einer saver Klasse.

CLASS ybp_cal_i_holiday_eyjfc DEFINITION PUBLIC ABSTRACT FINAL 
  FOR BEHAVIOR OF ycal_i_holiday_eyjfc.
ENDCLASS.

Beispiel: Lokaler Handler Definition

CLASS lhc_HolidayRoot DEFINITION INHERITING
FROM cl_abap_behavior_handler.

Die Definition von Methoden kann nun so aussehen

 METHODS det_create_and_change_texts
FOR DETERMINATION HolidayRoot~det_create_and_change_texts
IMPORTING keys FOR HolidayRoot.

oder

METHODS modify_create  FOR MODIFY IMPORTING it_travel_create FOR CREATE travel.

Eine Saver-Klasse Definition muss von der Klasse CL_ABAP_BEHAVIOR_SAVER abgeleitet werden.

In den Händler werden abgeleitete Datentypen verwendet, die mit % anfangen

  • %CID,  %KEY, %PID, %CONTROL, %DATA, %FAIL...

     

ABAP Entity Manipulation Language

ABAP wurde mit Statements erweitert, um mit CDS Entities zu arbeiten.

  • Lesen: READ ENTITIES, READ ENTITY und READ ENTITIES OPERATIONS.
  • Ändern: MODIFY ENTITIES, MODIFY ENTITY and MODIFY ENTITIES OPERATIONS.
  • Verbuchung starten: COMMIT ENTITIES und COMMIT ENTITIES RESPONSES.
  • Sperren: SET LOCKS OF und SET LOCKS ENTITY.

In diesem Blog werden Beispiele kommentiert:

Entity Manipulation Language – EML | RAP Series