(1) SAP-Webprogrammierung WI 4. Semester Übungen zum BSP-Framework Prof. Dr. H. Neuendorf System: HCC-SAP-System, ECC 6.0 Basis 7.30 Sommersemester 2016 Anmerkung: Von SAP ausgelieferte BSP-Anwendung IT00 enthält Demo-BSPs zu allen möglichen Aspekten der BSP-Entwicklung... Einstiegsseite ist default.htm
Melden Sie sich am SAP-System an : Benutzer = develop... Passwort = XXXXXXXXX Mandant = 904 Sprache = DE Einstieg (2) Bitte alle Übungen anlegen im vorhandenen Paket : ZBSPWI14R oder ZBSPWI14S oder ZBSPWI14TU Bitte den Namen aller BSP-Anwendungen, Klassen und Dictionary-Objekte im Kundennamensraum Z anlegen und mit der Endung < User-Nr > versehen als eindeutige Unterscheidung von anderen Kursteilnehmern!! Bsp : ZUeb1_12 von User develop12 Meine Demos sind im Paket : ZBSPTEST Coding wird am Ende der Vorlesung in pdf-file zur Verfügung gestellt Debug-Einstellungen : In Object Navigator unter : Hilfsmittel Einstellungen ABAP Editor Debugging muss Debuggen aktiviert und User eingetragen sein!
Einstieg: Arbeiten mit Workbench - Aufruf Transaktion SE80 (3) 1. Werkzeuge ABAP Workbench Übersicht Object Navigator Man landet im Repository- Browser. 2. In Auswahlbox : Paket : ZBSPWI14R bzw S TU + Brille betätigen Eintrag ZBSPWI14 expandieren: Ordner BSP-Bibliothek mit Unterordner BSP-Applikationen Dort befindet sich schon eine Demo-Anwendung 3. Neue BSP-Anwendung anlegen : Rechte Maustaste auf Paketnamen: Anlegen BSP-Bibliothek BSP-Applikation oder Rechte Maustaste auf BSP-Appikationen: Anlegen Namen und Kurzbeschreibung vergeben + speichern Anmerkung : In Screenshots teilweise letztjährige Paket- und Auftragseinträge. Texte der Aufgabenstellungen jedoch aktuell + korrekt
Einstieg: Workbench - Objekte anlegen (4) Zwei Möglichkeiten: 1. Lokales Objekt Dann erscheint die BSP-Anwendung nicht in der Paket- Darstellung, sondern nur bei Auswahl der Selektionen Lokale Objekte + <Username> 2. Speichern-Ikone Es wird ein transportierbares Objekt angelegt - und ein Workbenchauftrag muss gewählt werden. Für unsere Übungen wurde Auftrag R54K900804 angelegt : R54K900804 Eingeben und bestätigen! Zweimal hintereinander - da auch ein Service zur BSP-Anwendunge erzeugt wird. Weiter mit der Übung Auswahl des Auftrags möglich statt händischer Eingabe Andere Aufträge: Dritte Ikone von rechts
Übung 1A : (5) Erstellen Sie eine neue BSP-Anwendung in der SE80 : Gehen Sie in den ObjectNavigator und legen Sie im Paket ZBSPWI14 eine neue BSP-Anwendung mit einer Seite default.htm an: 1. Rechte Maustaste auf Paketnamen: Anlegen BSP-Bibliothek BSP-Applikation 2. Eigenschaften der BSP-Anwendung pflegen: Kurzbeschreibung + Einstiegs-BSP 3. Rechte Maustaste auf Anwendungsnamen: Anlegen Seite 4. Eigenschaften der Seite anschauen, Beschreibung pflegen 5. Im Layout eine HTML-Seite codieren: (zuvor generierte Inhalte löschen) Schreiben Sie etwas HTML (siehe Skript-Beispiele) bauen Sie ABAP-Code ein, der z.b. in einer Schleife etwas ausgibt. 6. Seite prüfen, aktivieren und testen!
Übung 1B: (6) 7. Objekte (Bilder) vom Frontend-Rechner holen (Import)! Rechte Maustaste auf Anwendungsnamen: Anlegen MIME-Objekt importieren MIME-Objekte an gewünschter Stelle in HTML-Seite einbinden : <img src=" " height=... width=... border=1> 8. Service in TA SICF anschauen : In SICF-Einstiegsseite Servicename eingeben! Rechte Maustaste auf Serviceeintrag: Deaktivieren / Aktivieren /... Doppelklick auf Serviceeintrag: Darstellung der Serviceeigenschaften 9. Tragen Sie den Defaultuser ein, um sich den Anmeldedialog im Browser zu ersparen: User: gast PW: mosbach 10. Testen Sie die Anwendung!
Übung 2: (7) Erstellen Sie eine BSP-Anwendung mit mehreren BSP-Seiten : 1. Legen Sie eine neue BSP-Anwendung in unserem Übungs-Paket an 2. Fügen Sie insgesamt drei BSP-Seiten und ein Seitenfragment ein. 3. Pflegen Sie eine der Seiten als Einstiegsseite in die BSP-Anwendung 4. Bauen Sie in eine der Seiten etwas clientseitiges JavaScript ein 5. Deklarieren Sie in einer der Seiten ein Seitenattribut vom Typ String und verwenden Sie dieses im Layout der Seite 6. Realisieren Sie in dem Seitenfragment eine einfache statische Navigation zwischen den Seiten mittels <a href =... > Tags Inkludieren Sie das Seitenfragment in die drei BSP-Seiten, so dass BSP-Seite + Seitenfragment sich zu korrektem HTML ergänzen.
Übung 4 : Werte aus DB beschaffen und darstellen (12) Ziel: Datenbeschaffung in Eventhandler - Darstellung im Layout default.htm : User kann Luftlinie (carrier) vorgeben - Voreinstellung ist 'LH' stateless Übergabe des carrier-werts an results.htm results.htm : Aus DB-Tabelle sflight alle Einträge zu gewünschter Luftlinie (carrier) auslesen Im Layout darstellen default.htm results.htm OnInitialization Layout Form : Benutzer- Eingaben OnInputProcessing OnInitialization Layout Form : Back- Button OnInputProcessing
Übung 4 : Werte aus DB beschaffen und darstellen (13) Erstellen Sie eine BSP-Anwendung : 1. Neue BSP-Anwendung in unserem Paket Zwei BSP-Seiten : default.htm (Einstiegsseite) + results.htm default.htm 2. Seitenattribut : carrier type String 3. OnInitialization: Seitenattribut carrier mit Wert 'LH' vorbelegen 3. Layout mit Form : User kann in Textfeld ( name: carrier ) Wert für Fluglinie eintragen Soll mit Wert von carrier vorbelegt werden Submit-Button mit Aufruf OnInputProcessing 4. OnInputProcessing : Übergabe carrier-wert an + Navigation zur Folgeseite results.htm : navigation set_parameter( ) + navigation goto_page( )
results.htm Übung 4: 5. Typdefinition: types: zflight_type type standard table of sflight. 6. Seitenattribute: carrier type String auto my_flights type zflight_type 7. OnInitialization: Aus DB-Tabelle sflight alle Einträge zu carrier in ITAB my_flights lesen : select * from sflight into table my_flights where carrid = carrier. 8. Layout : Inhalt von my_flights tabellarisch ausgeben HTML-Tabelle verwenden <% data: wa_flights type sflight. %> Loop über my_flights in Arbeitsbereich wa_flight : <% loop at my_flights into wa_flights. %> Inhalt der Struktur wa_flight in separaten Spalten ausgeben : <tr> <td> <%= wa_flights-connid %> </td> <td> <%= wa_flights-fldate %> </td> <td> <%= wa_flights-price %> </td> </tr> <% endloop. %> Form mit Submit-Button - Aufruf OnInputProcessing 9. OnInputProcessing : Navigation zurück zu default.htm (14)
Übung 6 : Ein einfacher Zähler Stateless-Problematik: Schreiben Sie eine 1-seitige BSP-Anwendung, in der serverseitig das Seitenattribut couter bei jedem Selbstaufruf der Seite in OnInitialization hochgezählt wird. Variable ausgeben. Durch Button Verhalten triggern. Verhalten hängt nicht von Auto oder Nicht-Auto ab Seitenattribut Name Typ counter i (17) Anwendung austesten : 1. Anwendung: stateless Testen 2. Anwendung: stateful Testen Umschalten in OnInputProcessing s.u. default.htm 3. Anwendung stateful : Aber User hat im Browser Annahme von Session-Cookies deaktiviert! Testen OnInitialization Layout Form : Benutzer- Eingaben OnInputProcessing
Übung 6 : (18) Erstellen Sie eine BSP-Anwendung mit einer BSP-Seite: 1. Neue BSP-Anwendung in unserem Paket mit einer BSP-Seite: default.htm 2. Deklarieren Sie das Seitenattribut counter vom Typ i. 3. OnInitialization : counter = counter + 1. 4. Layout : Ausgabe Seitenattribut counter Anmerkung: Grundsätzliches Verhalten hängt nicht davon ab, wo counter hochgezählt wird Ausgabe Uhrzeit sy-uzeit und Datum sy-datum Form mit 3 Submit-Buttons, rufen OnInputProcessing Button1: Hochzählen Button 2: Auf stateful schalten Button 3: Auf stateless schalten 5. OnInputProcessing : Stets nur impliziter Selbstaufruf... Uhrzeit und Datum sehen nicht hübsch aus - kann man sie schöner formatieren? event_id in Case-Struktur - drei Fälle : 1) Hochzählen : nichts tun - passiert in OnInitialization 2) Stateful schalten : runtime keep_context = 1. 3) Stateless schalten : runtime keep_context = 0.
Übung 7 : Literaturverwaltung (20) Erstellen Sie eine BSP-Anwendung, mit der sich Literatur verwalten lässt. User kann : 1. Den vorhandenen Bestand ausgeben lassen 2. Neuen Titel in die Literatur-DB einfügen 3. Titel aus der Literatur-DB löschen. 4. Nach Einträgen für gegebenen Autorennachnamen suchen Gesamter Datenbestand befindet sich in einer DB-Tabelle folgender Struktur : ISBN Authlname Authfname Title Publisher Publyear char13 char40 char40 char132 char40 numc4 Im System ist bereits diese Tabelle ZBSPLIT mit einigen Einträgen vorhanden Alle Gruppen arbeiten auf dieser DB-Tabelle!! Anmerkung: Der Suchteil ist am relativ aufwendigsten
Übung 7 : Struktur BSP-Anwendung default.htm* Einstieg (21) head.htm Statische Navigationsleiste In alle Seiten als Seitenfragment includiert allbooks.htm* search.htm* delete.htm* insert.htm* Ausgabe aller Titel in HTML- Tabelle Abfrage Autor-Nachname Dieser Sprung mit navigation-objekt Übergabe: authorlname results.htm Ausgabe der Suchergebnisse in HTML-Tabelle Ausgabe aller Titel in HTML- Tabelle Löschen eines Titels gemäß eingegebener ISBN Einfügen neuer Titel gemäß Eingabe aller Daten Aufgrund inkludierter statischer Navigationsleiste kann User von jeder Seite zu einer der anderen Seiten* springen - und somit jede begonnene Aktion folgenlos abbrechen. Erst durch Buttondruck passiert etwas, das in der DB Folgen hat Stets impliziter Selbstaufruf der Seite, wenn User nicht statisch weg navigiert.
Anforderungen an BSP-Anwendung : (22) 1. Applikation soll Seitenfragment head.htm verwenden, das am Anfang aller BSP-Seiten inkludiert wird. Im Seitenfragment soll enthalten sein eine Navigationsleiste in Form statischer Links auf die BSP-Seiten : default.htm insert.htm allbooks.htm delete.htm search.htm 2. Fehlersituationen rudimentär behandeln : Übung 7: a) fehlende Benutzereingaben beim Suchen, Einfügen, Löschen b) fehlgeschlagener DB-Zugriff sy-subrc <> 0 Im Fehlerfall soll in OnInputProcessing das String-Seitenattribut status mit aussagekräftiger Meldung gefüllt und im Layout auf selber Seite ausgegeben werden. User hat stets Gelegenheit zu einem neuen Versuch Man bleibt auf der Seite - da Navigation nur durch die statischen Links des Seitenfragments erfolgt Ausnahme : Sprung nach results.htm 3. Seitenattribute sollen verwendet und falls erforderlich auto geschaltet sein. 4. Die Anwendung arbeitet zustandslos.
Coding-Schnipsel : 1. Typdefinition Tabellentyp : types: zbooktab_type type standard table of zbsplit. Übung 7: 2. Interne Tabelle vom passenden Typ : (alle anderen Seitenattribute sind strings ) books type zbooktab_type 3. Working area zur Aufnahme von Tabellenzeilen : data: wa_lit type zbsplit. 4. Loop über interne Tabelle books in working area : loop at books into wa_lit. endloop. 5. Nützliche SQL-Statements : select * from zbsplit into table books. (23) if authorlname is not initial. select * from zbsplit into table books where authlname = authorlname. endif. delete from zbsplit where isbn = isbn. insert zbsplit from wa_lit.
Coding-Schnipsel : Eventhandler OnInputProcessing von insert.htm ist am aufwendigsten : (24) data: wa_lit type zbsplit. wa_lit-isbn = request->get_form_field( 'isbn' ). wa_lit-authlname = request->get_form_field( 'authorlname' ). wa_lit-authfname = request->get_form_field( 'authorfname' ). wa_lit-title = request->get_form_field( 'titel' ). wa_lit-publisher = request->get_form_field( 'verlag' ). wa_lit-publyear = request->get_form_field( 'jahr' ). Übung 7 : if wa_lit-isbn is initial or wa_lit-authlname is initial or wa_lit-authfname is initial or wa_lit-title is initial or wa_lit-publisher is initial or wa_lit-publyear is initial. status = ' Daten unvollständig! '. else. insert zbsplit from wa_lit. if sy-subrc <> 0. status = ' Fehler bei Einfügen Datensatz! '. else. status = ' Datensatz geschrieben! '. endif. endif.
(25) SAP-Webprogrammierung WI 4. Semester Testat zum BSP-Framework Prof. Dr. H. Neuendorf System: HCC-SAP-System, ECC6.0 Basis 7.30 Sommersemester 2016
Testat : Mitfahrerzentrale (26) Projekte anlegen im Paket ZWI14TESTAT - Namenskonvention : ZT2016_XX Erstellen Sie eine BSP-Anwendung, mit der sich Mitfahrangebote verwalten lassen User kann : 1. Die vorhandenen Angebote ausgeben lassen 2. Neue Angebote in die DB einfügen 3. Angebote aus der DB löschen. Transportauftrag : R54K900804 wie bei Übungen 4. Eine Mitfahrt buchen dabei wird Zahl der freien Plätze um 1 verringert falls die Zahl noch > 0 ist! ( Prüfen!! ) 5. Nach Angeboten für ein bestimmtes Ziel suchen Der Datenbestand befindet sich in der DB-Tabelle ZBSPFLUCHTXX folgender Struktur : Name Datum Ziel Anzahl char40 dats char40 int1 Jede Gruppe arbeitet auf eigener DB-Tabelle! ZBSPFLUCHTXX Gruppennummern: 01, 02,, 14,15 Speziell SAP-Datumsformat ist 8-stellige Zeichenkette : YYYYMMDD Vom Benutzer Tag, Monat, Jahr getrennt erfragen und in Feld vom Typ d stellen : data: datum type d. concatenate jahr monat tag into datum.
Testat : Struktur BSP-Anwendung (27) Anm: Buchung wird nur angedeutet, da Namen der Mitfahrer nicht erfasst werden dazu wären weitere Tabellen erforderlich default.htm* Einstieg head.htm Statische Navigationsleiste In allen Seiten includiert all.htm* search.htm* book.htm* delete.htm* insert.htm* Ausgabe aller Angebote in Html- Tabelle Mit navigation- Objekt Abfrage Zielort ziel results.htm Ausgabe der Suchergebnisse in HTML-Tabelle Ausgabe aller Angebote in Tabelle Abfrage Name und Datum des Angebots Anzahl freier Plätze in Angebot wird um 1 verringert! Ausgabe aller Angebote in Tabelle Löschen eines Angebots gemäß eingegebenem Namen und Datum Ausgabe aller Angebote in Tabelle Einfügen eines neuen Angebots gemäß Eingabe aller relevanter Daten Aufgrund Navigationsleiste kann User von jeder Seite zu jeder Seite* springen - und somit auch jede begonnene Aktion folgenlos abbrechen. Erst durch einen Buttondruck passiert etwas in der DB, das Folgen hat... Die Anwendung läuft zustandslos.
Anforderungen an BSP-Anwendung : (28) 1. Die Applikation soll ein Seitenfragment head.htm verwenden, das am Anfang aller BSP- Seiten inkludiert wird. Im Seitenfragment soll enthalten sein: a) Ein MIME-Objekt = Bild als Logo b) Eine Navigationsleiste in Form statischer Links auf alle BSP-Seiten*. Testat : 2. Fehlersituationen rudimentär behandeln : a) fehlende Benutzereingaben beim Suchen, Buchen, Löschen, Einfügen b) fehlgeschlagener DB-Zugriff sy-subrc <> 0. Im Fehlerfall soll in OnInputProcessing das String-Seitenattribut status aussagekräftiger Meldung gefüllt und auf selber Seite ausgegeben werden. mit Man bleibt somit auf der Seite + User hat Gelegenheit zu einem neuen Versuch 3. Seitenattribute sollen verwendet und falls erforderlich auto geschaltet sein. 4. Die Anwendung arbeitet zustandslos. 5. Der Navigationsrequest TORESULTS soll gepflegt und verwendet werden. Von search.htm zu results.htm soll mittels navigation-objekt gesprungen werden.
Coding-Schnipsel : (29) 1. Typdefinitionen Tabellentyp : types: zflucht type standard table of zbspflucht. 2. Interne Tabelle passenden Typs : Testat : connections type zflucht. 3. Workarea zur Aufnahme von Tabellenzeilen : data: wa_flucht type zbspflucht. 4. Loop über interne Tabelle connections in workarea : Auf gruppeneigene Tabelle ZBSPFLUCHTxx beziehen! loop at connections into wa_flucht. endloop. 5. Nützliches ABAP / SQL : data: tag(2) type c, monat(2) type c, jahr(4) type c, datum type d. concatenate jahr monat tag into datum. select * from zbspflucht into table connections. sort connections by name. select * from zbspflucht into wa_flucht where ziel = ziel. select single * from zbspflucht into wa_flucht where name = name and datum = datum. update zbspflucht from wa_flucht. delete from zbspflucht where name = name and datum = datum. insert zbspflucht from wa_flucht.