Ansicht
Dokumentation

ABAPMODIFY_SOURCE - MODIFY SOURCE

ABAPMODIFY_SOURCE - MODIFY SOURCE

PERFORM Short Reference   BAL_S_LOG - Application Log: Log header data  
Diese Dokumentation steht unter dem Copyright der SAP AG.
SAP E-Book

MODIFY dbtab, source

Kurzreferenz



...  @wa$|@( expr )
  $| ${ TABLE @itab$|@( expr ) $}
    ( SELECT subquery_clauses $[UNION$|INTERSECT$|EXCEPT ...$] ) ...


Alternativen:

1. ... @wa$|@( expr )

2. ... TABLE @itab$|@( expr )

3. ... ( SELECT subquery_clauses $[UNION$|INTERSECT$|EXCEPT ...$] ) ...

Wirkung

Hinter FROM in der Anweisung MODIFY können ein nicht-tabellenartiges Datenobjekt wa, hinter TABLE eine interne Tabelle oder eine eingeklammerte Subquery angegeben werden. Der Arbeitsbereich und die interne Tabelle können als Hostvariable oder Hostausdruck angegeben werden. Der Inhalt der Datenobjekte bzw. die Ergebnismenge der Subquery bestimmt zum einen, ob die Zeile(n) eingefügt oder geändert werden, und zum anderen, welche Werte eingefügt bzw. zum Ändern verwendet werden.

Hinweis

Die Angabe von Hostvariablen ohne Fluchtsymbol @ ist obsolet. In den strikten Modi der Syntaxprüfung ab Release muss das Fluchtsymbol @ angegeben werden.

Alternative 1

... @wa$|@( expr )


Wirkung

Bei Angabe eines nicht-tabellenartigen Arbeitsbereichs als Hostvariable @wa oder Hostausdruck @( expr ), der die Voraussetzungen für die Verwendung in -Anweisungen erfüllt, wird in der DDIC-Datenbanktabelle bzw. View eine Zeile durchsucht, die im Primärschlüssel den gleichen Inhalt wie das entsprechende Anfangsstück des Arbeitsbereichs hat.

  • Wird eine solche Zeile gefunden, wird diese Zeile nach den gleichen Regeln wie bei der Anweisung UPDATE überschrieben.
  • Wird keine solche Zeile gefunden, wird eine neue Zeile nach den gleichen Regeln wie bei der Anweisung INSERT eingefügt.

Wenn die Änderung zu einem doppelten Eintrag in einem eindeutigen Sekundärindex führen würde, wird sie nicht ausgeführt und sy-subrc auf 4 gesetzt.

Auf Views, bei denen alle Felder Schlüsselfelder sind, sollte nicht schreibend mit MODIFY FROM zugegriffen werden. Für DDIC-Datenbank-Views führt dies zu einer Warnung von der Syntaxprüfung, für Projektions-Views zu einem Syntax- oder Laufzeitfehler.

Hinweise

  • Der Arbeitsbereich wa sollte immer mit Bezug auf die DDIC-Datenbanktabelle bzw. den View im ABAP Dictionary deklariert werden. Für die Ableitung von LOB-Handle-Strukturen gibt es spezielle Zusätze zu den Anweisungen TYPES und $[CLASS-$]DATA.
  • Auch bei kompatiblen Arbeitsbereichen kann es zu Ausnahmen wegen ungültiger Werte kommen. Beispielsweise können Komponenten der Typen d und t ungültige Datums- und Zeitangaben enthalten, die nicht von Spalten der Typen DATN und TIMN akzeptiert werden.
  • Bei statischer Angabe der DDIC-Datenbanktabelle bzw. DDIC-View ist außerhalb von Klassen noch eine Kurzform möglich, bei der die Angabe des Arbeitsbereichs mit FROM wa weggelassen werden kann, falls mit der Anweisung TABLES ein Tabellenarbeitsbereich dbtab für die entsprechende DDIC-Datenbanktabelle bzw. DDIC-View deklariert ist. Das System ergänzt die MODIFY-Anweisung dann implizit um den Zusatz FROM dbtab.

Beispiel

Anlegen oder Ändern einer Nachricht in der DDIC-Datenbanktabelle T100. Falls es die Nachricht der Nummer 100 in der Nachrichtenklasse MYMSGCLASS in der Sprache Englisch noch nicht gibt, wird sie angelegt. Ansonsten wird nur der Text geändert.

Beispiel

Gleiches Beispiel wie zuvor, aber mit Hostausdruck.

Alternative 2

... TABLE @itab$|@( expr )


Wirkung

Bei Angabe einer internen Tabelle als Hostvariable @itab oder Hostausdruck @( expr ) werden deren Zeilen zum Überschreiben von vorhandenen Zeilen bzw. zum Einfügen neuer Zeilen ausgewertet. Der Zeilentyp der internen Tabelle muss die Voraussetzungen für die Verwendung in-Anweisungen erfüllen.

Das Verhalten ist plattformabhängig und folgt je nach Datenbanksystem einem der folgenden Muster:

  • UPDATE mit folgendem INSERT:
  • Zuerst wird für alle Zeilen der internen Tabelle die gleiche Funktion wie bei UPDATE FROM TABLE durchgeführt.

In Abhängigkeit vom Datenbanksystem kann die Verarbeitung der Zeilen der internen Tabelle dabei auch in Blöcke aufgeteilt werden.
  • Zeilenweises MODIFY
In einer Schleife wird jede Zeile der internen Tabelle gemäß obiger Regel für MODIFY ... FROM wa bearbeitet. Dabei hängt es vom Datenbanksystem ab, ob die Verarbeitung fortgesetzt wird, nachdem eine Zeile aufgrund eines eindeutigen Sekundärindex nicht eingefügt werden konnte.

Die beiden plattformabhängigen Verarbeitungen können zu unterschiedlichen Ergebnissen führen, wenn die DDIC-Datenbanktabelle eindeutige Sekundärindizes hat (siehe ausführbares Beispiel).

Falls die Änderung für eine Zeile der internen Tabelle zu einem doppelten Eintrag in einem eindeutigen Sekundärindex führen würde, wird die entsprechende Zeile nicht eingefügt und sy-subrc auf 4 gesetzt. Falls die interne Tabelle leer ist, werden keine Zeilen bearbeitet, sy-subrc wird aber dennoch auf 0 gesetzt. Das Systemfeld sy-dbcnt wird immer auf die Anzahl der tatsächlich bearbeiteten Zeilen gesetzt.

Hinweise

  • Um plattformabhängiges Verhalten zu verhindern sollte MODIFY ... FROM itab nur auf DDIC-Datenbanktabellen ohne eindeutigen Sekundärindex angewendet werden. Ansonsten muss das gewünschte Verhalten explizit mit UPDATE und INSERT bzw. mit LOOP AT itab und MODIFY programmiert werden.
  • Bei der Angabe einer internen Tabelle können zwar Lokatoren als Quelle dienen, es können aber keine Schreibströme erzeugt werden.

Beispiel

Anlegen oder Ändern mehrerer Zeilen in der DDIC-Datenbanktabelle DEMO_UPDATE. Diese DDIC-Datenbanktabelle hat keinen eindeutigen Sekundärindex und das Ergebnis ist deshalb nicht plattformabhängig.

Beispiel

Gleiches Beispiel wie zuvor, aber mit Hostausdruck.

MODIFY FROM TABLE

Alternative 3

... ( SELECT subquery_clauses $[UNION$|INTERSECT$|EXCEPT ...$] ) ...


Wirkung

Bei Angabe einer eingeklammerten Subquery werden die Zeilen der durch subquery_clauses definierten Ergebnismenge zum Überschreiben von vorhandenen Zeilen bzw. zum Einfügen neuer Zeilen ausgewertet. Um die Ergebnismengen mehrerer Subqueries zu kombinieren, können die Sprachelemente UNION, INTERSECT und EXCEPT verwendet werden. Dabei gelten spezielle Regeln query_clauses für die Angabe der Klauseln.

Das Verhalten der Anweisung MODIFY mit einer Subquery ist wie oben bei Angabe einer internen Tabelle plattformabhängig und folgt einem der beiden datenbankabhängigen Muster:

  • UPDATE mit folgendem INSERT
  • Zeilenweises MODIFY

Bezüglich

  • Mandantenbehandlung
  • Einfügen oder Ändern der Daten in der DDIC-Datenbanktabelle bzw. View und
  • Behandlung von Null-Werten

gelten die gleichen Regeln und Hinweise wie bei Verwendung einer Subquery als Datenquelle der Anweisung INSERT. Insbesondere kann ein Subquery nicht verwendet werden, wenn für die zu modifizierende Tabelle die Protokollierung eingeschaltet ist.

Wenn die Ergebnismenge der Subquery leer ist, werden keine Zeilen bearbeitet und sy-subrc wird auf 4 gesetzt.

Eine Subquery in der Anweisung MODIFY wird nicht von allen Datenbanken unterstützt. Deshalb kommt es zu einer durch das Pragma ##db_feature_mode[modify_from_select] ausblendbaren Syntaxwarnung der erweiterten Programmprüfung. Wenn dies zur Laufzeit auf einer Datenbank erkannt wird, die dies nicht unterstützt, kommt es zu einer behandelbaren Ausnahme der Klasse CX_SY_SQL_UNSUPPORTED_FEATURE.

Hinweise

  • Ob die aktuelle Datenbank Subqueries in der Anweisung MODIFY unterstützt, kann über die Konstante MODIFY_FROM_SELECT der Klasse CL_ABAP_DBFEATURES abgefragt werden.
  • Bei Verwendung einer Subquery in der Anweisung MODIFY wird die Syntaxprüfung im strikten Modus ab Release ausgeführt, welche die Anweisung strenger behandelt als die normale Syntaxprüfung.

Beispiel

In einer Subquery der Anweisung MODIFY werden alle Zeilen der Datenbanktabelle demo_join3 gelesen und die Ergebnismenge zum modifizieren der Datenbanktabelle demo_join1 verwendet. Zwei Zeilen der Ergebnismenge überschreiben vorhandene Zeilen in demo_join1 und eine Zeile wird eingefügt. Ein Subquery kann nur dann verwendet werden, wenn die Protokollierung für die DDIC-Datenbanktabelle DEMO_JOIN1 ausgeschaltet ist. Ansonsten müssen die Daten in eine interne Tabelle eingefügt werden, die als Quelle für die Modifikation dient.






SUBST_MERGE_LIST - merge external lists to one complete list with #if... logic for R3up   PERFORM Short Reference  
Diese Dokumentation steht unter dem Copyright der SAP AG.

Length: 14974 Date: 20240523 Time: 150318     sap01-206 ( 203 ms )