Erste Schritte
Grundlegende Methoden und Konzepte anwenden
Mit lokalen Klassen arbeiten
Daten aus der Datenbank lesen
Mit strukturierten Datenobjekten arbeiten
Mit komplexen internen Tabellen arbeiten
Datenbankänderungen mit Business Objects implementieren
Das ABAP-RESTful-Anwendungsprogrammiermodell beschreiben

Verwendung der Entity Manipulation Language

Objective

After completing this lesson, you will be able to implementieren Sie eine EML-Anweisung.

Entity Manipulation Language (EML)

EML besteht aus Anweisungen, mit denen Sie die Daten eines Business-Objekts manipulieren können. Zum Lesen von Daten verwenden Sie die Anweisung READ ENTITIES; für alle anderen Operationen verwenden Sie die MODIFY ENTITIES -Anweisung mit dem entsprechenden Zusatz UPDATE, CREATE oder DELETE.

Notiz

Sie können die Operationen CREATE, UPDATE und DELETE nur verwenden, wenn die Verhaltensdefinition des Business-Objekt-Interface die entsprechende use create, use update oder use delete -Direktive enthält. Der Versuch, eine verbotene Operation zu verwenden, verursacht einen Syntaxfehler.

Um Daten aus einem Business-Objekt zu lesen, verwenden Sie die Anweisung READ ENTITIES. Die Anweisung hat zwei wichtige Parameter: eine interne Tabelle mit den Schlüsseln der Daten, die Sie lesen möchten, und eine weitere Tabelle, die die Ergebnisse der Query enthält.

Diese internen Tabellen haben spezielle Datentypen, die als abgeleitete Verhaltensdefinitionstypen bezeichnet werden. Das System legt sie automatisch an, wenn ein Entwickler eine Verhaltensdefinition anlegt, und sie enthalten einige oder alle Felder des Business-Objekts zusammen mit weiteren Feldern, die steuern, wie das System eine bestimmte Anforderung verarbeitet. Sie deklarieren die internen Tabellen mit dem neuen Zusatz TYPE TABLE FOR <operation> in der DATA-Anweisung.

Der Typ TABLE FOR READ IMPORT enthält das oder die Schlüsselfelder des Business-Objekts. Die %control -Struktur ist eine generierte Struktur, die angibt, welche Felder des Business-Objekts tatsächlich in der aktuellen Operation verwendet werden. In unserem Beispiel füllt das System die Struktur automatisch und Sie müssen sich nicht darum kümmern.

Der TypTABLE FOR READ RESULT enthält alle Felder des Business-Objekts. Diese Tabelle enthält die Ergebnismenge nach Ausführung der Leseanweisung.

Die gelesene Importtabelle enthält eine Spalte für jedes Schlüsselfeld des Business-Objekts, in diesem Fall agencyID. Um eine bestimmte Agentur zu lesen, fügen Sie der internen Tabelle eine Zeile mit ihrem Schlüssel hinzu. Neben dem oder den Schlüsselfeldern enthält die Tabelle die Spalten %is_draft und %control. Mit %is_draft können Sie angeben, ob Sie Entwurfsdaten oder aktive Daten lesen möchten. Mit der %control -Struktur wird angegeben, welche Felder gelesen werden sollen.

Notiz

In unserem Beispiel lesen wir nur aktive Daten, und die %control -Struktur wird vom Framework gefüllt, basierend auf der Feldliste nach dem Zusatz FIELDS.

Wenn Sie ein Business-Objekt mit der Anweisung READ ENTITIES OF oder MODIFY ENTITIES OF bearbeiten, müssen Sie zuerst den Namen der Verhaltensdefinition angeben. Darauf folgt das Schlüsselwort ENTITY und der Name der Entität, mit der Sie arbeiten möchten. Wenn die Entität einen Aliasnamen hat, sollten Sie ihn hier verwenden.

Notiz

Der Aliasname kann nicht hinter dem Zusatz OF verwendet werden. Dies liegt daran, dass Sie an dieser Stelle technisch nicht den Namen der Entität, sondern den Namen der Verhaltensdefinition angeben.

Die READ ENTITIES -Anweisung liest Business-Objekt-Daten gemäß den Schlüsseln, die Sie im WITH -Zusatz übergeben. Sie gibt das Ergebnis im Zusatz RESULT in der internen Tabelle zurück. In der -Anweisung können Sie auch angeben, welche Felder des Business-Objekts Sie benötigen. In diesem Beispiel haben wir den Zusatz ALL FIELDS verwendet, um alle Felder zurückzugeben. Wenn Sie jedoch nur eine Teilmenge der Felder benötigen, können Sie die Variante FIELDS ( field1field2 … ) verwenden, um die Menge der gelesenen Daten einzuschränken.

Notiz

Anders als bei einer SELECT -Anweisung ist die Feldliste nicht kommasepariert.

Die Ergebnistabelle enthält alle Felder des Business-Objekts zusammen mit dem Steuerungsfeld %is_draft. Wenn Ihre READ ENTITIES -Anweisung die Variante ALL FIELDS enthält, stellt das System die Werte aller Felder bereit. Wenn Sie die Variante FIELDS ( f1fn ) verwenden, werden nur die Felder gefüllt, die Sie angefordert haben.

Notiz

Schlüsselfelder werden immer gefüllt, auch wenn sie nicht in der Variante FIELDS ( f1fn ) angegeben sind.

Wenn Sie Daten aktualisieren möchten, deklarieren Sie eine interne Tabelle mit TYPE TABLE FOR UPDATE. Diese enthält alle Felder des Business-Objekts sowie die %control -Struktur. In unserer Variante der MODIFY ENTITIES -Anweisung wird die %control -Struktur automatisch gefüllt.

Die MODIFY ENTITIES -Anweisung aktualisiert Daten im Transaktionspuffer. Im Zusatz FIELDS legen Sie fest, welche Felder geändert werden sollen. Im Zusatz WITH übergeben Sie die interne Tabelle mit den Daten, die Sie aktualisieren möchten.

Wenn Sie EML außerhalb des Business-Objekts verwenden, müssen Sie die Anweisung COMMIT ENTITIES verwenden, um die Sicherungssequenz auszulösen und die Daten in der Datenbank zu persistieren.

Notiz

Später in diesem Kurs verwenden wir EML in der Verhaltensimplementierung des Business-Objekts. Innerhalb der Verhaltensimplementierung ist es weder erforderlich noch zulässig, den Commit mit COMMIT ENTITIES auszulösen.

Implementieren einer EML-Anweisung

Daten über EML modifizieren

In dieser Übung verwenden Sie EML, um die Standardoperation update für die Wurzelentität des Business-Objekts /DMO/R_AGENCYTP durchzuführen. Um spätere Inkonsistenzen zu vermeiden, greifen Sie nicht direkt auf das Business-Objekt zu, sondern über die freigegebene stabile Schnittstelle /DMO/I_AGENCYTP.

Vorlage:

  • keine

Lösung:

  • /LRN/CL_S4D400_BOS_EML (globale Klasse)

Aufgabe 1: Aktuelle Daten analysieren

Verwenden Sie das Tool Data Preview, um den aktuellen Namen des Reisebüros mit der ID „0700##" zu prüfen, wobei ## für Ihre Gruppennummer steht.

Schritte

  1. Öffnen Sie die Definition der CDS-View-Entität /DMO/I_AgencyTP.

    1. Wenn Sie die Datendefinition /DMO/I_AGENCYTP aus der vorherigen Übung noch geöffnet haben, wechseln Sie zur entsprechenden Registerkarte. Drücken Sie andernfalls Strg + Umschalt + A, um das ABAP-Entwicklungsobjekt zu öffnen.

  2. Öffnen Sie das Tool Datenvorschau.

    1. Klicken Sie mit der rechten Maustaste auf eine beliebige Stelle im Quelltext, um das Kontextmenü zu öffnen.

    2. Wählen Sie im Kontextmenü Open WithData Preview.

  3. Prüfen Sie den aktuellen Namen des Reisebüros mit der ID „0700##", wobei ## für Ihre Gruppennummer steht.

    1. Blättern Sie nach unten zum Eintrag mit dem Wert „0700##" in der Spalte AgencyID, und notieren Sie sich den Wert in der Spalte Name.

Aufgabe 2: Globale Klasse anlegen

Legen Sie in Ihrem eigenen Paket eine neue ABAP-Klasse an.

Schritte

  1. Legen Sie eine neue ABAP-Klasse mit dem Namen ZCL_##_EML an, wobei ## für Ihre Gruppennummer steht. Stellen Sie sicher, dass die Klasse das Interface IF_OO_ADT_CLASSRUN implementiert.

    1. Wählen Sie FileNewABAP Class.

    2. Geben Sie den Namen Ihres Pakets in das Feld Package ein. Geben Sie im Feld Name den Namen ZCL_##_EML ein, wobei ## für Ihre Gruppennummer steht. Geben Sie eine Beschreibung ein.

    3. Wählen Sie im Gruppenrahmen Interfaces die Option Add.

    4. Geben Sie IF_OO_ADT_CLASSRUN ein. Wenn das Interface in der Trefferliste angezeigt wird, fügen Sie es mit Doppelklick zur Klassendefinition hinzu.

    5. Wählen Sie Next.

    6. Wählen Sie Ihren Transportauftrag aus, und wählen Sie Finish.

Aufgabe 3: Daten aktualisieren

Implementieren Sie eine EML-Anweisung, um den Namen des Reisebüros mit der ID „0700##" (## steht für Ihre Gruppennummer) zu ändern.

Schritte

  1. Deklarieren Sie in der Methode IF_OO_ADT_CLASSRUN~MAIN eine interne Tabelle mit dem korrekten abgeleiteten Typ für eine EML-Aktualisierung der Entität /DMO/I_AgencyTP (Namensvorschlag: agencies_upd).

    1. Fügen Sie folgenden Code hinzu:

      Code Snippet
      123
      DATA agencies_upd TYPE TABLE FOR UPDATE /DMO/I_AgencyTP.
  2. Füllen Sie die interne Tabelle mit einer einzelnen Zeile mit „0700##" als Wert für die Spalte AGENCYID (wobei ## für Ihre Gruppennummer steht) und einem beliebigen neuen Wert für die Spalte NAME.

    1. Fügen Sie nach der Datendeklaration einen Quelltext hinzu, der dem folgenden Code ähnelt:

      Code Snippet
      123
      agencies_upd = VALUE #( ( agencyid = '0700##' name = 'Some fancy new name' ) ).
  3. Implementieren Sie die EML-Anweisung MODIFY ENTITIES für das Business-Objekt-Interface /DMO/I_AgencyTP. Aktualisieren Sie die Daten der Wurzelentität, um sicherzustellen, dass nur das Feld NAME geändert wird.

    Hinweis

    Beachten Sie, dass das Interface-Verhalten den Aliasnamen /DMO/Agency für die Wurzelentität /DMO/I_AgencyTP definiert.
    1. Fügen Sie am Ende der Methode den folgenden Code hinzu:

      Code Snippet
      123456
      MODIFY ENTITIES OF /dmo/i_agencytp ENTITY /dmo/agency UPDATE FIELDS ( name ) WITH agencies_upd.
  4. Um ein sichtbares Ergebnis aus der Anwendung zu erhalten, schreiben Sie mit der Methode out->write ein Textliteral in die Konsole.

    1. Geben Sie nach der MODIFY ENTITIES-Anweisung folgenden Quelltext ein:

      Code Snippet
      123
      out->write( `Method execution finished!` ).
  5. Aktivieren und testen Sie die Klasse.

    1. Drücken Sie Strg + F3, um die Klasse zu aktivieren.

    2. Drücken Sie F9, um die Klasse auszuführen.

  6. Prüfen Sie, ob der neue Name auf die Datenbank geschrieben wurde.

    1. Kehren Sie zur Datenvorschau für die CDS-View-Entität /DMO/I_AgencyTP zurück.

    2. Wählen Sie in der Symbolleiste der Registerkarte Datenvorschau die Option Aktualisieren.

  7. Fügen Sie Ihrem Quelltext die Anweisung COMMIT ENTITIES hinzu, um die Änderungen zu bestätigen.

    1. Kehren Sie zur Methode IF_OO_ADT_CLASSRUN~MAIN in Ihrer globalen Klasse ZCL_##_EML zurück.

    2. Passen Sie den Quelltext wie folgt an:

      Code Snippet
      123456789101112131415161718
      METHOD if_oo_adt_classrun~main. DATA agencies_upd TYPE TABLE FOR UPDATE /dmo/i_agencytp. agencies_upd = VALUE #( ( agencyid = '0700##' name = 'Some fancy new name' ) ). MODIFY ENTITIES OF /dmo/i_agencytp ENTITY /dmo/agency UPDATE FIELDS ( name ) WITH agencies_upd. COMMIT ENTITIES. out->write( `Method execution finished!` ). ENDMETHOD.
  8. Aktivieren und testen Sie die Klasse erneut. Bestätigen Sie, dass die Änderungen nun in der Datenbank vorhanden sind.

    1. Drücken Sie Strg + F3, um die Klasse zu aktivieren.

    2. Drücken Sie F9, um die Klasse auszuführen.

    3. Kehren Sie zur Datenvorschau für die CDS-View-Entität /DMO/I_AgencyTP zurück.

    4. Wählen Sie in der Symbolleiste der Registerkarte Datenvorschau die Option Aktualisieren.