ABAP-Praktikum v03

50
Praktikum Unternehmenssoftware ABAP-Grundlagen Technische Universität München Lehrstuhl für Wirtschaftsinformatik © Prof. Dr. H. Krcmar © Prof. Dr. H. Krcmar Inhalte ABAP-Grundlagen: Grundlegende Konzepte Hello World Datenbankzugriffe Data Dictionary Modularisierung DynPros Betriebswirtschaftliche Konzepte & Sonstiges ABAP Objects Business Server Pages

Transcript of ABAP-Praktikum v03

1

Praktikum Unternehmenssoftware –ABAP-Grundlagen

Praktikum Unternehmenssoftware –ABAP-Grundlagen

Technische Universität München

Lehrstuhl für Wirtschaftsinformatik© Prof. Dr. H. Krcmar

© Prof. Dr. H. Krcmar

Inhalte

• ABAP-Grundlagen:• Grundlegende Konzepte• Hello World• Datenbankzugriffe• Data Dictionary• Modularisierung• DynPros• Betriebswirtschaftliche Konzepte & Sonstiges

• ABAP Objects• Business Server Pages

2

ABAP-Gundlagen: Grundlegende KonzepteABAP-Gundlagen: Grundlegende Konzepte

© Prof. Dr. H. Krcmar

Was ist ABAP ?

• ABAP = Advanced Business Application Programming (früher: Allg. Berichts-Aufarbeitungs Prozessor)

• Wurzeln in COBOL und Pascal• Existiert seit 1982 (abwärtkompatibel viele Relikte)• ABAP-Programme werden bei der ersten Ausführung kompiliert, d.h.

alle Programme liegen auch als Quelltext vor• Plattformunabhängig (schon lange vor Java)• Datenbankunabhängig• Starke Ausrichtung an Wiederverwendbarkeit von Code- und

Datenobjekten• Seit 1998 objektorientierte Erweiterung ABAP-ObjectsTM: Verwendung

von ABAP in Klassen- und Objektstrukturen

3

© Prof. Dr. H. Krcmar

Kompilierung von ABAP-Code

Database-Server

Application-Server

Application-Server

SAPGuiPräsentation

Application

Database

Application-Server

SAPGui SAPGui

Erster Aufruf eines Programms Meldung über Kompilierung Programmausgabe

ABAP Quellcode Kompilierte Programme

Programm wurde noch nicht kompiliert

Kompilierung

Rückgabe des kompilierten Programms

Quelle: Eigene Darstellung

© Prof. Dr. H. Krcmar

Informationsquellen zu ABAP

• SAP-Hilfe• SAP Marketplace• SDN• Transaktion ABAPDOCU• Transaktion SE30 Tips & Tricks• Internet:

• www.abap4.de.vu• http://www.sapgenie.com/abap/• http://cma.zdnet.com/book/abap/index.htm (Teach Yourself ABAP/4 in 21 days)• …

• Bücher:• Umlauff/Dirnhofer: ABAP Übungsbuch, Addison-Wesley 2001• Keller, Krüger: ABAP-Objects, Galileo Press 2002• Keller/Jacobitz: ABAP Objects Referenz, Galileo Press 2004

4

© Prof. Dr. H. Krcmar

Der Entwicklerschlüssel

• Ein Entwicklerschlüssel ermöglicht es einem bestimmten SAP-Benutzer Programme zu entwickeln oder bestehende zu verändern

• Jeder Schlüssel muss bei SAP beantragt und nur einmal pro User angegeben werden

• Der Grund dieser Beantragung liegt in den höheren Lizenzkosten für Entwicklungsuser

• Zudem unterscheidet man Objektschlüssel, die die Bearbeitung bestehender SAP-Entwicklungen ermöglichen

• Der passende Entwicklerschlüssel liegt für das Praktikum auf demShare-Laufwerk

© Prof. Dr. H. Krcmar

ProductionSystem (PROD)

Quality AssuranceSystem (QAS)

DevelopmentSystem (DEV)

Transport in einer typischen SAP-Systemlandschaft

• Änderungen werden in Transportaufträgen gespeichert und werden von DEV nach QAS transportiert

• Transportaufträge werden beim Export als Dateien gespeichert• Beim Import können einzelne oder alle anstehenden

Transportaufträge eingespielt werden

Quelle: Eigene Darstellung

5

© Prof. Dr. H. Krcmar

Hierarchie des Transportwesens

Aufgabe

Transportauftrag

Projekt

Aufgabe Aufgabe

Transportauftrag Transportauftrag

Aufgabe AufgabeAufgabe

Mitarbeiter Mitarbeiter Mitarbeiter Mitarbeiter Mitarbeiter Mitarbeiter

Quelle: Eigene Darstellung

ABAP-Gundlagen: Hello World!ABAP-Gundlagen: Hello World!

6

© Prof. Dr. H. Krcmar

Zugangsdaten

• System: G31• Mandant: 902• User: ABAP-5-XX• Passwort: init Passwort

muss bei der ersternAnmeldung geändert werden (Bitte merken!)

© Prof. Dr. H. Krcmar

Hello World ! 1/3

Einmalige Vorarbeiten (TA SE80):

• Paket anlegen: ZB_05_## (## ist die User-Nummer)

• Neuen Transportauftrag für das Anlegen des Pakets erstellen

• Pakete gliedern das Repository• Transportaufträge dienen der

Organisation und dem Transport von Entwicklungen

ZB_05_##

ZB_05_##

7

© Prof. Dr. H. Krcmar

Hello World 2/3

• Programm ZB_05_XX_HELLOWORLD in angelegtem Paket ohne TOP-Include erstellen (Kontextmenü des Pakets anwählen)

• Entwicklerschlüssel eingeben• Eigenschaften des Programms

angeben

• Programm dem neuen Paket und dem Transportauftrag zuordnen

ZB_05_##_HELLOWORLD

Report ZB_05_##_HELLOWORLD

ZB_05_##_HELLOWORLD

ZB_05_##

© Prof. Dr. H. Krcmar

Hello World 3/3

• Programm schreiben (Punkt nicht vergessen!)

• Programm speichern, prüfen, testen und aktivieren

• Aufgabe: Wie kann das Programm erweitert werden, damit vor dem Text ein Icon erscheint ? (Tip: Hilfe zum Befehl „Write“)

2. 4. 3.

1.

*&---------------------------------------------------------------------**& Report ZB_05_##_HELLOWORLD **& **&---------------------------------------------------------------------**& **& **&---------------------------------------------------------------------*REPORT ZB_05_##_HELLOWORLD .write 'Hello World!'.

ABAP Editor: Report ZB_05_HELLOWORLD ändern

8

© Prof. Dr. H. Krcmar

Arbeitsumgebung: Object Navigator 1/2

• Benutzerfreundliche Oberfläche, die alle Entwicklungswerkzeuge intuitiv verbindet

• Zweiteilung des Object Navigator in Navigationsbaum und Inhaltsteil (Teile entsprechen sich nicht immer!)

• Programmierhilfen:• Informationssystem: bietet gezielte Hilfe zu Befehlen, Konzepten und

Objekten• Breakpoints: gezielte Pause bei Programmausführung• Muster: Assistent zur Generierung komplexer Befehlsstrukturen• Pretty Printer: macht den Code besser lesbar (einstellbar über Hilfsmittel

Einstellungen

© Prof. Dr. H. Krcmar

Arbeitsumgebung: Object Navigator 2/2

• Vorwärtsnavigation: forward ever, backward never• Grundlegendes Prinzip in der SAP-Entwicklung• Durch Doppelklick auf Erwähnung eines Objektes kann zum Objekt

navigiert bzw. es erstellt werden• Einsicht in beliebigen SAP-Code (über System Status):

9

© Prof. Dr. H. Krcmar

Entwicklungswerkzeuge in SAP

Quelle: SAP AG 1999

© Prof. Dr. H. Krcmar

Elemente der ABAP-Programmierung 1/2

• Dynamisches Programme (Dynpro): Bildschirmbild mitAblauflogik

• Selektionsbilder: “Geschenktes” Dynpro ohne Ablauflogik• Report: Ausgabe von Listen• Programm: Interaktives Programm mit Dynpro• Funktionsbaustein: Funktionsbibliothek, die von anderen

Programmen bzw. SAP-Systemen genutzt werden kann• Strukturen: Struktur einer Tabellenzeile• Tabellen: Unterscheidung verschiedener Typen, wobei

transparente Tabellen am häufigsten verwendet werden

10

© Prof. Dr. H. Krcmar

Elemente der ABAP-Programmierung 2/2

• Datenbankview: - Zusammenführung von mehreren Tabellen- Festlegung im Data Dictionary (im Gegensatz zu Inner Joins)- Unterscheidung in Datenbankview (Lesen von Daten),

Pflegeview (Datenpflege mit betriebswirtschaftlichen Zusammenhängen) …

- Lässt sich über Workbench anlegen- Kann wie eine Datenbank angesprochen werden

• Interne Tabellen: temporäre Speicherung von Datenbanktabellen

ABAP-Gundlagen: DatenbankzugriffeABAP-Gundlagen: Datenbankzugriffe

11

© Prof. Dr. H. Krcmar

Applikations-Server Datenbank-Server

DB-InterfaceDB-Interface

OpenSQLTM

• Portierung von ABAP auf alle gängigen Datenbanken

ABAP-Interpreter

Select * from

Exec SQL.Select …

End Exec.

ABAP-Interpreter

Select * from

Exec SQL.Select …

End Exec.

SQL-DatenbankSQL-Datenbank

Daten

Open SQLOpen SQL

Native SQLNative SQL

DB DatenDB Daten DB DatenDB Daten

DB DatenDB Daten

Native SQLNative SQL

Quelle: SAP AG

© Prof. Dr. H. Krcmar

SAP-Reisebüro Beispiel

• Von SAP erstelltes Beispiel, dass eine vereinfachte Einführung in die ABAP-Entwicklung ermöglicht

• Primär sind die bestehenden Datenstrukturen und –tabellen sowie die enthaltenen Daten relevant

• Wichtige Tabellen: • SCARR (Fluggesellschaften)• SPFLI (Flugpläne) Struktur: sbc400_t_spfli• SFLIGHT (Flüge) Struktur: sbc400focc• SBOOK (Flugbuchungen)

• Betrachtung der Tabellenstruktur über das Dictionary (SE11)des Tabelleninhalts über den Data Browser (SE16)

12

© Prof. Dr. H. Krcmar

Programm: Tabellen auslesen

• Geben Sie alle Flüge der Lufthansa aus der Tabelle „SFLIGHT“ aus

• Aufgabe: Erweitern Sie das bestehende Programm um eine Abfrage, ob der Select-Befehl erfolgreich ausgeführt wurde (benutzen Sie dazu die Systemvariable sy-subrcsowie eine IF-Verzweigung)

*&---------------------------------------**& Report ZB_05_##_LUFTHANSA **& **&---------------------------------------**& **& **&---------------------------------------*

REPORT zb_05_##_lufthansa .

DATA: it_spfli TYPE sbc400_t_spfli,wa_spfli TYPE spfli.

SELECT * FROM spfli INTO TABLE it_spfliWHERE carrid = 'LH'.

LOOP AT it_spfli INTO wa_spfli.WRITE: / wa_spfli-carrid,

wa_spfli-connid,wa_spfli-cityfrom,wa_spfli-cityto,wa_spfli-deptime,wa_spfli-arrtime.

ENDLOOP.

© Prof. Dr. H. Krcmar

Interne Tabellen und Arbeitsbereiche

• Workarea (wa_spfli):• Entspricht einer Zeile in einer Tabelle

und wird meistens durch eine Struktur definiert

• Enthält die aktuell bearbeitete Tabellenzeile

• Interne Tabelle (it_spfli):• Kann analog zu einer

Datenbanktabelle aufgebaut sein• Ist eine „lokale Kopie“ einer Tabelle• Besteht nur, so lange das Programm

läuft, das sie erstellt hat

0400LH

0400LH0017AA

Arbeitsbereich wa_spfli

Interne Tabelle it_spfliAPPEND …COLLECT …INSERT …MODIFY …DELETE …

LOOP AT ….ENDLOOP.

READ TABLE …

SORT … BY …REFRESH …Quelle: In Anlehnung an SAP AG

13

© Prof. Dr. H. Krcmar

Datentypen

Vordefiniert(P, I, F, C, N, D, T, X)

Datentyp

benutzerdefiniert

elementar

Feldleistentyp

strukturiert

Tabellentyp

Quelle: In Anlehnung an SAP AG

© Prof. Dr. H. Krcmar

Vordefinierte Datentypen in ABAP

Systemvariablen (sy-…): Tabelle syst

Alphanumerischer TextStringBytefolgeXstring

0Gepackte ZahlpMax. 65536 Ziffern00 … 0Numerischer TextnMax. 65536 Zeichen<Leerzeichen>Zeichenkettec

X’00‘Byte (hexadezimal)x

0.000Gleitpunktzahlf0integeri000000Timet00000000Dated

WertebereichInitialwertBedeutungDatentyp

14

© Prof. Dr. H. Krcmar

Datendeklaration

• Einfache Felddefinition: DATA f (len) TYPE Datentyp

• Strukturiertes Datenobjekt: DATA: BEGIN OF struc, …END OF struc.

• Interne Tabelle: DATA itab TYPE Tabellentyp oderDATA itab TYPE TABLE OF Struktur

• Konstanten: CONSTANTS c VALUE Wert/is INITIAL

• Parameter: PARAMETERS p

• Anstelle von TYPE kann in den meisten Fällen LIKE verwendet werden es muss keine Kenntnis über genauen Datentyp vorliegen

© Prof. Dr. H. Krcmar

Datenmanipulation

• Datenzuweisung: MOVE f TO f oderg = f

• Numerische Operationen: ADD n TO m oderm = m + n

• Wichtige Stringoperationen: CONCATENATE

SPLIT

SEARCH

• Es erfolgt eine automatische Typkonvertierung bei Wertzuweisung, wenn möglich

15

© Prof. Dr. H. Krcmar

Programm: Selektionsbildschirm

• Interaktion mit Benutzer vereinfacht über Selektionsbildschirme möglich (z.B. auch bei SE16)

• Selektionsbildschirm ist ein „geschenktes“ Dynpro• Dynpro-nr. des Selektionsbildschirmes ist 1000• Komplexe Selektionsbildschirme realisierbar• Aufgabe: Erweitern Sie das Lufthansa-Programm so, dass

Sie zu Beginn auswählen können, von welcher Fluggesellschaft alle Flüge angezeigt werden sollen (Ändern des angezeigten Variablennamens über Springen Textelemente)

© Prof. Dr. H. Krcmar

Ablauf eines ABAP-Programmes

• Ablaufreihenfolge:• LOAD-OF-PROGRAM (INITIALIZATION)• AT SELECTION-SCREEN• START-OF-SELECTION

• Ereignisse:• AT LINE_SELECTION• TOP-OF-PAGE• END-OF-PAGE

16

© Prof. Dr. H. Krcmar

Verzweigungslisten

• Im Ereignis „AT LINE-SELECTION“ kann hinterlegt werden, welche Reaktion bei Doppelklick auf einen Listeneintrag erfolgt

• Durch jeden Doppelklick, gelangt man eine Verzweigungsebene tiefer (bis 10 Ebenen)

• Bei jedem Doppelklick (auch auf weiterführenden Listen) wird dieser Block ausgeführt Begrenzung notwendig (sy-lsind)

• Schnittstelle zwischen den Listenebenen ist der HIDE-Bereich (später auch für Dynpro‘s wichtig)

© Prof. Dr. H. Krcmar

Programm: Verzweigungslisten

• Aufgabe: Ändern Sie das letzte Programm so ab, dass nach der Auswahl der Fluggesellschaft nur Fluggesellschaft und Flugnummer angezeigt werden. Durch einen Doppelklick gelangt man zur Detailanzeige des Eintrags, bei der die restlichen Daten zum Flug angezeigt werden.

• Begrenzen Sie dabei die Anzahl der Verzeigungsebenen auf eine einzige

• Zusatzaufgabe: Erweitern Sie das Programm um eine weitere Verzweigungsebene

17

© Prof. Dr. H. Krcmar

Programm: Verzweigungsliste - Lösung*&---------------------------------------------------------------------**& Report ZB_05_##_LUFTHANSA_VERZWEIG**&---------------------------------------------------------------------*

REPORT zb_05_##_lufthansa_verzweig.

PARAMETERS: flugges TYPE spfli-carrid.

DATA: it_spfli TYPE sbc400_t_spfli,wa_spfli TYPE spfli.

START-OF-SELECTION.SELECT * FROM spfli INTO TABLE it_spfliWHERE carrid = flugges.

IF sy-subrc = 0.LOOP AT it_spfli INTO wa_spfli.

WRITE: / wa_spfli-carrid, wa_spfli-connid.

HIDE: wa_spfli-carrid, wa_spfli-connid, wa_spfli-cityfrom,wa_spfli-cityto, wa_spfli-deptime, wa_spfli-arrtime.

ENDLOOP.ENDIF.

AT LINE-SELECTION.IF sy-lsind = 1.

WRITE: / wa_spfli-carrid, wa_spfli-connid, wa_spfli-carrid,wa_spfli-connid, wa_spfli-cityfrom, wa_spfli-cityto,wa_spfli-deptime, wa_spfli-arrtime.

ENDIF.

ABAP-Gundlagen: Data DictionaryABAP-Gundlagen: Data Dictionary

18

© Prof. Dr. H. Krcmar

Rolle des Data Dictionary

• „Vererbungsmodell“ für Daten• Automatische Zuweisung von Hilfe und Bezeichnungen zu

Datentypen• Abbildung eines ERM als Relationen direkt möglich (mit

Tools wie z.B. ARIS)• Unterscheidung von Feldern, Strukturen, Tabellen,

Datenelementen und Domänen

© Prof. Dr. H. Krcmar

KPLZ MPLZ

PLZPLZ

Aufbau des Data Dictionary

Vererbung Domäne

Feld

Datenelement

Feld Struktur

FeldFeld

Tabelle

NUM4

Quelle: In Anlehnung an SAP AG

19

© Prof. Dr. H. Krcmar

Anlegen einer Suchhilfe

• Legen Sie die Domäne ZB5##CHAR30 vom Datentyp CHAR der Länge 30 an (prüfen + aktivieren nicht vergessen!)

• Legen Sie das Datenelement ZB5##ANR30 von der eben erstellten Domäne an (prüfen + aktivieren nicht vergessen!)

• Legen Sie die Tabelle ZB5##ANREDE in Transaktion SE11 an, bei der die Auslieferungsklasse C ist

• Erlauben Sie die uneingeschränkte Pflege• Legen Sie das Feld „Anrede“ mit dem Datenelement ZB5##ANR30

als Primärschlüssel an• Pflegen Sie die technischen Einstellungen (prüfen + aktivieren nicht

vergessen!)• Pflegen Sie über SE16 Werte in die Tabelle ein

© Prof. Dr. H. Krcmar

Anlegen einer Tabelle

• Legen Sie mit der Transaktion SE11 (Data Dictionary) eine neue Tabelle ZB5##PERSON an, die Daten von Personen aufnehmen soll (z.B. Name, Vorname, Anrede …)

• Nehmen sie für Name und Vorname zur Vereinfachung eingebaute Datentypen zur Deklaration und markieren Sie diese Felder als Schlüssel

• Das Feld Anrede muss von Datenelement ZB5##ANR30 sein• Erlauben Sie die Anzeige und Pflege der Tabelle• Pflegen Sie vor der Aktivierung die technischen Einstellungen der

Tabelle

20

© Prof. Dr. H. Krcmar

Angeben der Suchhilfe

• Geben Sie in der Tabelle ZA5##PERSON im Reiter Eingabehilfe für das Feld Anrede als Fremdschlüssel das entsprechende Feld der Tabelle ZB5##ANREDE an und übernehmen Sie die automatischen Vorschlagswerte

• Aufgabe: Testen Sie die Suchhilfe, indem Sie ein Programm erstellen, bei dem Sie über eine Parametereingabe die F4-Hilfe der Anrede einbinden

ZB##ANREDE

ZB##ANREDE

ABAP-Gundlagen: ModularisierungABAP-Gundlagen: Modularisierung

21

© Prof. Dr. H. Krcmar

Modularisierung

Möglichkeiten der Modularisierung in ABAP:1. Include-Dateien (Befehl INCLUDE)

- TOP-Include: enthält globale Datendefinitionen- Include: enthält Programmteile

2. Form‘s (Prozeduren)3. Funktionsbausteine

© Prof. Dr. H. Krcmar

Include-Dateien

• Ausgliederung von Quellcode aus Programm• Include-Dateien werden vor Ausführung in Hauptprogramm

eingefügt• Einbinden eine Include-Datei über Befehl „INCLUDE“

22

© Prof. Dr. H. Krcmar

Forms (Prozeduren) in ABAP

• Forms können auf übergeordnete Variablen zugreifen• Deklaration:

FORM <Prozedurname>USING value(<Eingabeparameter>) TYPE <Typ> Eingabeparameter by valueCHANGING <Eingabe-/Ausgabeparameter> Eingabe-/Ausgabeparameter by referenceCHANGING value(<Eingabe-/Ausgabeparameter>). Eingabe-/Ausgabeparameter by value and

resultENDFORM.

• Aufruf:PERFORM <Prozedurname>

USING <Eingabeparameter> Eingabeparameter by valueCHANGING <Eingabe-/Ausgabeparameter>. Eingabe-/Ausgabeparameter by reference

bzw. by value and result (je nach Deklaration)

• Aufgabe: Gliedern sie die Anzeige der Flugübersicht des letzten Programms in eine Prozedur aus und übergeben Sie die Fluggesellschaft als Parameter

© Prof. Dr. H. Krcmar

Programm: Funktionsbausteine

• Kapselung von Quellcode zu Funktionsbausteinen• Organisation von Funktionsbausteinen in Funktionsgruppen• Funktionsbausteine können nicht auf übergeordnete Variablen

zugreifen vollständige Parameterübergabe über Schnittstelle• Aufgabe: Fassen Sie den Prozess der Listen- und Detailanzeige in

einen Funktionsbaustein zusammen. Die Auswahl der Fluggesellschaft soll nach wie vor im Programm erfolgen.

• Legen Sie zunächst eineFunktionsgruppe an

ZB_05_##

23

© Prof. Dr. H. Krcmar

Programm: Funktionsbaustein - Lösung

Das Programm:Das Programm: Der Funktionsbaustein:

Der Importparameter FGES wird im Reiter „Import“ angegeben

*&---------------------------------------**& Report ZB_05_##_LUFTHANSA_FUNKTION **& **&---------------------------------------*REPORT zb_05_##_lufthansa_funktion.

PARAMETERS: flugges TYPE spfli-carrid.

START-OF-SELECTION.CALL FUNCTION 'ZB_05_##_LISTE'

EXPORTINGfges = flugges.

FUNCTION ZB_05_##_LISTE .*"------------------------------*"*"Lokale Schnittstelle:*" IMPORTING*" REFERENCE(FGES)*"------------------------------

DATA: it_spfli TYPE sbc400_t_spfli,wa_spfli TYPE spfli.

SELECT * FROM spfli INTO TABLE it_spfliWHERE carrid = fges.

IF sy-subrc = 0.LOOP AT it_spfli INTO wa_spfli.

WRITE: / wa_spfli-carrid, wa_spfli-connid,wa_spfli-carrid, wa_spfli-connid,wa_spfli-cityfrom, wa_spfli-cityto,wa_spfli-deptime, wa_spfli-arrtime.

ENDLOOP.ENDIF.

ENDFUNCTION.

© Prof. Dr. H. Krcmar

Arten von Funktionsbausteinen

Funktionsbausteine

Remotefähige Funktionsbausteine

BAPI

Quelle: Eigene Darstellung

24

© Prof. Dr. H. Krcmar

Besondere Funktionsbausteine: BAPI‘s

• BAPI‘s sind nach betriebswirtschaftlicher Sichtweise gekapselte Funktionsbausteine

• Entwickler müssen sich keine Gedanken um die Veränderung der entsprechenden Tabellen

• BAPI‘s sind RFC-fähigeFunktionsbausteine, die von außerhalb SAP‘s aus aufgerufen werden können

• Übersicht aller verfügbarer BAPI‘sunter der Transaktion BAPI

© Prof. Dr. H. Krcmar

Umgang mit BAPI‘s

• Grundsätzliches Vorgehen beim Verwenden von BAPI‘s:1. Nach Möglichkeit zunächst mit der Transaktion vertraut machen, deren Funktion ein

BAPI widerspiegelt2. Suchen des BAPI‘s und lesen der Dokumentation (evtl. auch Anschauen des

Quellcodes des BAPI‘s)3. Testen des BAPI‘s im Function Builder oder über die Transaktion BAPI4. Verwendung des BAPI‘s in einem eigenen Programm

• Mögliche Probleme:• Im Testmodus werden auch leere Felder teilweise belegt• Bei Einbindung in ein eigenes Programm immer auf die Datentypen und Mussfelder

achten

• Aufgabe: Testen Sie in der TA BAPI das BAPI BAPI_PROJECTDEF_GETLIST (Projektsystem ProjectDefinition GetList)

25

© Prof. Dr. H. Krcmar

Der Debugger

• Ermöglicht schrittweises Ausführen einer Anwendung• Überprüfung von Variablen und Strukturen zur Laufzeit• Im Gegensatz zu normalem Ablauf sind nicht nur

Breakpoints, sondern auch Watchpoint möglich• Watchpoint: Programmablauf wird nur bei bestimmtem

Wert einer Variable unterbrochen• Aktivierung bei Programmstart oder während des Ablaufs

durch „/h“ (wirkt erst bei nächstem Bildschirmwechsel)• Starten eines Programms mit Debugger über Menü:

Programm Testen Debugging

© Prof. Dr. H. Krcmar

Messages

• Nachrichtenklassen enthalten vorgefertigte Messages• Es werden folgende Messagetypen unterschieden:

• A – Abbruch im modalen Fenster• I - Information im modalen Fenster• E – Error in der Statusleiste• S – Meldung in der Statusleiste• W – Warnung in der Statusleiste (muss mit Enter bestätigt werden)• X – harter Abbruch, verursacht Kurzdump

• Aufruf: MESSAGE <Typ><Nummer> WITH <Parameter 1> <Parameter 2> <Parameter 3> <Parameter 4>

26

© Prof. Dr. H. Krcmar

Programm: Messages

• Zusatzaufgabe: Erstellen Sie eine Nachrichtenklasse ZB_05_XX und legen Sie mindestens eine Nachricht ein, die Sie sinnvoll in das Programm zur Verzweigungsliste einbinden

• Hinweis: Sie müssen im Befehl „Report“ angeben, welche Nachrichtenklasse Sie verwenden möchten

ABAP-Gundlagen: DynProsABAP-Gundlagen: DynPros

27

© Prof. Dr. H. Krcmar

Eigenschaften von DynPros

• Werden pro Programm mit vierstelliger Nummer gespeichert (Selektionsbild hat Nr. 1000)

• Programme mit Dynpros können nur über Transaktionen aufgerufen werden

• Programme, die Dypros verwenden sind Modulpools• Module beinhalten Dynpro-ABAP• Unterscheidung in Input und Output-Module pro Dynpro

© Prof. Dr. H. Krcmar

Ablauf eines DynPros

Process beforeOutput (PBO) 100

Fluggesellschaft = ‚LH‘

Process afterInput (PAI) 100

Select * from spfliWhere carrid=

fluggesellschaft and …

Quelle: Eigene Darstellung

28

© Prof. Dr. H. Krcmar

Ablauf mehrerer DynPros

PBO 100 PAI 100

DynPro 100

PBO 200 PAI 200

DynPro 200

TOP IncludeHIDE-Bereich

COMMIT

Quelle: Eigene Darstellung

© Prof. Dr. H. Krcmar

Übung: Dynpro 100 1/5

• Legen Sie das Programm (Modulpool) ZB_05_##_LH_Dynpro mit TOP-Include an (ZB_05_##_LH_DYNPRO_TOP).

• Definieren Sie im TOP-Include eine Workarea entsprechend der Tabelle spfli an, sowie die Variablen ok_codeund save_ok vom Typ sy-ucomm; Deklarieren Sie die Tabelle SPFLI mit Tables

*&---------------------------------------------**& Include ZB_05_##_LH_DYNPRO_TOP Modulpool **& **&---------------------------------------------*

PROGRAM ZB_05_##_LH_DYNPRO .

tables spfli.

data: ok_code like sy-ucomm,save_ok like ok_code.

data: wa_spfli like spfli.

Programm ZB_05_##_LH_DYNPRO

29

© Prof. Dr. H. Krcmar

Übung: Dynpro 100 2/5

• Legen Sie zu diesem Programm das Dynpro 100 über das Kontaxtmenü an (Folgedynpro: 200)

• Über den Button „Layout“ gelangen Sie zum graphischen Screen Painter

Dynpro 100 zum Programm ZB_05_##_LH_DYNPRO

© Prof. Dr. H. Krcmar

Übung: Dynpro 100 3/5

• Die farbigen Buttons öffnen weitere Auswahlfenster

• Übernehmen Sie aus dem Dictionary die Felder Carridund Connid der Tabelle spfli in das Dynpro (Felder markieren, übernehmen und fallen lassen)

• Erstellen Sie einen Knopf zum Weiterverarbeiten der gewählten Daten und pflegen sie den OK_CODE (sowohl für Dynpro und Button)

30

© Prof. Dr. H. Krcmar

Übung: Dynpro 100 4/5

• Speichern, prüfen und aktivieren Sie Dynpro und verlassen Sie den Screen Painter

• Erstellen Sie per Vorwärtsnavigation im Reiter Ablauflogik das Modul „MODULE STATUS_0100“ und darin einen Status sowie einen Titel für das Dynpro 100 (vorgeschlagene Namen korrigieren!, Includeswerden autom. erstellt)

ZB_05_##

Screen Painter: Dynpro zu ZB_05_##_LH_DYNPRO ändern

© Prof. Dr. H. Krcmar

Übung: Dynpro 100 5/5

• Kommentieren Sie im Dynpro alle Module ein und legen Sie sie per Vorwärtsnavigation an

• Legen Sie per Vorwärtsnavigation das Modul „MODULE USER_COMMAND_0100“ an und verarbeiten Sie den eingehenden ok_code des Dynpros

• Es soll gemäß den ausgesuchten Parametern ein Eintrag aus der Tabelle „spfli“ in die zuvor definierte Workarea geladen werden

• Legen Sie die Transaktion ZA_05_##_lh_dyn über das Kontextmenü an, um das zugehörige Programm starten zu können

*&--------------------------------------------**& Include ZB_05_##_LH_DYNPRO_I01 **&--------------------------------------------**& Module USER_COMMAND_0100 INPUT **&--------------------------------------------*MODULE user_command_0100 INPUT.

save_ok = ok_code.CLEAR ok_code.

CASE save_ok.WHEN 'BACK'.

LEAVE PROGRAM.WHEN 'ENTER'.

set screen 100.WHEN 'SELECT'.

SELECT * FROM spfli into wa_spfliWHERE carrid = spfli-carrid AND connid = spfli-connid.ENDSELECT.LEAVE TO SCREEN 200.

ENDCASE.

ENDMODULE. " USER_COMMAND_0100 INPUT

31

© Prof. Dr. H. Krcmar

Übung: Dynpro 100 Zusatz

• Wie kann das Feld carrid im Dynpro vorbelegt werden ?• Wie kann die Eingabe der ENTER-Taste angefangen

werden ?• Wo kann man für die Buttons ein Ikon angeben ?• Wie kann erreicht werden, dass für das Feld Flugnummer

auch eine F4-Hilfe erscheint ? (Tip: Transaktion ABAPDOCU)

© Prof. Dr. H. Krcmar

Übung: Dynpro 200

• Erstellen Sie im gleichen Programm das Dynpro 200• Es soll alle Daten des gewählten Fluges anzeigen• Die angezeigten Daten sollen veränderbar sein• Legen Sie dazu einen Button an, der das Speichern

ermöglichen soll• Benutzen sie zum Speichern den ABAP-Befehl „MODIFY“

bzw. „UPDATE“ (weitere Doku in der Hilfe)• Zusatz: Zeigen Sie durch Meldungen in der Statuszeile an,

ob das Speichern erfolgreich war oder nicht

32

ABAP-Gundlagen: Betriebswirtschaftliche Konzepte & Sonstiges

ABAP-Gundlagen: Betriebswirtschaftliche Konzepte & Sonstiges

© Prof. Dr. H. Krcmar

Das Sperrkonzept

• Was passiert, wenn mehrere User den gleichen Datensatz gleichzeitig bearbeiten ?

Dateninkonsistenz• Sperrkonzepte verhindern den gleichzeitigen

(verändernden) Datenzugriff• Neben dem Sperrkonzept der Datenbank hat SAP ein

eigenes Sperrkonzept

33

© Prof. Dr. H. Krcmar

Sperrmodi

1. Lesesperre (shared lock)• Setzt Sperre auf zu lesendes Datenobjekt• Es können mehrere Lesesperren gleichzeitig auf ein Datenobjekt bestehen• Verhindert das setzen einer Schreibsperre auf ein Datenobjekt

2. Schreibsperre (exclusive lock)• Setzt Sperre auf zu veränderndes Datenobjekt• Erlaubt keine weiteren Sperren (auch keine Lesesperre)

Deadlock:• Kann eine Sperre nicht gesetzt werden, wird gewartet, bis die Sperre gesetzt

werden kann• 2 Programme warten gegenseitig darauf, dass das andere Programm die

Sperre aufhebt

© Prof. Dr. H. Krcmar

Anlegen eines Sperrobjektes

• Anlegen erfolgt im DataDictionary (SE11)

• Pro Tabelle kann es nur ein Sperrobjekt geben

• Sperrparameter werden automatisch aus dem Primärschlüssel der Tabelle generiert

34

© Prof. Dr. H. Krcmar

Verwendung von Sperrobjekten

• Beim Anlegen eines Sperrobjektes werden automatisch die Funktionsbausteine Enqueue_<Sperrobjekt> und Dequeue_<Sperrobjekt> angelegt

• Vor dem Lesen/Schreiben wird mit Enqueue eine Sperre angefordert• Nach der Lese-/Schreibaktion bzw. bei Fehlern wird die Sperre mit

Dequeue wieder freigegeben• Einbinden der Funktionsaufrufe erfolgt am einfachsten über „Muster“• Sperren können mit der Transaktion SM12 manuell aufgehoben

werden

© Prof. Dr. H. Krcmar

Übung: Sperrobjekte

• Fordern Sie in Ihrem Programm eine Lesesperre an für den in Dynpro 100 gewählten Datensatz

• Wenn der Datensatz im Dynpro 200 geändert wurde und gespeichert werden soll, fordern Sie eine Schreibsperre für den entsprechenden Datensatz an

• Vergessen Sie nicht, die Sperren wieder freizugeben !

35

© Prof. Dr. H. Krcmar

Logical Unit of Work (LUW)

PBO 100 PAI 100

DynPro 100

PBO 200 PAI 200

DynPro 200

Netzausfall

Verbuchung Soll-Seite

Verbuchung Haben-Seite

Was passiert, wenn während der Verbuchung einer betriebwirtschaftlich

zusammenhängen Buchung über mehrere Dynpros das

Netz ausfällt ?

© Prof. Dr. H. Krcmar

LUW

• Problem: • Bei jedem neuen Dynpro werden geändert DB-Tabellen in die DB geschrieben

(COMMIT)• Wenn zusammenhängende Daten über mehrere DynPros ermittelt werden,

kann erst am Ende ausgesagt werden, ob die Daten gebucht werden sollen oder nicht

• Lösung:• Änderungen an DB-Tabellen werden in Verbuchungsbausteinen vorgemerkt • Erst, wenn alle Daten korrekt gesammelt wurden, werden die Änderungen in

die DB-Tabellen geschrieben (Commit Work) oder verworfen (Rollback)Daten können in einer LUW über mehrere DynPros hinweg gesammelt werden

36

© Prof. Dr. H. Krcmar

Anlegen/Aufrufen eines Verbuchungsbausteines

• Anlegen:• Analog zu normalem Funktionsbaustein, nur dass als Ablaufart

„Verbuchungsbaustein“ gewählt wird• Ausführungsarten:

- Start sofort: synchron- Sofort, nicht nachverbuchbar: bei Problemen wird Nachverbuchung nicht

vorgenommen- Start verzögert: asynchron

• Inhalt: Änderung der DB-Tabelle• Aufrufen:

• Synchron:CALL FUNCTION <Verbuchungsbaustein> … COMMIT WORK.• Asynchron: CALL FUNCTION <Verbuchungsbaustein> IN UPDATE TASK.

© Prof. Dr. H. Krcmar

Berechtigungsprüfung

• Vor jedem DB-Zugriff sollten die Rechte des Benutzers geprüft werden

• Überprüfung, ob der Benutzer das Berechtigungsobjekt „S_CARRID“ besitzt und für die Fluggesellschaft „LH“ die Aktivität „02“ (=ändern) durchführen darf

AUTHORITY-CHECK OBJECT ‘S_CARRID‘ID ‘ CARRID‘ FIELD ‘LH‘ID ‘ACTVT‘ FIELD ’02‘.

IF sy-subrc NE 0.…ENDIF.

ACTVT

CARRIDAA AZ DL LH UA

03

02

01

x x x x x

x

37

© Prof. Dr. H. Krcmar

Sonstiges

• Einplanung von APAB-Programmen für Hintergrundverarbeitung:• Einplanung in TA SM36 mit Zeitintervall, Event oder Vorgänger-

Job• Bei Aufruf von Programmen mit Eingabefeldern müssen vorher

Varianten gespeichert und angewendet werden

• Aufruf von Transaktionen innerhalb ABAP mit : CALL TRANSACTION <ta>

ABAP-ObjectsABAP-Objects

38

© Prof. Dr. H. Krcmar

Einstieg ABAP-Object

• Objektorientierter „Aufsatz“ auf ABAP• Stufenweise Konvertierung des ABAP-Quellcodes in

ABAP-Objects• Wichtige Werkzeuge:

• ABAP Workbench (nach wie vor)• Class Builder

© Prof. Dr. H. Krcmar

Prinzipien der Objektorientierung 1

• Klassen sind die Definition eines Objektes und enthalten Attribute und Methoden eines Objektes

• Instanzen sind die konkrete Ausprägung einer Klasse• Beispiel:

- Klasse: Auto- Instanz: Mein Auto mit dem Kennzeichen xxx

39

© Prof. Dr. H. Krcmar

Prinzipien der Objektorientierung 2

• Kapselung: innerer Ablauf einer Klasse ist egal, es zählen nur Schnittstellen

• Polymorphie: gleichnamige Funktionen bei verschiedenen Klassen führen zu analogem Verhalten

• Vererbung: eine neue Klasse die Eigenschaften einer bestehenden Klasse erben und um eigene Eigenschaften erweitern

© Prof. Dr. H. Krcmar

Beispiel für Objektorientierung

Klasse Fahrzeug

Klasse PKW Klasse LKW

Attribute: Hersteller

Anzahl Räder

Methoden: Erstellen

Attr. anzeigen

Vererbung Vererbung

Attribute: Hersteller

Anzahl Räder

Anzahl Sitze

Methoden: Erstellen

Attr. anzeigen

Belegte Sitze

Attribute: Hersteller

Anzahl Räder

Zuladung

Methoden: Erstellen

Attr. anzeigen

LadekapazitätQuelle: Eigene Darstellung

40

© Prof. Dr. H. Krcmar

Klassifikation von Methoden und Attributen

• Privat öffentlich:• Private Methoden/Attribute können nur aus der Klasse selbst

aufgerufen/abgefragt werden (z.B. Methode „Bremsen“: soll nicht jeder machen können)

• Öffentliche Methoden/Attribute können immer aufgerufen/abgefragt werden (z.B. was für eine Farbe hat das Auto ?)

• Instanz statisch• Instanz-Methoden/Attribute existieren in jeder Instanz (z.B. Methode „Farbe

abfragen“, da jede Instanz eine andere Farbe haben kann)• Statische Methoden/Attribute existieren in nur einmal für alle Instanzen (z.B.

Auflistung aller Instanzen einer Klasse)

© Prof. Dr. H. Krcmar

Deklaration einer Klasse

• Klassen können in der ABAP-Workbench oder im ClassBuilder (beides am besten in Include-Dateien)

• Unterteilung in Definition und Implementierung einer Klasse• Definition enthält „Kopfdaten“ der Klasse• Implementierung enthält Code der entsprechenden

Methoden

41

© Prof. Dr. H. Krcmar

Definition einer Klasse

CLASS <Klassenname> DEFINITION.PUBLIC SECTION.

METHODS: <Methode1> IMPORTING <Importparameter1> TYPE <Datentyp><Importparameter2> TYPE <Datentyp>,

<Methode2>.CLASS-METHODS: <Methode2>.DATA: <Variable1> TYPE <Datentyp>CLASS-DATA: <Variable2> TYPE <Datentyp>

PRIVATE SECTION.METHODS: …CLASS-METHODS: …DATA: …CLASS-DATA: …

ENDCLASS.

© Prof. Dr. H. Krcmar

Implementierung einer Klasse

CLASS <Klassenname> IMPLEMENTATION.…METHOD <Methodenname>.

…ABAP-Code…ENDMETHOD.…

ENDCLASS.

42

© Prof. Dr. H. Krcmar

Aufruf von Methoden / Attributabfrage

• Instanzmethode: [CALL METHOD] <Instanzname>-><Methode>(_<Importparameter> = Wert_).

• Klassenmethode:[CALL METHOD] <Klassename>=><Methode>(_<Importparameter> = Wert_).

• Instanzattribute:<Instanzname>-><Attribut>.

• Statische Attribute:<Klassenname>=><Attribut>.

© Prof. Dr. H. Krcmar

Übung: Klasse anlegen

• Erstellen Sie die Klasse lcl_airplane, die ein Flugzeug abbilden soll, in einer Include-Datei eines neuen Programms namens ZB_05_##_AIRPLANE

• Die Klasse soll die Attribute Name und Flugzeugtyp haben• Erstellen Sie eine öffentliche Methode, um diese Attribute

zu setzen und eine Weitere, um sie anzuzeigen

43

© Prof. Dr. H. Krcmar

Lösung: Klasse anlegen 1/2

CLASS lcl_airplane DEFINITION.

PUBLIC SECTION.METHODS: attribute_setzen IMPORTING

im_name TYPE stringim_planetype TYPE string,

attribute_anzeigen.

PRIVATE SECTION.DATA: name TYPE string,

planetype TYPE string.

ENDCLASS. "lcl_airplane DEFINITION

© Prof. Dr. H. Krcmar

Lösung: Klasse anlegen 2/2

CLASS lcl_airplane IMPLEMENTATION.

METHOD attribute_setzen.name = im_name.planetype = im_planetype.

ENDMETHOD. "attribute_setzen

METHOD attribute_anzeigen.WRITE: / icon_ws_plane AS ICON,

/ 'Name des Flugzeugs: ', name,/ 'Typ des Flugzeugs: ', planetype.

ENDMETHOD. "attribute_anzeigen

ENDCLASS. "lcl_airplane IMPLEMENTATION

44

© Prof. Dr. H. Krcmar

Übung: Erstellen von Instanzen

• Legen Sie mehrere Instanz der Klasse lcl_airplane an und weisen Sie ihren Attributen Werte zu

• Speichern Sie Verweise auf alle Instanzen in einer Tabelle

© Prof. Dr. H. Krcmar

Lösung: Erstellen von Instanzen

REPORT zb_05_##_airplane .

TYPE-POOLS icon.INCLUDE zb_05_##_class.

DATA: r_plane TYPE REF TO lcl_airplane,plane_list TYPE TABLE OF REF TO lcl_airplane.

START-OF-SELECTION.

CREATE OBJECT r_plane.APPEND r_plane TO plane_list.r_plane->attribute_setzen( im_name = 'München'

im_planetype = 'Boeing 737' ).…LOOP AT plane_list INTO r_plane.r_plane->attribute_anzeigen( ).

ENDLOOP.

45

© Prof. Dr. H. Krcmar

Der Konstruktor

• Explizit oder implizit definierte Methode „constuctor“, die neue Instanzen erzeugt

• Wird autom. durch „CREATE OBJECT“ aufgerufen• Bei fehlender Implementierung, wird einfach nur eine

Instanz erzeugt• Bei expliziter Implementierung in der PUBLIC SECTION

können bestimmte Schritte bei der Erstellung einer neuen Instanz ausgeführt werden (z.B. Defaultwerte vergeben …)

© Prof. Dr. H. Krcmar

Beispiel Konstruktor

PUBLIC SECTIONMETHODS: constructor IMPORTING

im_name type stringim_name type string.

CREATE OBJECT r_plane exporting im_name = ‚München‘im_planetype=‚747‘.

• Preisfrage: Wie sieht die Implementierung aus ?

46

Business Server PagesBusiness Server Pages

© Prof. Dr. H. Krcmar

Einstieg Business Server Pages (BSP)

• Web-Erweiterung für ABAP• Ermöglicht u. a. die Einbindung von ABAP und

serverseitigem JavScript in HTML-Seiten, die auf dem SAP-System gehostet/erstellt sind

• Kann zur Realisierung umfangreicher Portallösungen verwendet werden

• Erst ab SAP Web Application Server 6.20 möglich

47

© Prof. Dr. H. Krcmar

• Legen Sie BSP-Applikation ZB_05_##_BSP in der ABAP-Workbench an und erstellen Sie darin eine neue Seite

• Auf dieser Seite sollen die Daten der Tabellen SPFLI angezeigt werden• Schalten Sie den neu erstellten Service in der Pflege der Services: Transaktion

SICF frei (Pfad: /sap/bc/bsp/sap/zb_05_##_bsp)

• Frage: Über welche URL kann Ihr neuer Service erreicht werden ?

Übung: Business Server Page anlegen

ZB_05_##_BSP

© Prof. Dr. H. Krcmar

Lösung: Business Server Pages anlegen<%@page language="abap" %><html>

<head><title>Meine erste BSP-Seite</title>

</head><% DATA: it_spfli TYPE TABLE OF spfli,

wa_spfli type spfli.SELECT * FROM spfli INTO TABLE it_spfli.%>

<body><center><h2> Ausgabe aller Daten aus Tabelle SPFLI

</h2><br><br><table border="1">

<tr><td>Fluggesellschaft</td><td>Verbindung</td><td>Startflughafen</td><td>Zielflughafen</td><td>Abflugszeit</td><td>Ankunftszeit</td>

</tr>

<% loop at it_spfli into wa_spfli. %><tr>

<td><%= wa_spfli-carrid %></td><td><%= wa_spfli-connid %></td><td><%= wa_spfli-airpfrom %></td><td><%= wa_spfli-airpto %></td><td><%= wa_spfli-deptime %></td><td><%= wa_spfli-arrtime %></td>

</tr><% endloop. %></table>

</body></html>

48

© Prof. Dr. H. Krcmar

Übung: BSP – Eingabe verarbeiten

• Legen Sie eine weitere BSP mit einem Formular an, Wert für die Fluggesellschaft und die Verbindung aufnehmen und bei Knopfdruck an die bereits erstellte Seite senden soll

• Verändern Sie die Seite aus der letzten Übung so, dass nur noch die Informationen zur gewählten Verbindung angezeigt werden

• Zusatzaufgabe: Erweitern sie das Formular sinnvoll um weitere Buttons

© Prof. Dr. H. Krcmar

Lösung: BSP – Eingabe verarbeiten 1/3

• Formular:<%@page language="abap" %><html><head><title>Eingaben bearbeiten</title>

</head><body><form name="Formular">

Fluggesellschaft <INPUT type="text" name="param_carrid"><br>Verbindung <INPUT type="text" name="param_connid"><br><br><input type="submit" name="onInputProcessing(event_1)" value="Alle Flugdaten">

</form></body>

</html>

49

© Prof. Dr. H. Krcmar

Lösung: BSP – Eingabe verarbeiten 2/3

• Eventhandler OnInputprocessingDATA: lv_help TYPE string.

CASE event_id.WHEN 'event_1'.

navigation->set_parameter( 'param_carrid' ).navigation->set_parameter( 'param_connid' ).navigation->goto_page( 'index.htm' ).

ENDCASE.

© Prof. Dr. H. Krcmar

• Anlegen der Seitenattribute auf der Zielseite

• Aktivieren der beiden Seiten! und evtl. des Services

Lösung: BSP – Eingabe verarbeiten 3/3

Web Application Builder: Seite zu ZB_05_##_BSP ändern

ZB_05_##

50

© Prof. Dr. H. Krcmar

Aufruf der BSP‘s

• http:/hcc1b11.informatik.tu-muenchen.de:8001/sap/bc/bsp/sap/<Programmname>\<Seitenname>.htm

oder:

• http:/hcc3b11.informatik.tu-muenchen.de:8002/sap/bc/bsp/sap/<Programmname>\<Seitenname>.htm

© Prof. Dr. H. Krcmar

Hausaufgabe

• Erstellen Sie eine Tabelle ZB_05_##_MA, in der Daten zu Mitarbeitern erfasst werden können

• Entwickeln Sie in einem gleichnamigen ABAP-Programm dazu eine grafische Oberfläche, mit der die Daten erstellt, bearbeitet und gelöscht werden können

• Die Oberfläche kann in Form eines Dynpros oder von BSP‘s erstellt werden• Berücksichtigen Sie dabei das Sperrkonzept von SAP indem Sie ein Sperrobjekt für

Ihre Tabelle anlegen und dies in Ihrem Programm verwenden

• Abgabe der Hausaufgabe durch Zusendung des Programmnamens und der Transaktion oder der URL per Email bis zum 2.11.2005 12:00 Uhr