ABAP RAP

Fortgeschrittene Modellierung

(C) Brandeis Consulting📁

Scpope

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

  • Validierungen
  • Ableitungen
  • Actions
  • Nummernvergabe
  • Draft Verarbeitung
  • Dynamische Features
(C) Brandeis Consulting📁

Zusammenspiel von Behavior und Implementation

Nach dem etwas im Behavior definiert wurde, kann man sich die zugehörigen Methoden per Quick-Assist in die Implementierung generieren lassen:

(C) Brandeis Consulting📁

Aktionen

Es können eigenen Aktionen hinzugefügt werden. Dazu muss man alle Objekte anpassen

  • Behavior - Aktion definieren
  • Implementierung - Aktion ausprogrammieren
  • CDS - Aktion auf der Oberfläche sichtbar machen

Arten von Aktionen

Unterscheidung zwischen

  • Aktionen - Ändern die Daten
  • Factory Aktionen erzeugen Instanzen
  • Funktionen - nur lesender Zugriff auf die Daten

Maximal eine Struktur als Importing Parameter und als Returning Parameter. Es können auch Objekte übergeben werden.

(C) Brandeis Consulting📁

Aktion Stornieren - Cancel Tasks

Anforderung: In der Liste sollen mehrere Aufgaben markiert werden und mit einer Aktion storniert werden können.

(C) Brandeis Consulting📁

Aktion Stornieren - Behavior

Die Aktion CANCEL ist ohne Parameter und Rückgabe. Also einfach hinschreiben: action cancel;

projection implementation in class zbp_c_tasks unique;
strict ( 2 );

define behavior for zc_tasks //alias <alias_name>
{
  use create;
  use update;
  use delete;

  use action copy;
  use action close;
  action cancel ;

  field ( readonly ) Author,
                     ChangedAt,
                     CreatedAt;
(C) Brandeis Consulting📁

EML

Die EML ist Bestandteil der ABAP Programmiersprache. Sie bezieht sich auf den Transaktionspuffer.

  • Definition:
    • Entity Manipulation Language (EML) ist eine deklarative Sprache, die in SAP verwendet wird, um auf Entitäten (Business Objects) im ABAP RESTful Application Programming Model (RAP) zuzugreifen und diese zu manipulieren.
    • EML ermöglicht das Erstellen, Bearbeiten und Löschen von Entitäten auf eine vereinfachte und strukturierte Weise.
    • Die EML ist vergleichbar mit der DML von SQL.
  • Einsatzgebiet:
    • Wird in der Definition von Business Object Behavior und zur Verwaltung von Entitäten und deren Zustand in RAP verwendet.
(C) Brandeis Consulting📁

Aktion Stornieren - Implementierung

Hinweise

  • IN LOCAL MODE umgeht die Berechtigungsprüfungen
  • Durch die FOR Schleife können auch mehrere Instanzen storniert werden.
  • Beachte das UPDATE FIELDS( status ) - Nur dieses Feld soll aktualisiert werden.
  • Das Schlüsselwort VALUE steht hier für den entsprechenden Konstruktor-Operator. Die Interne Tabelle in der WITH Klausel kann man auch anders konstruieren.

Implementierung

CLASS lhc_zc_tasks IMPLEMENTATION.

  METHOD cancel.
    MODIFY ENTITIES OF zc_tasks IN LOCAL MODE
      ENTITY zc_tasks
     UPDATE FIELDS ( status )
     WITH VALUE #( FOR key IN keys ( %tky = key-%tky
                                     status = 'CANCELED' ) ).


  ENDMETHOD.

ENDCLASS.
(C) Brandeis Consulting📁

Aktion Stornieren - CDS

Die Aktion ist erst dann sichtbar, wenn sie auch im CDS annotiert wird:

      @UI.lineItem:[ { position: 10 },
                     { type: #FOR_ACTION, 
                       dataAction : 'cancel', 
                       label: 'Cancel Tasks' } ]

Da die Annotation wird bei irgend einem Feld (z.B. dem ersten) mit hinzugefügt.

(C) Brandeis Consulting📁

Validations

Prüfung der Eingaben zum Zeitpunkt des Speicherns (save).

Definition im Behavior

  validation validateProjectManager on save { create; 
                                              update; 
                                              field ProjectManager ;}

Implementierung mit ABAP

  METHOD validateassignee.

    SELECT DISTINCT status
      FROM zbc_status_text
      INTO TABLE @DATA(status_texts).

    READ ENTITIES OF zi_jb5_tasks IN LOCAL MODE
      ENTITY zi_jb5_tasks
        FIELDS ( assignee ) "the field to validate
        WITH CORRESPONDING #( keys )
      RESULT DATA(tasks).


    LOOP AT tasks INTO DATA(task) .
      IF NOT line_exists( status_texts[ status = task-status ] ).


        APPEND VALUE #( %tky = task-%tky ) TO failed-zi_jb5_tasks.

        APPEND VALUE #( %tky = task-%tky
                        %msg = NEW zbc_rap_message( 
                           msgv1 = |Status "{ task-status }" invalid|
                           textid = zbc_rap_message=>validation_failed
                           severity = if_abap_behv_message=>severity-error )
                        %element-status = if_abap_behv=>mk-on
                      ) TO reported-zi_jb5_tasks.


      ENDIF.
    ENDLOOP.
  ENDMETHOD.
(C) Brandeis Consulting📁

Messages

Bei Validierungen und an anderen Stellen können Situationen entstehen, in denen wir dem Nutzer etwas mitteilen möchten. Dazu wird das Interface if_abap_behv_message verwendet.

In der SAP Dokumentation ist eine Schritt-für-Schritt Anleitung zum Anlegen der zugehörigen ABAP Klassen.

Es können T100 Meldungen verwendet werden.

(C) Brandeis Consulting📁

Aufbau von Messages

Video zu Messages
new_message_with_text

APPEND VALUE #(  %tky = key-%tky ) TO failed-travel.
      APPEND VALUE #(  %tky                 = key-%tky
                       %state_area          = 'sampleValidation'
                        %msg              = new_message_with_text( 
                              text     = 'ein Text'
                              severity  = if_abap_behv_message=>severity-error )
                       %element-sample_field  = if_abap_behv=>mk-on ) TO reported-travel.
  ENDMETHOD.

new_message

APPEND VALUE #(  %tky = key-%tky ) TO failed-travel.
      APPEND VALUE #(  %tky                 = key-%tky
                       %state_area          = 'sampleValidation'
                        %msg              = new_message( 
														id = 'bla'
														number = '123'
														v1 = |Der Wert { <bla>-blub } ist falsch|
														severity = if_abap_behv_message=>severity-error
                                                    )
                       %element-sample_field  = if_abap_behv=>mk-on ) TO reported-travel.
  ENDMETHOD.
(C) Brandeis Consulting📁

Determinations - Ableitungen

Feldwerte werden berechnet.
Zeitpunkte:

  • ON MODIFY - Nach der Änderung
  • ON SAVE - Beim Speichern

Definition im Behavior

  determination fillChangeFields on modify { create; }

Implementierung mit ABAP

METHOD fillChangeFields.

    MODIFY ENTITIES OF zi_jb6_tasks  IN LOCAL MODE
      ENTITY zi_jb6_tasks
        EXECUTE doSomething
        FROM CORRESPONDING #( keys ).

  ENDMETHOD.
(C) Brandeis Consulting📁

Feature Control

Alle Eigenschaften in der Behavior Definition können dynamisch gesteuert werden. Beispielsweise die Verfügbarkeit von Aktionen.

Definition im Behavior

Dazu muss zunächst in der Behavior die Aktion als Kontrolliert gekennzeichnet werden:

action (features: instance) cancel result [1] $self;

Implementierung mit ABAP

Und dann erfolgt die Entscheidung, ob das Feature angezeigt wird oder nicht in der Implementierung des Behavior Handlers im ABAP.

METHOD get_features. 


ENDMETHOD. 
(C) Brandeis Consulting📁

Custom CDS Entities - Wrapper um eine ABAP Klasse

Im ABAP implementierte CDS Entities.

  • Interface IF_RAP_QUERY_PROVIDER
  METHODS select IMPORTING io_request  TYPE REF TO if_rap_query_request
						io_response TYPE REF TO if_rap_query_response
                 RAISING   cx_rap_query_provider
(C) Brandeis Consulting📁

Virtual Elements - Im ABAP ermittelte Felder

Read-Only Felder, die im ABAP per Klasse gefüllt werden.

Im CDS View

@ObjectModel.virtualElement: true
@ObjectModel.virtualElementCalculatedBy: 'ABAP:ZCL_BC_VIRTUAL_ELE'
'' as VirtualFieldName,

In der ABAP Klasse

ZCL_BC_VIRTUAL_ELE

INTERFACES: if_sadl_exit_calc_element_read.

Optional: Methode GET_CALCULATION_INFO vor dem SELECT

Falls für Berechnungen andere Felder benötigt werden, kann man in GET_CALCULATION_INFO die Liste der Felder zurückgegeben. Diese werden dann aus der DB-Tabelle selektiert.

(C) Brandeis Consulting📁

Entwurfsmodus - DRAFT

Im DRAFT Modus wird ein Objekt permanent abgespeichert. D.h. man kann die Bearbeitung in der Weboberfläche auch unterbrechen, ohne dass die eingegebenen Informationen verloren gehen. Über eine spezielle Suche kann man die Objekte im Entwurfsmodus dann wieder anzeigen.

Draft Tabelle

Die Draft Tabelle besteht aus den Feldern der eigentlichen Datenbanktabelle plus die Felder der Struktur sych_bdl_draft_admin_inc (INCLUDE). Sie hat den auch den gleichen Schlüssel.
Daraus ergibt sich, dass jede BO-Instanz maximal eine Version im Entwurfsmodus haben kann.

Beispiel für DRAFT

Der RAP Generator erzeugt die Objekte immer vollständig mit Draft.

(C) Brandeis Consulting📁

Nummernvergabe - Übersicht

Optionen für die Nummernvergabe

  • Manuelle Nummernvergabe über die Dateneingabe. Validierung beim Speichern auf Schlüsselfelder.
  • Automatische Nummernvergabe mit UUIDs - keine Implementierung notwendig
  • Selbst programmierte Nummernvergabe:
    • EARLY NUMBERING - Vor der Darstellung des neuen Datensatzes auf der Oberfläche
    • LATE NUMBERING - Späte Nummernvergabe kurz vor dem Speichern des Datensatzes
(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📁

Programmierte Nummernvergabe

Frühe Nummernvergabe

  • Im Kopf der Verhaltensdefinition: early numbering
  • Implementierung der Methode FOR_NUMBERING der Handlerklasse
(C) Brandeis Consulting📁

Späte Nummervergabe - Ab 2021

Anforderung: Anhand des ausgewählten Projektes soll ein Schlüssel erzeugt werden. Dieser besteht aus

  • dem Schlüssel des Projektes
  • einem Bindestrich und
  • einer innerhalb dieses Projektes fortlaufenden Nummer

Beispiel

Der Benutzer wählt das Projekt BW4 aus. Die höchste bislang vergebene Aufgabennummer für dieses Projekt ist BW4-815. Die nächste Nummer ist also die BW4-816.

Was zu tun ist

  • Behavior Definition anpassen
  • Implementierung der Methode ADJUST_NUMBERS
(C) Brandeis Consulting📁

Späte Nummernvergabe - Behavior Definition

  • late numbering einstellen
  • Feld Projekt ist Pflichtfeld für die Anlage
  • Feld TaskKey ist gegen Eingab gesperrt
managed implementation in class zbp_i_tasks unique;
strict ( 2 );

define behavior for zi_tasks 
late numbering                           //<===
persistent table zbc_tasks
lock master
authorization master ( instance )
{
  create;
  update;
  delete;
  association _Comments { create; }
  field ( readonly ) TaskKey;            //<===
  field ( mandatory : create ) Project;  //<===
  field ( mandatory ) Summary;
  mapping for zbc_tasks
(C) Brandeis Consulting📁

Späte Nummernvergab - Implementierung

  • Im Changing-Parameter MAPPED stehen die %PID der Instanzen, die einen neuen Schlüssel bekommen sollen.
  • Da die Methode auch beim Update-Speichern ohne Neuanlage durchlaufen wird, ist die Logik im LOOP implementiert. Wenn MAPPED-ZI_TASKS leer ist, dann passiert auch nichts.
  • Der neue Schlüssel wird mit der %PID an die Tabelle MAPPED-ZI_TASKS angehängt.
  • Die WHERE-Bedingung im LOOP stellt sicher, dass es keine Endlosschleife gibt.
  METHOD adjust_numbers.
    LOOP AT mapped-zi_tasks INTO DATA(ls_task)
      where %key-taskkey is initial.

      READ ENTITY IN LOCAL MODE zi_tasks
        ALL FIELDS
        WITH VALUE #( ( %pid = ls_task-%pid ) )
        RESULT DATA(result).

      DATA(project) = result[ 1 ]-project.

      SELECT  SINGLE MAX(
                   CAST( right( task_key,
                                length( task_key ) 
                                - instr( task_key, '-' ) )
                            AS INT4 ) ) AS max_key
        FROM zbc_tasks
        WHERE project = @project
        INTO @DATA(max_key).

      DATA(nextKey) = |{ project }-{ max_key + 1 }|.

      APPEND VALUE #( %key-taskkey = nextKey
                      %pid = ls_task-%pid ) 
                TO mapped-zi_tasks.
    ENDLOOP.
  ENDMETHOD.
(C) Brandeis Consulting📁