bc414_de_datenbankänderungen.pdf

Upload: mail1893

Post on 17-Oct-2015

251 views

Category:

Documents


10 download

TRANSCRIPT

  • SAP AG 2001

    BC414 Datenbanknderungen programmieren

    DatenbanknderungenprogrammierenDatenbanknderungenprogrammieren

    System R/3 Systemanforderungen: SAP R/3, Basis Release 4.6c oder hher Collection 21

    5005 2580

  • SAP AG 2001

    Copyright 2002 SAP AG. Alle Rechte vorbehalten.Weitergabe und Vervielfltigung dieser Publikation oder vonTeilen daraus sind, zu welchem Zweck und in welcher Formauch immer, ohne die ausdrckliche schriftliche Genehmigungdurch SAP AG nicht gestattet. In dieser Publikation enthalteneInformationen knnen ohne vorherige Ankndigung gendertwerden.Alle Rechte vorbehalten.

    Copyright

    Warenzeichenvermerke

    Die von SAP AG oder deren Vertriebsfirmen angebotenen Software-Produkte knnen 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 ServerTM 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 Lndern weltweit. Alle anderen Produkte sind Marken oder eingetragene Marken der jeweiligen Firmen.

  • SAP AG 2001

    z Notwendig:z Sicherer Umgang mit der ABAP

    Entwicklungsumgebung: ABAP Workbenchz Tiefere Kenntnisse der Programmiersprache ABAP

    z.B erworben in:z BC400 ABAP Workbench: Konzepte und Toolsz BC402 ABAP Programmiertechniken

    z Empfohlene zustzliche Kurse:z BC410 Entwicklung von Benutzerdialogenz BC430 ABAP Dictionaryz BC425 Erweiterungen und Modifikationen

    Voraussetzungen fr Teilnehmer

  • SAP AG 2001

    Zielgruppe

    z Teilnehmer: Erfahrene ABAP Programmierer Berater Projektmitglieder

    z Dauer: 2 Tage

    Benutzerhinweise

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

  • SAP AG BC414 1-1

    SAP AG 2001

    z Zielsetzungen des Kursesz Lernziele des Kursesz Inhaltsverzeichnisz bersichtsdiagrammz Gesamtunternehmensszenario

    Inhalt:

    Kursberblick

  • SAP AG BC414 1-2

    SAP AG 2001

    Dieser Kurs ermglicht es Ihnen:

    z Datenbanknderungen im Sinne einertransaktionalen Verarbeitung im SAP R/3 Systemzu programmieren

    Zielsetzungen des Kurses

  • SAP AG BC414 1-3

    SAP AG 2001

    Am Ende dieses Kurses knnen Sie:

    z Die Anweisungen des Open SQL frDatenbanknderungen verwenden

    z Das SAP-Sperrkonzept bei Datenbanknderungeneinsetzen

    z Verschiedene Verbuchungstechniken zurDatenbanknderung einsetzen

    Lernziele des Kurses

  • SAP AG BC414 1-4

    SAP AG 2001

    Kapitel 1 KursberblickKapitel 2 Datenbankaktualisierungen mit Open SQLKapitel 3 LUWs und Client-Server-ArchitekturKapitel 4 SAP-SperrkonzeptKapitel 5 Datenbanknderungen organisierenKapitel 6 Komplexe LUW-Verarbeitungen

    Vorspann

    Anhang

    Inhaltsverzeichnis

    bungen und Lsungen finden Sie am Ende des jeweiligen Kapitels.

  • SAP AG BC414 1-5

    SAP AG 2001

    bersichtsdiagramm-Kursberblick

    VorspannVorspann

    LUW

    s LU

    Ws

    un

    d Cl

    ien

    t-u

    nd

    Clie

    nt-

    Serv

    er-A

    rchi

    tekt

    ur

    Serv

    er-Ar

    chite

    ktu

    r

    1 KursberblickKursberblick

    Ope

    nO

    pen

    SQ

    L SQ

    L

    SAP-

    SAP-

    Sper

    rko

    nze

    ptSp

    errk

    on

    zept

    342

    5

    6

    Komplexe LUW-VerarbeitungenKomplexe LUW-Verarbeitungen

    Datenbanknderungen organisierenDatenbanknderungen organisieren

  • SAP AG BC414 2-1

    SAP AG 2001

    z Open SQLz Einzelsatzoperationenz Mengenoperationen

    Inhalt:

    Datenbankaktualisierungen mit Open SQL

  • SAP AG BC414 2-2

    SAP AG 2001

    Am Ende dieses Kapitels knnen Sie:

    Datenbankaktualisierungen mit Open SQL :Lernziele des Kapitels

    z mit Hilfe der Open SQL-Befehle folgende Operationenauf Datenbanktabellen ausfhren:z einzelne Zeilen anlegen, ndern oder lschenz Mengenoperationen auf Datenbanktabellen

    durchfhren (anlegen, ndern, lschen)

  • SAP AG BC414 2-3

    SAP AG 2001

    bersichtsdiagramm - Open SQL

    Ope

    nO

    pen

    SQL

    SQL

    2

    Open SQL

  • SAP AG BC414 2-4

    SAP AG 2001

    bersicht: Datenbankaktualisierungen

    Applikations-Server

    Native SQL

    ABAPOpen SQL Native SQL

    Tabellen-puffer

    Datenbank-Server

    Datenbankschnittstelle

    Fr Datenbanknderungen stehen Ihnen im ABAP sowohl die Befehle des Open SQL als auch die des jeweiligen datenbankspezifischen Native SQL zur Verfgung.

    Datenbankzugriffe ber Native SQL ermglichen 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) zustzlichen Entwicklungsaufwand, da die Syntax der SQL-Kommandos wegen ihrer Datenbankabhngigkeit angepasst werden mssen.

    Befehle des Open SQL sind datenbankunabhngig 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 datenbankunabhngig und kann in beliebigen R/3-Systemen ohne Anpassung eingesetzt werden.

    Ein weiterer Vorteil der Open SQL-Nutzung ist die Mglichkeit, SAP-Tabellen fr 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 umfat 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-Funktionalitt benutzt werden mu, die im Open SQL nicht vorhanden ist.

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

  • SAP AG BC414 2-5

    SAP AG 2001

    Zielmenge und Return-Werte

    Open SQLOpen SQL

    Einzelsatzzugriff Mengenzugriff

    SY-SUBRCSY-DBCNT

    Performance !

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

    Es knnen jeweils eine Einzelzeile oder mehrere Zeilen ber einen SQL-Befehl bearbeitet werden. Befehle, die mehrere Zeilen bearbeiten, sind stets performanter als entsprechende Einzelzugriffe (Ausnahme: Massennderung ber MODIFY).

    Ferner existiert fr die nderungsoperation eine Syntaxvariante, mit der es mglich ist, einzelne Felder einer Zeile abzundern.

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

    Smtliche Open SQL-Befehle liefern Ihnen eine Rckmeldung ber den Erfolg bzw. Mierfolg der Datenbankoperation in Form eines Returncodes im Systemfeld sy-subrc zurck. Dabei bedeutet der Wert "0" (Null) stets, dass die Operation erfolgreich durchgefhrt wurde. Alle anderen Werte bedeuten, dass Fehler aufgetreten sind. Details hierzu entnehmen Sie bitte der jeweiligen Schlsselwortdokumentation des entsprechenden Befehls.

    Zustzlich knnen Sie dem Systemfeld sy-dbcnt die Anzahl der Stze entnehmen, fr die die gewnschte Datenbankoperation tatschlich ausgefhrt wurde.

    Bitte beachten Sie, dass Open SQL-Befehle keine Berechtigungsprfungen durchfhren. Diese mssen Sie in Ihrem Programm explizit durchfhren (siehe Kapitel Berechtigungsprfungen).

  • SAP AG BC414 2-6

    SAP AG 2001

    Zugriff auf mandantenabhngige Tabellen

    Open SQLOpen SQL

    MANDT400400400400401401401402402402

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    . . .

    Kein "CLIENT SPECIFIED"- Zusatz im Befehl => Mandantenangabe im Befehl nicht mglich => Zugriff auf aktuellen Mandant

    Kein "CLIENT SPECIFIED"- Zusatz im Befehl => Mandantenangabe im Befehl nicht mglich => Zugriff auf aktuellen Mandant

    Mit "CLIENT SPECIFIED"- Zusatz im Befehl => Mandantenangabe im Befehl mglich

    Mit "CLIENT SPECIFIED"- Zusatz im Befehl => Mandantenangabe im Befehl mglich

    Mandant angegeben => Zugriff auf angegebenen Mandant Mandant nicht angegeben => Zugriff auf alle Mandanten !

    Wird in einem Open SQL-Befehl der Zusatz "CLIENT SPECIFIED" nicht angegeben, so ist in der zugehrigen WHERE-Klausel keine Mandantenangabe erlaubt und es wird auf die entsprechenden Stze des aktuellen Ausfhrungsmandanten zugegriffen.

    Wollen Sie Daten aus anderen Mandanten bearbeiten, so ist der Zusatz "CLIENT SPECIFIED" im Open SQL-Befehl und der/die gewnschte(n) Mandant(en) in der zugehrigen WHERE-Klausel anzugeben.

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

  • SAP AG BC414 2-7

    SAP AG 2001

    Anlegen Einzelsatz

    INSERT INTO [CLIENT SPECIFIED] VALUES . INSERT INTO [CLIENT SPECIFIED] VALUES .

    DATA wa_spfli TYPE spfli. ...

    wa_spfli-carrid = LH. wa_spfli-connid = 0007. wa_spfli-cityto = SINGAPORE. ...

    INSERT INTO spfli VALUES wa_spfli.

    IF sy-subrc NE 0. ...

    DATA wa_spfli TYPE spfli. ...

    wa_spfli-carrid = LH. wa_spfli-connid = 0007. wa_spfli-cityto = SINGAPORE. ...

    INSERT INTO spfli VALUES wa_spfli.

    IF sy-subrc NE 0. ...

    wa_spfli

    spfli

    LH 0007 ...SINGAPORE

    Mit dem Befehl "INSERT INTO VALUES ." knnen Sie eine neue Zeile in eine Datenbanktabelle einfgen. Hierzu ist die einzufgende Zeile vor Aufruf des Kommandos in die Struktur zu stellen, die den gleichen Aufbau haben mu wie die Zeilen der entsprechenden Datenbanktabelle.

    Das evtl. in der Struktur enthaltene Mandantenfeld wird nur bei Angabe des "CLIENT SPECIFIED"-Zusatzes bercksichtigt. Ohne "CLIENT SPECIFIED"-Zusatz gilt der aktuelle Ausfhrungsmandant.

    Das Einfgen von Zeilen ist auch ber Views mglich. 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 eingefgt werden. 4 : Zeile konnte nicht eingefgt werden, da schon eine Zeile mit dem selben Schlssel existiert.

    Alternative Syntax : INSERT [CLIENT SPECIFIED] FROM .

  • SAP AG BC414 2-8

    SAP AG 2001

    Anlegen mehrere Stze

    it_spfli

    spfli

    INSERT [CLIENT SPECIFIED] FROM TABLE . INSERT [CLIENT SPECIFIED] FROM TABLE .

    DATA: it_spfli TYPE STANDARD TABLE OF spfli, wa_itab LIKE LINE OF it_spfli. ...

    wa_itab-carrid = LH. wa_itab-connid = 0009. wa_itab-cityto = HONGKONG. ...

    APPEND wa_itab TO it_spfli.

    APPEND wa_itab TO it_spfli.

    INSERT spfli FROM TABLE it_spfli.

    IF sy-subrc NE 0. ...

    DATA: it_spfli TYPE STANDARD TABLE OF spfli, wa_itab LIKE LINE OF it_spfli. ...

    wa_itab-carrid = LH. wa_itab-connid = 0009. wa_itab-cityto = HONGKONG. ...

    APPEND wa_itab TO it_spfli.

    APPEND wa_itab TO it_spfli.

    INSERT spfli FROM TABLE it_spfli.

    IF sy-subrc NE 0. ...

    .

    .

    .

    LH 0007 ...SINGAPORELH 0008 ...MUNICLH 0009 ...HONGKONG

    Das Kommando "INSERT FROM TABLE ." ermglicht das Anlegen mehrerer Zeilen in einer Datenbanktabelle. Die dabei anzugebende interne Tabelle mu den gleichen Zeilenaufbau wie die entsprechende Datenbanktabelle haben und die neuen Datenstze enthalten.

    Das evtl. in der interne Tabelle enthaltene Mandantenfeld wird nur bei Angabe des "CLIENT SPECIFIED"-Zusatzes bercksichtigt. Ohne "CLIENT SPECIFIED"-Zusatz gilt der aktuelle Ausfhrungsmandant.

    Knnen dabei alle Zeilen angelegt werden, wird sy-subrc auf Null gesetzt.

    Kann jedoch mindestens ein Datensatz nicht angelegt werden, wird ein Laufzeitfehler ausgelst. Dieser bewirkt, dass der gesamte Einfgevorgang verworfen wird (Datenbank-Rollback). Mchten Sie in einem solchen Fall, dass Stze, die eingefgt werden knnen, auch eingefgt werden, knnen Sie den Befehlszusatz "ACCEPTING DUPLICATE KEYS" verwenden. Dieser Zusatz bewirkt, dass im Fehlerfall der Laufzeitfehler (und somit auch der Datenbank-Rollback) unterdrckt, sy-subrc auf 4 gesetzt und alle nicht fehlerhaften Stze eingefgt werden.

    Das Systemfeld sy-dbcnt enthlt die Anzahl der Zeilen, die auf der Datenbank eingefgt werden konnten.

  • SAP AG BC414 2-9

    SAP AG 2001

    ndern Einzelsatz

    DATA wa_spfli TYPE spfli. ...

    wa_spfli-carrid = LH. wa_spfli-connid = 0010. wa_spfli-cityto = ROME. wa_spfli-countryto = I. ...

    UPDATE spfli FROM wa_spfli.* UPDATE spfli* SET cityto = wa_spfli-cityto* countryto = wa_spfli-countryto* WHERE carrid = wa_spfli-carrid* AND connid = wa_spfli-connid. IF sy-subrc NE 0. ...

    DATA wa_spfli TYPE spfli. ...

    wa_spfli-carrid = LH. wa_spfli-connid = 0010. wa_spfli-cityto = ROME. wa_spfli-countryto = I. ...

    UPDATE spfli FROM wa_spfli.* UPDATE spfli* SET cityto = wa_spfli-cityto* countryto = wa_spfli-countryto* WHERE carrid = wa_spfli-carrid* AND connid = wa_spfli-connid. IF sy-subrc NE 0. ...

    wa_spfli

    spfli

    LH 0010 CHBERN

    LH 0010 IROME

    UPDATE [CLIENT SPECIFIED] FROM . UPDATE [CLIENT SPECIFIED] FROM .

    UPDATE [CLIENT SPECIFIED] SET = ... = WHERE .

    UPDATE [CLIENT SPECIFIED] SET = ... = WHERE .

    1

    2

    1

    2 2

    Mit den beiden oben dargestellten Varianten des UPDATE-Befehls knnen Sie gezielt eine Zeile einer Datenbanktabelle ndern.

    Bei Variante 1 wird der Datenbanksatz, der den in stehenden Schlssel besitzt, mit berschrieben, wobei das in evtl. vorhandene Schlsselfeld "MANDT" nur dann bercksichtigt wird, wenn der "CLIENT SPECIFIED"-Zusatz angegeben ist (sonst gilt der aktuelle Ausfhrungsmandant). Logischerweise mu den gleichen Aufbau haben wie der zu ndernde Datenbanksatz.

    Bei Variante 2 wird der in der WHERE-Klausel angegebene Satz gendert, 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 Schlsselfeldbewertungen spezifiziert werden. Details zur Angabe des evtl. vorhandenen MANDT-Feldes entnehmen Sie bitte der Folie "Zugriff auf mandantenabhngige Tabellen".

    Fr numerische Datenbankfelder im "SET"-Zusatz knnen einfache Rechenoperationen als Bewertung angegeben werden : f = g , f = f + g , f = f - g .

    Das ndern von Zeilen ist auch ber Views mglich. 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 : 0 : Zeile konnte gendert werden. 4 : Zeile konnte nicht gendert werden, da z.B. der angegebene Schlssel nicht vorhanden ist.

  • SAP AG BC414 2-10

    SAP AG 2001

    ndern mehrere Stze (ber Bedingung)

    spfli

    AZ 0534 CHBERNAZ 0535 CHBIELAZ 0555 IMILANAZ 0556 CHLUCERN

    UPDATE [CLIENT SPECIFIED] SET = ... = WHERE .

    UPDATE [CLIENT SPECIFIED] SET = ... = WHERE .

    UPDATE spfli SET cityto = ROME countryto = I WHERE carrid = AZ.

    IF sy-subrc NE 0. ...

    UPDATE spfli SET cityto = ROME countryto = I WHERE carrid = AZ.

    IF sy-subrc NE 0. ...

    "ROME" " I "

    zundernde

    Stze

    Sollen fr mehrere Zeilen einer Datenbaktabelle jeweils die gleichen Felder identisch gendert werden, so knnen Sie die auf der Folie angegebene Syntax verwenden.

    ber die WHERE-Klausel legen Sie fest, welche Zeilen gendert werden sollen. Details zur Angabe des evtl. vorhandenen MANDT-Feldes entnehmen Sie bitte der Folie "Zugriff auf mandantenabhngige Tabellen".

    Im SET-Zusatz geben Sie an, welche Felder dieser Stze wie gendert werden sollen. Auch hier sind fr die zu ndernden numerischen Felder Rechenoperationen als Bewertungsangabe mglich : f = g , f = f + g , f = f - g .

    Diese UPDATE-Variante besitzt folgende Returncodes : 0 : Mindestens eine Zeile wurde gendert. 4 : Es wurde keine Zeile gendert, weil z.B. keine solchen existieren.

    Das Feld sy-dbcnt enthlt die Anzahl der genderten Zeilen.

  • SAP AG BC414 2-11

    SAP AG 2001

    ndern mehrere Stze (ber interne Tabelle)

    it_spfli

    spfli

    LH 0007 ...BEIJINGLH 0008 ...BEIJING

    LH 0007 ...SINGAPORELH 0008 ...MUNICLH 0009 ...HONGKONG

    LH 0009 ...BEIJING

    UPDATE [CLIENT SPECIFIED] FROM TABLE . UPDATE [CLIENT SPECIFIED] FROM TABLE .

    DATA: it_spfli TYPE STANDARD TABLE OF spfli, wa_itab LIKE LINE OF it_spfli. ...

    SELECT * FROM spfli INTO TABLE it_spfli WHERE carrid = LH.

    UPDATE spfli FROM TABLE it_spfli.

    IF sy-subrc NE 0. ...

    DATA: it_spfli TYPE STANDARD TABLE OF spfli, wa_itab LIKE LINE OF it_spfli. ...

    SELECT * FROM spfli INTO TABLE it_spfli WHERE carrid = LH.

    UPDATE spfli FROM TABLE it_spfli.

    IF sy-subrc NE 0. ...

    .

    .

    .< ndern it_spfli >

    Eine Massennderung knnen Sie auch ber die Angabe einer internen Tabelle realisieren, die den gleichen Aufbau hat wie die entsprechende Datenbanktabelle und die zu ndernden Stze enthlt.

    Das in der angegebenen internen Tabelle evtl. vorhandene Feld "MANDT" wird nur dann bercksichtigt wird, wenn der "CLIENT SPECIFIED"-Zusatz angegeben ist (sonst gilt der aktuelle Ausfhrungsmandant).

    Diese UPDATE-Variante besitzt folgende Returncodes : 0 : Alle angegebenen Zeilen wurden erfolgreich gendert. 4 : Mindestens eine der angegebenen Zeilen konnte nicht gendert werden (weil sie z.B. gar nicht existiert); die brigen Zeilen wurden gendert.

    Das Systemfeld sy-dbcnt enthlt die Anzahl der erfolgreich genderten Zeilen.

  • SAP AG BC414 2-12

    SAP AG 2001

    Modifizieren Einzelsatz / mehrere Stze

    MODIFYMODIFY

    UPDATEUPDATE

    INSERTINSERT

    falls angegebenerEintrag existiert

    MODIFY [CLIENT SPECIFIED] FROM . MODIFY [CLIENT SPECIFIED] FROM .

    MODIFY [CLIENT SPECIFIED] FROM TABLE . MODIFY [CLIENT SPECIFIED] FROM TABLE .

    falls angegebenerEintrag nicht existiert

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

    yExistiert der im MODIFY angegebene Datensatz, wird dieser aktualisiert (-> UPDATE ). yExistiert der im MODIFY angegebene Datensatz nicht, wird dieser neu eingefgt (-> INSERT ).

    Mit den verschiedenen Syntaxvarianten lsst sich die Bearbeitung von Einzelstzen und mehrere Stzen realisieren ( analog zur Syntax von UPDATE und INSERT ).

    Die Operation ist auch fr Views mglich. 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 Stze konnte(n) bearbeitet (aktualisiert/eingefgt) werden. 4 : Der angegebene Satz bzw. mindestens einer der angegebenen Stze konnte(n) nicht bearbeitet werden (weil z.B. der Satz datenbankseitig nicht vorhanden ist und sein Einfgen einen Unique- Sekundrindex zerstren wrde); im Falle der Massennderung wurden die brigen Stze bearbeitet.

    Das Feld sy-dbcnt enthlt die Anzahl der erfolgreich bearbeiteten Stze.

  • SAP AG BC414 2-13

    SAP AG 2001

    Lschen Einzelsatz

    spfli

    LH 0007 ......

    DELETE FROM [CLIENT SPECIFIED] WHERE .

    DELETE FROM [CLIENT SPECIFIED] WHERE .

    DELETE FROM spfli WHERE carrid = LH AND connid = 0007.

    IF sy-subrc NE 0. ...

    DELETE FROM spfli WHERE carrid = LH AND connid = 0007.

    IF sy-subrc NE 0. ...

    "LH" / "0007"

    Die oben angegebene Syntax des DELETE-Kommandos ermglicht das Lschen einer Einzelzeile einer Datenbanktabelle. In dieser Syntaxversion mu der zu lschende Satz in der WHERE-Klausel durch exakte Angabe aller Schlsselfeldbewertungen spezifiziert werden. Details zur Angabe des evtl. vorhandenen MANDT-Feldes entnehmen Sie bitte der Folie "Zugriff auf mandantenabhngige Tabellen".

    Das Lschen einer Zeile ist auch fr Views mglich. 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 gelscht. 4 : Zeile konnte nicht gelscht werden, da z.B. dieser datenbankseitig gar nicht existiert.

    Alternative Syntax : DELETE [CLIENT SPECIFIED] FROM . Bei dieser Syntaxversion mu die Struktur den gleichen Aufbau wie Stze der entsprechenden Datenbanktabelle haben und vor dem Kommando-Aufruf mit den Schlsselfeldern des zu lschenden Satzes gefllt werden, wobei das in evtl. vorhandene Schlsselfeld "MANDT" nur dann bercksichtigt wird, wenn der "CLIENT SPECIFIED"-Zusatz angegeben ist (sonst gilt der aktuelle Ausfhrungsmandant).

  • SAP AG BC414 2-14

    SAP AG 2001

    Lschen mehrere Stze (ber Bedingung)

    spfli

    LH 0007 ......LH 0008 ......LH 0009 ......

    DELETE FROM [CLIENT SPECIFIED] WHERE .

    DELETE FROM [CLIENT SPECIFIED] WHERE .

    DELETE FROM spfli WHERE carrid = LH.

    IF sy-subrc NE 0. ...

    DELETE FROM spfli WHERE carrid = LH.

    IF sy-subrc NE 0. ...

    "LH"

    Diese Syntaxvariante des DELETE-Kommandos ermglicht das Lschen mehrerer Zeilen einer Datenbanktabelle. Hierbei legen Sie mit Hilfe der WHERE-Klausel fest, welche Zeilen gelscht werden sollen. Details zur Angabe des evtl. vorhandenen MANDT-Feldes entnehmen Sie bitte der Folie "Zugriff auf mandantenabhngige Tabellen".

    Das Lschen aller Zeilen einer mandantenunabhngigen Datenbanktabelle knnen Sie mit folgender Syntax realisieren : DELETE FROM WHERE LIKE %. Dabei ist ein beliebiges Tabellenfeld.

    Mchten Sie von einer mandantenabhngigen Datenbanktabelle alle Zeilen des Ausfhrungs-mandanten lschen, knnen sie die gleiche Syntax benutzen : DELETE FROM WHERE LIKE %. Wollen Sie jedoch von einer mandantenabhngigen Datenbanktabelle alle existierenden Zeilen lschen, so ist im Befehl zustzlich der "CLIENT SPECIFIED"-Zusatz anzugeben : DELETE FROM CLIENT SPECIFIED WHERE LIKE %.

    Das Lschen mehrerer Datenstze ber die Angabe von Bedingungen liefert folgende Returncodes : 0 : Es wurde mindestens eine Zeile gelscht. 4 : Es wurde keine Zeile gelscht, da z.B. die angegebenen Zeilen gar nicht existieren.

    Das Systemfeld sy-dbcnt enthlt die Anzahl der auf der Datenbank gelschten Zeilen.

  • SAP AG BC414 2-15

    SAP AG 2001

    Lschen mehrere Stze (ber interne Tabelle)

    it_spfli

    spfli

    LH 0007 ...SingaporeLH 0008 ...Munic

    LH 0007 ......LH 0008 ......LH 0009 ......

    LH 0009 ...Hongkong

    DELETE [CLIENT SPECIFIED] FROM TABLE . DELETE [CLIENT SPECIFIED] FROM TABLE .

    DATA: it_spfli TYPE STANDARD TABLE OF spfli, wa_itab LIKE LINE OF it_spfli. ...

    wa_itab-carrid = LH. wa_itab-connid = 0007. APPEND wa_itab TO it_spfli.

    APPEND wa_itab TO it_spfli.

    DELETE spfli FROM TABLE it_spfli.

    IF sy-subrc NE 0. ...

    DATA: it_spfli TYPE STANDARD TABLE OF spfli, wa_itab LIKE LINE OF it_spfli. ...

    wa_itab-carrid = LH. wa_itab-connid = 0007. APPEND wa_itab TO it_spfli.

    APPEND wa_itab TO it_spfli.

    DELETE spfli FROM TABLE it_spfli.

    IF sy-subrc NE 0. ...

    .

    .

    .

    Mchten Sie mehrere Stze einer Datenbanktabelle lschen, so knnen Sie diese auch zunchst in einer internen Tabelle, die den gleichen Aufbau besitzt wie die entsprechende Datenbanktabelle, angeben und die oben dargestellte Syntax des DELETE-Kommandos verwenden. Dabei gengt es, in der internen Tabelle jeweils nur den Schlsselteil der zu lschenden Stze anzugeben. Das evtl. vorhandene Schlsselfeld "MANDT" wird jedoch nur dann bercksichtigt, wenn der "CLIENT SPECIFIED"-Zusatz angegeben ist (sonst gilt der aktuelle Ausfhrungsmandant).

    Diese DELETE-Variante liefert folgende Returncodes : 0 : Alle in der internen Tabelle angegebenen Zeilen konnten erfolgreich gelscht werden. 4 : Mindestens eine Zeile konnte nicht gelscht werden (weil z.B. nicht vorhanden), die brigen Stze wurden gelscht.

    Die Anzahl der auf der Datenbank gelschten Zeilen befindet sich in dem Systemfeld sy-dbcnt.

  • SAP AG BC414 2-16

    SAP AG 2001

    Datenbank

    Vorherigen Datenbankzustand wiederherstellen

    IF sy-subrc NE 0. MESSAGE A... * ROLLBACK WORK. ENDIF.

    IF sy-subrc NE 0. MESSAGE A... * ROLLBACK WORK. ENDIF.

    ABAP Programm

    Datenbank-Rollback

    Open-SQL-AnweisungOpen-SQL-Anweisung

    Open-SQL-AnweisungOpen-SQL-Anweisung

    .

    .

    .

    .

    .

    .

    Wenn eine datenbankndernde Open-SQL-Anweisung einen von Null verschiedenen Returncode zurckgeliefert, sollten Sie dafr sorgen, dass die Datenbank in den Zustand zurckgesetzt 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 nchstes Kapitel) rckgngig macht.

    Es gibt zwei Mglichkeiten, einen Datenbank-Rollback zu verursachen : - Abbruchdialognachricht (A-Message) senden - ABAP-Anweisung ROLLBACK WORK verwenden

    Das Senden einer A-Message lst auf der Datenbank einen Rollback aus und beendet das Programm. Alle anderen Nachrichtentypen (E,W, I) fhren 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 zurckgesetzt wurde !

  • SAP AG BC414 2-17

    SAP AG 2001

    Datenbankaktualisierungen mit Open SQL :Zusammenfassung des Kapitels

    z mit Hilfe der Open-SQL-Befehle folgendeOperationen auf Datenbanktabellen ausfhren:z Einzelzeile anlegen, ndern oder lschenz Mengenoperationen auf Datenbanktabellen

    durchfhren (anlegen, ndern, lschen)

    Sie knnen nun:

  • SAP AG BC414 2-18

    SAP AG 2001

    Navigation bei den bungsaufgaben

    100

    200 300

    Buchungen stornieren Buchung anlegen

    Kunde anlegen

    Flug festlegen

    100

    BOOKC BOOKN

    NEW_CUSTOM

    BACK

    CANCEL

    SAVE

    BACK

    CANCEL

    SAVE

    EXIT

    Programm SAPBC414...BOOKINGS...

    Programm SAPBC414...CREATE_CUSTOMER...

    BACK, EXIT, CANCEL

    EXIT

  • SAP AG BC414 2-19

    bungen

    Kapitel: Datenbankaktualisierungen mit Open SQL Thema: Einzelsatznderung

    Am Ende dieser bungen knnen Sie: Einzelstze in Datenbanktabellen einfgen.

    Das Programm SAPBC414T_CREATE_CUSTOMER_01 ermglicht das Erfassen neuer Kundendaten ber das Dynpro 100. Erweitern Sie das vorgegebene Programm um den Datenbankdialogteil: Die neu eingegebenen Kundendaten sollen nach dem Auslsen des Funktionscodes SAVE (z.B. durch das Drcken der Sichern-Ikone) auf die Datenbanktabelle SCUSTOM geschrieben werden.

    Programm: SAPMZ##_CUSTOMER1 Transaktion: Z##_CUSTOMER1 Kopiervorlage: SAPBC414T_CREATE_CUSTOMER_01 Musterlsung: 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 fr den Datenbankdialog werden im Unterprogramm SAVE_SCUSTOM gekapselt. Das Unterprogramm ist bereits (leer) angelegt. 1-2-1 Fgen Sie den neu eingegebenen Kundendatensatz in die Datenbanktabelle

    SCUSTOM ein. Geben Sie im Erfolgsfall die Setznachricht S015 , im Mierfolgsfall 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 gltig.

  • SAP AG BC414 2-20

    Optionale bung

    Kapitel: Datenbankaktualisierungen mit Open SQL Thema: ndern mehrerer Datenstze

    Am Ende dieser bungen knnen Sie: mehrere Datenstze performanterweise in Datenbanktabellen ndern.

    Im Programm SAPBC414T_UPDATE_STRAVELAG wird eine Liste erzeugt, auf der die Daten der in der Tabelle STRAVELAG gepflegten Reisebros dargestellt werden. Der Benutzer kann durch das Markieren von einer oder mehreren Zeilen die Daten der korrespondierenden Reisebros auf dem Folgedynpro (100) ndern. Erweitern Sie das Programm um den Datenbankdialogteil: Durch das Drcken der Sichern-Ikone (Funktionscode SAVE) auf dem Dynpro 100 sollen die genderten Daten auf die Datenbanktabelle STRAVELAG zurckgeschrieben werden.

    Programm: SAPMZ##_UPDATE_STRAVELAG Kopiervorlage: SAPBC414T_UPDATE_STRAVELAG

    Musterlsung: 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 Auslsen des Funktionscodes SAVE ange-stoen. 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 genderten Adredaten auf die Datenbanktabelle

    STRAVELAG zurck. Achten Sie bei der Umsetzung dieser Aufgabe auf Performance-Aspekte. Im Erfolgsfall soll die Setznachricht S030 , im Mierfolgsfall die Informationsnachricht I048 ausgegeben werden.

    Die Daten der Reisebros sind in der internen Tabelle ITAB_TRAVEL (Arbeitsbereich WA_TRAVEL) gepuffert. Die Zeilenstruktur der internen Tabelle entspricht bis auf das zustzliches Feld MARK_CHANGED (C(1)) der Zeilenstruktur von STRAVELAG . MARK_CHANGED besitzt den Wert 'X', falls die Adredaten auf dem Dynpro 100 gendert wurden und ist ansonsten initial.

  • SAP AG BC414 2-21

    Hinweise zu den Musterlsungen dieses Kurses

    Die angegebenen Musterlsungen geben die Anweisungen der Dynproablauflogiken sowie der ABAP-Programmteile wieder, die in der Musterlsung bentigt werden. Die bungen zur Schulung BC414 sind so konzipiert, da zwei grere Programme begleitend zu den Inhalten der jeweiligen Kapitel weiterentwickelt werden. Aus Grnden der bersichtlichkeit wird nicht fr jede Musterlsung deren gesamtes Coding wiedergegeben. Stattdessen wird folgendes Verfahren durchgefhrt: Die Musterlsung der Aufgabe, in der ein Programm zum ersten

    Mal bearbeitet wird, ist komplett dargestellt. Alle darauf aufbauenden Musterlsungen geben nur die

    genderten oder neu hinzugekommenen Ablauflogiken, Unterprogramme und Module wieder. Die in den wiedergegebenen Modularisierungseinheiten zur Lsung der Aufgabe notwendig zu ergnzenden 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 gehrende Programm in den folgenden Kapiteln nicht weiter bearbeitet wird, ist die Musterlsung dieser Aufgabe komplett wiedergegeben.

  • SAP AG BC414 2-22

    Lsungen

    Kapitel: Datenbankaktualisierungen mit Open SQL Thema: Einzelsatznderung

    Musterlsung SAPBC414S_CREATE_CUSTOMER_01

    Modulpool *&-----------------------------------------------------------------*

    *& Modulpool SAPBC414S_CREATE_CUSTOMER_01 *

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

    INCLUDE BC414S_CREATE_CUSTOMERTOP.

    INCLUDE BC414S_CREATE_CUSTOMERO01.

    INCLUDE BC414S_CREATE_CUSTOMERI01.

    INCLUDE BC414S_CREATE_CUSTOMER_01F01.

    SCREEN 100 PROCESS BEFORE OUTPUT.

    MODULE status_0100.

    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.

  • SAP AG BC414 2-23

    TABLES: scustom.

  • SAP AG BC414 2-24

    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

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

    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.

  • SAP AG BC414 2-25

    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. " 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.

    WHEN SAVE&EXIT.

    PERFORM save.

    LEAVE PROGRAM.

    WHEN SAVE.

    IF flag IS INITIAL.

    SET SCREEN 100.

    ELSE.

    PERFORM save.

    SET SCREEN 0.

  • SAP AG BC414 2-26

    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

  • SAP AG BC414 2-27

    FORM Routinen *------------------------------------------------------------------*

    ***INCLUDE BC414S_CREATE_CUSTOMER_01F01 .

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

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

    *& Form NUMBER_GET_NEXT

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

    * -->P_WA_SCUSTOM text

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

    FORM number_get_next USING p_scustom LIKE scustom.

    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 = p_scustom-id

    returncode = return

    EXCEPTIONS

    OTHERS = 1.

    CASE sy-subrc.

    WHEN 0. CASE return. WHEN 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

  • SAP AG BC414 2-28

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

    *& Form ASK_SAVE

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

    * -->P_ANSWER text

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

    FORM ask_save USING p_answer.

    CALL FUNCTION POPUP_TO_CONFIRM_STEP

    EXPORTING

    textline1 = Data has been changed.(001) textline2 = Save before leaving transaction?(002) titel = Create Customer(003) IMPORTING

    answer = p_answer.

    ENDFORM. " ASK_SAVE

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

    *& Form ASK_LOSS

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

    * -->P_ANSWER text

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

    FORM ask_loss USING p_answer.

    CALL FUNCTION POPUP_TO_CONFIRM_LOSS_OF_DATA

    EXPORTING

    textline1 = Continue?(004) titel = Create Customer(003) IMPORTING

    answer = p_answer.

    ENDFORM. " ASK_LOSS

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

    *& Form ENQ_SCUSTOM *&-----------------------------------------------------------------*

    FORM enq_scustom.

    CALL FUNCTION ENQUEUE_ESCUSTOM EXPORTING

    id = scustom-id

    EXCEPTIONS

    foreign_lock = 1

  • SAP AG BC414 2-29

    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 *&-----------------------------------------------------------------*

    FORM deq_all.

    CALL FUNCTION DEQUEUE_ALL. ENDFORM. " DEQ_ALL *&-----------------------------------------------------------------*

    *& Form SAVE

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

    FORM save.

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

    * save new customer

    PERFORM save_scustom.

    ENDFORM. " SAVE

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

    *& Form SAVE_SCUSTOM

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

    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. " SAVE_SCUSTOM

  • SAP AG BC414 2-30

    Lsungen

    Kapitel: Datenbankaktualisierungen mit Open SQL Thema: ndern mehrerer Datenstze

    Musterlsung SAPBC414S_UPDATE_STRAVELAG

    Modulpool *&-----------------------------------------------------------------*

    *& Modulpool SAPBC414S_UPDATE_STRAVELAG *

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

    INCLUDE bc414s_update_stravelagtop.

    INCLUDE bc414s_update_stravelagf01.

    INCLUDE bc414s_update_stravelago01.

    INCLUDE bc414s_update_stravelagi01.

    INCLUDE bc414s_update_stravelage01.

    SCREEN 100 PROCESS BEFORE OUTPUT.

    MODULE STATUS_0100.

    * 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

  • SAP AG BC414 2-31

    * 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,

  • SAP AG BC414 2-32

    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

  • SAP AG BC414 2-33

    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.

  • SAP AG BC414 2-34

    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 *

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

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

    *& Event START-OF-SELECTION

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

    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.

  • SAP AG BC414 2-35

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

    *& Event TOP-OF-PAGE

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

    TOP-OF-PAGE.

    * Write page title and page heading

    PERFORM write_header.

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

    *& Event END-OF-SELECTION

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

    END-OF-SELECTION.

    * Set PF-Status and Title of list

    SET PF-STATUS LIST.

    SET TITLEBAR LIST.

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

    *& 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).

  • SAP AG BC414 2-36

    FORM-Routinen *------------------------------------------------------------------*

    ***INCLUDE BC414S_UPDATE_STRAVELAGF01 .

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

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

    *& Form READ_DATA

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

    * -->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. " READ_DATA

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

    *& Form WRITE_DATA

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

    FORM write_data.

    LOOP AT itab_stravelag INTO wa_stravelag.

    WRITE AT: /pos1 mark AS CHECKBOX, 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

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

    FORM write_header.

    WRITE: / Travel agency data(007), AT sy-linsz sy-pagno. ULINE.

  • SAP AG BC414 2-37

    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

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

    *& Form LOOP_AT_LIST

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

    * -->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. " LOOP_AT_LIST

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

    *& Form CALL_SCREEN

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

    FORM call_screen.

    * Initialize table control on 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

  • SAP AG BC414 2-38

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

    *& 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

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

    FORM save_changes.

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

    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.

  • SAP AG BC414 2-39

    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

  • SAP AG BC414 3-1

    SAP AG 2001

    z SAP-LUWz Datenbank-LUWz Konsequenzen der Client-Server-Architektur

    Inhalt:

    LUWs und Client-Server-Architektur

  • SAP AG BC414 3-2

    SAP AG 2001

    z die Begriffe Datenbank-LUW und SAP-LUWerklren

    z erklren, warum Sie in der Client-Server-Architekturdes R/3-Systems zusammen gehrige nderungenan Datenbanktabellen bndeln mssen

    Am Ende dieses Kapitels knnen Sie:

    LUWs und Client-Server-Architektur:Lernziele des Kapitels

  • SAP AG BC414 3-3

    SAP AG 2001

    bersichtsdiagramm - LUWs

    LUW

    s LU

    Ws

    un

    d Cl

    ien

    t-u

    nd

    Clie

    nt-

    Serv

    er-Ar

    chite

    ktu

    rSe

    rver

    -A

    rchi

    tekt

    ur

    3

    LUWs und Client-Server-Architektur

  • SAP AG BC414 3-4

    SAP AG 2001

    SAP-LUW (Logical Unit of Work )

    nderung 1 nderung 2 nderung n. . .

    nderungen auf der Datenbank

    SAP-LUW(logisch zusammen gehrige nderungen)

    Alles- oder - Nichts - Prinzip !

    Eine SAP-LUW (Logical Unit of Work) besteht aus logisch zusammen gehrigen nderungen im R/3-System, von denen entweder alle oder gar keine durchgefhrt 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 auszufhrende Teile zerlegt, die jeweils einer SAP-LUW entsprechen. Die Definition von SAP-LUWs hngt vom Gesamtvorgang und dessen Modellierung ab.

    Weitere Informationen hierzu finden Sie in der Schlsselwortdokumentation im ABAP-Editor zum Begriff Transaktionsverarbeitung.

  • SAP AG BC414 3-5

    SAP AG 2001

    Datenbank-LUW

    Zwischenzustnde

    Rollbackmglich DB - Commit

    (kein Rollbackmehr mglich)

    "versiegelter" Zustand

    neuer"versiegelter"

    Zustand

    nderung 1 nderung 2. . .

    nderung n

    Datenbank-LUWDatenbank-LUW

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

    Innerhalb einer Datenbank-LUW ist jederzeit ein Verwerfen aller bis dahin durchgefhrten nderungen mglich (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 mglich.

    ber die ABAP-Anweisungen ROLLBACK WORK und COMMIT WORK knnen 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 Schlsselwortdokumentation im ABAP-Editor zum Begriff Transaktionsverarbeitung.

  • SAP AG BC414 3-6

    SAP AG 2001

    SAP-LUW innerhalb einer DB-LUW realisieren

    nderung 1 nderung 2 nderung n. . .

    SAP-LUW

    "versiegelter" Zustand

    neuer"versiegelter"

    Zustand

    DB-LUW mit Rollback- und Commit - MglichkeitDB-LUW mit Rollback- und Commit - Mglichkeit

    Um whrend der Abarbeitung einer SAP-LUW jederzeit im Fehlerfall auf den konsistenten Datenbankzustand vor Beginn der SAP-LUW zurckkehren zu knnen, 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, gebndlet innerhalb einer DB-LUW auf die Datenbank geschrieben werden.

  • SAP AG BC414 3-7

    SAP AG 2001

    Client-Server-Architektur des R/3-Systems

    SAPGUI

    Work-prozess

    Dispatcher

    Work-prozess

    Work-prozess

    Datenbank-Workprozesse

    SAPGUI SAPGUI SAPGUI

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

    Durch die Wahl dieser Architektur mit dem Verteilen von Benutzeranfragen (Userdispatching) ist es mglich, ein hocheffizientes, kostengnstiges Mehrbenutzersystem zu realisieren.

    Die Drei-Ebenen-Architektur erlaubt es, eine groe Anzahl von Benutzern mit preiswerten Endgerten (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 Prsentationsserverebene fr bestimmte Zeitintervalle einem Workproze zugeordnet, der seinerseits fr 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 (hinzufgen von weiteren Benutzern) herausgestellt als eine "Fat"-Client-Architektur, bei der die Prsentationsebene 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 gnstig auf das Verhalten der Datenbank aus.

  • SAP AG BC414 3-8

    SAP AG 2001

    Implizite DB-Commits

    DB-LUW 1 Zeit

    DB- Commit

    Bildschirm 1 Bildschirm 2

    DB- Commit

    Bildschirm 3

    . . .

    . . .

    . . .

    DB- Commit

    DB-LUW 2 DB-LUW 3

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

    Die Freigabe des Workprozesses vor jedem Benutzerdialog gewhrleistet, dass die meist lnger 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 ausgelst, 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 oder SUBMIT .

    Wegen der oben erluterten impliziten DB-Commits drfen nderungen, die zu einer SAP-LUW gehren, nicht in verschiedenen Dialogschritten ( Dialogschritt = programmseitige Verarbeitung nach einem Dynpro) plaziert werden, da sie sich dadurch nicht innerhalb einer DB-LUW befinden wrden !

  • SAP AG BC414 3-9

    SAP AG 2001

    LUWs und Client-Server-Architektur :Zusammenfassung des Kapitels

    z die Begriffe Datenbank- LUW und SAP - LUWerklren

    z erklren, warum Sie in der Client-Server-Architekturdes R/3-Systems zusammen gehrige nderungenan Datenbanktabellen bndeln mssen

    Sie knnen nun:

  • SAP AG BC414 3-10

    bungen

    Kapitel: LUW-Konzepte

    Am Ende dieser bungen knnen Sie: Funktionsbausteine und Unterprogramme hinsichtlich ihrer

    Tauglichkeit fr die Realisierung einer LUW-Verarbeitung beurteilen.

    Das Programm SAPBC414T_BOOKINGS_01 bietet die Mglichkeit, Buchungen auf einen Flug zu stornieren. Hierzu knnen entsprechende Buchungen auf dem Dynpro 200 zum Stornieren markierten werden. Realisieren Sie den Datenbankdialog: Durch das Drcken der Sichern-Ikone (Funktionscode SAVE) auf dem Dynpro 200 sollen die markierten Buchungen auf der Tabelle SBOOK gendert werden. Auerdem mu innerhalb der gleichen Datenbank-LUW der entsprechende Flug in der Tabelle SFLIGHT modifiziert werden (Buchungssumme und Anzahl der belegten Pltze ndern sich durch die Stornierung), da die nderung der Datenstze beider Datenbanktabellen mit dem "Alles-oder-Nichts"-Prinzip erfolgen mu. Zur nderung sollen vorhandene Funktionsbausteine verwendet werden.

    Programm: SAPMZ##_BOOKINGS1 Transaktionscode: Z##_BOOKINGS1 Kopiervorlage: SAPBC414T_BOOKINGS_01 Musterlsung: 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 fr die Datenbanknderungen sollen im Unterprogramm SAVE_MODIFIED_BOOKING , welches aus dem PAI-Modul USER_COMMAND_0200 (Dynpro 200) gerufen wird, gekapselt werden.

    Die Datenbanknderung sollen mittels vorhandener Funktionsbausteine durchgefhrt 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.

  • SAP AG BC414 3-11

    1-2-1 In welcher Reihenfolge mssen 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 fhren knnen.

    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 mgliche 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

    Die auf der Datenbanktabelle SBOOK zu ndernden Datenstze sind in der internen Tabelle ITAB_SBOOK_MODIFY gepuffert. Die Schlsselfelder 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.

  • SAP AG BC414 3-12

    Lsungen

    Kapitel: LUW Konzepte

    Musterlsung SAPBC414S_BOOKINGS_01

    Modulpool *&-----------------------------------------------------------------*

    *& Modulpool SAPBC414S_BOOKINGS_01 *

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

    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.

    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.

  • SAP AG BC414 3-13

    SCREEN 200 PROCESS BEFORE OUTPUT.

    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.

    SCREEN 201 PROCESS BEFORE OUTPUT.

    PROCESS AFTER INPUT.

    SCREEN 300 PROCESS BEFORE OUTPUT.

    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.

  • SAP AG BC414 3-14

    MODULE USER_COMMAND_0300.

    SCREEN 301 PROCESS BEFORE OUTPUT.

    * MODULE HIDE_BOOKID.

    PROCESS AFTER INPUT.

    SCREEN 302 PROCESS BEFORE OUTPUT.

    PROCESS AFTER INPUT.

    SCREEN 303 PROCESS BEFORE OUTPUT.

    PROCESS AFTER INPUT.

  • SAP AG BC414 3-15

    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.

  • SAP AG BC414 3-16

    * 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.

  • SAP AG BC414 3-17

    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,

  • SAP AG BC414 3-18

    wa_sflight TO sdyn_conn,

    wa_sbook TO sdyn_book.

    ENDMODULE. " 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

  • SAP AG BC414 3-19

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

    *& 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

  • SAP AG BC414 3-20

    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

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

  • SAP AG BC414 3-21

    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

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

    MODULE user_command_0200 INPUT.

    CASE save_ok.

    WHEN SAVE.

    * 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.

  • SAP AG BC414 3-22

    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

  • SAP AG BC414 3-23

    FORM Routinen F01

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

    ***INCLUDE BC414S_BOOKINGS_01F01 .

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

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

    *& Form COLLECT_MODIFIED_DATA

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

    * -->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

    WHERE mark = X

    AND cancelled = X.

    MOVE-CORRESPONDING wa_book TO wa_sbook_modify.

    APPEND wa_sbook_modify TO p_itab_sbook_modify.

    ENDLOOP.

    ENDFORM. " COLLECT_MODIFIED_DATA

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

    *& Form INITIALIZE_SBOOK

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

    * -->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.

  • SAP AG BC414 3-24

    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

    sdyn_conn-fldate.

    ENDCASE.

    ENDFORM. " 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

    sdyn_conn-fldate.

    ENDCASE.

    ENDFORM. " PROCESS_SYSUBRC_BOOKN

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

    *& Form TABSTRIP_SET

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

    FORM tabstrip_set.

  • SAP AG BC414 3-25

    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

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

    FORM create_new_customer.

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

    ENDFORM. " 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

  • SAP AG BC414 3-26

    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

  • SAP AG BC414 3-27

    F03 *------------------------------------------------------------------*

    * INCLUDE BC414S_BOOKINGS_01F03

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

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

    *&