Sie sind auf Seite 1von 304
BC414 Datenbankänderungen programmieren Datenbankänderungen Datenbankänderungen programmieren programmieren  SAP
BC414 Datenbankänderungen programmieren
Datenbankänderungen Datenbankänderungen
programmieren programmieren
 SAP AG 2001

System R/3 Systemanforderungen: SAP R/3, Basis Release 4.6c oder höher Collection 21 5005 2580

Copyright
Copyright

Copyright 2002 SAP AG. Alle Rechte vorbehalten.

Weitergabe und Vervielfältigung dieser Publikation oder von Teilen daraus sind, zu welchem Zweck und in welcher Form auch immer, ohne die ausdrückliche schriftliche Genehmigung durch SAP AG nicht gestattet. In dieser Publikation enthaltene Informationen können ohne vorherige Ankündigung geändert werden.

Alle Rechte vorbehalten.

SAP AG 2001

Warenzeichenvermerke

Die von SAP AG oder deren Vertriebsfirmen angebotenen Software-Produkte können Software- Komponenten auch anderer Software-Hersteller enthalten.

Microsoft ® , WINDOWS ® , NT ® , EXCEL ® , Word ® , PowerPoint ® und SQL Server ® sind eingetragenen Marken der Microsoft Corporation.

IBM ® , DB2 ® , OS/2 ® , DB2/6000 ® , Parallel Sysplex ® , MVS/ESA ® , RS/6000 ® , AIX ® , S/390 ® , AS/400 ® , OS/390 ® und OS/400 ® sind eingetragene Marken der IBM Corporation.

ORACLE ® ist eine eingetragene Marke der ORACLE Corporation.

INFORMIX ® -OnLine for SAP und INFORMIX ® Dynamic Server TM sind eingetragene Marken der Informix Software Incorporated.

UNIX ® , X/Open ® , OSF/1 ® und Motif ® sind eingetragene Marken der Open Group.

HTML, DHTML, XML, XHTML sind Marken oder eingetragene Marken des W3C ® , World Wide Web Consortium, Massachusetts Institute of Technology.

JAVA ® ist eine eingetragene Marke der Sun Microsystems, Inc.

JAVASCRIPT ® ist eine eingetragene Marke der Sun Microsystems, Inc., verwendet unter der Lizenz der von Netscape entwickelten und implementierten Technologie.

SAP, SAP Logo, R/2, RIVA, R/3, ABAP, SAP ArchiveLink, SAP Business Workflow, WebFlow, SAP EarlyWatch, BAPI, SAPPHIRE, Management Cockpit, mySAP.com Logo und mySAP.com sind Marken oder eingetragene Marken der SAP AG in Deutschland und vielen anderen Ländern weltweit. Alle anderen Produkte sind Marken oder eingetragene Marken der jeweiligen Firmen.

Voraussetzungen für Teilnehmer
Voraussetzungen für Teilnehmer

Notwendig:

Sicherer Umgang mit der ABAP Entwicklungsumgebung: ABAP Workbench

Tiefere Kenntnisse der Programmiersprache ABAP z.B erworben in:

BC400 ABAP Workbench: Konzepte und Tools

BC402 ABAP Programmiertechniken

Konzepte und Tools BC402 ABAP Programmiertechniken Empfohlene zusätzliche Kurse: BC410 Entwicklung von

Empfohlene zusätzliche Kurse:

BC410 Entwicklung von Benutzerdialogen

BC430 ABAP Dictionary

BC425 Erweiterungen und Modifikationen

SAP AG 2001

Zielgruppe
Zielgruppe

Teilnehmer:

Erfahrene ABAP Programmierer Berater Projektmitglieder

Dauer: 2 Tage

SAP AG 2001

Zielgruppe Teilnehmer: Erfahrene ABAP Programmierer Berater Projektmitglieder Dauer: 2 Tage  SAP AG 2001

Benutzerhinweise

Die Schulungsunterlagen bilden keine Selbstlernprogramme. Nur in Verbindung mit den Erläuterungen des Referenten/der Referentin haben Sie komplette Unterlagen. Auf Ihren Unterlagen haben Sie Platz, um diese Zusatzinformationen zu notieren.

Kursüberblick
Kursüberblick

Inhalt:

Zielsetzungen des Kurses

Lernziele des Kurses

Inhaltsverzeichnis Übersichtsdiagramm Gesamtunternehmensszenario

SAP AG 2001

Kurses Lernziele des Kurses Inhaltsverzeichnis Übersichtsdiagramm Gesamtunternehmensszenario  SAP AG 2001
Zielsetzungen des Kurses
Zielsetzungen des Kurses
Zielsetzungen des Kurses  SAP AG 2001 Dieser Kurs ermöglicht es Ihnen: Datenbankänderungen im Sinne einer

SAP AG 2001

Dieser Kurs ermöglicht es Ihnen:

Datenbankänderungen im Sinne einer transaktionalen Verarbeitung im SAP R/3 System zu programmieren

ermöglicht es Ihnen: Datenbankänderungen im Sinne einer transaktionalen Verarbeitung im SAP R/3 System zu programmieren
Lernziele des Kurses
Lernziele des Kurses
Lernziele des Kurses  SAP AG 2001 Am Ende dieses Kurses können Sie: Die Anweisungen des

SAP AG 2001

Am Ende dieses Kurses können Sie:

Die Anweisungen des Open SQL für Datenbankänderungen verwenden Das SAP-Sperrkonzept bei Datenbankänderungen
Die Anweisungen des Open SQL für
Datenbankänderungen verwenden
Das SAP-Sperrkonzept bei Datenbankänderungen
einsetzen
Verschiedene Verbuchungstechniken zur
Datenbankänderung einsetzen
Inhaltsverzeichnis
Inhaltsverzeichnis

Vorspann

Kapitel 1

Kursüberblick

Kapitel 2

Datenbankaktualisierungen mit Open SQL

Kapitel 3

LUWs und Client-Server-Architektur

Kapitel 4

SAP-Sperrkonzept

Kapitel 5

Datenbankänderungen organisieren

Kapitel 6

Komplexe LUW-Verarbeitungen

Übungen und Lösungen finden Sie am Ende des jeweiligen Kapitels.

SAP AG 2001

Anhang

Übersichtsdiagramm-Kursüberblick 6 KKoommpplleexxee LLUUWW--VVeerraarrbbeeiittuunnggeenn 5
Übersichtsdiagramm-Kursüberblick
6
KKoommpplleexxee LLUUWW--VVeerraarrbbeeiittuunnggeenn
5
DDaatteennbbaannkkäännddeerruunnggeenn oorrggaanniissiieerreenn
3
2
4
1
KKuurrssüübbeerrbblliicckk
VVoorrssppaannnn
SQLOpen
Open SQL
Client-LUWs
LUWs und
und Client-
Server-ArchitekturServer-Architektur
SAP-SAP-
SperrkonzeptSperrkonzept

SAP AG 2001

Datenbankaktualisierungen mit Open SQL
Datenbankaktualisierungen mit Open SQL

Inhalt:

Einzelsatzoperationen Mengenoperationen

Open SQL

SAP AG 2001

Datenbankaktualisierungen mit Open SQL Inhalt: Einzelsatzoperationen Mengenoperationen Open SQL  SAP AG 2001
Datenbankaktualisierungen mit Open SQL : Lernziele des Kapitels
Datenbankaktualisierungen mit Open SQL :
Lernziele des Kapitels
mit Open SQL : Lernziele des Kapitels Am Ende dieses Kapitels können Sie: mit Hilfe der

Am Ende dieses Kapitels können Sie:

mit Hilfe der Open SQL-Befehle folgende Operationen auf Datenbanktabellen ausführen:

einzelne Zeilen anlegen, ändern oder löschen

Mengenoperationen auf Datenbanktabellen durchführen (anlegen, ändern, löschen)

SAP AG 2001

ändern oder löschen Mengenoperationen auf Datenbanktabellen durchführen (anlegen, ändern, löschen)  SAP AG 2001
Übersichtsdiagramm - Open SQL
Übersichtsdiagramm - Open SQL
Open SQL 2 SQLOpen Open SQL
Open SQL
2
SQLOpen
Open SQL
Übersichtsdiagramm - Open SQL Open SQL 2 SQLOpen Open SQL  SAP AG 2001
Übersichtsdiagramm - Open SQL Open SQL 2 SQLOpen Open SQL  SAP AG 2001
Übersichtsdiagramm - Open SQL Open SQL 2 SQLOpen Open SQL  SAP AG 2001

SAP AG 2001

Übersicht: Datenbankaktualisierungen
Übersicht: Datenbankaktualisierungen
Applikations- ABAP Server Open SQL Native SQL Tabellen- puffer Datenbankschnittstelle
Applikations-
ABAP
Server
Open SQL
Native SQL
Tabellen-
puffer
Datenbankschnittstelle

Datenbank-

Native SQL

Server

Server

SAP AG 2001

Für Datenbankänderungen stehen Ihnen im ABAP sowohl die Befehle des Open SQL als auch die des jeweiligen datenbankspezifischen Native SQL zur Verfügung.

Datenbankzugriffe über Native SQL ermöglichen die Verwendung datenbankspezifischer Kommandos. Sie setzen eine detaillierte Kenntnis der entsprechenden Syntax voraus. Programme, die Native-SQL Befehle verwenden, erfordern nach dem Transport in andere Systemumgebungen (anderes Datenbanksystem) zusätzlichen Entwicklungsaufwand, da die Syntax der SQL-Kommandos wegen ihrer Datenbankabhängigkeit angepasst werden müssen.

Befehle des Open SQL sind datenbankunabhängig und werden von der Datenbankschnittstelle des Applikationsservers in die jeweils passenden Native SQL-Statements umgesetzt und an die Datenbank weitergereicht. Ein mit Open SQL operierendes ABAP-Programm ist daher datenbankunabhängig und kann in beliebigen R/3-Systemen ohne Anpassung eingesetzt werden.

Ein weiterer Vorteil der Open SQL-Nutzung ist die Möglichkeit, SAP-Tabellen für schnellere Lesezugriffe auf dem Applikationsserver lokal zu puffern, wodurch auch die Datenbank entlastet wird. Das Lesen aus dem Puffer wird nach entsprechender Tabelleneinstellung automatisch realisiert.

Der Open SQL-Befehlssatz umfaßt nur Operationen der Data Manipulation Language (DML), nicht die der Data Definition Language (DDL), da diese im ABAP-Dictionary integriert sind.

Datenbankzugriffe über Native SQL sollten nur dann eingesetzt werden, wenn eine bestimmte Native SQL-Funktionalität benutzt werden muß, die im Open SQL nicht vorhanden ist.

Weitere Informationen hierzu finden Sie in der Dokumentation des ABAP-Editors zum Begriff SQL.

Zielmenge und Return-Werte
Zielmenge und Return-Werte
SY-SUBRC SY-DBCNT Einzelsatzzugriff Mengenzugriff Performance !  SAP AG 2001
SY-SUBRC
SY-DBCNT
Einzelsatzzugriff
Mengenzugriff
Performance !
 SAP AG 2001

Bei allen nachfolgend vorgestellten Open SQL-Befehlen ist es möglich, die Zielmenge auf der Datenbank einzugrenzen.

Es können jeweils eine Einzelzeile oder mehrere Zeilen über einen SQL-Befehl bearbeitet werden. Befehle, die mehrere Zeilen bearbeiten, sind stets performanter als entsprechende Einzelzugriffe (Ausnahme: Massenänderung über MODIFY).

Ferner existiert für die Änderungsoperation eine Syntaxvariante, mit der es möglich ist, einzelne Felder einer Zeile abzuändern.

Bei maskierten Abgrenzungen ( WHERE <field> LIKE ’<search_mask>’) beachten Sie bitte, dass ' _ ' ein einzelnes Zeichen und ' % ' eine beliebige Zeichenfolge maskiert (in Anlehnung an den SQL-Standard).

Sämtliche Open SQL-Befehle liefern Ihnen eine Rückmeldung über den Erfolg bzw. Mißerfolg der Datenbankoperation in Form eines Returncodes im Systemfeld sy-subrc zurück. Dabei bedeutet der Wert "0" (Null) stets, dass die Operation erfolgreich durchgeführt wurde. Alle anderen Werte bedeuten, dass Fehler aufgetreten sind. Details hierzu entnehmen Sie bitte der jeweiligen Schlüsselwortdokumentation des entsprechenden Befehls.

Zusätzlich können Sie dem Systemfeld sy-dbcnt die Anzahl der Sätze entnehmen, für die die gewünschte Datenbankoperation tatsächlich ausgeführt wurde.

Bitte beachten Sie, dass Open SQL-Befehle keine Berechtigungsprüfungen durchführen. Diese müssen Sie in Ihrem Programm explizit durchführen (siehe Kapitel Berechtigungsprüfungen).

Zugriff auf mandantenabhängige Tabellen Open Open SQL SQL . . . Mit Mit "CLIENT "CLIENT
Zugriff auf mandantenabhängige Tabellen
Open Open SQL SQL
.
.
.
Mit Mit "CLIENT "CLIENT SPECIFIED"-Zusatz SPECIFIED"-Zusatz im im Befehl Befehl
=> Mandantenangabe im Befehl möglich
=> Mandantenangabe im Befehl möglich
MANDT
.
.
.
.
.
.
• Mandant angegeben
400
.
.
.
.
.
.
=> Zugriff auf angegebenen Mandant
400
.
.
.
.
.
.
400
.
.
.
.
.
.
• Mandant nicht angegeben
400
.
.
.
.
.
.
=> Zugriff auf alle Mandanten !
401
.
.
.
.
.
.
401
.
.
.
.
.
.
.
.
.
.
.
.
401
402
.
.
.
.
.
.
402
.
.
.
.
.
.
402
.
.
.
.
.
.

SAP AG 2001

Wird in einem Open SQL-Befehl der Zusatz "CLIENTSPECIFIED" nicht angegeben, so ist in der zugehörigen WHERE-Klausel keine Mandantenangabe erlaubt und es wird auf die entsprechenden Sätze des aktuellen Ausführungsmandanten zugegriffen.

Wollen Sie Daten aus anderen Mandanten bearbeiten, so ist der Zusatz "CLIENTSPECIFIED" im Open SQL-Befehl und der/die gewünschte(n) Mandant(en) in der zugehörigen WHERE-Klausel anzugeben.

Bitte beachten Sie, dass ein Open SQL-Befehl auf alle(!) Mandanten zugreift, falls in ihm der Zusatz "CLIENTSPECIFIED" ohne Mandantenangabe verwendet wird.

Anlegen Einzelsatz
Anlegen Einzelsatz
Anlegen Einzelsatz wa_spfli LH 0007 SINGAPORE spfli  SAP AG 2001

wa_spfli

LH 0007 SINGAPORE spfli  SAP AG 2001
LH
0007
SINGAPORE
spfli
 SAP AG 2001
Anlegen Einzelsatz wa_spfli LH 0007 SINGAPORE spfli  SAP AG 2001

Mit dem Befehl "INSERT INTO <dbtab> VALUES <wa>." können Sie eine neue Zeile in eine Datenbanktabelle einfügen. Hierzu ist die einzufügende Zeile vor Aufruf des Kommandos in die Struktur <wa> zu stellen, die den gleichen Aufbau haben muß wie die Zeilen der entsprechenden Datenbanktabelle.

Das evtl. in der Struktur <wa> enthaltene Mandantenfeld wird nur bei Angabe des "CLIENT SPECIFIED"-Zusatzes berücksichtigt. Ohne "CLIENTSPECIFIED"-Zusatz gilt der aktuelle Ausführungsmandant.

Das Einfügen von Zeilen ist auch über Views möglich. Allerdings muß die View im ABAP Dictionary mit dem Pflegestatus "lesen und ändern" angelegt sein und darf nur Felder aus einer Tabelle enthalten.

Diese INSERT-Variante besitzt folgende Returncodes :

0 : Zeile konnte erfolgreich eingefügt werden. 4 : Zeile konnte nicht eingefügt werden, da schon eine Zeile mit dem selben Schlüssel existiert.

Alternative Syntax : INSERT <dbtab> [CLIENT SPECIFIED] FROM <wa>.

Anlegen mehrere Sätze
Anlegen mehrere Sätze
Anlegen mehrere Sätze it_spfli LH 0007 SINGAPORE LH 0008 MUNIC LH 0009 HONGKONG spfli  SAP

it_spfli

LH 0007 SINGAPORE LH 0008 MUNIC LH 0009 HONGKONG spfli
LH
0007 SINGAPORE
LH
0008 MUNIC
LH
0009 HONGKONG
spfli

SAP AG 2001

.

.

.

Das Kommando "INSERT <dbtab> FROM TABLE <itab>." ermöglicht das Anlegen mehrerer Zeilen in einer Datenbanktabelle. Die dabei anzugebende interne Tabelle <itab> muß den gleichen Zeilenaufbau wie die entsprechende Datenbanktabelle haben und die neuen Datensätze enthalten.

Das evtl. in der interne Tabelle <itab> enthaltene Mandantenfeld wird nur bei Angabe des "CLIENT SPECIFIED"-Zusatzes berücksichtigt. Ohne "CLIENTSPECIFIED"-Zusatz gilt der aktuelle Ausführungsmandant.

Können dabei alle Zeilen angelegt werden, wird sy-subrc auf Null gesetzt.

Kann jedoch mindestens ein Datensatz nicht angelegt werden, wird ein Laufzeitfehler ausgelöst. Dieser bewirkt, dass der gesamte Einfügevorgang verworfen wird (Datenbank-Rollback). Möchten Sie in einem solchen Fall, dass Sätze, die eingefügt werden können, auch eingefügt werden, können Sie den Befehlszusatz "ACCEPTING DUPLICATE KEYS" verwenden. Dieser Zusatz bewirkt, dass im Fehlerfall der Laufzeitfehler (und somit auch der Datenbank-Rollback) unterdrückt, sy-subrc auf 4 gesetzt und alle nicht fehlerhaften Sätze eingefügt werden.

Das Systemfeld sy-dbcnt enthält die Anzahl der Zeilen, die auf der Datenbank eingefügt werden konnten.

Ändern Einzelsatz
Ändern Einzelsatz
1 2
1
2
Ändern Einzelsatz 1 2 wa_spfli LH 0010 ROME I 1 2 2 spfli LH 0010 BERN
Ändern Einzelsatz 1 2 wa_spfli LH 0010 ROME I 1 2 2 spfli LH 0010 BERN
wa_spfli LH 0010 ROME I 1 2 2 spfli LH 0010 BERN CH
wa_spfli
LH
0010 ROME
I
1
2
2
spfli
LH
0010 BERN
CH

SAP AG 2001

*

*

*

*

Mit den beiden oben dargestellten Varianten des UPDATE-Befehls können Sie gezielt eine Zeile einer Datenbanktabelle ändern.

Bei Variante 1 wird der Datenbanksatz, der den in <wa> stehenden Schlüssel besitzt, mit <wa> überschrieben, wobei das in <wa> evtl. vorhandene Schlüsselfeld "MANDT" nur dann berücksichtigt wird, wenn der "CLIENTSPECIFIED"-Zusatz angegeben ist (sonst gilt der aktuelle Ausführungsmandant). Logischerweise muß <wa> den gleichen Aufbau haben wie der zu ändernde Datenbanksatz.

Bei Variante 2 wird der in der WHERE-Klausel angegebene Satz geändert, wobei nur die im "SET"- Zusatz angegebenen Felder datenbankseitig mit den angegebenen Werten überschrieben werden. In dieser Syntaxversion muß der zu ändernde Satz in der WHERE-Klausel durch exakte Angabe aller Schlüsselfeldbewertungen spezifiziert werden. Details zur Angabe des evtl. vorhandenen MANDT- Feldes entnehmen Sie bitte der Folie "Zugriff auf mandantenabhängige Tabellen".

Für numerische Datenbankfelder im "SET"-Zusatz können einfache Rechenoperationen als -

Das Ändern von Zeilen ist auch über Views möglich. Allerdings muß die View im ABAP Dictionary mit dem Pflegestatus "lesen und ändern" angelegt sein und darf nur Felder aus einer Tabelle enthalten.

Diese beiden UPDATE-Varianten besitzen folgende Returncodes :

Bewertung angegeben werden : f = g ,

f

=

f

+ g ,

f

= f

g .

0 : Zeile konnte geändert werden. 4 : Zeile konnte nicht geändert werden, da z.B. der angegebene Schlüssel nicht vorhanden ist.

Ändern mehrere Sätze (über Bedingung)
Ändern mehrere Sätze (über Bedingung)
Ändern mehrere Sätze (über Bedingung) "ROME" " I " spfli AZ 0534 BERN CH zu AZ
"ROME" " I " spfli AZ 0534 BERN CH zu AZ 0535 BIEL CH ändernde
"ROME"
" I "
spfli
AZ
0534
BERN
CH
zu
AZ
0535
BIEL
CH
ändernde
AZ
0555
MILAN
I
Sätze
AZ
0556
LUCERN
CH

SAP AG 2001

AZ 0534 BERN CH zu AZ 0535 BIEL CH ändernde AZ 0555 MILAN I Sätze AZ

Sollen für mehrere Zeilen einer Datenbaktabelle jeweils die gleichen Felder identisch geändert werden, so können Sie die auf der Folie angegebene Syntax verwenden.

Über die WHERE-Klausel legen Sie fest, welche Zeilen geändert werden sollen. Details zur Angabe des evtl. vorhandenen MANDT-Feldes entnehmen Sie bitte der Folie "Zugriff auf mandantenabhängige Tabellen".

Im SET-Zusatz geben Sie an, welche Felder dieser Sätze wie geändert werden sollen. Auch hier sind für die zu ändernden numerischen Felder Rechenoperationen als Bewertungsangabe möglich :

f

= g ,

f =

f +

g ,

f

=

f

-

g .

Diese UPDATE-Variante besitzt folgende Returncodes :

0 : Mindestens eine Zeile wurde geändert. 4 : Es wurde keine Zeile geändert, weil z.B. keine solchen existieren.

Das Feld sy-dbcnt enthält die Anzahl der geänderten Zeilen.

Ändern mehrere Sätze (über interne Tabelle)
Ändern mehrere Sätze (über interne Tabelle)
Ändern mehrere Sätze (über interne Tabelle) it_spfli LH 0007 SINGAPORE LH 0008 MUNIC LH 0009 HONGKONG

it_spfli

LH 0007 SINGAPORE LH 0008 MUNIC LH 0009 HONGKONG spfli LH 0007 BEIJING LH 0008
LH
0007 SINGAPORE
LH
0008 MUNIC
LH
0009 HONGKONG
spfli
LH
0007 BEIJING
LH
0008 BEIJING
LH
0009 BEIJING

SAP AG 2001

.

.

.

< Ändern it_spfli >

Eine Massenänderung können Sie auch über die Angabe einer internen Tabelle realisieren, die den gleichen Aufbau hat wie die entsprechende Datenbanktabelle und die zu ändernden Sätze enthält.

Das in der angegebenen internen Tabelle evtl. vorhandene Feld "MANDT" wird nur dann berücksichtigt wird, wenn der "CLIENTSPECIFIED"-Zusatz angegeben ist (sonst gilt der aktuelle Ausführungsmandant).

Diese UPDATE-Variante besitzt folgende Returncodes :

0 : Alle angegebenen Zeilen wurden erfolgreich geändert. 4 : Mindestens eine der angegebenen Zeilen konnte nicht geändert werden (weil sie z.B. gar nicht existiert); die übrigen Zeilen wurden geändert.

Das Systemfeld sy-dbcnt enthält die Anzahl der erfolgreich geänderten Zeilen.

Modifizieren Einzelsatz / mehrere Sätze
Modifizieren Einzelsatz / mehrere Sätze
Modifizieren Einzelsatz / mehrere Sätze  SAP AG 2001 falls angegebener Eintrag existiert falls angegebener Eintrag
Modifizieren Einzelsatz / mehrere Sätze  SAP AG 2001 falls angegebener Eintrag existiert falls angegebener Eintrag
Modifizieren Einzelsatz / mehrere Sätze  SAP AG 2001 falls angegebener Eintrag existiert falls angegebener Eintrag

SAP AG 2001

Modifizieren Einzelsatz / mehrere Sätze  SAP AG 2001 falls angegebener Eintrag existiert falls angegebener Eintrag

falls angegebener Eintrag existiert

falls angegebener Eintrag nicht existiert

Der Befehl MODIFY ist SAP-spezifisch. Er umfaßt die beiden Befehle UPDATE und INSERT :

Existiert der im MODIFY angegebene Datensatz, wird dieser aktualisiert (-> UPDATE ).

Existiert der im MODIFY angegebene Datensatz nicht, wird dieser neu eingefügt (-> INSERT ).

Mit den verschiedenen Syntaxvarianten lässt sich die Bearbeitung von Einzelsätzen und mehrere Sätzen realisieren ( analog zur Syntax von UPDATE und INSERT ).

Die Operation ist auch für Views möglich. Allerdings muß die View im ABAP Dictionary mit dem Pflegestatus "lesen und ändern" angelegt sein und darf nur Felder aus einer Tabelle enthalten.

Das Kommando besitzt folgende Returncodes :

0 : Der angegebene Satz bzw. alle angegebenen Sätze konnte(n) bearbeitet (aktualisiert/eingefügt) werden. 4 : Der angegebene Satz bzw. mindestens einer der angegebenen Sätze konnte(n) nicht bearbeitet werden (weil z.B. der Satz datenbankseitig nicht vorhanden ist und sein Einfügen einen Unique- Sekundärindex zerstören würde); im Falle der Massenänderung wurden die übrigen Sätze bearbeitet.

Das Feld sy-dbcnt enthält die Anzahl der erfolgreich bearbeiteten Sätze.

Löschen Einzelsatz
Löschen Einzelsatz
Löschen Einzelsatz "LH" / "0007" spfli LH 0007  SAP AG 2001
"LH" / "0007" spfli LH 0007
"LH" / "0007"
spfli
LH
0007

SAP AG 2001

Löschen Einzelsatz "LH" / "0007" spfli LH 0007  SAP AG 2001

Die oben angegebene Syntax des DELETE-Kommandos ermöglicht das Löschen einer Einzelzeile einer Datenbanktabelle. In dieser Syntaxversion muß der zu löschende Satz in der WHERE-Klausel durch exakte Angabe aller Schlüsselfeldbewertungen spezifiziert werden. Details zur Angabe des evtl. vorhandenen MANDT-Feldes entnehmen Sie bitte der Folie "Zugriff auf mandantenabhängige Tabellen".

Das Löschen einer Zeile ist auch für Views möglich. Allerdings muß die View im ABAP Dictionary mit dem Pflegestatus "lesen und ändern" angelegt sein und darf nur Felder aus einer Tabelle enthalten.

Diese DELETE-Variante besitzt folgende Returncodes :

0 : Zeile wurde erfolgreich gelöscht. 4 : Zeile konnte nicht gelöscht werden, da z.B. dieser datenbankseitig gar nicht existiert.

Alternative Syntax : DELETE <dbtab> [CLIENT SPECIFIED] FROM <wa>. Bei dieser Syntaxversion muß die Struktur <wa> den gleichen Aufbau wie Sätze der entsprechenden Datenbanktabelle haben und vor dem Kommando-Aufruf mit den Schlüsselfeldern des zu löschenden Satzes gefüllt werden, wobei das in <wa> evtl. vorhandene Schlüsselfeld "MANDT" nur dann berücksichtigt wird, wenn der "CLIENTSPECIFIED"-Zusatz angegeben ist (sonst gilt der aktuelle Ausführungsmandant).

Löschen mehrere Sätze (über Bedingung)
Löschen mehrere Sätze (über Bedingung)
Löschen mehrere Sätze (über Bedingung) "LH" spfli LH 0007 LH 0008 LH 0009  SAP AG

"LH"

spfli LH 0007 LH 0008 LH 0009
spfli
LH
0007
LH
0008
LH
0009

SAP AG 2001

Löschen mehrere Sätze (über Bedingung) "LH" spfli LH 0007 LH 0008 LH 0009  SAP AG

Diese Syntaxvariante des DELETE-Kommandos ermöglicht das Löschen mehrerer Zeilen einer Datenbanktabelle. Hierbei legen Sie mit Hilfe der WHERE-Klausel fest, welche Zeilen gelöscht werden sollen. Details zur Angabe des evtl. vorhandenen MANDT-Feldes entnehmen Sie bitte der Folie "Zugriff auf mandantenabhängige Tabellen".

Das Löschen aller Zeilen einer mandantenunabhängigen Datenbanktabelle können Sie mit folgender Syntax realisieren :

DELETE FROM <dbtab> WHERE <field> LIKE ’%’. Dabei ist <field> ein beliebiges Tabellenfeld.

Möchten Sie von einer mandantenabhängigen Datenbanktabelle alle Zeilen des Ausführungs- mandanten löschen, können sie die gleiche Syntax benutzen :

DELETE FROM <dbtab> WHERE <field> LIKE ’%’. Wollen Sie jedoch von einer mandantenabhängigen Datenbanktabelle alle existierenden Zeilen löschen, so ist im Befehl zusätzlich der "CLIENTSPECIFIED"-Zusatz anzugeben :

DELETE FROM <dbtab> CLIENTSPECIFIED WHERE <field> LIKE ’%’.

Das Löschen mehrerer Datensätze über die Angabe von Bedingungen liefert folgende Returncodes :

0 : Es wurde mindestens eine Zeile gelöscht. 4 : Es wurde keine Zeile gelöscht, da z.B. die angegebenen Zeilen gar nicht existieren.

Das Systemfeld sy-dbcnt enthält die Anzahl der auf der Datenbank gelöschten Zeilen.

Löschen mehrere Sätze (über interne Tabelle)
Löschen mehrere Sätze (über interne Tabelle)
Löschen mehrere Sätze (über interne Tabelle) it_spfli LH 0007 LH 0008 LH 0009 spfli LH 0007

it_spfli

LH 0007 LH 0008 LH 0009 spfli LH 0007 Singapore LH 0008 Munic LH 0009
LH
0007
LH
0008
LH
0009
spfli
LH
0007
Singapore
LH
0008
Munic
LH
0009
Hongkong

SAP AG 2001

.

.

.

Möchten Sie mehrere Sätze einer Datenbanktabelle löschen, so können Sie diese auch zunächst in einer internen Tabelle, die den gleichen Aufbau besitzt wie die entsprechende Datenbanktabelle, angeben und die oben dargestellte Syntax des DELETE-Kommandos verwenden. Dabei genügt es, in der internen Tabelle jeweils nur den Schlüsselteil der zu löschenden Sätze anzugeben. Das evtl. vorhandene Schlüsselfeld "MANDT" wird jedoch nur dann berücksichtigt, wenn der "CLIENT SPECIFIED"-Zusatz angegeben ist (sonst gilt der aktuelle Ausführungsmandant).

Diese DELETE-Variante liefert folgende Returncodes :

0 : Alle in der internen Tabelle angegebenen Zeilen konnten erfolgreich gelöscht werden. 4 : Mindestens eine Zeile konnte nicht gelöscht werden (weil z.B. nicht vorhanden), die übrigen Sätze wurden gelöscht.

Die Anzahl der auf der Datenbank gelöschten Zeilen befindet sich in dem Systemfeld sy-dbcnt.

Vorherigen Datenbankzustand wiederherstellen
Vorherigen Datenbankzustand wiederherstellen

ABAP Programm

ABAP Programm . . . . . .

.

.

.

. . . . . .
. . . . . .
. . . . . .

.

.

.

Datenbank Datenbank-Rollback
Datenbank
Datenbank-Rollback

SAP AG 2001

Wenn eine datenbankändernde Open-SQL-Anweisung einen von Null verschiedenen Returncode zurückgeliefert, sollten Sie dafür sorgen, dass die Datenbank in den Zustand zurückgesetzt wird, in dem sie sich vor Ihrem Änderungsversuch befand. Dies erreichen Sie durch einen Rollback auf der Datenbank, der alle Änderungen der aktuellen Datenbank-LUW (siehe nächstes Kapitel) rückgängig macht.

Es gibt zwei Möglichkeiten, einen Datenbank-Rollback zu verursachen :

- Abbruchdialognachricht (A-Message) senden - ABAP-Anweisung ROLLBACK WORK verwenden

Das Senden einer A-Message löst auf der Datenbank einen Rollback aus und beendet das Programm. Alle anderen Nachrichtentypen (E,W, I) führen zwar auch einen Dialog, bewirken jedoch keinen Rollback auf der Datenbank.

Die ABAP-Anweisung ROLLBACK WORK dagegen verursacht einen Datenbank-Rollback, ohne das Programm zu beenden. In diesem Fall ist Vorsicht geboten, da im noch laufenden Programm der Kontext nicht zurückgesetzt wurde !

Datenbankaktualisierungen mit Open SQL : Zusammenfassung des Kapitels
Datenbankaktualisierungen mit Open SQL :
Zusammenfassung des Kapitels
mit Open SQL : Zusammenfassung des Kapitels Sie können nun: mit Hilfe der Open-SQL-Befehle folgende

Sie können nun:

mit Hilfe der Open-SQL-Befehle folgende Operationen auf Datenbanktabellen ausführen:

Einzelzeile anlegen, ändern oder löschen

Mengenoperationen auf Datenbanktabellen durchführen (anlegen, ändern, löschen)

SAP AG 2001

Navigation bei den Übungsaufgaben
Navigation bei den Übungsaufgaben
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL

BACK, EXIT, CANCEL

BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
BACK, EXIT, CANCEL
Flug festlegen BACK 100 BACK CANCEL CANCEL SAVE SAVE BOOKC BOOKN
Flug festlegen
BACK
100 BACK
CANCEL
CANCEL
SAVE
SAVE
BOOKC
BOOKN
200 300 Buchungen stornieren Buchung anlegen NEW_CUSTOM Programm SAPBC414 BOOKINGS 100 Programm SAPBC414
200
300
Buchungen stornieren
Buchung
anlegen
NEW_CUSTOM
Programm SAPBC414
BOOKINGS
100
Programm SAPBC414
CREATE_CUSTOMER
Kunde anlegen
SAP AG 2001
EXIT
EXIT

Übungen

Kapitel: Datenbankaktualisierungen mit Open SQL Thema: Einzelsatzänderung Thema: Einzelsatzänderung

mit Open SQL Thema: Einzelsatzänderung Am Ende dies er Übungen können Sie: • Einzelsätze in
mit Open SQL Thema: Einzelsatzänderung Am Ende dies er Übungen können Sie: • Einzelsätze in
mit Open SQL Thema: Einzelsatzänderung Am Ende dies er Übungen können Sie: • Einzelsätze in

Am Ende dieser Übungen können Sie:

Einzelsätze in Datenbanktabellen einfügen.

Das Programm SAPBC414T_CREATE_CUSTOMER_01 ermöglicht das Erfassen neuer Kundendaten über das Dynpro 100.

Erweitern Sie das vorgegebene Programm um den Datenbankdialogteil:

Die neu eingegebenen Kundendaten sollen nach dem Auslösen des Funktionscodes SAVE (z.B. durch das Drücken der Sichern-Ikone) auf die Datenbanktabelle SCUSTOM geschrieben werden.

Programm:

SAPMZ##_CUSTOMER1

Transaktion: Z##_CUSTOMER1 Kopiervorlage: SAPBC414T_CREATE_CUSTOMER_01 Musterlösung: SAPBC414S_CREATE_CUSTOMER_01

1-1

Kopieren Sie die Programmvorlage SAPBC414T_CREATE_CUSTOMER_01 mit allen Teilobjekten auf SAPMZ##_CUSTOMER1 ( ## = Gruppennummer ) . Ordnen Sie dem Programm den Transaktionscode Z##_CUSTOMER1 zu.

1-2

Die ABAP-Anweisungen für den Datenbankdialog werden im Unterprogramm SAVE_SCUSTOM gekapselt. Das Unterprogramm ist bereits (leer) angelegt.

1-2-1

Das Unterprogramm ist bereits (leer) angelegt. 1-2-1 Fügen Sie den neu eingegebenen Kundendatensatz in die

Fügen Sie den neu eingegebenen Kundendatensatz in die Datenbanktabelle SCUSTOM ein. Geben Sie im Erfolgsfall die Setznachricht S015 , im Mißerfolgsfall die Abbruchnachricht A048 aus.

Auf dem Eingabe-Dynpro befinden sich SCUSTOM-Felder.

Programmintern werden die neu eingegebenen Kundendaten in der über die TABLES-Anweisung definierten Feldleiste SCUSTOM gehalten.

Der bereits implementierte Aufruf des Unterprogramms NUMBER_GET_NEXT setzt eine neue Kundennummer ins Feld SCUSTOM-ID, so dass alle Daten des neuen Kunden komplett in der Struktur SCUSTOM vorhanden sind.

Die Nachrichtenklasse BC414 ist als Programm-Default in der PROGRAM-Anweisung deklariert und daher programmglobal gültig.

Optionale Übung

Kapitel: Datenbankaktualisierungen mit Open SQL Thema: Ändern mehrerer Datensätze Thema: Ändern mehrerer Datensätze

mit Open SQL Thema: Ändern mehrerer Datensätze Am Ende dieser Übungen können Sie: • mehrere
mit Open SQL Thema: Ändern mehrerer Datensätze Am Ende dieser Übungen können Sie: • mehrere
mit Open SQL Thema: Ändern mehrerer Datensätze Am Ende dieser Übungen können Sie: • mehrere

Am Ende dieser Übungen können Sie:

mehrere Datensätze performanterweise in Datenbanktabellen ändern.

Im Programm SAPBC414T_UPDATE_STRAVELAG wird eine Liste erzeugt, auf der die Daten der in der Tabelle STRAVELAG gepflegten Reisebüros dargestellt werden. Der Benutzer kann durch das Markieren von einer oder mehreren Zeilen die Daten der korrespondierenden Reisebüros auf dem Folgedynpro (100) ändern.

Erweitern Sie das Programm um den Datenbankdialogteil:

Durch das Drücken der Sichern-Ikone (Funktionscode SAVE) auf dem Dynpro 100 sollen die geänderten Daten auf die Datenbanktabelle STRAVELAG zurückgeschrieben werden.

Programm:

SAPMZ##_UPDATE_STRAVELAG

Kopiervorlage:

SAPBC414T_UPDATE_STRAVELAG

Musterlösung:

SAPBC414S_UPDATE_STRAVELAG

2-1

Kopieren Sie die Programmvorlage SAPBC414T_UPDATE_STRAVELAG mit

allen Teilobjekten auf SAPMZ##_UPDATE_STRAVELAG

( ## = Gruppen-

nummer). Da es sich um ein Programm vom Typ 1 handelt, ist es nicht notwendig, dass ein Transaktionscode zugeordnet wird.

2-2

Der Datenbankdialog wird durch das Auslösen des Funktionscodes SAVE ange- stoßen. Hierbei wird im PAI-Module USER_COMMAND_0100 des Dynpro 100 das Unterprogramm SAVE_CHANGES aufgerufen, welches den Datenbank-dialog kapselt. Dieses Unterprogramm ist bereits (leer) angelegt.

2-2-1

Schreiben Sie die geänderten Adreßdaten auf die Datenbanktabelle STRAVELAG zurück. Achten Sie bei der Umsetzung dieser Aufgabe auf Performance-Aspekte. Im Erfolgsfall soll die Setznachricht S030 , im Mißerfolgsfall die Informationsnachricht I048 ausgegeben werden.

Die Daten der Reisebüros sind in der internen Tabelle ITAB_TRAVEL Die Daten der Reisebüros sind in der internen Tabelle (Arbeitsbereich WA_TRAVEL ) gepuffert. Die Zeilenstruktur der (Arbeitsbereich WA_TRAVEL) gepuffert. Die Zeilenstruktur der internen Tabelle entspricht bis auf das zusätzliches Feld MARK_CHANGED (C(1)) der Zeilenstruktur von STRAVELAG. MARK_CHANGED besitzt den Wert 'X', falls die Adreßdaten auf dem Dynpro 100 geändert wurden und ist ansonsten initial.

Hinweise zu den Musterlösungen dieses Kurses

Hinweise zu den Musterlösungen dieses Kurses Die angegebenen Musterlösungen geben die Anweisungen der

Die angegebenen Musterlösungen geben die Anweisungen der Dynproablauflogiken sowie der ABAP-Programmteile wieder, die in der Musterlösung benötigt werden.

Die Übungen zur Schulung BC414 sind so konzipiert, daß zwei größere Programme begleitend zu den Inhalten der jeweiligen Kapitel weiterentwickelt werden. Aus Gründen der Übersichtlichkeit wird nicht für jede Musterlösung deren gesamtes Coding wiedergegeben. Stattdessen wird folgendes Verfahren durchgeführt:

Die Musterlösung der Aufgabe, in der ein Programm zum ersten Mal bearbeitet wird, ist komplett dargestellt.

Alle darauf aufbauenden Musterlösungen geben nur die geänderten oder neu hinzugekommenen Ablauflogiken, Unterprogramme und Module wieder. Die in den wiedergegebenen Modularisierungseinheiten zur Lösung der Aufgabe notwendig zu ergänzenden Anweisungen sind jeweils durch Fettdruck hervorgehoben.

Im Anhang des Schulungsordners finden Sie je eine komplette Version der beiden Programme.

Einzige Ausnahme von diesem Vorgehen bildet die zweite als optional gekennzeichnete Aufgabe des Kapitels Datenbankaktualisierungen mit Open SQL. Da das zu dieser Aufgabe gehörende Programm in den folgenden Kapiteln nicht weiter bearbeitet wird, ist die Musterlösung dieser Aufgabe komplett wiedergegeben.

Lösungen Kapitel: Datenbankaktualisierungen mit Open SQL Thema: Einzelsatzänderung Musterlösung

Lösungen

Kapitel: Datenbankaktualisierungen mit Open SQL Thema: Einzelsatzänderung

Musterlösung SAPBC414S_CREATE_CUSTOMER_01

Modulpool

*&-----------------------------------------------------------------*

*

*&-----------------------------------------------------------------* INCLUDE BC414S_CREATE_CUSTOMERTOP. INCLUDE BC414S_CREATE_CUSTOMERO01. INCLUDE BC414S_CREATE_CUSTOMERI01. INCLUDE BC414S_CREATE_CUSTOMER_01F01.

*& Modulpool

SAPBC414S_CREATE_CUSTOMER_01

PROCESS BEFORE OUTPUT. MODULE status_0100.

SCREEN 100

PROCESS AFTER INPUT. MODULE exit AT EXIT-COMMAND. MODULE save_ok_code. FIELD: scustom-name MODULE mark_changed ON REQUEST. MODULE user_command_0100.

TOP Include

*&-----------------------------------------------------------------*

*& Include BC414S_CREATE_CUSTOMERTOP *&-----------------------------------------------------------------* PROGRAM sapbc414s_create_customer MESSAGE-ID bc414.

*

DATA: answer, flag. DATA: ok_code LIKE sy-ucomm, save_ok LIKE ok_code.

TABLES: scustom.

PBO Module

*------------------------------------------------------------------* ***INCLUDE BC414S_CREATE_CUSTOMERO01 . *------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

Module STATUS_0100 OUTPUT

*&-----------------------------------------------------------------* MODULE STATUS_0100 OUTPUT. SET PF-STATUS ’DYN_0100’. SET TITLEBAR ’DYN_0100’.

ENDMODULE.

" STATUS_0100 OUTPUT

PAI Module

*------------------------------------------------------------------* ***INCLUDE BC414S_CREATE_CUSTOMERI01 . *------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* MODULE exit INPUT. CASE ok_code. WHEN ’EXIT’. IF sy-datar IS INITIAL AND flag IS INITIAL. * no changes on screen 100 LEAVE PROGRAM. ELSE. PERFORM ask_save USING answer. CASE answer. WHEN ’J’. ok_code = ’SAVE&EXIT’. WHEN ’N’. LEAVE PROGRAM. WHEN ’A’. CLEAR ok_code. SET SCREEN 100.

Module EXIT INPUT

ENDCASE.

ENDIF.

WHEN ’CANCEL’. IF sy-datar IS INITIAL AND flag IS INITIAL. * no changes on screen 100 LEAVE TO SCREEN 0. ELSE. PERFORM ask_loss USING answer. CASE answer. WHEN ’J’. LEAVE TO SCREEN 0. WHEN ’N’. CLEAR ok_code. SET SCREEN 100. ENDCASE. ENDIF. ENDCASE.

ENDMODULE.

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* MODULE save_ok_code INPUT. save_ok = ok_code. CLEAR ok_code.

ENDMODULE.

" EXIT

INPUT

Module SAVE_OK_CODE INPUT

" SAVE_OK_CODE INPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* MODULE user_command_0100 INPUT. CASE save_ok. WHEN ’SAVE&EXIT’. PERFORM save. LEAVE PROGRAM. WHEN ’SAVE’. IF flag IS INITIAL. SET SCREEN 100. ELSE. PERFORM save. SET SCREEN 0.

Module USER_COMMAND_0100 INPUT

ENDIF. WHEN ’BACK’. IF flag IS INITIAL. SET SCREEN 0. ELSE. PERFORM ask_save USING answer. CASE answer. WHEN ’J’. PERFORM save. SET SCREEN 0. WHEN ’N’. SET SCREEN 0. WHEN ’A’. SET SCREEN 100. ENDCASE. ENDIF. ENDCASE. ENDMODULE.

" USER_COMMAND_0100 INPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

Module MARK_CHANGED INPUT

MODULE mark_changed INPUT.

* set flag to mark changes were made on screen 100 flag = ’X’.

ENDMODULE.

" MARK_CHANGED INPUT

FORM Routinen

*------------------------------------------------------------------*

***INCLUDE BC414S_CREATE_CUSTOMER_01F01 .

*------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_WA_SCUSTOM text

*------------------------------------------------------------------*

FORM number_get_next USING p_scustom LIKE scustom.

Form NUMBER_GET_NEXT

DATA: return TYPE inri-returncode.

* get next free number in the number range ’01’

* of number range object ’SBUSPID’

CALL FUNCTION ’NUMBER_GET_NEXT’

EXPORTING

nr_range_nr = ’01’

object

= ’SBUSPID’

IMPORTING

number

returncode = return

= p_scustom-id

EXCEPTIONS

OTHERS

CASE sy-subrc.

WHEN 0. CASE return. WHEN 1.

= 1.

* number of remaining numbers critical MESSAGE s070. WHEN 2.

* last number MESSAGE s071.

WHEN 3.

* no free number left over MESSAGE a072.

ENDCASE.

WHEN 1.

* internal error MESSAGE a073 WITH sy-subrc.

ENDCASE.

ENDFORM.

" NUMBER_GET_NEXT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_ANSWER text

*------------------------------------------------------------------*

FORM ask_save USING p_answer. CALL FUNCTION ’POPUP_TO_CONFIRM_STEP’ EXPORTING textline1 = ’Data has been changed.’(001)

Form ASK_SAVE

textline2 = ’Save before leaving transaction?’(002)

titel

= ’Create Customer’(003)

IMPORTING

ENDFORM.

answer

= p_answer.

" ASK_SAVE

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_ANSWER text

*------------------------------------------------------------------* FORM ask_loss USING p_answer. CALL FUNCTION ’POPUP_TO_CONFIRM_LOSS_OF_DATA’ EXPORTING textline1 = ’Continue?’(004)

= ’Create Customer’(003)

Form ASK_LOSS

titel

IMPORTING

ENDFORM.

answer

= p_answer.

" ASK_LOSS

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* FORM enq_scustom. CALL FUNCTION ’ENQUEUE_ESCUSTOM’ EXPORTING

Form ENQ_SCUSTOM

id

= scustom-id

EXCEPTIONS

foreign_lock

= 1

system_failure = 2

OTHERS

= 3.

CASE sy-subrc. WHEN 0. WHEN 1. MESSAGE e060. WHEN OTHERS. MESSAGE e063 WITH sy-subrc. ENDCASE. ENDFORM.

" ENQ_SCUSTOM

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* FORM deq_all. CALL FUNCTION ’DEQUEUE_ALL’.

ENDFORM.

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* FORM save.

* get SCUSTOM-ID from number range object SBUSPID PERFORM number_get_next USING scustom.

* save new customer PERFORM save_scustom.

ENDFORM.

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

FORM save_scustom. INSERT INTO scustom VALUES scustom. IF sy-subrc <> 0.

* insertion of dataset in DB-table not possible MESSAGE a048. ELSE.

* insertion successfull MESSAGE s015 WITH scustom-id. ENDIF.

ENDFORM.

Form DEQ_ALL

" DEQ_ALL

Form SAVE

" SAVE

Form SAVE_SCUSTOM

" SAVE_SCUSTOM

Lösungen Kapitel: Datenbankaktualisierungen mit Open SQL Thema: Ändern mehrerer Datensätze Musterlösung

Lösungen

Kapitel: Datenbankaktualisierungen mit Open SQL Thema: Ändern mehrerer Datensätze

Musterlösung SAPBC414S_UPDATE_STRAVELAG

Modulpool

*&-----------------------------------------------------------------*

SAPBC414S_UPDATE_STRAVELAG

*&-----------------------------------------------------------------*

INCLUDE bc414s_update_stravelagtop. INCLUDE bc414s_update_stravelagf01. INCLUDE bc414s_update_stravelago01. INCLUDE bc414s_update_stravelagi01. INCLUDE bc414s_update_stravelage01.

*& Modulpool

*

PROCESS BEFORE OUTPUT. MODULE STATUS_0100.

SCREEN 100

*

fill table control (only agencies, marked on list) LOOP AT ITAB_TRAVEL INTO WA_TRAVEL WITH CONTROL TC_STRAVELAG. MODULE TRANS_TO_DYNPRO. ENDLOOP.

*

PROCESS AFTER INPUT. MODULE EXIT AT EXIT-COMMAND. LOOP AT ITAB_TRAVEL. CHAIN. FIELD: STRAVELAG-STREET, STRAVELAG-POSTBOX, STRAVELAG-POSTCODE, STRAVELAG-CITY, STRAVELAG-COUNTRY, STRAVELAG-REGION, STRAVELAG-TELEPHONE, STRAVELAG-URL, STRAVELAG-LANGU.

* mark datasets, that were changed in table control (subset of all

* agencies, thet were shown on table control)

MODULE SET_MARKER ON CHAIN-REQUEST.

ENDCHAIN.

ENDLOOP.

MODULE SAVE_OK_CODE.

MODULE USER_COMMAND_0100.

TOP Include

*&-----------------------------------------------------------------*

*& Include BC414S_UPDATE_STRAVELAGTOP

*

*&-----------------------------------------------------------------*

PROGRAM sapbc414s_update_stravelag NO STANDARD PAGE HEADING

LINE-SIZE 120

LINE-COUNT 10

MESSAGE-ID bc414.

* Line type definition for internal table itab_travel

TYPES: BEGIN OF stravel_type.

INCLUDE STRUCTURE stravelag.

TYPES:

mark_changed,

END OF stravel_type.

* Standard internal table for travel agency data buffering and

* corresponding workarea

DATA: itab_stravelag LIKE STANDARD TABLE OF stravelag

WITH NON-UNIQUE KEY agencynum,

wa_stravelag TYPE stravelag.

* Workarea for transport of field values from/to screen 100

TABLES: stravelag.

* Transport function code from screen 100

DATA: ok_code TYPE sy-ucomm, save_ok LIKE ok_code.

* Table control structure on screen 100

CONTROLS: tc_stravelag TYPE TABLEVIEW USING SCREEN ’0100’.

* Internal table to collect marked list entries, corresponding

* workarea

DATA: itab_travel TYPE STANDARD TABLE OF stravel_type

WITH NON-UNIQUE KEY agencynum,

wa_travel TYPE stravel_type.

* Mark field displayed as checkbox on list DATA: mark.

* Flags:

DATA: flag,

"changes performed on table control

modify_list. "modification of list buffer is neccessary

* Positions of fields on list

CONSTANTS: pos1 TYPE i VALUE

1,

pos2 TYPE i VALUE

3,

pos3 TYPE i VALUE

14,

pos4 TYPE i VALUE

40,

pos5 TYPE i VALUE

71,

pos6 TYPE i VALUE

82,

pos7 TYPE i VALUE 108.

PBO Module

*------------------------------------------------------------------* ***INCLUDE BC414S_UPDATE_STRAVELAGO01 . *------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

Module STATUS_0100 OUTPUT

*&-----------------------------------------------------------------* MODULE status_0100 OUTPUT. SET PF-STATUS ’DYNPRO’. SET TITLEBAR ’DYNPRO’.

ENDMODULE.

" STATUS_0100 OUTPUT

*&-----------------------------------------------------------------*

*&

Module TRANS_TO_DYNPRO OUTPUT

*&-----------------------------------------------------------------* MODULE trans_to_dynpro OUTPUT.

* Field transport to screen MOVE-CORRESPONDING wa_travel TO stravelag.

ENDMODULE.

" TRANS_TO_DYNPRO OUTPUT

PAI Module

*------------------------------------------------------------------* ***INCLUDE BC414S_UPDATE_STRAVELAGI01 . *------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

Module USER_COMMAND_0100 INPUT

MODULE user_command_0100 INPUT. CASE save_ok. WHEN ’SAVE’. IF flag IS INITIAL.

* enries on table control not changed. SET SCREEN 0. ELSE.

* at least one field on table control changed PERFORM save_changes. SET SCREEN 0. ENDIF. ENDCASE.

ENDMODULE.

" USER_COMMAND_0100 INPUT

*&-----------------------------------------------------------------*

*&

Module SAVE_OK_CODE INPUT

*&-----------------------------------------------------------------* MODULE save_ok_code INPUT. save_ok = ok_code. CLEAR: ok_code.

ENDMODULE.

" SAVE_OK_CODE INPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* MODULE exit INPUT.

Module EXIT INPUT

CASE ok_code. WHEN ’CANCEL’. IF sy-datar IS INITIAL AND flag IS INITIAL.

* no changes performed on screen LEAVE TO SCREEN 0. ELSE.

* at least one field on table control changed. PERFORM popup_to_confirm_loss_of_data. ENDIF. ENDCASE.

ENDMODULE.

" EXIT

INPUT

*&-----------------------------------------------------------------*

*&

Module SET_MARKER INPUT

*&-----------------------------------------------------------------* MODULE set_marker INPUT. MOVE-CORRESPONDING stravelag TO wa_travel. wa_travel-mark_changed = ’X’.

* mark datasets in internal table as modified MODIFY TABLE itab_travel FROM wa_travel.

* at least one dataset is modified in table control flag = ’X’.

ENDMODULE.

" SET_MARKER INPUT

Ereignisse

*------------------------------------------------------------------*

*

* INCLUDE BC414S_UPDATE_STRAVELAGE01

*------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

START-OF-SELECTION.

* Read data from STRAVELAG into internal table ITAB_STRAVELAG PERFORM read_data USING itab_stravelag.

* Write data from ITAB_STRAVELAG on list PERFORM write_data.

Event START-OF-SELECTION

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

TOP-OF-PAGE.

* Write page title and page heading PERFORM write_header.

Event TOP-OF-PAGE

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

END-OF-SELECTION.

* Set PF-Status and Title of list SET PF-STATUS ’LIST’. SET TITLEBAR ’LIST’.

Event END-OF-SELECTION

*&-----------------------------------------------------------------*

*&

Event AT USER-COMMAND

*&-----------------------------------------------------------------* AT USER-COMMAND. CLEAR: modify_list, flag, itab_travel.

* Collect data corresponding to marked lines into internal table PERFORM loop_at_list USING itab_travel.

* Call screen if any line on list was marked CHECK NOT itab_travel IS INITIAL. PERFORM call_screen.

* Modify list buffer if database table was modified -> submit report CHECK NOT modify_list IS INITIAL. SUBMIT (sy-cprog).

FORM-Routinen

*------------------------------------------------------------------* ***INCLUDE BC414S_UPDATE_STRAVELAGF01 . *------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_ITAB_STRAVELAG text

*------------------------------------------------------------------* FORM read_data USING p_itab_stravelag LIKE itab_stravelag. SELECT * FROM stravelag INTO CORRESPONDING FIELDS OF TABLE p_itab_stravelag.

ENDFORM.

Form READ_DATA

" READ_DATA

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

FORM write_data. LOOP AT itab_stravelag INTO wa_stravelag. WRITE AT: /pos1 mark AS CHECKBOX,

Form WRITE_DATA

pos2 wa_stravelag-agencynum COLOR COL_KEY, pos3 wa_stravelag-name, pos4 wa_stravelag-street, pos5 wa_stravelag-postcode, pos6 wa_stravelag-city, pos7 wa_stravelag-country. HIDE: wa_stravelag. ENDLOOP.

ENDFORM.

" WRITE_DATA

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* FORM write_header. WRITE: / ’Travel agency data’(007), AT sy-linsz sy-pagno. ULINE.

Form WRITE_HEADER

FORMAT COLOR COL_HEADING. WRITE AT: /pos2 ’Agency’(001), pos3 ’Name’(002), pos4 ’Street’(003), pos5 ’Postal Code’(004), pos6 ’City’(005), pos7 ’Country’(006).

ULINE.

ENDFORM.

" WRITE_HEADER

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_ITAB_AGNECYNUM text

*------------------------------------------------------------------*

FORM loop_at_list USING p_itab_travel LIKE itab_travel. DO. CLEAR: mark. READ LINE sy-index FIELD VALUE mark. IF sy-subrc <> 0. EXIT. ENDIF. CHECK NOT mark IS INITIAL. APPEND wa_stravelag TO p_itab_travel. ENDDO.

ENDFORM.

Form LOOP_AT_LIST

" LOOP_AT_LIST

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

FORM call_screen.

* Initialize table control on screen

Form CALL_SCREEN

REFRESH CONTROL ’TC_STRAVELAG’ FROM SCREEN ’0100’.

* Show screen in modal dialog box.

CALL SCREEN 100 STARTING AT

5

5

ENDING

AT 80 15.

ENDFORM.

" CALL_SCREEN

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

FORM popup_to_confirm_loss_of_data.

Form POPUP_TO_CONFIRM_LOSS_OF_DATA

DATA answer.

CALL FUNCTION ’POPUP_TO_CONFIRM_LOSS_OF_DATA’

EXPORTING

textline1 = ’Cancel processing of travel agencies?’(008)

titel

= ’Cancel processing’(009)

IMPORTING

answer

= answer.

CASE answer.

WHEN ’J’.

LEAVE TO SCREEN 0.

WHEN ’N’.

LEAVE TO SCREEN ’0100’.

ENDCASE.

ENDFORM.

POPUP_TO_CONFIRM_LOSS_OF_DATA

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

FORM save_changes.

* declare internal table and workarea of same linetype as DB table

"

Form SAVE_CHANGES

DATA: itab TYPE STANDARD TABLE OF stravelag,

wa LIKE LINE OF itab.

* search for datasets changed on the screen

LOOP AT itab_travel INTO wa_travel

WHERE mark_changed = ’X’.

* fill workarea fitting to DB table

MOVE-CORRESPONDING wa_travel TO wa.

* fill corresponding internal table

APPEND wa TO itab.

ENDLOOP.

* mass update on stravelag -> best performance

UPDATE stravelag FROM TABLE itab.

* check success

IF sy-subrc = 0.

* all datasets are successfully updated

MESSAGE s030.

ELSE.

* at least one dataset from the internal table could not be updated

* on the database table

MESSAGE i048.

ENDIF.

* Flag: List does not show correct data any more

modify_list = ’X’.

ENDFORM.

" SAVE_CHANGES

LUWs und Client-Server-Architektur
LUWs und Client-Server-Architektur

Inhalt:

SAP-LUW

Datenbank-LUW

Konsequenzen der Client-Server-Architektur

SAP AG 2001

LUWs und Client-Server-Architektur: Lernziele des Kapitels
LUWs und Client-Server-Architektur:
Lernziele des Kapitels
LUWs und Client-Server-Architektur: Lernziele des Kapitels  SAP AG 2001 Am Ende dieses Kapitels können Sie:

SAP AG 2001

Am Ende dieses Kapitels können Sie:

die Begriffe Datenbank-LUW und SAP-LUW erklären

erklären, warum Sie in der Client-Server-Architektur des R/3-Systems zusammen gehörige Änderungen an Datenbanktabellen bündeln müssen

Sie in der Client-Server-Architektur des R/3-Systems zusammen gehörige Änderungen an Datenbanktabellen bündeln müssen
Übersichtsdiagramm - LUWs
Übersichtsdiagramm - LUWs
LUWs und Client- Server-Architektur 3 Client-LUWs LUWs und und Client- Server-ArchitekturServer-Architektur
LUWs und Client-
Server-Architektur
3
Client-LUWs
LUWs und
und Client-
Server-ArchitekturServer-Architektur

SAP AG 2001

SAP-LUW (Logical Unit of Work )
SAP-LUW (Logical Unit of Work )
SAP-LUW (logisch zusammen gehörige Änderungen) Änderungen auf der Datenbank Änderung 1 Änderung 2 . .

SAP-LUW

(logisch zusammen gehörige Änderungen)

Änderungen auf der Datenbank Änderung 1 Änderung 2 . . . Änderung n
Änderungen auf der Datenbank
Änderung 1
Änderung 2
.
.
.
Änderung n
Alles-oder-Nichts-Prinzip !
Alles-oder-Nichts-Prinzip !

SAP AG 2001

Eine SAP-LUW (Logical Unit of Work) besteht aus logisch zusammen gehörigen Änderungen im R/3-System, von denen entweder alle oder gar keine durchgeführt werden ("Alles-oder-Nichts- Prinzip").

Im Allgemeinen wird ein betriebswirtschaftlicher Vorgang nicht durch eine einzige SAP-LUW abgewickelt. Das Eingehen einer Kundenbestellung bis zur Erstellung der Faktura z.B. wird in logisch separat auszuführende Teile zerlegt, die jeweils einer SAP-LUW entsprechen. Die Definition von SAP-LUWs hängt vom Gesamtvorgang und dessen Modellierung ab.

Weitere Informationen hierzu finden Sie in der Schlüsselwortdokumentation im ABAP-Editor zum Begriff Transaktionsverarbeitung.

Datenbank-LUW
Datenbank-LUW

"versiegelter"

Zwischenzustände Zustand Änderung 1 Änderung 2 . . .
Zwischenzustände
Zustand
Änderung 1
Änderung 2
.
.
.

Rollback

möglich

neuer

"versiegelter"

Zustand Änderung n
Zustand
Änderung n

DB-Commit

(kein Rollback

mehr möglich)

g l i c h neuer "versiegelter" Zustand Änderung n DB-Commit (kein Rollback mehr möglich) 

SAP AG 2001

g l i c h neuer "versiegelter" Zustand Änderung n DB-Commit (kein Rollback mehr möglich) 

Eine Datenbank-LUW besteht aus allen Änderungen, die bis zum "Versiegeln" des Datenbank- zustands (DB-Commit) durchgeführt werden.

Innerhalb einer Datenbank-LUW ist jederzeit ein Verwerfen aller bis dahin durchgeführten Änderungen möglich (DB-Rollback), wodurch der Datenbankzustand vor der aktuellen Datenbank- LUW wieder erreicht wird. Solch ein DB-Rollback wird genutzt, um im Fehlerfall den vorhergehenden (konsistenten) Datenbankzustand wieder herzustellen.

Durch einen DB-Commit wird der aktuelle Datenbankzustand "versiegelt". Danach ist kein Verwerfen der aktuellen Datenbank-LUW mehr möglich.

Über die ABAP-Anweisungen ROLLBACK WORK und COMMIT WORK können Sie explizit einen DB-Rollback bzw. DB-Commit realisieren. Es gibt jedoch auch Situationen, in denen ein DB- Commit implizit abgesetzt wird (siehe nachfolgende Folien) !

Weitere Informationen hierzu finden Sie in der Schlüsselwortdokumentation im ABAP-Editor zum Begriff Transaktionsverarbeitung.

SAP-LUW innerhalb einer DB-LUW realisieren
SAP-LUW innerhalb einer DB-LUW realisieren
SAP-LUW Änderung 1 Änderung 2 . . . Änderung n
SAP-LUW
Änderung 1
Änderung 2
.
.
.
Änderung n
SAP-LUW Änderung 1 Änderung 2 . . . Änderung n "versiegelter" Zustand neuer "versiegelter"
SAP-LUW Änderung 1 Änderung 2 . . . Änderung n "versiegelter" Zustand neuer "versiegelter"
SAP-LUW Änderung 1 Änderung 2 . . . Änderung n "versiegelter" Zustand neuer "versiegelter"

"versiegelter"

Zustand

neuer

"versiegelter"

Zustand

SAP AG 2001

Um während der Abarbeitung einer SAP-LUW jederzeit im Fehlerfall auf den konsistenten Datenbankzustand vor Beginn der SAP-LUW zurückkehren zu können, muß die SAP-LUW innerhalb einer DB-LUW prozessiert werden.

Dies erweist sich jedoch aufgrund der Client-Server-Architektur des R/3-Systems als nicht trivial, da eine R/3-Transaktion meist mehrere Dynpros zur Eingabe der Änderungsdaten besitzt und bei Dynpro-Wechsel stets automatisch vom System ein impliziter DB-Commit abgesetzt wird (siehe nachfolgende Folien). Dennoch muß in einer Transaktion erreicht werden, dass Benutzereingaben, die eine SAP-LUW bilden, gebündlet innerhalb einer DB-LUW auf die Datenbank geschrieben werden.

Client-Server-Architektur des R/3-Systems SAPGUI SAPGUI SAPGUI SAPGUI Dispatcher Work- Work- Work- prozess
Client-Server-Architektur des R/3-Systems
SAPGUI
SAPGUI
SAPGUI
SAPGUI
Dispatcher
Work- Work-
Work-
prozess
prozess
prozess
Datenbank-
Workprozesse

SAP AG 2001

Das SAP R/3-System basiert auf der Drei-Ebenen-Architektur eines Client-Server-Systems. Es besteht aus den drei Ebenen Datenbank, Applikationsserver und Präsentationsserver.

Durch die Wahl dieser Architektur mit dem Verteilen von Benutzeranfragen (Userdispatching) ist es möglich, ein hocheffizientes, kostengünstiges Mehrbenutzersystem zu realisieren.

Die Drei-Ebenen-Architektur erlaubt es, eine große Anzahl von Benutzern mit preiswerten Endgeräten (ohne besondere Performanceanforderungen) auf eine kleine Anzahl von Workprozessen auf teueren und schnellen Applikationsservern abzubilden. Jedem Workprozeß eines Applikationsservers ist ein Workprozeß auf einem (teueren) Datenbankserver zugeordnet.

Beim Verteilen von Benutzeranfragen auf Workprozesse werden die einzelnen Clients auf der Präsentationsserverebene für bestimmte Zeitintervalle einem Workprozeß zugeordnet, der seinerseits für diese Zeitdauer einen Workprozeß der Datenbank nutzt. Nach der Verarbeitung der Benutzereingaben eines Dialogschritts wird der Benutzer mit seinem Benutzer- und Programmkontext aus dem Workprozeß "herausgerollt" und der Workprozeß kann von einem anderen Benutzer verwendet werden.

Die 3-Ebenen-Architektur hat sich als deutlich skalierbarer (hinzufügen von weiteren Benutzern) herausgestellt als eine "Fat"-Client-Architektur, bei der die Präsentationsebene und die Anwendungsebene auf einem Server ablaufen. Bei der Drei-Ebenen-Architektur ist die Zahl der Datenbankbenutzer erheblich geringer als die der am System aktiven Benutzer. Dies wirkt sich günstig auf das Verhalten der Datenbank aus.

Implizite DB-Commits
Implizite DB-Commits
Bildschirm 1 Bildschirm 2 Bildschirm 3 . . . . . . DB-Commit DB-Commit DB-Commit
Bildschirm 1
Bildschirm 2
Bildschirm 3
.
.
.
.
.
.
DB-Commit
DB-Commit
DB-Commit
.
.
.
Bildschirm 3 . . . . . . DB-Commit DB-Commit DB-Commit . . . DB-LUW 1
Bildschirm 3 . . . . . . DB-Commit DB-Commit DB-Commit . . . DB-LUW 1
Bildschirm 3 . . . . . . DB-Commit DB-Commit DB-Commit . . . DB-LUW 1
Bildschirm 3 . . . . . . DB-Commit DB-Commit DB-Commit . . . DB-LUW 1

DB-LUW 1

DB-LUW 2

DB-LUW 3

Zeit

SAP AG 2001

Vor Anzeige eines jeden Bildschirmbilds wird der aktuell belegte Workprozess auf dem Applikationsserver freigegeben, was auch die Freigabe des zugehörigen Datenbank-Workprozess bewirkt und automatisch einen impliziten Datenbank-Commit auslöst.

Die Freigabe des Workprozesses vor jedem Benutzerdialog gewährleistet, dass die meist länger andauernden Benutzeraktionen keine Workprozesse auf dem Applikationsserver und vor allem auf dem Datenbankserver blockieren, was eine geringere Belastung der Datenbankresourcen bewirkt. Erst nach abgeschlossener Bearbeitung des Dynpros durch den Benutzer, wo eine programmseitige Verarbeitung ansteht, wird der Benutzer samt Programmkontext wieder "hereingerollt", d.h. wieder in einen Workprozess zur Abarbeitung geladen.

Implizite DB-Commits werden immer dann ausgelöst, wenn das Programm warten muß, z.B. bei :

- Senden eines SAP-Bildschirmbildes

- Senden einer Dialognachricht

- Synchronen und asynchronen RFC-Aufrufen (Remote Function Call)

- Anweisungen CALL TRANSACTION <t_code> oder SUBMIT <program> .

Wegen der oben erläuterten impliziten DB-Commits dürfen Änderungen, die zu einer SAP- LUW gehören, nicht in verschiedenen Dialogschritten ( Dialogschritt = programmseitige Verarbeitung nach einem Dynpro) plaziert werden, da sie sich dadurch nicht innerhalb einer DB-LUW befinden würden !

LUWs und Client-Server-Architektur : Zusammenfassung des Kapitels
LUWs und Client-Server-Architektur :
Zusammenfassung des Kapitels
Client-Server-Architektur : Zusammenfassung des Kapitels  SAP AG 2001 Sie können nun: die Begriffe Datenbank-LUW

SAP AG 2001

Sie können nun:

die Begriffe Datenbank-LUW und SAP-LUW erklären

erklären, warum Sie in der Client-Server-Architektur des R/3-Systems zusammen gehörige Änderungen an Datenbanktabellen bündeln müssen

Übungen

Kapitel: LUW-KonzepteÜbungen Am Ende dieser Übungen können Sie: • Funktionsbausteine und Unterprogramme hinsichtlich ihrer Tauglichkeit

Übungen Kapitel: LUW-Konzepte Am Ende dieser Übungen können Sie: • Funktionsbausteine und Unterprogramme

Am Ende dieser Übungen können Sie:

Funktionsbausteine und Unterprogramme hinsichtlich ihrer Tauglichkeit für die Realisierung einer LUW-Verarbeitung beurteilen.

für die Realisierung einer LUW-Verarbeitung beurteilen. Das Programm SAPBC414T_BOOKINGS_01 bietet die

Das Programm SAPBC414T_BOOKINGS_01 bietet die Möglichkeit, Buchungen auf einen Flug zu stornieren. Hierzu können entsprechende Buchungen auf dem Dynpro 200 zum Stornieren markierten werden.

Realisieren Sie den Datenbankdialog:

Durch das Drücken der Sichern-Ikone (Funktionscode SAVE) auf dem Dynpro 200 sollen die markierten Buchungen auf der Tabelle SBOOK geändert werden. Außerdem muß innerhalb der gleichen Datenbank- LUW der entsprechende Flug in der Tabelle SFLIGHT modifiziert werden (Buchungssumme und Anzahl der belegten Plätze ändern sich durch die Stornierung), da die Änderung der Datensätze beider Datenbanktabellen mit dem "Alles-oder-Nichts"-Prinzip erfolgen muß. Zur Änderung sollen vorhandene Funktionsbausteine verwendet werden.

sollen vorhandene Funktionsbausteine verwendet werden. Programm: SAPMZ##_BOOKINGS1 Transaktionscode:

Programm:

SAPMZ##_BOOKINGS1

Transaktionscode:

Z##_BOOKINGS1

Kopiervorlage:

SAPBC414T_BOOKINGS_01

Musterlösung:

SAPBC414S_BOOKINGS_01

1-1

Kopieren Sie die Programmvorlage SAPBC414T_BOOKINGS_01 mit allen Teilobjekten auf SAPMZ##_BOOKINGS1 (## ist die Gruppennummer) und ordnen Sie dem Programm den Transaktionscode Z##_BOOKINGS1 zu. Machen Sie sich mit dem Funktionsumfang des Programms vertraut.

1-2

Die ABAP-Anweisungen für die Datenbankänderungen sollen im Unterprogramm SAVE_MODIFIED_BOOKING , welches aus dem PAI-Modul USER_COMMAND_0200 (Dynpro 200) gerufen wird, gekapselt werden.

Die Datenbankänderung sollen mittels vorhandener Funktionsbausteine durchgeführt werden. Zur Auswahl stehen pro Tabelle zwei Funktionsbausteine :

UPDATE_SBOOK , UPDATE_SBOOK_A , UPDATE_SFLIGHT und UPDATE_SFLIGHT_A . Durch die Kombination der richtigen Funktionsbausteine in der richtigen Aufrufreihenfolge soll sichergestellt werden, daß im Fehlerfall die Konsistenz der Daten auf den beteiligten Datenbanktabellen gewahrt bleibt.

1-2-1

In welcher Reihenfolge müssen welche Funktionsbausteine gerufen werden? Untersuchen Sie hierzu den Quellcode der Funktionsbausteine auf ABAP- Anweisungen, welche die Datenbank-LUW vorzeitig beenden und damit zum Festschreiben inkonsistenter Daten auf den Tabellen führen können.

1-2-2

Rufen Sie die Funktionsbausteine in der entsprechenden Reihenfolge aus dem Unterprogramm SAVE_MODIFIED_BOOKING auf.

1-2-3

Behandeln Sie die Ausnahmen der Funktionsbausteine. Als mögliche Benutzernachrichten eignen sich:

Flug / Buchungen aktualisiert

Nachricht 034

Fehler beim Aktualisieren Flug / Buchung

Nachricht 044

Änderungen nicht erfolgreich

Nachricht 048

Flug ausgebucht oder überbucht

Nachricht 045

Flug existiert nicht

Nachricht 046

045 Flug existiert nicht ⇒ Nachricht 046 Die auf der Datenbanktabelle SBOOK zu ändernden

Die auf der Datenbanktabelle SBOOK zu ändernden Datensätze sind in der internen Tabelle ITAB_SBOOK_MODIFY gepuffert.

Die Schlüsselfelder des korrespondierenden Flugs sind über die Feldleiste WA_SFLIGHT abgreifbar.

Verwenden Sie die bei den Übungen zum vorigen Kapitel angegebene Grafik, um sich über den Funktionsumfang der Kopiervorlage zu informieren.Schlüsselfelder des korrespondierenden Flugs sind über die Feldleiste WA_SFLIGHT abgreifbar. © SAP AG BC414 3-11

Kapitel: LUW Konzepte Lösungen Musterlösung SAPBC414S_BOOKINGS_01 Modulpool

Kapitel: LUW Konzepte

Lösungen

Musterlösung SAPBC414S_BOOKINGS_01

Modulpool

*&-----------------------------------------------------------------*

*& Modulpool

*&-----------------------------------------------------------------* INCLUDE BC414S_BOOKINGS_01TOP. INCLUDE BC414S_BOOKINGS_01O01. INCLUDE BC414S_BOOKINGS_01I01. INCLUDE BC414S_BOOKINGS_01F01. INCLUDE BC414S_BOOKINGS_01F02. INCLUDE BC414S_BOOKINGS_01F03. INCLUDE BC414S_BOOKINGS_01F04. INCLUDE BC414S_BOOKINGS_01F05. INCLUDE BC414S_BOOKINGS_01F06.

*

SAPBC414S_BOOKINGS_01

SCREEN 100

PROCESS BEFORE OUTPUT. MODULE STATUS_0100.

*

PROCESS AFTER INPUT. MODULE EXIT AT EXIT-COMMAND. MODULE SAVE_OK_CODE. CHAIN. * cancel booking: check if flight exists or flight can be created FIELD: SDYN_CONN-CARRID, SDYN_CONN-CONNID, SDYN_CONN-FLDATE. MODULE USER_COMMAND_0100. ENDCHAIN.

PROCESS BEFORE OUTPUT.

SCREEN 200

MODULE STATUS_0200.

MODULE TRANS_DETAILS.

CALL SUBSCREEN SUB1 INCLUDING SY-CPROG ’0201’.

LOOP AT ITAB_BOOK INTO WA_BOOK WITH CONTROL TC_SBOOK.

MODULE TRANS_TO_TC.

* allow only modification of bookings, that are not allready cancelled

MODULE MODIFY_SCREEN.

ENDLOOP.

*

PROCESS AFTER INPUT.

LOOP AT ITAB_BOOK.

* mark changed bookings in internal table itab_book

FIELD SDYN_BOOK-CANCELLED MODULE MODIFY_ITAB ON REQUEST.

ENDLOOP.

MODULE EXIT AT EXIT-COMMAND.

MODULE SAVE_OK_CODE.

MODULE USER_COMMAND_0200.

PROCESS BEFORE OUTPUT.

PROCESS AFTER INPUT.

PROCESS BEFORE OUTPUT.

SCREEN 201

SCREEN 300

MODULE STATUS_0300.

MODULE TABSTRIP_INIT.

MODULE TRANS_DETAILS.

CALL SUBSCREEN TAB_SUB INCLUDING SY-CPROG SCREEN_NO.

*

PROCESS AFTER INPUT.

CALL SUBSCREEN TAB_SUB.

MODULE EXIT AT EXIT-COMMAND.

MODULE SAVE_OK_CODE.

MODULE TRANS_FROM_0300.

MODULE USER_COMMAND_0300.

PROCESS BEFORE OUTPUT. * MODULE HIDE_BOOKID. PROCESS AFTER INPUT.

PROCESS BEFORE OUTPUT. PROCESS AFTER INPUT.

PROCESS BEFORE OUTPUT. PROCESS AFTER INPUT.

SCREEN 301

SCREEN 302

SCREEN 303

TOP Include

*&-----------------------------------------------------------------*

*& Include BC414S_BOOKINGS_01TOP

*&-----------------------------------------------------------------*

PROGRAM sapbc414s_bookings_01 MESSAGE-ID bc414.

*

* line type of internal table itab_book, used to display bookings in

* table control

TYPES: BEGIN OF wa_book_type.

INCLUDE: STRUCTURE sbook.

TYPES:

name TYPE scustom-name,

mark,

END OF wa_book_type.

* work area and internal table used to display bookings in table

* control

DATA: wa_book TYPE wa_book_type,

itab_book TYPE TABLE OF wa_book_type.

* bookings to be modified on database table

DATA: itab_sbook_modify TYPE TABLE OF sbook.

* change documents: bookings before changes are performed

DATA: itab_cd TYPE TABLE OF sbook WITH NON-UNIQUE KEY

carrid connid fldate bookid customid.

* work areas for database tables spfli, sflight, sbook.

DATA: wa_sbook TYPE sbook, wa_sflight TYPE sflight, wa_spfli TYPE spfli.

* complex transactions: number of the customer created in the called

* transaction

data: scust_id(20).

* transport function codes from screens

DATA: ok_code TYPE sy-ucomm, save_ok LIKE ok_code.

* define subscreen screen number on tabstrip, screen 300

DATA: screen_no TYPE sy-dynnr.

* used to handle sy-subrc, which is determined in form

DATA sysubrc LIKE sy-subrc.

* transporting fields to/from screen

TABLES: sdyn_conn, sdyn_book.

* table control declaration (display bookings),

* tabstrip declaration (create booking)

CONTROLS: tc_sbook TYPE TABLEVIEW USING SCREEN ’0200’,

tab TYPE TABSTRIP.

PBO Module

*------------------------------------------------------------------* ***INCLUDE BC414S_BOOKINGS_01O01 . *------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

Module STATUS_0100 OUTPUT

*&-----------------------------------------------------------------* MODULE status_0100 OUTPUT. SET PF-STATUS ’DYN_100’. SET TITLEBAR ’DYN_100’.

ENDMODULE.

" STATUS_0100 OUTPUT

*&-----------------------------------------------------------------*

*&

Module STATUS_0200 OUTPUT

*&-----------------------------------------------------------------* MODULE status_0200 OUTPUT. SET PF-STATUS ’DYN_200’. SET TITLEBAR ’DYN_200’ WITH sdyn_conn-carrid sdyn_conn-connid sdyn_conn-fldate.

ENDMODULE.

" STATUS_0200 OUTPUT

*&-----------------------------------------------------------------*

*&

Module STATUS_0300 OUTPUT

*&-----------------------------------------------------------------* MODULE status_0300 OUTPUT. SET PF-STATUS ’DYN_300’. SET TITLEBAR ’DYN_300’ WITH sdyn_conn-carrid sdyn_conn-connid sdyn_conn-fldate.

ENDMODULE.

" STATUS_0300 OUTPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* MODULE trans_details OUTPUT.

Module TRANS_DETAILS OUTPUT

MOVE-CORRESPONDING: wa_spfli

TO sdyn_conn,

ENDMODULE.

wa_sflight TO sdyn_conn,

wa_sbook

TO sdyn_book. " TRANS_DETAILS OUTPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* MODULE trans_to_tc OUTPUT.

Module TRANS_TO_TC OUTPUT

MOVE-CORRESPONDING wa_book TO sdyn_book.

ENDMODULE.

" TRANS_TO_TC OUTPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

Module MODIFY_SCREEN OUTPUT

MODULE modify_screen OUTPUT.

LOOP AT SCREEN.

CHECK screen-name = ’SDYN_BOOK-CANCELLED’.

CHECK ( NOT sdyn_book-cancelled IS INITIAL ) AND

( sdyn_book-mark IS INITIAL ).

screen-input = 0.

MODIFY SCREEN.

ENDLOOP.

ENDMODULE.

" MODIFY_SCREEN OUTPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

Module TABSTRIP_INIT OUTPUT

MODULE tabstrip_init OUTPUT.

CHECK tab-activetab IS INITIAL.

tab-activetab = ’BOOK’.

screen_no = ’0301’.

ENDMODULE.

" TABSTRIP_INIT OUTPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

Module HIDE_BOOKID OUTPUT

MODULE hide_bookid OUTPUT.

* hide field displaying customer number when working with number range

* object BS_SCUSTOM

LOOP AT SCREEN.

CHECK screen-name = ’SDYN_BOOK-BOOKID’.

screen-active = 0.

MODIFY SCREEN.

ENDLOOP.

ENDMODULE.

" HIDE_BOOKID OUTPUT

PAI Module

*------------------------------------------------------------------* ***INCLUDE BC414S_BOOKINGS_01I01 . *------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

Module EXIT INPUT

*&-----------------------------------------------------------------* MODULE exit INPUT. CASE ok_code. WHEN ’CANCEL’. CASE sy-dynnr. WHEN ’0100’. LEAVE PROGRAM. WHEN ’0200’. LEAVE TO SCREEN ’0100’. WHEN ’0300’. LEAVE TO SCREEN ’0100’. WHEN OTHERS. ENDCASE. WHEN ’EXIT’. LEAVE PROGRAM. WHEN OTHERS. ENDCASE.

ENDMODULE.

" EXIT

INPUT

*&-----------------------------------------------------------------*

*&

Module SAVE_OK_CODE INPUT

*&-----------------------------------------------------------------* MODULE save_ok_code INPUT. save_ok = ok_code. CLEAR ok_code.

ENDMODULE.

" SAVE_OK_CODE INPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

Module USER_COMMAND_0100 INPUT

MODULE user_command_0100 INPUT. CASE save_ok.

****************************CANCEL BOOKING************************** WHEN ’BOOKC’. PERFORM read_sflight USING wa_sflight sysubrc.

* process returncode - if flight does not exist: e-message PERFORM process_sysubrc_bookc. PERFORM read_spfli USING wa_spfli. PERFORM read_sbook USING itab_book itab_cd. REFRESH CONTROL ’TC_SBOOK’ FROM SCREEN ’0200’. ****************************CREATE BOOKING************************** WHEN ’BOOKN’. PERFORM read_sflight USING wa_sflight sysubrc.

* process returncode - if flight does not exist: e-message PERFORM process_sysubrc_bookn. PERFORM read_spfli USING wa_spfli. PERFORM initialize_sbook USING wa_sbook. WHEN ’BACK’. SET SCREEN 0. WHEN OTHERS. SET SCREEN ’0100’. ENDCASE.

ENDMODULE.

" USER_COMMAND_0100 INPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* MODULE user_command_0200 INPUT. CASE save_ok. WHEN ’SAVE’.

Module USER_COMMAND_0200 INPUT

* collect marked (changed) data sets in seperate internal table PERFORM collect_modified_data USING itab_sbook_modify.

* perform database changes PERFORM save_modified_booking. SET SCREEN ’0100’. WHEN ’BACK’. SET SCREEN ’0100’. WHEN OTHERS. SET SCREEN ’0200’.

ENDCASE.

ENDMODULE.

" USER_COMMAND_0200 INPUT

*&-----------------------------------------------------------------*

*&

Module MODIFY_ITAB INPUT

*&-----------------------------------------------------------------* MODULE modify_itab INPUT. wa_book-cancelled = sdyn_book-cancelled. wa_book-mark = ’X’. MODIFY itab_book FROM wa_book INDEX tc_sbook-current_line.

ENDMODULE.

" MODIFY_ITAB INPUT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

Module USER_COMMAND_0300 INPUT

MODULE user_command_0300 INPUT. PERFORM tabstrip_set. CASE save_ok. WHEN ’NEW_CUSTOM’. PERFORM create_new_customer. SET SCREEN ’0300’. WHEN ’SAVE’. PERFORM save_new_booking. SET SCREEN ’0100’. WHEN ’BACK’. SET SCREEN ’0100’. WHEN OTHERS. SET SCREEN ’0300’. ENDCASE. ENDMODULE.

" USER_COMMAND_0300 INPUT

*&-----------------------------------------------------------------*

*&

Module TRANS_FROM_0300 INPUT

*&-----------------------------------------------------------------* MODULE trans_from_0300 INPUT. MOVE-CORRESPONDING sdyn_book TO wa_sbook.

ENDMODULE.

" TRANS_FROM_0300 INPUT

FORM Routinen

F01

*------------------------------------------------------------------* ***INCLUDE BC414S_BOOKINGS_01F01 . *------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_ITAB_SBOOK_MODIFY text

*------------------------------------------------------------------*

FORM collect_modified_data USING p_itab_sbook_modify LIKE itab_sbook_modify. DATA: wa_book LIKE LINE OF itab_book, wa_sbook_modify LIKE LINE OF p_itab_sbook_modify. CLEAR: p_itab_sbook_modify.

* Only bookings are collected, that

* 1) have been changed (mark = ’X’)

* 2) shall be cancelled (cancelled = ’X’) LOOP AT itab_book INTO wa_book

Form COLLECT_MODIFIED_DATA

WHERE

AND cancelled = ’X’.

mark = ’X’

MOVE-CORRESPONDING wa_book TO wa_sbook_modify. APPEND wa_sbook_modify TO p_itab_sbook_modify. ENDLOOP.

ENDFORM.

" COLLECT_MODIFIED_DATA

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_WA_SBOOK text

*------------------------------------------------------------------* FORM initialize_sbook USING p_wa_sbook TYPE sbook. CLEAR p_wa_sbook. MOVE-CORRESPONDING wa_sflight TO p_wa_sbook.

Form INITIALIZE_SBOOK

MOVE: wa_sflight-price

TO p_wa_sbook-forcurram,

wa_sflight-currency TO p_wa_sbook-forcurkey,

sy-datum

TO p_wa_sbook-order_date.

ENDFORM.

" INITIALIZE_SBOOK

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

FORM process_sysubrc_bookc.

Form PROCESS_SYSUBRC_BOOKC

CASE sysubrc.

WHEN 0.

SET SCREEN ’0200’.

WHEN OTHERS.

MESSAGE e023 WITH sdyn_conn-carrid sdyn_conn-connid

ENDCASE.

ENDFORM.

sdyn_conn-fldate.

" PROCESS_SYSUBRC_BOOKC

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

FORM process_sysubrc_bookn.

Form PROCESS_SYSUBRC_BOOKN

CASE sysubrc.

WHEN 0.

SET SCREEN ’0300’.

WHEN OTHERS.

MESSAGE e023 WITH sdyn_conn-carrid sdyn_conn-connid

ENDCASE.

ENDFORM.

sdyn_conn-fldate.

" PROCESS_SYSUBRC_BOOKN

*&-------------------------------------------------------------------

--*

*&

Form TABSTRIP_SET

*&-------------------------------------------------------------------

--*

FORM tabstrip_set.

IF save_ok = ’BOOK’ OR save_ok = ’DETCON’ OR save_ok = ’DETFLT’. tab-activetab = save_ok. ENDIF. CASE save_ok. WHEN ’BOOK’. screen_no = ’0301’. WHEN ’DETCON’. screen_no = ’0302’. WHEN ’DETFLT’. screen_no = ’0303’. ENDCASE.

ENDFORM.

" TABSTRIP_SET

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

FORM create_new_customer.

********************** TO BE IMPLEMENTED LATER *********************

ENDFORM.

Form CREATE_NEW_CUSTOMER

" CREATE_NEW_CUSTOMER

*&-----------------------------------------------------------------* *& Form NUMBER_GET_NEXT *&-----------------------------------------------------------------* FORM number_get_next USING p_wa_sbook LIKE sbook. ********************** TO BE IMPLEMENTED LATER *********************

ENDFORM.

" NUMBER_GET_NEXT

F02

*------------------------------------------------------------------*

* INCLUDE BC414S_BOOKINGS_01F02

*------------------------------------------------------------------*

*------------------------------------------------------------------*

* FORM ENQ_SFLIGHT

*------------------------------------------------------------------* FORM enq_sflight. ********************* TO BE IMPLEMENTED LATER **********************

ENDFORM.

"ENQ_SFLIGHT

*------------------------------------------------------------------*

* FORM ENQ_SBOOK

*------------------------------------------------------------------* FORM enq_sbook.

********************* TO BE IMPLEMENTED LATER **********************

ENDFORM.

"ENQ_SBOOK

*------------------------------------------------------------------*

* FORM ENQ_SFLIGHT_SBOOK

*------------------------------------------------------------------* FORM enq_sflight_sbook.

********************* TO BE IMPLEMENTED LATER **********************

ENDFORM.

"ENQ_SFLIGHT_SBOOK

*------------------------------------------------------------------*

* FORM DEQ_ALL

*------------------------------------------------------------------*

FORM deq_all. ********************* TO BE IMPLEMENTED LATER **********************

ENDFORM.

"DEQ_ALL

F03

*------------------------------------------------------------------*

* INCLUDE BC414S_BOOKINGS_01F03

*------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_WA_SFLIGHT text

* -->P_SYSUBRC

*------------------------------------------------------------------* FORM read_sflight USING p_wa_sflight TYPE sflight p_sysubrc LIKE sy-subrc. SELECT SINGLE * FROM sflight INTO p_wa_sflight WHERE carrid = sdyn_conn-carrid

Form READ_SFLIGHT

text

AND

connid = sdyn_conn-connid

AND

fldate = sdyn_conn-fldate.

p_sysubrc = sy-subrc. ENDFORM.

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_ITAB_BOOK text

* -->P_ITAB_CD

*------------------------------------------------------------------* FORM read_sbook USING p_itab_book LIKE itab_book

" READ_SFLIGHT

Form READ_SBOOK

text

p_itab_cd

LIKE itab_cd.

TYPES: BEGIN OF wa_custom_type, id TYPE scustom-id, name TYPE scustom-name, END OF wa_custom_type. DATA: wa_custom TYPE wa_custom_type,

itab_custom TYPE STANDARD TABLE OF wa_custom_type WITH NON-UNIQUE KEY id, wa_book LIKE LINE OF p_itab_book,

wa_cd

LIKE LINE OF p_itab_cd.

CLEAR: p_itab_book, p_itab_cd.

* Select customer names in buffer table (array fetch)

SELECT id name FROM scustom INTO CORRESPONDING FIELDS

OF TABLE itab_custom.

* Select all bookings on selected flight (array fetch)

SELECT * FROM sbook INTO CORRESPONDING FIELDS OF TABLE p_itab_book

WHERE carrid = sdyn_conn-carrid

AND

connid = sdyn_conn-connid

AND

fldate = sdyn_conn-fldate.

* read customer names corresponding to customer number from buffer

* table

LOOP AT p_itab_book INTO wa_book.

READ TABLE itab_custom INTO wa_custom WITH TABLE KEY

id = wa_book-customid.

wa_book-name = wa_custom-name.

MODIFY p_itab_book FROM wa_book.

MOVE-CORRESPONDING wa_book TO wa_cd.

APPEND wa_cd TO p_itab_cd.

ENDLOOP.

SORT p_itab_book BY bookid customid.

ENDFORM.

" READ_SBOOK

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_WA_SPFLI text

*------------------------------------------------------------------*

FORM read_spfli USING p_wa_spfli TYPE spfli.

Form READ_SPFLI

SELECT SINGLE * FROM spfli INTO p_wa_spfli

WHERE carrid = sdyn_conn-carrid

AND

connid = sdyn_conn-connid.

IF sy-subrc <> 0.

MESSAGE e022 WITH sdyn_conn-carrid sdyn_conn-connid.

ENDIF.

ENDFORM.

" READ_SPFLI

F04

*------------------------------------------------------------------*

* INCLUDE BC414S_BOOKINGS_01F04

*------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* FORM save_modified_booking. * Modify data on database tables sbook and sflight CALL FUNCTION ’UPDATE_SBOOK’ EXPORTING

Form SAVE_MODIFIED_BOOKING

itab_sbook

= itab_sbook_modify

EXCEPTIONS update_failure = 1

OTHERS

= 2.

CASE sy-subrc. WHEN 0. PERFORM update_sflight. WHEN OTHERS. MESSAGE a044 WITH wa_sflight-carrid wa_sflight-connid wa_sflight-fldate.

ENDCASE.

ENDFORM.

" SAVE_MODIFIED_BOOKING

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

FORM update_sflight. CALL FUNCTION ’UPDATE_SFLIGHT’ EXPORTING

Form UPDATE_SFLIGHT

carrier

connection

date

EXCEPTIONS

= wa_sflight-carrid = wa_sflight-connid = wa_sflight-fldate

update_failure

flight_full

flight_not_found = 3

OTHERS

= 1

= 2

= 4.

CASE sy-subrc. WHEN 0. MESSAGE s034 WITH wa_sflight-carrid wa_sflight-connid wa_sflight-fldate.

WHEN 1. MESSAGE a044 WITH wa_sflight-carrid wa_sflight-connid wa_sflight-fldate.

WHEN 2. MESSAGE a045. WHEN 3. MESSAGE a046. WHEN OTHERS. MESSAGE a048. ENDCASE. ENDFORM.

" UPDATE_SFLIGHT

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

FORM save_new_booking.

********************* TO BE IMPLEMENTED LATER **********************

ENDFORM.

Form SAVE_NEW_BOOKING

" SAVE_NEW_BOOKING

F05

*------------------------------------------------------------------*

* INCLUDE BC414S_BOOKINGS_01F05

*------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------*

* -->P_WA_SBOOK text

*------------------------------------------------------------------*

FORM convert_to_loc_currency USING p_wa_sbook TYPE sbook. SELECT SINGLE currcode FROM scarr INTO p_wa_sbook-loccurkey WHERE carrid = p_wa_sbook-carrid. CALL FUNCTION ’CONVERT_TO_LOCAL_CURRENCY_N’ EXPORTING

Form CONVERT_TO_LOC_CURRENCY

client

= sy-mandt

date

= sy-datum

foreign_amount

= p_wa_sbook-forcuram

foreign_currency = p_wa_sbook-forcurkey

local_currency

= p_wa_sbook-loccurkey

IMPORTING

local_amount

EXCEPTIONS

= p_wa_sbook-loccuram

no_rate_found

= 1

overflow

= 2

no_factors_found = 3

no_spread_found = 4

derived_2_times = 5

OTHERS

= 6.

IF sy-subrc <> 0. MESSAGE e080 WITH sy-subrc.

ENDIF.

ENDFORM.

" CONVERT_TO_LOC_CURRENCY

F06

*------------------------------------------------------------------*

* INCLUDE BC414S_BOOKINGS_01F06

*------------------------------------------------------------------*

*&-----------------------------------------------------------------*

*&

*&-----------------------------------------------------------------* FORM create_change_documents. ********************* TO BE IMPLEMENTED LATER **********************

ENDFORM.

Form CREATE_CHANGE_DOCUMENTS

" CREATE_CHANGE_DOCUMENTS

SAP-Sperrkonzept
SAP-Sperrkonzept

Inhalt:

Sperrobjekte

Sperrbausteine

Sperren einsetzen

Monitoring

SAP AG 2001

SAP-Sperrkonzept: Lernziele des Kapitels
SAP-Sperrkonzept: Lernziele des Kapitels
SAP-Sperrkonzept: Lernziele des Kapitels  SAP AG 2001 Am Ende dieses Kapitels können Sie: Sperrobjekte und

SAP AG 2001

Am Ende dieses Kapitels können Sie:

Sperrobjekte und Sperrbausteine finden, anlegen und verwenden, um Sperren für zu ändernde Tabelleneinträge zu setzen.

Sperrobjekte und Sperrbausteine finden, anlegen und verwenden, um Sperren für zu ändernde Tabelleneinträge zu setzen.