ABAP RAP

CRUD-Szenarios

(C) Brandeis Consulting📁

Scope

In diesem Foliensatz geht es ausschließlich um die Standard Features des Managed Szenarios. Die folgenden Aspekte sollen gelernt werden:

  • CRUD Anwendungen
  • Behavior Definitionen
  • Child Entities anlegen, bearbeiten und löschen

CRUD Anwendung

(C) Brandeis Consulting📁

Managed vs. Unmanaged

Managed

Beim Managed Szenario kümmert sich das RAP Framework um die CRUD Operationen:

  • Create
  • Read
  • Update
  • Delete

Darüber hinaus werden Sperren automatisch verwaltet. Neben den CRUD Operationen kann eigene Geschäftslogik implementiert werden, z.B. in Form von Aktionen, Ableitungen und Validierungen.

Unmanaged

Alles muss selber implementiert werden. Das ist ideal, wenn bestehende Anwendungslogik weiterverwendet werden soll. Dafür gibt es zwei lokale Klassen in der Implementierung

(C) Brandeis Consulting📁

Unmanaged - Die zu implementierenden Methoden

Interaction Phase

CLASS lhc_ZI_TASKS_UM DEFINITION 
                 INHERITING FROM cl_abap_behavior_handler.
  PRIVATE SECTION.
    METHODS get_instance_authorizations 
               FOR INSTANCE AUTHORIZATION IMPORTING keys 
               REQUEST requested_authorizations 
               FOR zi_tasks_um RESULT result.

    METHODS create FOR MODIFY
      IMPORTING entities FOR CREATE zi_tasks_um.

    METHODS update FOR MODIFY
      IMPORTING entities FOR UPDATE zi_tasks_um.

    METHODS delete FOR MODIFY
      IMPORTING keys FOR DELETE zi_tasks_um.

    METHODS read FOR READ
      IMPORTING keys FOR READ zi_tasks_um RESULT result.

    METHODS lock FOR LOCK
      IMPORTING keys FOR LOCK zi_tasks_um.
ENDCLASS.

Save Sequence

CLASS lsc_ZI_TASKS_UM DEFINITION INHERITING FROM cl_abap_behavior_saver.
  PROTECTED SECTION.

    METHODS finalize REDEFINITION.

    METHODS check_before_save REDEFINITION.

    METHODS save REDEFINITION.

    METHODS cleanup REDEFINITION.

    METHODS cleanup_finalize REDEFINITION.

ENDCLASS.
(C) Brandeis Consulting📁

Interaktionsphase und Speichersequenz

Interaktionsphase

Änderungen nur im Transactional Buffer

  • Ändern
  • Anlegen
  • Löschen
  • Aktionen

Speichersequenz

Datenänderungen konsistent speichern

  • Finalize
  • Prüfungen
  • Speichern
  • Commit

SAP Dokumentation

(C) Brandeis Consulting📁

Integration: SAP LUW und RAP

  • RAP orientiert sich am klassischen SAP LUW, automatisiert jedoch viele Schritte:
    • Verteilte Steuerung: SAP LUW bleibt bestehen, aber RAP übernimmt die Transaktionslogik.
    • Consistency: RAP validiert und speichert Daten gemäß den SAP LUW-Prinzipien.
    • Flexibilität: Entwickler definieren Verhalten in der Behavior Implementation (z. B. Validierungen, Autorisierungen).
(C) Brandeis Consulting📁

RAP Business Object (BO)

Ein Business Object (BO) ist eine zusammenhängendes Geschäftsobjekt, die aus einer oder mehreren Entitäten besteht. Es besteht technisch aus den folgenden Komponenten:

Datenmodell (CDS Views)

Abbildung des BO Datenmodells auf die Datenbanktabellen.

Verhaltensdefinition (Behavior)

  • Nummernvergabe
  • Sperren
  • Aktionen
  • Validierungen
    ...

Implementierung - (ABAP Klassen)

Ausprogrammierung des Verhaltens, soweit das nicht generisch implementiert ist, z.B. im Managed Szenario

Das BO muss noch keine Oberflächeneigenschaften definieren.

(C) Brandeis Consulting📁

Business Object

Transaktionale RAP Anwendungen basieren auf einem sogenannten Business Object. Dieses besteht wiederum aus

  • Der Datenstruktur (CDS Root View Entity)
    • Kern des BO, definiert die Datenstruktur.
  • Der Verhaltensdefinition (Behavior)
    • Definiert das Verhalten des BO.

Service Definition und Service Binding sind nicht Bestandteil des Business Objects

(C) Brandeis Consulting📁

Entitäten

Die Basis für alle RAP Anwendungen bildet das Datenmodell. Es basiert auf DB-Tabellen, die durch CDS Views gekapselt und verknüpft werden.

Root-Entitäten

Bei Root-Entitäten handelt es sich um Objekte, die eigenständig existieren können. Beispielsweise Kunden, Aufträge oder Materialien. Sie bestehen häufig auch aus

Kind-Entitäten

Kind-Entitäten sind Bestandteil einer Root-Entität. Sie gehören als Teil dieser Entität fest dazu und können nicht ohne ihre Root-Entität existieren. Häufig haben Sie in den Datenbanktabellen den gleichen Teil-Schlüssel oder eine Fremdschlüsselbeziehung.
Beispiele:

  • Positionen zu Aufträgen
  • Adressen zu Kunden
(C) Brandeis Consulting📁

Business Object mit einer Entität

Im einfachsten Falle haben wir exakt eine Entität. Dieser CDS View wird dann als ROOT View angelegt. Dazu wird dann eine Verhaltensdefinition angelegt werden.

Das Mapping muss noch ergänzt werden. Es ist wichtig, damit die Felder des BO auf die Felder der DB-Tabelle abgebildet werden.

managed implementation in class zbp_i_jb3_projects unique;
strict;

define behavior for zi_jb3_projects //alias <alias_name>
persistent table ZBC_PROJECTS
lock master
authorization master ( instance )
//etag master <field_name>
{
  create;
  update;
  delete;
  mapping for zbc_projects
  {
    ProjectKey = project_key;
    Name = name;
    ProjectManager = project_manager;
    ChangedBy = changed_by;
    ChangedAt = changed_at;
    CreatedBy = created_by;
  }
}
(C) Brandeis Consulting📁

Mehrere Entitäten zu einem BO

Die BO Struktur wird mit CDS Views definiert. Die Datenstruktur von Business Objekten wird durch eine Root View Entity festgelegt.

  • COMPOSITION - Assoziation von Root zu den Teilobjekten des BOs. Die Kardinalität muss angegeben werden.
  • TO PARENT - Gegenrichtung: Assozation von Teil- zu Rootobjekt, die Kardinalität ist immer 1..1

Es gibt immer genau eine Behavior Definition pro Root-Objekt. Child Entities haben keine eigene Behavior.

(C) Brandeis Consulting📁

Schlüssel in einem BO

Es gibt zwei Optionen: Semantic Key oder GUID/UUID

Semantic Key

Der Semantic Key muss selber vergeben werden. Es besteht die Gefahr von Kollisionen mit bestehenden Datenbankeinträgen.

GUIDs

Die GUIDs sind global eindeutig. Darum eignen sie sich sehr gut als Schlüssel. Und vor allem für eine automatische Schlüsselvergabe. Versehentliche Kollisionen sind quasi ausgeschlossen. Aber für die Lesbarkeit ist es eine Katastrophe.

(C) Brandeis Consulting📁

Behvior Verhaltensdefinition (Behavior)

Im Behavior wird das Verhalten definiert:

  • Implementierungstyp Managed oder Unmanaged
  • Implementierungsklasse
  • Datenbanktabellen
  • Draftverhalten
  • Transaktionales Verhalten (Sperren, Berechtigungen, Nummervergabe)
  • Aktionen, Validierungen & Ableitungen
  • Feldeigenschaften
  • Feldmapping
(C) Brandeis Consulting📁

Feldeigenschaften

Die Feldeigenschaften werden innerhalb der Verhaltensdefinition vergeben. Die Notation dazu ist:
field ( <Feldeigenschaft> [,<Feldeigenschaft2>] ) <Feldliste>;

Liste der Feldeigenschaften

  • numbering:managed - Automatische Nummernvergabe von UUIDs
  • readonly - Nicht eingabebereit
  • readonly:update - Nur bei Anlage Eingabebereit, danach gesperrt
  • mandatory - Kennzeichnung auf der Oberfläche als Pflichtfeld. Eine Prüfung muss selber implementiert werden!
  • mandatory:create - Pflichtfeld für die Anlage eines Datensatzes. Prüfung durch das Framework
(C) Brandeis Consulting📁

Mapping der Felder

Zuordnung der Felder zwischen Business Object und Datenbanktabelle.

  mapping for zbc_tasks
  {
    TaskKey = task_key;
    Summary = summary;
    Status  = status;
    Project = project;
  }

Mit dem Zusatz CORRESPONDING werden gleichlautende Felder automatisch gemappt:

  mapping for zbc_tasks corresponding
  {
    TaskKey = task_key;
  }
(C) Brandeis Consulting📁

Sperren

Im RAP gibt es die folgenden Konzepte gegen gleichzeitige Bearbeitung.

Pessimistischer Sperre

Kurzfristige, exklusive Sperre, während das BO auf dem Server geändert wird. Vor der Änderung wird die Sperre gesetzt und erst danach zurückgegeben. Damit werden alle Konflikte vermieden.

Nicht für Fiori Anwendungen!

Optimistische Sperre

Eigentlich keine echte Sperre. Beim Schreiben wird geprüft, ob sich die Version seit dem Anfang des Bearbeitens verändert hat. Also lediglich eine Erkennung von veralteten Daten. Für diese Erkennung wird das ETag-Feld verwendet. Typischer Kandidat als ETag-Feld: der letzte Änderungszeitstempel.

Sperren beim Draft Handling

Bei Draft Handling wird die Entwurfsversion zusammen mit Zeitstempel und Bearbeiter in der Draft-Tabelle abgespeichert. Dieser Tabelleneintrag wirkt wie eine exklusive Sperre für Fiori Anwendungen. Allerdings verfällt die Sperre nach einer gewissen Zeit. Danach greift aber ggf. noch die optimistische Sperre, um Lost-Update-Situationen zu vermeiden.

(C) Brandeis Consulting📁

Nummernvergabe

  • Manuelle Nummernvergabe über die Dateneingabe. Validierung beim Speichern auf Schlüsselfelder.
  • Automatische Nummernvergabe mit UUIDs - keine Implementierung notwendig
  • Selbst programmierte Nummernvergabe:
    • EARLY NUMBERING - mplementierung der frühen Nummernvergabe im Code erfolgt vor der Darstellung des neuen Datensatzes auf der Oberfläche
    • LATE NUMBERING - Späte Nummernvergabe kurz vor dem Commit des Datensatzes. Damit kann man z.B. fortlaufende, lückenlose Nummern für Belege erzeugen.
(C) Brandeis Consulting📁

Automatische Nummernvergabe

Falls als Primärschlüssel UUIDs verwendet werden, kann die Nummernvergabe vollautomatisch (managed) erfolgen. Es muss nichts implementiert werden.

Die folgenden Dinge müssen in der Verhaltensdefinition festgelegt sein:

Im Kopf der Verhaltensdefinition

define behavior for <My_CDS_View>
early numbering
...
{
    field ( numbering : managed ) <Feldname>;
}
(C) Brandeis Consulting📁