Ihr Florian Zimniak - Logosworldlogosworld.com/docs/GALILEO/Angeli_TechnischeIntegration... ·...
Transcript of Ihr Florian Zimniak - Logosworldlogosworld.com/docs/GALILEO/Angeli_TechnischeIntegration... ·...
Liebe Leserin, lieber Leser,
vielen Dank, dass Sie sich für ein Buch von SAP PRESS entschieden haben.
SAP PRESS ist eine gemeinschaftliche Initiative von SAP und Galileo Press. Ziel ist es, den Anwendern qualifiziertes SAP-Wissen zur Verfügung zu stel-len. SAP PRESS vereint das fachliche Know-how der SAP und die verlegeri-sche Kompetenz von Galileo Press. Die Bücher bieten Expertenwissen zu technischen wie auch zu betriebswirtschaftlichen SAP-Themen.
Die technischen Bücher von SAP PRESS sind von Mitarbeitern der SAP oder qualifizierter Beratungsunternehmen konzipiert, verfasst und geprüft. Nie-mand wäre berufener als diese Experten, Sie bei Ihren anspruchsvollen Ad-ministrations- und Beratungsaufgaben zu unterstützen.
Jedes unserer Bücher will Sie überzeugen. Damit uns das immer wieder neu gelingt, sind wir auf Ihre Rückmeldung angewiesen. Bitte teilen Sie uns Ihre Meinung zu diesem Buch mit. Ihre kritischen und freundlichen Anregungen, Ihre Wünsche und Ideen werden uns weiterhelfen.
Wir freuen uns auf den Dialog mit Ihnen.
Ihr Florian ZimniakLektorat SAP PRESS
Galileo PressGartenstraße 2453229 Bonn
SAP PRESS wird herausgegeben vonBernhard Hochlehnert, SAP AG
Paul ReadmySAP.com-Datenbankadministration mit Microsoft SQL Server 20002002, ca. 300 Seiten, geb.ISBN 3-934358-87-X
Liane WillSAP APO-SystemadministrationBasiswissen für ein effektives Systemmanagement2002, ca. 230 Seiten, geb.ISBN 3-89842-248-8
Thomas SchneiderSAP R/3-PerformanceoptimierungAnalyse und Tuning von SAP-Systemen2., aktualiserte u. erweiterte Auflage2002, 504 Seiten, geb.ISBN 3-89842-192-9
SAP LabsSAP Guide SystemadministrationSchritt-für-Schritt-Anleitungen für die tägliche Praxis2002, 792 Seiten, geb.ISBN 3-89842-208-9
Horst Keller, Sascha KrügerABAP ObjectsEinführung in die SAP-Programmierung2. Auflage 2001, 665 Seiten, geb., 2 CDsISBN 3-89842-147-3
Aktuelle Angaben zum gesamten SAP PRESS-Programm finden Sie unter www.sap-press.de.
Axel Angeli
TechnischeIntegration von
SAP-Systemen
Bibliografische Information Der Deutschen Bibliothek
Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie;
detaillierte Bibliografische Daten sind im Internet über http://dnb.ddb.de abrufbar.
ISBN 3-89842-316-6
© Galileo Press GmbH, Bonn 20031. Auflage 2003
Der Name Galileo Press geht auf den italieni-
schen Mathematiker und Philosophen Galileo
Galilei (1564–1642) zurück. Er gilt als Grün-
dungsfigur der neuzeitlichen Wissenschaft
und wurde berühmt als Verfechter des moder-
nen, heliozentrischen Weltbilds. Legendär ist
sein Ausspruch Eppur se muove (Und sie be-
wegt sich doch). Das Emblem von Galileo
Press ist der Jupiter, umkreist von den vier
Galileischen Monden. Galilei entdeckte die
nach ihm benannten Monde 1610.
Lektorat Florian Zimniak Korrektorat Alexan-dra Müller, Oer-Erkenschwick Einbandgestal-tung department, Köln Herstellung Iris Warkus Satz reemers publishing services, Krefeld Druck und Bindung Bercker Graphischer Be-trieb, Kevelaer
Das vorliegende Werk ist in all seinen Teilen
urheberrechtlich geschützt. Alle Rechte vor-
behalten, insbesondere das Recht der Über-
setzung, des Vortrags, der Reproduktion, der
Vervielfältigung auf fotomechanischen oder
anderen Wegen und der Speicherung in
elektronischen Medien.
Ungeachtet der Sorgfalt, die auf die Erstellung
von Text, Abbildungen und Programmen ver-
wendet wurde, können weder Verlag noch
Autor, Herausgeber oder Übersetzer für mög-
liche Fehler und deren Folgen eine juristische
Verantwortung oder irgendeine Haftung über-
nehmen.
Die in diesem Werk wiedergegebenen
Gebrauchsnamen, Handelsnamen, Warenbe-
zeichnungen usw. können auch ohne besondere
Kennzeichnung Marken sein und als solche den
gesetzlichen Bestimmungen unterliegen.
Sämtliche in diesem Werk abgedruckten
Abbildungen und Bildschirmabzüge unter-
liegen dem Urheberrecht © der SAP AG,
Neurottstraße 16, D-69190 Walldorf.
SAP, das SAP-Logo, my SAP, mySAP.com,
mySAP Business Suite, SAP NetWeaver, SAP
R/3, SAP R/2, SAP B2B, SAPtronic, SAPscript,
SAP BW, SAP CRM, SAP Early Watch, SAP Ar-
chiveLink, SAP GUI, SAP Business Workflow,
SAP Business Engineer, SAP Business Naviga-
tor, SAP Business Framework, SAP Business In-
formation Warehouse, SAP inter-enterprise
solutions, SAP APO, AcceleratedSAP, InterSAP,
SAPoffice, SAPfind, SAPfile, SAPtime, SAPmail,
SAPaccess, SAP-EDI, R/3 Retail, Accelerated
HR, Accelerated HiTech, Accelerated Consu-
mer Products, ABAP, ABAP/4, ALE/WEB, BAPI,
Business Framework, BW Explorer, Enjoy-SAP,
mySAP.com e-business platform, mySAP
Enterprise Portals, RIVA, SAPPHIRE, TeamSAP,
Webflow und SAP PRESS sind Marken oder
eingetragene Marken der SAP AG, Walldorf.
Inhalt 5
1.1 Enterprise Application Integration ....................................................... 17
1.2 SAP-Technologie und -Komponenten .................................................. 191.2.1 SAP NetWeaver ....................................................................... 201.2.2 mySAP Business Suite .............................................................. 21
1.3 All-in-one versus Best-of-Breed ........................................................... 22
2.0.1 Proxy-Dienste .......................................................................... 272.0.2 Proxy-Dienste im Sicherheitsbereich ........................................ 282.0.3 Message-Queues ..................................................................... 292.0.4 Workflow ................................................................................ 302.0.5 GUI-Server .............................................................................. 302.0.6 3-Tier-Lösungen ..................................................................... 31
3.1 Die nahe Zukunft ................................................................................. 353.1.1 XML-Datenbanken .................................................................. 353.1.2 Entwicklung in mehreren Programmiersprachen ...................... 353.1.3 Grid-Computing ...................................................................... 36
3.2 Komponenten und Protokolle .............................................................. 37
3.3 Ein Beispiel einer heutigen Unternehmens-IT ...................................... 383.3.1 Modellsichten und Abstraktion ................................................ 413.3.2 Ansatz für eine zeitgemäße Lösung: Integration mit HTTP
und XML ................................................................................. 44
Inhalt
Einleitung 11
1 Von All-in-one-Software zu Webservices 17
2 Middleware 27
3 Beispielszenarien und Voraussetzungen 35
316IVZ.fm Seite 5 Dienstag, 22. April 2003 2:31 14
6 Inhalt
4.1 Was ist RFC? ........................................................................................ 49
4.2 R/3-RFC von einer anderen R/3-Instanz .............................................. 514.2.1 Interne Destination NONE ...................................................... 52
4.3 Windows-zu-R/3-Connectivity mit DCOM .......................................... 524.3.1 R/3-Logon mit VBA ................................................................. 544.3.2 Anatomie der RFC- und BAPI-Aufrufe von Windows ............... 56
4.4 Helper-Klassen für den Zugriff auf R/3 via RFC .................................... 664.4.1 Class R3LogonObj ................................................................... 664.4.2 Class R3Credentials ................................................................. 674.4.3 Alternative R3Credentials-Class ............................................... 68
4.5 R/3 Java Connectivity ........................................................................... 704.5.1 SAP R/3 Java Connector JCo ................................................... 704.5.2 SAP R/3-Logon mit Java .......................................................... 70
4.6 Das SAP RFC-Gateway ......................................................................... 734.6.1 Registrierung eines RFC-Listeners beim SAP-Gateway ............. 734.6.2 Anlegen einer RFC-Destination für einen registrierten Listener 744.6.3 Eigene RFC-Listener erstellen .................................................. 74
4.7 Troubleshooting RFC ........................................................................... 77
4.8 Aufruf von Remote Programs aus R/3 Via RFC ..................................... 784.8.1 RFC via Remote Shell .............................................................. 784.8.2 RFC über Webserver ............................................................... 794.8.3 Aufruf eines Programms auf der Workstation mit RFC ............. 804.8.4 Aufruf eines HTTP-Webservers von SAP R/3 ............................ 844.8.5 Proxy-Settings in ABAP ........................................................... 86
4.9 RFC von SAP R/3 auf Windows ............................................................ 874.9.1 Kommunikation mit Excel via OLE/2 und HTTP-Server ............ 874.9.2 Zugriff auf ein Excel-Datenblatt von R/3 .................................. 88
4.10 Business-Objekte und BAPI ................................................................. 954.10.1 Business-Objekte und Modellsichten ....................................... 954.10.2 Technische Kriterien eines BAPI .............................................. 994.10.3 Anwendungsbeispiel: Das Sales-Order-BAPI ............................ 1004.10.4 Beispiel: BAPI_SALESORDER_GETLIST .................................... 1014.10.5 VBA-Beispiel zu BAPI_SALESORDER_GETLIST ......................... 109
4.11 SAP Interface Repository .................................................................... 111
5.1 Casabac GUI-Server ............................................................................. 1165.1.1 Technologie ............................................................................ 1175.1.2 Beispiel zur Kalkulation der Mehrwertsteuer ........................... 119
5.2 Web Dynpro und Business Server Pages ............................................. 123
4 SAP R/3 Remote Function Call 49
5 Frontend und GUIs 115
316IVZ.fm Seite 6 Dienstag, 22. April 2003 2:31 14
Inhalt 7
6.1 Anwendungen von Message Queues ................................................... 1256.1.1 Modelle von Message-Queues ................................................. 1256.1.2 Nutzen der Message-Queues ................................................... 126
6.2 Message-Server Software ..................................................................... 128
6.3 Kommunikation mit Messages-Queues ............................................... 130
7.0.1 NAST Message Control ............................................................ 1337.0.2 Entwicklung eigener NAST-Handler ......................................... 1347.0.3 Workflow-Events ..................................................................... 1387.0.4 Pro und Kontra Workflow versus NAST ................................... 138
7.1 Messaging mit R/3-IDocs ..................................................................... 139
7.2 SAP R/3 Workflow programmieren ...................................................... 142
7.3 Workflow-Handler ............................................................................... 146
8.1 Von Plattformen, Frameworks und Personalities ................................. 1478.1.1 Plattformen ............................................................................. 1478.1.2 Frameworks und Personalities ................................................. 149
8.2 Programmiersprachen und Entwicklungsumgebung ............................ 1518.2.1 Die Entwicklungsumgebung .................................................... 1528.2.2 Die Compile-on-Demand-Runtime .......................................... 1528.2.3 Der Debugger ......................................................................... 1528.2.4 Einrichten einer Entwicklungsumgebung ................................. 1538.2.5 Plattformentscheidung: UNIX versus Windows NT .................. 1548.2.6 Framework: Web AS/ABAP, Microsoft.NET oder J2EE ............. 1548.2.7 Windows Scripting Host versus Visual Basic ............................. 1568.2.8 Windows Classic versus Microsoft.NET .................................... 156
8.3 Die Wahl der richtigen Programmiersprache ........................................ 1578.3.1 Sprache für den Webserver ..................................................... 1578.3.2 Java ......................................................................................... 1588.3.3 J# ............................................................................................ 1588.3.4 Visual Basic (VB) und Visual Basic for Applications (VBA) ......... 1588.3.5 Visual Basic Script (VBS) und ASP ............................................ 1588.3.6 C# ........................................................................................... 1598.3.7 X# ........................................................................................... 1598.3.8 Delphi ..................................................................................... 1608.3.9 ADA ........................................................................................ 1608.3.10 SmallTalk ................................................................................. 1618.3.11 LISP ......................................................................................... 161
6 Message-Queues und Message-Server 125
7 Internes Messaging in R/3 133
8 Programmieren mit mehreren Programmiersprachen 147
316IVZ.fm Seite 7 Dienstag, 22. April 2003 2:31 14
8 Inhalt
8.4 Synopsis der Objektprogrammierung mit Java, VB und ABAP ............. 1628.4.1 Grundbegriffe ......................................................................... 1628.4.2 Constructor ............................................................................. 1698.4.3 Destructor .............................................................................. 1708.4.4 Property-Deklarationen ........................................................... 1718.4.5 Methoden ............................................................................... 1728.4.6 String-Deklarationen ............................................................... 1738.4.7 Array-Deklarationen ................................................................ 174
9.1 Beispiel für Webservices mit Amazon.com .......................................... 1809.1.1 Einfache Beispiele für Webservices .......................................... 1809.1.2 Ein Beispiel mit einem winzigkleinen Fehler ............................ 1819.1.3 Die WSDL zum Amazon.com-Service ...................................... 1859.1.4 Webservice als HTTP GET-Anfrage .......................................... 1889.1.5 Verwendung eines XSLT-Stylesheets ........................................ 1889.1.6 Type- und Namespace-Referenz .............................................. 189
10.1 TCP/IP und UDP/IP Network Protocol ................................................. 191
10.2 Client-Server-Protokolle ...................................................................... 19310.2.1 Clientseite ............................................................................... 19310.2.2 Serverseite .............................................................................. 19410.2.3 URN, URI und URL – Resource Locator ................................... 19410.2.4 CGI – Common Gateway Interface .......................................... 196
10.3 HTTP-Kommunikation mit einem Webserver ....................................... 19610.3.1 Beispiel einer HTTP-Session ..................................................... 19910.3.2 Beispiel für einen HTTP POST-Request .................................... 20110.3.3 Anfragen direkt ins Internet .................................................... 203
11.1 XML als Lingua franca des Internet ...................................................... 20511.1.1 Kleine Anatomie eines XML-Dokuments ................................. 206
11.2 XSD-Schema und DTD ......................................................................... 209
11.3 DOM – Document Object Model ........................................................ 21311.3.1 DOM-Beispiele ....................................................................... 214
11.4 XML-Parser .......................................................................................... 21511.4.1 DOM oder SAX ....................................................................... 21611.4.2 Der Microsoft XML-Parser ....................................................... 21611.4.3 XML-Parser Libraries for Java ................................................... 217
9 Webservice als Standard-Nachrichtenformat 179
10 HTTP- und TCP/IP-Protokolle 191
11 XML – Extended Markup Language 205
316IVZ.fm Seite 8 Dienstag, 22. April 2003 2:31 14
Inhalt 9
11.4.4 XML-Browser und Editoren ..................................................... 21911.4.5 Namespaces – Namensräume .................................................. 219
11.5 XSLT – eXtended Style Sheet Language Transformations ..................... 220
11.6 HTML-Seiten mit XSL-Stylesheets und XML ........................................ 22111.6.1 Inventurtabelle der Animal-Farm ............................................. 22111.6.2 XSL – Step by step ................................................................... 22211.6.3 XSL-Templates ......................................................................... 22211.6.4 XSL auf die Animal-Farm angewandt ....................................... 22311.6.5 Anatomie des XSL-Stylesheets ................................................. 22411.6.6 Parsing des XML und Anwendung des XSL ............................... 227
11.7 SOAP .................................................................................................... 228
11.8 WSDL-Dokumente ............................................................................... 23111.8.1 WSDL-DOM ........................................................................... 23211.8.2 Beispiel eines WSDL-Dokuments für eine BAPI-Funktion ......... 235
12.1 Server Pages und Scripting ................................................................... 23912.1.1 Common Gateway Interface – CGI .......................................... 24012.1.2 Active Server Pages – ASP und ASP.NET ................................. 24012.1.3 Java Server Pages – JSP ............................................................ 24112.1.4 Java Servlets ............................................................................ 24312.1.5 Business Server Pages (BSP) .................................................... 244
12.2 Web Pages mit Active Server Pages ..................................................... 24512.2.1 ASP »Hello World« .................................................................. 24512.2.2 Senden von HTML ................................................................... 24612.2.3 Aufrufe beliebiger Windows-Objekte aus VBS ......................... 24712.2.4 BAPI-Aufruf von ASP ............................................................... 24712.2.5 Microsoft.NET Connector ........................................................ 25012.2.6 Parameter aus der URI abfragen ............................................... 25012.2.7 ASP Application Variables ........................................................ 25312.2.8 Global.asa – Die ASP-Autoexec-Datei ...................................... 25412.2.9 Extra-Beispiel: File-Liste mit ASP .............................................. 255
12.3 Entwicklung von Business Server Pages für den SAP Web AS .............. 25612.3.1 »Hello World« für BSP ............................................................. 25612.3.2 BAPI-Aufruf aus einer BSP ....................................................... 25712.3.3 Online Text Repository ............................................................ 259
13.1 Abfragen einer URI mit Visual Basic ..................................................... 26113.1.1 Das Windows-Webbrowser-Control ........................................ 26113.1.2 Anwendungsbeispiel für das Browser-Control .......................... 26213.1.3 Das WINHTTP-Control ............................................................ 266
12 Entwicklung von dynamischen Webseiten 239
13 Webseiten von anderen Programmen abrufen 261
316IVZ.fm Seite 9 Dienstag, 22. April 2003 2:31 14
10 Inhalt
13.1.4 Anwendungsbeispiel für das WINHTTP-Control ...................... 267
13.2 Webentwicklung mit SAP R/3 ............................................................. 27113.2.1 SAP Function HTTP_GET ......................................................... 27213.2.2 Proxy-Settings in ABAP ........................................................... 27513.2.3 SAP und SOAP: Webservice Choreography Interface (WSCI) ... 276
13.3 SAP Internet Transaction Server .......................................................... 276
A.1 MIME-Typen ........................................................................................ 279
A.2 Beispiel für HTTP GET und HTTP POST ................................................ 282
A.3 HTTP-Statuscodes ................................................................................ 283
A.4 HTTP- und FTP-Kommandos ................................................................ 286
A.5 Java-Utilities ........................................................................................ 287
A.6 SAPLPD-Befehlszeilenparameter .......................................................... 290
A.7 Setzen des Suchpfads für SAPLOGON.INI ........................................... 291
A.8 RFC-Connectors ................................................................................... 292
A.9 Beispiele aus dem SAP Interface Repository ........................................ 296
A Anhang 279
B Synopsis der Programmiersprachen ABAP, VB und Java 299
Index 309
316IVZ.fm Seite 10 Dienstag, 22. April 2003 2:31 14
11
Einleitung
So wie Windows seinerzeit zum Standard für Betriebssysteme im Desk-top-Bereich wurde, ist SAP heute der unbestrittene Standard für Unter-nehmenssoftware. Dennoch gibt es in den IT-Abteilungen von Unterneh-men unzählige, verstreut laufende Software-Module, die nicht einfachdurch eine Standardlösung abgelöst werden können. Die Aufgabe derUnternehmens-IT in den nächsten zehn Jahren wird es deshalb vor allemsein, diese Software zu einer harmonisch kooperierenden Einheit zu ver-schmelzen. Hierzu wird leistungsstarke Middleware wie IBM WebSphereoder SAPs NetWeaver eine zentrale Rolle spielen. Neben der Kenntnisder Produkte benötigt der Integrator künftig ein detailliertes Verständnisder Technologien und Protokolle, die zum Austausch von Informationenverwendet werden.
Warum dieses Buch?
Dieses Buch ist das Ergebnis jahrelanger Erfahrung im Umgang mit Tech-nologien zur Anbindung von Software an SAP R/3, deren Entwickler nie-mals im Traum daran gedacht hatten, überhaupt Schnittstellen zu einemanderen System zu verwirklichen. Dazu war es notwendig, unzähligeTechnologien und Technologievarianten zu sichten, um deren Tauglich-keit zu beurteilen und das Potenzial zu einem Trend oder Standard zuerkennen. Das Ziel lässt sich in einem Wort beschreiben: Vereinfachung.
Erfahrungsgemäß besteht bei der Entwicklung einer einzelnen Software-Brücke in einem klassischen Umfeld eines Großunternehmens ein krassesMissverhältnis zwischen Planungs- und Realisierungsaufwand. Währenddas Schreiben des Programms in der Regel wenige Tage in Anspruchnimmt, verschlingen Planung und Testphase oft viele Monate. Auch wenndies in hohem Maß dem organisatorischen Umfeld zuzuschreiben ist, las-sen sich massive Einsparungen und Synergien durch den Einsatz von stan-dardisierten Verfahren und der universellen Dokumentensprache XMLerzielen.
Als die Technologien, die die Kraft haben, die Netze zwischen verteiltenApplikationen erfolgreich und kostengünstig zu realisieren, haben sichHTTP und XML erwiesen. Deshalb ist der Tenor dieses Buches immer dieRealisierung von Datenaustausch über XML und HTTP von den verschie-densten gängigen Plattformen aus.
Einleitung.fm Seite 11 Dienstag, 22. April 2003 2:31 14
12
Für wen dieses Buch gedacht ist und was in diesem Buch steht
Dieses Buch ist gedacht für Unternehmen und deren Berater, die ihrenSchwerpunkt heute auf SAP R/3 haben und Wege suchen, wie beste-hende und neu zu entwickelnde Applikationen in SAP R/3 und die SAPNetWeaver-Technologie integriert werden können. Es stellt die Architek-turalternativen gegenüber und versetzt Sie in die Lage, selbst fachlichkompetent über Best-Practices-Ansätze zu diskutieren, und es bietetIhnen einen Einstieg, um sich das notwendige Programmierwissen selbstanzueignen.
Es ist eine Destillation der enormen Menge an Material, die es zu denThemen Webservices, SAP R/3 und Messaging gibt. Es geht davon aus,dass dem Leser eine der vorgestellten Techniken sehr gut bekannt ist under nun bereit ist, sich Kenntnisse in dem jeweils fremden Bereich anzueig-nen. Das Buch setzt voraus, dass Sie offen sind für ein gemischtes Zusam-menspiel von SAP-Komponenten mit Anwendungen Dritter.
Dieses Buch erklärt die Technologien, die zur Kommunikation innerhalbeines Unternehmensnetzwerks erforderlich sind, um Software-Kompo-nenten zu integrieren, die ursprünglich nicht für die wechselseitige Koo-peration entwickelt wurden. Aufgelockert durch Beispiele aus einem rea-len Betrieb, ist es der Versuch, in kompakter Form die technischenMöglichkeiten der Collaboration mit SAP-Systemen aufzuzeigen. Dabeiwird von der Annahme ausgegangen, dass ein Betrieb den Kern seinerUnternehmens-IT auf SAP R/3 realisiert und eigene Satellitenanwendun-gen an dieses System in Echtzeit anbinden möchte.
Was in diesem Buch nicht steht
Dieses Buch ist keine Einführung in die verschiedenen SAP-Komponentenoder -Lösungen. Es ist auch kein Nachdruck der SAP-Dokumentationenzu einem der Themen, sondern vielmehr eine eigenständige Interpreta-tion der Anwendungsmöglichkeiten der vorhandenen Technologien.
Auch die SAP Exchange Infrastructure (SAP XI), Teil von SAP NetWeaverund in zukünftigen SAP-Systemlandschaften für alle Integrationsaufgabenzuständig, wird in diesem Buch nicht näher behandelt. Da die XI zumZeitpunkt der Drucklegung dieses Buches in wesentlichen Teilen nochweiterentwickelt wird, macht es im Augenblick wenig Sinn, über diesesProdukt Aussagen in Buchform zu machen.
Einleitung.fm Seite 12 Dienstag, 22. April 2003 2:31 14
13
Wie das Buch aufgebaut ist und warum
Das Buch besteht aus einem einführenden Block und zwei Technikteilen.Im ersten Teil wird zunächst eine Einschätzung gewagt, in welche Rich-tung sich die IT in der nahen Zukunft entwickeln wird und welchen Bei-trag die SAP NetWeaver-Technologie hierzu leisten kann. Wir wollen dasProblembewusstsein stärken und stellen ein Spiel-Szenario vor, wie eineModellfirma es anpacken könnte, den Sprung von der traditionellen EDVzu moderner, webgestützter Informationstechnologie zu schaffen. Derzweite Teil befasst sich mit der Entwicklung in verteilten Systemen. Aus-gehend von den Grundlagen der RFC-Technologie, zeigen Auszüge auserprobten Programmen, wie eine Kommunikation zwischen einer R/3-Instanz und einer beliebigen anderen Applikation aufgebaut werdenkann. Darüber hinaus wird im Sinne eines Delta-Ansatzes auf system-übergreifende Programmierung eingegangen. Der Grundgedanke ist es,dass ein Entwickler entweder ABAP, Java oder Visual Basic beherrscht undsich gezwungen sieht, auch Grundkenntnisse aus den jeweils anderenBereichen zu erlernen, um eine Kommunikation mit SAP R/3 aufzubauen.Dabei geht es besonders um den Austausch von Nachrichten und die Ein-bindung von HTTP-Lösungen in eigene Programme.
Der dritte Teil erklärt an Beispielen das große Thema der Webservices,was sie sind, welchen Nutzen sie haben und wie man sie in eigenen Pro-grammen nutzt. In diesen Sektor gehören auch die Grundlagen der HTTP-Technik, XML und SOAP.
Einleitung.fm Seite 13 Dienstag, 22. April 2003 2:31 14
Einleitung.fm Seite 14 Dienstag, 22. April 2003 2:31 14
Teil 1 Problemstellung
In diesem ersten Teil werden wir zunächst die beiden Konzepte des All-in-One und des Best-of-Breed gegenüberstellen und ihre jeweiligen Vor- und Nachteile abwägen. In einer ersten Vorschau werden Ihnen dann die wesentlichen Technologien, von denen dieses Buch handelt, vorgestellt.
Einleitung.fm Seite 15 Dienstag, 22. April 2003 2:31 14
Einleitung.fm Seite 16 Dienstag, 22. April 2003 2:31 14
Von All-in-one-Software zu Webservices 17
1 Von All-in-one-Software zu Webservices
Ausgelöst durch Standard-Software wie SAP R/2, BAAN und Peoplesoft, entstand seit Mitte der Achtzigerjahre ein zuneh-mender Trend zu Software aus einer Hand. Die Aufgabe der Unternehmens-IT in den nächsten zehn Jahren wird es vor allem sein, die unzähligen, verstreut laufenden Software-Module zu einer harmonisch kooperierenden Einheit zu ver-schmelzen und die Zusammenarbeit dieser zentralen Systeme mit hoch spezialisierten Satellitensystemen zu forcieren. Als Schlüssel dazu verwenden Webservices die einheitliche Spra-che XML für den Datenaustausch.
Um zu der einfachsten Wahrheit zu gelangen, braucht es Jahre des Nach-denkens.Sir Isaac Newton
Heute werden die Kernaufgaben fast aller größeren Unternehmen, wieFinanzen, ERP und SCM, von einer oder mehreren SAP-Installationenabgedeckt, andere Anbieter vergleichbarer Business-Suites spielen nurnoch eine marginale Rolle. In Sonderbereichen haben sich Spezialanbie-ter angesiedelt, die entweder eigene Add-Ons innerhalb von R/3 entwi-ckelt haben oder ihre Plattform über die RFC-Funktionalität von R/3 andieses anbinden.
SAP als 80/20-Lösung
SAP wandelt sich in dieser Hinsicht zu einem zunehmend offenen Sys-tem. Anstatt an dem Versuch zu zerbrechen, für jede Branche oderNische eine Sonderlösung anzubieten beziehungsweise diese Branchendazu zu zwingen, ihre Geschäftsstrukturen an die Standardabläufe einesSAP R/3 Enterprise-Systems anzupassen, positioniert sich SAP nun als Fix-stern in der Unternehmens-IT, der im Sinne eines guten 80/20-Modellsdie Routine- und Kernaufgaben eines Betriebs abdeckt und sich gegen-über Dritten vollständig offen und transparent präsentiert.
1.1 Enterprise Application Integration
Unter Enterprise Application Integration, abgekürzt EAI, fasst man heuteeine Teildisziplin der Informatik zusammen. Dabei geht man davon aus,dass die zu integrierenden Anwendungen ursprünglich nicht ausdrücklichdafür entwickelt wurden zusammenzuarbeiten. Das Ziel der EAI ist es, die
Kap01.fm Seite 17 Dienstag, 22. April 2003 2:31 14
18 Von All-in-one-Software zu Webservices
Applikationen in einer Weise zu verändern oder zu ergänzen, dass sieohne Eingriff eines Menschen miteinander kommunizieren. Die Kommu-nikation kann dabei sehr weit gefasst sein. Im einfachen Fall werdenschlicht Daten von einer Applikation zu einer anderen übertragen, inkomplexen Fällen kontrolliert eine Applikation den Ablauf einer anderen,wie dies etwa beim Workflow der Fall ist.
EAI ist einegereifte Form des
Workflows
Letztlich verbirgt sich hinter dem Akronym EAI eine erwachsene Formvon Workflow- und Automationsdiensten, die unter Einsatz flexibler undintelligenter Tools Daten aus den verschiedensten Systemen abgreifen, sieumwandeln und dann an eine andere Applikation weiterreichen.
Ein typisches EAI-System wäre demnach ein zentraler Enterprise-Server,der von allen betriebsrelevanten Daten eine Kopie erhält und dann ent-scheidet, ob, wo und wie die Kopie gespeichert wird, so dass sie andereninteressierten Applikationen zugänglich wird. Dieser zentrale Enterprise-Server wird als intelligenter Proxy-Server betrieben, der in der Lage ist,den Datenfluss zu überwachen, umzulenken, eigene Aktionen anzusto-ßen und Daten nach Bedarf zu transformieren. Eine Software, die all diesbewerkstelligt, nennt man Middleware.
EAI ist Auto-matisierung
Natürlich ist weder die Aufgabenstellung der EAI neu, noch sind es ihreLösungsansätze. Neu ist, dass der zunehmende Wunsch der Automatisie-rung von IT-Anwendungen der EAI zu einer Schlüsselstellung verholfenhat. Je höher der Automatisierungsgrad eines Betriebs ist, also je mehrApplikationen reibungslos zusammenarbeiten, desto effizienter arbeitetdieser Betrieb.
Durch die zunehmende Bedeutung der Integration haben sich Technikenherauskristallisiert, die diese Automatisierung mit einer zuverlässigen,kontrollierten und nachvollziehbaren Methodik bewerkstelligen lassen.Dies sind in erster Linie:
� Vernetzung aller beteiligten Computer durch IP und TCP/IP- bezie-hungsweise UDP/IP-Protokolle
� Einsatz von Message-Queues als Broker zwischen den Anwendungen(Middleware)
� Austausch aller Daten auf Applikationsebene durch standardisierteProtokolle. Ein Beispiel wäre XML over HTTP over TCP/IP. Dies bedeu-tet:
� Alle Computer des Netzwerks formatieren die Anwendungsdaten inXML.
Kap01.fm Seite 18 Dienstag, 22. April 2003 2:31 14
SAP-Technologie und -Komponenten 19
� Die Session zwischen zwei Computern wird durch HTTP hergestellt(und nicht durch TELNET, VT/100 oder gar herstellereigene Proto-kolle).
� Die HTTP-Daten werden ausschließlich in TCP-Paketen über ein IP-Netzwerk zugestellt.
»One face to the application«
Der zentrale Gedanke ist, dass nur der EAI-Rechner die proprietärenZugriffsmechanismen und Protokolle der einzelnen verstreuten Applikati-onen kennen muss, während die Applikationen jeweils ausschließlich mitdem EAI-Rechner kommunizieren. Griffiger ausgedrückt: In Anlehnungan »One face to the customer« bedeutet dies nun »One face to the appli-cation«.
Collaboration
Seit geraumer Zeit ist vor allem in den USA der Oberbegriff Collaborationgebräuchlich. Er bezeichnet die »Zusammenarbeit« von Objektdiensteneiner verteilten Umgebung. Damit sind vor allem Messaging-Dienste wieMail-APIs, Workflow-Manager und Message-Queue-Dienste gemeint.Allgemein referiert der Begriff auf die Fähigkeit der einzelnen Komponen-ten in einem Netzwerk, Daten und Nachrichten in einer Form auszusen-den, dass sie von einem beliebigen anderen Computer desselben Netzesmit endlichem Aufwand genutzt werden können.
1.2 SAP-Technologie und -Komponenten
Die Produktpalette der SAP lässt sich heute im Wesentlichen in zweiBereiche unterteilen, die um das klassische R/3 herumgewachsen sind:
� SAP NetWeaver, ein Framework zur einheitlichen Gestaltung und Ein-bindung eigener Anwendungen
� Applikationen und spezialisierte Lösungen für einzelne betriebswirt-schaftliche Aufgabenbereiche, z.B. APO oder BW
Das klassische SAP R/3, im aktuellen Release R/3 Enterprise genannt, bil-det dabei nach wie vor den Kern für die betriebswirtschaftlichen Anwen-dungen. Mit R/3 war es SAP über die Jahre gelungen, Standardisierungenin betriebswirtschaftlichen Prozessen zu schaffen, die sich heute in denBusiness-Objekten manifestieren.
Kap01.fm Seite 19 Dienstag, 22. April 2003 2:31 14
20 Von All-in-one-Software zu Webservices
1.2.1 SAP NetWeaver
Seit Anfang 2003 heißt mySAP Technology – ergänzt um einige neueFunktionalitäten und Komponenten – SAP NetWeaver, womit SAP end-lich einen Namen gefunden hat, der die tatsächliche Leistung der neuen,über R/3 hinausgehenden Infrastruktur treffend darstellt.
Hauptbestandteile von SAP NetWeaver sind die SAP Exchange Infrastruc-ture, das SAP Enterprise Portal und der SAP Web Application Server:
� SAP Exchange InfrastructureDas neue Flaggschiff von SAP für die Integration ist die SAP ExchangeInfrastructure (SAP XI). Die SAP XI ermöglicht es, flexibel auf Funkti-onsaufrufe anderer Applikationen zu reagieren und Ergebnisse zurück-zuliefern oder aber Funktionsaufrufe selbst durchzuführen. Sie ist inder Lage, Software-Komponenten verschiedenster Hersteller zu integ-rieren und wird somit in Zukunft zum Herzstück neuer SAP-System-landschaften werden.
� SAP Web Application Server Der Kern aller SAP-Komponenten ist das um HTTP-Funktionalitäterweiterte SAP R/3-Basissystem, das unter dem Namen SAP WebApplication Server alias SAP R/3 Basisrelease 6.x, firmiert. Dadurch stehtein Entwicklungsframework zur Verfügung, das dank ABAP und Javaalle Möglichkeiten bietet, eigene Applikationen zu entwickeln. Durchdie Flexibilität dieser Plattform eignet sich SAP auch als mächtigesInstrument zur Integration von heterogenen Anwendungen auf vielenverschiedenen Plattformen.
� SAP Enterprise PortalDas SAP Enterprise Portal stellt innerhalb des Unternehmens und aufWunsch sogar für Geschäftspartner einen einheitlich gestalteten undextrem anpassbaren Zugang zu allen im Unternehmen vorhandenenInformationen dar. Wichtige Bestandteile sind z.B. der Portal Server fürdie Gestaltung und Bereitstellung der Oberfläche, der Unification Ser-ver für die einheitliche Navigation durch Daten aus verschiedenenApplikationen und die Knowledge Management Platform für die Arbeitmit unstrukturierten Informationen.
Netze zu weben ist das neue Ziel von SAP, also die Zusammenarbeit vongleichberechtigten IT-Lösungen innerhalb eines Netzwerks zu ermögli-chen. Damit positioniert sich SAP eindeutig als kompetenter Anbietervon Lösungen für die Enterprise Application Integration, und man darf
Kap01.fm Seite 20 Dienstag, 22. April 2003 2:31 14
SAP-Technologie und -Komponenten 21
ohne Neid eingestehen, dass es SAP damit endlich gelungen ist, einemodulare und nach allen Seiten offene Plattform zu schaffen, diezukunftsfähig ist.
Peter Graf, Vice-President der SAP AG, behauptet sogar, dass NetWeaverderzeit das einzige Framework für Cross-Applikationsentwicklung sei:
»What we are really suggesting is that if you wanted to create cross-applications, then we have the only platform to do cross-applicationstoday.«Peter Graf, Vice-Präsident der SAP AG in einem Interview auf http://searchsap.techtarget.com, Januar 2003
Das muss man zwar etwas relativieren, indem man feststellt, dass Net-Weaver zwar das bei weitem umfangsreichste und flexibelste Produkt indieser Klasse ist, jedoch nicht das einzige. Es wird in diesem Buch durch-aus deutlich werden, dass auch IBM WebSphere mit J2EE und Micro-soft.NET ähnliche Möglichkeiten bieten. Es ist aber klar, dass NetWeaverdas derzeit mächtigste Produkt auf dem Markt ist.
1.2.2 mySAP Business Suite
mySAP Business Suite ist die Gesamtheit der Lösungen, die SAP für ein-zelne betriebswirtschaftliche Aufgabenbereiche anbietet. Die Suite lässtsich wiederum in zwei große Bereiche unterteilen
� SAP R/3 Enterprise Seit Release 4.7 heißt SAP R/3 SAP R/3 Enterprise. Dahinter verbergensich alle traditionellen R/3-Applikationen wie FI/CO, MM, SD usw.Neu an R/3 Enterprise ist sowohl die um einige Funktionalitäten (z.B.HTTP und Java) erweiterte Basis (der Web AS) als auch die Softwarear-chitektur, die nun die Kernfunktionalitäten in einem unveränderlichenCore kapselt. Weiterentwicklungen finden fortan nur noch in den sogenannten Extensions statt.
� mySAP-LösungenDamit sind vor allem die Lösungen gemeint, die nicht in SAP R/3Enterprise abgedeckt und jeweils so konzipiert sind, dass sie im Regel-fall auf einem eigenen Server ausgeführt werden. Sie alle hier aufzu-zählen, würde den Rahmen dieses einleitenden Kapitels bei weitemsprengen. Den einzelnen Lösungen liegen wiederum spezialisierteSoftware-Komponenten zugrunde, zu denen unter anderem die Fol-genden gehören:
Kap01.fm Seite 21 Dienstag, 22. April 2003 2:31 14
22 Von All-in-one-Software zu Webservices
� CRMCustomer Relationship Management liefert alle relevanten Informati-onen zu einem Kundenkontakt und ermöglicht so eine zielgerich-tete und individuelle Kommunikation mit dem einzelnen Kunden.Mit der Ausgliederung von CRM attackiert SAP sehr erfolgreich denlangjährigen Marktführer in diesem Sektor, Siebel Systems.
� BWDas Business Information Warehouse spezialisiert sich auf das Bedürf-nis von Unternehmen nach zeitnahen und flexiblen Auswertungenund Reports. Die Applikation greift dazu über RFC auf eines odermehrere SAP R/3 Enterprise-Systeme zu und führt die Daten ingeeigneter Form zusammen.
� APODer Advanced Planner and Optimizer ist eine Applikation, die z.B. inder Produktionsplanung zur Bestimmung von künftigem Bedarf anMaterial eingesetzt wird. APO setzt dabei statistische und heuristi-sche Verfahren ein, um Zeitreihen auszuwerten und Hochrechnun-gen in die Zukunft vorzunehmen. APO selbst ist in verschiedeneModule aufgeteilt, zum Beispiel DS (Detailed Scheduling) und DP(Detailed Planning). Bedeutende konkurrierende Produkte werdenvon SAS, i2 und Manugistics hergestellt.
RFC ist dieGrundlage
Künftig wird man, ausgehend von den SAP R/3-Kernmodulen, neueKomponenten entwickeln, die aber nicht mehr in R/3 integriert sind, son-dern als eigenständige Einheiten über Webservices mit anderer Softwareeinschließlich R/3 kommunizieren. Die Entwicklung dieser Komponentenkann auf dem Web AS erfolgen, ist aber auch auf anderen Frameworkswie Microsoft.NET oder J2EE möglich. Grundlage der neuen Technolo-gien ist die Offenheit des R/3-Systems durch Remote Function Calls (RFC).
1.3 All-in-one versus Best-of-Breed
In fast allen größeren Unternehmen sind über die letzten zehn bis fünf-zehn Jahre hinweg Server- und Software-Strukturen gewachsen. Altsys-teme laufen aus den verschiedensten Gründen parallel zu neuen Installa-tionen, hoch spezialisierte Systeme decken Sonderbereiche ab, und vieleSachbearbeiter wissen die Flexibilität einer eigenen PC-Software zu schät-zen.
Wiederverwen-dung komplexer
Komponenten
Die Aufgabe der Unternehmens-IT in den nächsten zehn Jahren wird esvor allem sein, diese verstreuten Software-Module zu einer harmonischkooperierenden Einheit zu verschmelzen. Dabei geht es ausdrücklich
Kap01.fm Seite 22 Dienstag, 22. April 2003 2:31 14
All-in-one versus Best-of-Breed 23
nicht darum, die Software neu zu schreiben oder von einer Plattform aufeine andere zu hieven. Vielmehr muss es das Ziel sein, die Datenflüssezwischen den einzelnen Programmen so zu koordinieren, dass jedes Pro-gramm sich auf seine Stärken konzentrieren kann.
Miteinander der Plattformen und Frameworks
Mit der exponentiell wachsenden Zahl der Anforderungen und Wünschean moderne Software ist kein Hersteller der Welt mehr in der Lage, dieseVorgaben in einem einzigen Produkt oder auch nur auf einer einzigenPlattform zu erfüllen. Dies ergibt sich schon aus den praktischen Rahmen-bedingungen des Computereinsatzes.
Während die Auswertung von gigantischen Zahlenmengen, das Erstellenvon Analysereports oder das Hochrechnen von Bedarf und Verkäufen(zum Beispiel in einem System wie APO) nach einem Computer mithoher Rechenleistung und hoher Speicherkapazität rufen, ist für dieErfassung der Daten ein kleiner portabler Palm-Computer, der leicht ist,lange Zeit mit wenig Batterie auskommt und gegebenenfalls in derJackentasche Platz hat, genau das Richtige.
Egal, von welcher Seite man es betrachtet, die Forderung der Zukunftwird sein, das beste Produkt in seiner Klasse an der richtigen Stelle einzu-setzen. Eine handwerklich solide gemachte Software ist selten einfach gutoder schlecht, aber man kann sie an der richtigen oder auch an der fal-schen Stelle einsetzen. In sehr vielen Fällen kann ein über die Zeitgewachsenes Tabellenkalkulationsblatt die Anforderungen in vielerleiHinsicht besser lösen als eine teure und mit Features überladene Unter-nehmenssoftware. Andererseits riskiert eine noch so geniale Software-Lösung, zum hässlichen Entlein zu werden, wenn sie an der falschenStelle eingesetzt wird.
All-in-one-Software
SAP R/3 war ursprünglich eine typische All-in-one-Software. Die Vorteileeiner solchen integrierten Lösung sind:
� einheitliche Bedienoberfläche
� reibungslose Verzahnung der Business-Anforderung, zum BeispielFinanzen/Controlling mit SD und MM
� gemeinsam nutzbare Dienstprogramme, zum Beispiel zum Datenbank-Update (Verbucher), zum Drucken von Formularen oder zum EDI-Ver-sand
Best-of-BreedWenn wir uns den Punkt »einheitliche Bedienoberfläche« einer All-in-one-Software einmal näher ansehen, fällt uns Folgendes auf: Der Zugriffdurch den Benutzer erfolgt durch ein GUI, ein Grafisches User Interface.
Kap01.fm Seite 23 Dienstag, 22. April 2003 2:31 14
24 Von All-in-one-Software zu Webservices
Ein GUI ist aber eine Client-Software und weiß als solche eigentlich nichtsüber die wahre Natur des am anderen Ende kommunizierenden Compu-ters, denn ein Client-GUI sendet lediglich Nachrichten und nimmt Ant-worten entgegen, die es dann interpretiert. Wenn dem aber so ist, wärees nicht sinnvoll, wenn der Server, anstatt alles allein zu tun, die Anfrageneinfach an geeignete Server weiterverteilt, somit andere für sich arbeitenlässt und nur noch die eingesammelten Antworten wieder an das GUIweitergibt?
Server-Grid Das Ergebnis wäre ein Grid (deutsch: Raster) von Servern, die jeweils spe-zialisiert eine bestimmte Aufgabe ausführen und idealerweise auf einengemeinsamen Datenbestand zugreifen.
Bei dem Vergleich der Ansätze dürfen wir aber nicht vergessen, dass dieRealität im Grunde gar keine allumfassende, integrierte Lösung kennt.Wenn man sich ein System wie R/3 ansieht, stellt man doch nach einigerZeit ehrlicher Betrachtung fest, dass zwar SAP für jeden Aspekt des Busi-ness ein geeignetes Tool zur Verfügung stellt, jedoch die einzelnen Blöckekeineswegs so reibungslos aufeinander abgestimmt sind, wie man daserwartet hätte.
SAP-Einzelmo-dule sind oft diebesten ihrer Art
Dabei spielen viele Module von SAP natürlich problemlos unter den Bes-ten ihrer Kategorie mit. In den Sektoren FI, CO, SD und MM setzt SAPeindeutig den Standard hinsichtlich Leistungsfähigkeit, Flexibilität undVollständigkeit. Auch im Supply-Chain-Management ist SAP einer derTop-Performer.
Es gibt Bereiche, in denen SAP traditionell schwächer war, z.B. im SektorWorkflow-Messaging. Aber auch da ist SAP auf dem Sprung in die Welt-spitze, denn die SAP Exchange Infrastructure ist eines der modernstenMessaging-Systeme auf dem Markt und wird sicher mit IBM WebSphere/MQ in Konkurrenz treten.
Kollaboration istentscheidendes
Kriterium
Die Frage stellt sich also nicht, ob man eine All-in-One-Lösung einerKomponentenlösung vorzieht. In Zukunft wird die Qualität einer Soft-ware ausschließlich davon abhängen, wie harmonisch die Komponentenmit fremden Komponenten zusammenarbeiten. Natürlich können auchdie meisten Komponenten eines einzigen Herstellers wie die von SAPimmer die besten sein, zumal da die Kollaboration auch garantiert wird.SAP hat das schon seit Release R/3 3.x klar erkannt, hält seine Systemeoffen und versucht, mit den Modulen die einzelnen Geschäftsbereiche zuerobern.
Kap01.fm Seite 24 Dienstag, 22. April 2003 2:31 14
All-in-one versus Best-of-Breed 25
Seit R/3 Enter-prise ist SAP modular
Spätestens mit SAP R/3 Enterprise hat sich R/3 zu einer modularenLösung gewandelt. R/3 besteht jetzt aus einem Basissystem mit derABAP-Runtime (bei Java Virtual Machine genannt, entspricht bei Micro-soft dem .NET-Framework). Darauf aufbauend, lassen sich die Anwen-dungsmodule für FI, CO, SD, MM und so weiter hinzufügen.
Kap01.fm Seite 25 Dienstag, 22. April 2003 2:31 14
Kap01.fm Seite 26 Dienstag, 22. April 2003 2:31 14
Middleware 27
2 Middleware
Dieses Kapitel gibt einen Überblick über die verschiedenen Komponenten und Konzepte innerhalb einer Systemland-schaft. Im weiteren Verlauf dieses Buches werden wir immer wieder auf sie zurückkommen und Wege aufzeigen, mit wel-chen Mitteln diese Konzepte realisiert und die Komponenten in einen produktiven Austausch gebracht werden können.
Als Middleware bezeichnet man jede Art von Software, die eine Ver-mittlerrolle zwischen zwei oder mehreren über ein Netzwerk kommuni-zierenden Softwarekomponenten übernimmt. Eine Middleware arbeitetdabei immer nach dem Prinzip einer Postverteilstation, an der Nachrich-ten entgegengenommen und an einen Empfänger zugestellt werden.Neben der eigentlichen Nachrichtenverteilung übernimmt die Middle-ware aber auch jede Menge Routineaufgaben, wie die Konvertierung derNachrichten zwischen den Formaten des Senders und des Empfängers –zum Beispiel von EDIFACT nach IDoc –, die zeitversetzte Auslieferungeiner Nachricht, wenn Sender und Empfänger verschiedene Arbeitsge-schwindigkeiten haben, oder die Ansteuerung und Überwachung vonAutomatisierungs- und Workflow-Diensten.
2.0.1 Proxy-Dienste
Ein Proxy ist eine Server-Software, die die Kommunikation zwischen zweientfernten Applikationen herstellt. Ein Proxy kann dabei die Anfragen fil-tern, bei Bedarf auch formale Transformationen vornehmen und gegebe-nenfalls Workflows anstoßen.
Firewall als Sonderform des Messaging-Dienstes
Die Grenzen zwischen Middleware und Proxy-Servern für Sonderdienstesind fließend, und häufig ist jeder Versuch einer terminologischenAbgrenzung Haarspalterei. In der Praxis werden alle Zugriffe von Internet-nutzern auf einen Unternehmenscomputer durch eine Firewall auf derSeite des Anbieters geleitet. Eine Firewall ist ein Proxy-Server mit einerSonderaufgabe, der alle Nachrichten entgegennimmt, die zwischen zweiComputern ausgetauscht werden, diese analysiert und dann an deneigentlichen Ziel-Computer weiterleitet. Gegebenenfalls weist der Proxydie Anfrage zurück, wenn sie verdächtig oder nicht identifizierbar ist.
Kap02.fm Seite 27 Dienstag, 22. April 2003 2:31 14
28 Middleware
Durch den Einsatz eines Proxys erscheint somit für den Client das Unter-nehmensnetzwerk wie ein einzelner Computer, denn der Anfragendesieht lediglich den Firewall-Computer, von dem er auch alle Antwortenerhält. Hinter dieser Firewall können sich eine Vielzahl an individuellenComputern und spezialisierter Software befinden.
Firewall kann einMessage-Server
sein
Es liegt nahe, dass der Firewall-Computer die Anfragen vorsortiert und sieentsprechend dem Inhalt an einen geeigneten Computer weiterleitet. Indiesem Fall mutiert die Firewall zu einem ausgewachsenen Message-Ser-ver. Ein solcher Message-Server stellt dann eine Reihe von Funktionalitä-ten zur Verfügung, die von sehr vielen Applikationen gewünscht werden.
2.0.2 Proxy-Dienste im Sicherheitsbereich
Proxy-Dienste sind das Handwerkszeug jeder Sicherheitsadministration.Ein Proxy dient nicht nur als Firewall oder Vermittler von Diensten, son-dern auch als elektronischer Gendarm und Geheimbote, der die Datenzwischen den Partnern verschlüsselt überträgt und die Identität der Part-ner überprüft.
Secure RemotePassword und
Single Sign On
Eine solch besondere Form eines Proxys stellt auch Secure Remote Pass-word (SCR) dar beziehungsweise als Variante davon Single Sign On (SSO).Dabei handelt es sich um einen Server, der die Zugangsdaten (englisch:credentials) für den Zugriff auf eine Ressource an einer geheim gehaltenenStelle und nach einer ebenfalls geheimen Strategie ablegt. Sobald ein Cli-ent den Zugriff auf die Ressource verlangt, entscheidet der SCR-Server,auf Basis welcher Informationen der Zugriff gestattet werden kann. EinBeispiel für kommerzielle SSO-Dienste ist Microsoft Passport; ein einfa-cher SSO-Mechanismus für interne Applikationen zum Zugriff auf SAP istim Anhang in der Visual-Basic-Klasse Credentials dargestellt.
Dabei ist es weniger wichtig, die Berechtigung eines erkannten Benutzerszuverlässig zu überprüfen. Vielmehr ist das entscheidende Problem, diewahre Identität eines Anfragenden zu ermitteln. Kombinationen vonUsernamen und Passwort lassen sich allzu leicht stehlen, als dass dies einzuverlässiger Mechanismus zur Bestätigung der Identität des Anfragendensein kann.
IP-Netzwerkelassen sich leicht
abhören
Das Stehlen solcher Zugangsdaten ist besonders einfach, wenn solcheDaten ohne nennenswerten Schutz direkt über das Internet geschicktwerden. Ein solches Vorgehen ist genauso sicher, wie die Angaben alsKleinanzeige in einer Zeitung zu veröffentlichen, da die Internetstreckenöffentlich sind und – zumindest rein theoretisch – über jeden beliebigenRechner geleitet werden können, der gerade online ist.
Kap02.fm Seite 28 Dienstag, 22. April 2003 2:31 14
Middleware 29
Auch die überall gerne verwendeten SSL-Verbindungen, die an dem URL-Präfix https:// zu erkennen sind, sind keineswegs wirklich sicher, auchwenn dort das Abhören der Leitung kaum zum Erfolg führt. Hier führenandere Mechanismen zum Ziel, zum Beispiel ein »Potemkinsches Dorf«,das eine Abwandlung der bekannten Trojaner-Viren ist. Dazu bietetjemand einen Dienst an, für den er eine Registrierung in Form eines freiwählbaren Usernamens und eines Passworts verlangt. Bei der großen Zahlan Registrierungen, die ein durchschnittlicher Internetuser pflegt, ist esjedoch kaum realistisch, für jeden Dienst einen anderen Usernamen undein neues Passwort zu vergeben. Damit kann der Anbieter eines solchenDienstes in der Regel zu Recht annehmen, dass der neue Client die glei-chen Anmeldedaten auch für andere Dienste nutzt, zum Beispiel, um sichbei Yahoo!-Shopping anzumelden. Es bedarf wenig krimineller Phantasie,um sich die Missbrauchsmöglichkeiten vorzustellen.
Challenge Authenticate
Die Beispiele machen deutlich, wie wichtig es ist, die wahre Identität desAnmeldenden zu authentifizieren. Um dies zu erreichen, fordert der Ser-ver vom Client glaubwürdige Beweise für die behauptete Identität. Die-sen Vorgang nennt man im englischen Fachjargon einen Challenge.
CerberusAls Beispiel soll hier eine Strategie zur Sprache kommen, die bereits indem legendären Computerspiel »Leisure Suit Larry I« zur Verifikation desbehaupteten Alters des Spielers verwendet wurde. Dieses Verfahren istnach dem griechischen Wächter der Unterwelt, dem Höllenhund Cerbe-rus, benannt. Hierzu muss dem Computer eine Liste von Fragen und Ant-worten bekannt sein, die unter normalen Umständen nur die berechtigtePerson selbst beantworten kann. In einem einfachen Fall wird hierzu dieBiographie des Benutzers abgespeichert und der Cerberus stellt nun eineoder mehrere Fragen aus dem Repertoire, etwa nach dem Geburtstag derMutter, dem Beruf des Großvaters oder dem Namen des Arbeitgebers vorexakt zehn Jahren.
2.0.3 Message-Queues
In den Zeiten der alten Mainframes, als Programme vor allem im Batch-Betrieb ausgeführt wurden, waren Message-Queues etwas ganz Selbst-verständliches. Jeder Job musste sich in eine Queue einreihen und aufseine Abarbeitung warten, bis er an der Reihe war. Die Eingabe- und Aus-gabeströme wurden in speziellen Input- und Output-Queues zwischen-gespeichert.
Kap02.fm Seite 29 Dienstag, 22. April 2003 2:31 14
30 Middleware
MQs habeneigene Intelligenz
Ausgehend von diesen einfachen Verwaltungsqueues stellt man heuteallen Applikationen zentrale Message-Queues zur Verfügung, die nichtnur Nachrichten speichern und verwalten, sondern selbst eigene Intelli-genz besitzen, um Verarbeitungen anzustoßen, auf Fehler zu reagierenoder ganze Flüsse von Verarbeitungen (Workflows) zu kontrollieren.
Beispiel Das sieht zum Beispiel wie folgt aus: Falls eine Anfrage nicht sofortzustellbar ist, weil ein geeigneter Computer zeitweise nicht zur Verfügungsteht oder überlastet ist, kann die Anfrage vorübergehend zwischenge-speichert und zu gegebener Zeit an den Empfänger zugestellt werden.Falls der anfragende Client in der Anfrage zu verstehen gibt, dass er nureine komplette Antwort wünscht, kann der Message-Server für dieAnfrage ein Postfach einrichten, dort die Ergebnisdaten sammeln und,wenn das Ergebnis komplett ist, den Client darüber benachrichtigen.
2.0.4 Workflow
Aufbauend auf einer funktionierenden Message-Queue entwickeln sichWorkflows. Darunter versteht man ganz allgemein die automatischeAbfolge von regelmäßig wiederkehrenden Prozessen. Im Normalfall han-delt es sich dabei um ein einfaches Verketten von Programmaufrufen, wiees bei klassischen Jobs auch der Fall ist.
So meldet z.B. Programm A, dass ein bestimmtes Ereignis stattgefundenhat, zum Beispiel, dass es schlicht zu Ende ist. Der Workflow-Managerfängt dieses Ereignis ab und bestimmt anhand weiterer Daten, die Pro-gramm A hinterlassen hat, welches Programm als Nächstes auszuführenist.
IntelligenteVerknüpfungen
Damit sind nicht nur stupide Programmverkettungen gemeint, sondernauch intelligente Verknüpfungen, das soll heißen, dass der Workflow-Manager die Daten des ersten Programms konvertiert, filtert und gegebe-nenfalls nach bestimmten Kriterien eine Entscheidung trifft, welches Pro-gramm als Nächstes auszuführen ist.
2.0.5 GUI-Server
GUI-Serveroptimieren denDatenfluss zum
Browser
Mit der zunehmenden Nachfrage nach browserorientierten Applikatio-nen öffnet sich auch ein neuer Bedarf an Software, die Inhalte in einerWeise aufbereitet und optimiert, dass dem Nutzer eine einheitliche Prä-sentation gewährleistet wird. Gleichzeitig erfordert die weite Verzwei-gung von Internetanwendungen immer die Optimierung des Datenver-kehrs zwischen Browser und Server.
Kap02.fm Seite 30 Dienstag, 22. April 2003 2:31 14
Middleware 31
Hierfür bieten sich GUI-Server als eine neue Form der Middleware an.Dabei handelt es sich um Proxy-Server, die HTML-Seiten auf der Basis vonXML-Dokumenten und abstrakten Modellbeschreibungen aufbauen.Dabei geht man davon aus, dass auf der Ebene der Datenübertragungund Transaktionsverwaltung die abstrakte Sicht auf den Datenfluss beisehr vielen Anwendungen identisch ist.
BeispielNehmen wir zum Beispiel einen Webshop, die »Hello-World!«-Applika-tion für Webentwickler. Die Seite eines Webshops besteht meistens auseiner Navigationsleiste, einem Block mit Detaildaten und einer Liste.Detaildaten und Listen bestehen selbst aus Feldern. In Teilen der Feldersoll es dann möglich sein, Eingaben zu machen. Vergleichen wir damiteine Lagerverwaltung im Materialwesen, so befinden wir, dass auch hierdie Struktur identisch ist. Statt der gekauften Artikel sehen wir dieBestände eines Lagerplatzes, statt der Kundendetaildaten sehen wir dieInformation zum Lagerplatz.
2.0.6 3-Tier-Lösungen
Der Einsatz einer Message-Queue bedeutet in der Praxis zusätzliche Soft-ware und somit zusätzliche Kosten für Anschaffung und Wartung. Es stelltsich also die Frage, warum dennoch eine 3-Tier-Lösung attraktiv seinsollte.
Eine 3-Tier-Lösung, bei der SAP R/3 über einen Middleware-Broker miteiner externen Lösung kommuniziert, erweist sich in der Praxis als deut-lich wartungs- und entwicklungsfreundlicher als eine 2-Tier-Lösung.Erwarten sollte man eigentlich das Gegenteil, denn immerhin muss einzusätzliches Produkt mit gewartet und programmiert werden. Ein Teil derLösung liegt im »Gewicht« der Verbindung. Darunter versteht man denrelativen Aufwand zum Aufbau einer Verbindung und zum Austausch vonDaten zwischen einem Client und einem Server.
Heavy und Thin Clients
Dabei spricht man von einem Heavy Client, wenn der Aufwand für dasProtokoll zum Datenaustausch sehr hoch ist, während ein unmittelbarerDatenaustausch als Thin Client (manchmal auch als Slim Client) bezeichnetwird. Für die Protokolle sind die Begriffe Heavy weighted protocol undLight weighted protocol gängige Termini.
Payload und Envelope
Als Anmerkung seien noch die beiden Begriffe Envelope und Payloadangeführt, die bei protokollbasierten Kommunikationen gerne verwendetwerden. Unter Payload versteht man die durch das Protokoll tatsächlichübertragene Information, also die reine Netto-Information ohne die Ver-
Kap02.fm Seite 31 Dienstag, 22. April 2003 2:31 14
32 Middleware
waltungsdaten, die zur sicheren Übertragung der Information mitgesandtwerden. Der Envelope, auf Deutsch Umschlag, ist die Information, die umeine Nachricht herumgepackt wird, um bei der Übertragung den Paketeneine einheitliche Form zu geben.
Zwischen SAP R/3 und DCOM besteht eine schwere Verbindung, weilRFC und OLE/DCOM zwei völlig verschiedene Protokollarten sind. Hinzukommt, dass SAP R/3 in aller Regel auf einer Nicht-Windows-Plattformläuft. Aber auch eine Windows NT/2000-Version von SAP R/3 wirdgewöhnlich betriebssystemneutral betrachtet, das heißt, dass alle Zugriffevon SAP R/3 nach draußen über die R/3-API-Schnittstellen erfolgen.
Ein HTTP-Server auf einer Windows-Plattform basiert selbst auf demCOM-Protokoll. Damit laufen alle Applikationen, die vom HTTP-Server inseinem eigenen Kontext gestartet werden, als COM+- beziehungsweise.NET-Instanzen, womit der Protokoll-Overhead zwischen Client und Ser-ver wegfällt beziehungsweise auf dem Niveau von internen Aufrufenbleibt.
Die 3-Tier-Architektur ermöglicht es nun, die Heavy-Client-Verbindungvon und nach SAP R/3 zu eliminieren, indem zur Kommunikation mit SAPR/3 ein HTTP-Server zwischengeschaltet wird. Die Kommunikation zwi-schen HTTP und SAP R/3 ist eine Light-Weight-Verbindung, denn HTTP istein ganz einfaches textbasiertes Protokoll, das über TCP/IP ausgetauschtwird, dem Netzwerk-Transport-Protokoll, das auch SAP R/3 für die eigeneKommunikation verwendet. Durch TCP/IP entsteht demnach kein zusätz-licher Overhead für die Kommunikation, während die HTTP-Textnach-richten sehr leicht in SAP R/3 aufgebaut werden können, ohne dass derEntwickler auf R/3-Seite besondere Kenntnisse haben muss.
Message-Serverwirkt als Kataly-
sator
Der zwischengeschaltete Message-Server hat somit eine katalytische Wir-kung, indem er den Aufwand der Kommunikation zwischen den Partnernim Vergleich zur Direktverbindung deutlich reduziert.
Kap02.fm Seite 32 Dienstag, 22. April 2003 2:31 14
Middleware 33
Abbildung 2.1 2-Tier-Kommunikation zwischen Excel und SAP R/3
Abbildung 2.2 3-Tier-Kommunikation zwischen Excel und SAP R/3
���
���������
�����
���
���������� ����
�����
�����
������
������
����
����
���
Kap02.fm Seite 33 Dienstag, 22. April 2003 2:31 14
Kap02.fm Seite 34 Dienstag, 22. April 2003 2:31 14
Beispielszenarien und Voraussetzungen 35
3 Beispielszenarien und Voraussetzungen
Die Situation, die man in vielen IT-Abteilungen heute vorfin-det, lässt auf den ersten Blick kaum hoffen, dass eine Verein-fachung oder gar Vereinheitlichung der Systemlandschaften möglich ist. Analysiert man jedoch das Vorgefundene genau und konzentriert sich bei der Neustrukturierung auf einige wenige zukunftsfähige Standards, beginnt sich der Nebel rasch zu lichten.
3.1 Die nahe Zukunft
Nachdem die letzten Jahre zwar durch das Internet geprägt waren, aberkaum eine klare Linie erkennbar wurde, auf welche Technologien sich dieIT-Welt letztlich einigen würde, kristallisieren sich mittlerweile ein paarStandards heraus, die in naher Zukunft das Geschehen im Enterprise-Computing dominieren werden.
3.1.1 XML-Datenbanken
XML dient der Datenstruktu-rierung
XML (Extensible Markup Language) ist eine Sprache zur strukturiertenBeschreibung von Daten. Da die meisten Applikationen mittlerweile dieDaten von einem externen Partner in XML-Form verlangen, liegt es nahe,dass die Datenbank Anfragen und Ergebnisse direkt in XML mit dem Cli-ent austauscht.
XML ist jedoch kein alleinstehender Standard; in seinem Umfeld findensich vielmehr verschiedenste Spezifikationen, die alle auf den Grundprin-zipien von XML aufbauen. Ein wichtiger Standard innerhalb dieser »XML-Familie« zum Austausch von Dokumenten ist das Simple Object AccessProtocol (SOAP).
An die Stelle von Open SQL, ODBC oder JDBC tritt somit also XML. Fürden Anwendungsentwickler verhält sich die Datenbank so, als seien dieDaten als Dokumente im hierarchischen XML-Format abgespeichert.
3.1.2 Entwicklung in mehreren Programmiersprachen
Microsoft setzt Standards
Bei der Öffnung der eigenen Plattform für verschiedene fremde Program-miersprachen hat Microsoft ganz deutlich den Trend gesetzt. Jede wieauch immer geartete Programmiersprache wird ihre Freunde und ihre
Kap03.fm Seite 35 Dienstag, 22. April 2003 2:31 14
36 Beispielszenarien und Voraussetzungen
Gegner haben. Begeisterung und Ablehnung sind manchmal in nachvoll-ziehbaren Argumenten begründet, meistens jedoch basieren sie auf eheremotionalen Beurteilungen. Mit Microsoft.NET hat Microsoft unmissver-ständlich klar gemacht, dass es keine Programmiersprache in irgendeinerWeise bevorzugen oder benachteiligen will. Ab sofort kann man auf Mi-crosoft.NET mit allen unterstützten Sprachen gleichzeitig entwickeln.Dies war freilich auch schon Ende der 80er Jahre mit Borlands Turbo Pas-cal 3 möglich, nur blieb dies eine Spezialität, die ihrer Zeit um zehn Jahrevoraus war.
Derzeit existiert Microsoft.NET noch ausschließlich auf Windows-Rech-nern, obwohl das Framework ähnlich wie Java so entwickelt wurde, dasses selbst als vollständiges Betriebssystem agieren kann. Somit ist auch zuerwarten, dass eine Portierung auf andere Plattformen rasch erfolgen wird.
Bis Ende 2003 kann man mit Microsoft.NET auf Mac OS rechnen, undselbst ein Zuschnitt auf Linux wird nur eine Frage der Zeit sein, auchwenn immer wieder unterstellt wird, Microsoft.NET sei vor allem einMarketing-Vehikel für Windows. Setzt man jedoch die enorme Leistungs-fähigkeit des Frameworks dagegen, kann man durchaus erwarten, dass esauf lange Sicht ein Eigenleben entwickeln wird.
SAP NetWeaver Auch SAP öffnet sich mit dem SAP NetWeaver für die Entwicklung mittelsverschiedener Programmiersprachen. Heute wird auf dem Web AS bereitsdie Applikationsentwicklung mit ABAP und Java unterstützt und es exis-tiert auch bereits ein Konnektor für die .NET-Plattform.
3.1.3 Grid-Computing
Bisher gingen wir immer von der Vorstellung aus, dass in einem Netzwerkeine ganze Reihe von spezialisierten Computern stehen, die jeweils eineoder ein paar wenige Programme ausführen. Dabei wird zum Beispiel SAPR/3 auf Box SAP1, SAP2 und SAP3 ausgeführt, die hauseigene, selbstgeschriebene Produktionsplanung auf Box PP01 und gedruckt wird aufeiner Windows-Box NT501. Nun kann es in der Praxis schon einmal vor-kommen, dass sich SAP1 langweilt, während NT501 beim Formatierender Monatsrechnungen heftig ins Glühen kommt.
Lastverteilung An diesem Punkt setzt nun das Konzept des Grid-Computing an. Anstatteine Software genau einer Applikations-Box zuzuweisen, werden dieHardware-Boxen nach ihren Möglichkeiten klassifiziert. Wenn zum Bei-spiel der Printer-Server feststellt, dass seine Box überlastet ist, sendet ereine Anfrage nach mehr Rechnerpower an einen Message-Server. Der
Kap03.fm Seite 36 Dienstag, 22. April 2003 2:31 14
Komponenten und Protokolle 37
Message-Server sucht nun in der Liste der verfügbaren Boxen eine aus,die momentan wenig ausgelastet ist, lädt dort die notwendige Softwareund verteilt die Last teilweise auf diese Box um.
3.2 Komponenten und Protokolle
Zu den Kernkompetenzen in einem Integrationsteam gehört das Wissenum Protokolle und das Denken und Entwickeln in Komponenten. Dieverschiedenen Frameworks bieten jeweils eigene Komponentenmodellean. Dabei ist unter »Komponenten« eine abgeschlossene modulare,transaktionale Einheit zu verstehen. Solche Komponenten heißen in JavaBeans, in SAP je nach Betrachtungsweise BAPI oder Logical Unit of Work(LUW) und in Microsoft-Umgebungen COM-Objekte.
Die wichtigsten Protokolle, die zwischen den Komponenten den Daten-austausch kontrollieren, sind COM+ bei Microsoft, CORBA und RMI beiJava und RFC bei SAP. Diese Protokolle dienen dazu, die von der jeweili-gen Umgebung bereitgestellten APIs der Komponenten sauber aufzuru-fen. Abbildung 3.1 und Tabelle 3.1 vermitteln aber ein Bild davon, welcheFähigkeiten für einen erfolgreichen Technikberater unverzichtbar sind.
Micro-soft.NET
Visual Basic(Microsoft Office)
J2EE R/3, SAP Web AS
Microsoft.NET .NET COM+ RMI/CORBA
1. RFC Controls
2. .NET Connector
Visual Basic(Microsoft Office)
COM+ COM+ COM+ RFC Controls
J2EE JNI JNI RMI/CORBA
Java Connector (JNI)
SAP R/3 RFC via OLE2
RFC via OLE2 RFC RFC
SAP Web AS RFC via OLE2
RFC via OLE2 RMI RFC
Tabelle 3.1 Zugriffstechniken zwischen den Frameworks
Kap03.fm Seite 37 Dienstag, 22. April 2003 2:31 14
38 Beispielszenarien und Voraussetzungen
3.3 Ein Beispiel einer heutigen Unternehmens-IT
So wie früher der Großvater vom Krieg und so mancher gestandene Pro-fessor von seiner Studienzeit erzählt hat, erzählen heute die COBOL- undFORTRAN-Programmierer von Lochkartenstapeln und Magnetbändern,Assembler-Programmen mit so mystisch klingenden Befehlen wieBranch-and-Link, nächtelangen Jobs zum Erstellen von Fakturen undMonatsabschlüssen, geheimnisvoll im Halbdunkel aufgestellten Monito-ren mit leuchtend grüner Schrift und wie man die Siebzigjährigen ausMallorca hatte einfliegen lassen, als beim Upgrade der Zentraleinheit derRechner partout nicht mehr den IPL machen wollte.
Austausch hochspezialisierter
Software istriskant
Ganz so lange ist das wahrscheinlich doch noch nicht her, und in so man-chem Betrieb gibt es zwar vermutlich keine Lochkarten mehr, aberschwarz-grüne Monitore gibt es immer noch zuhauf. Denn es ist eine Tat-
Abbildung 3.1 Komponenten, API und RPC-Protokolle
����������
��� ���������� �������������� ��������
�������������� ��
������������
�������
����
����
���
���������������
��������
����
��� ������ � � ���������
���� � ���� ����������
�
������
���
� ����
�������� !���!��� !������ � �"�#� �$� ��������
����������� � � �
��������
���������������� ��!�������
����
������%��������&��� ��#���� ����������&����
��
'()*
����
����� )���� ���
!��������
����
+��
����
���
Kap03.fm Seite 38 Dienstag, 22. April 2003 2:31 14
Ein Beispiel einer heutigen Unternehmens-IT 39
sache: Man trennt sich ungern von den alten, zuverlässigen Maschinen,die direkt die Produktion kontrollieren und in denen all das Wissensteckt, das so manch ein Programmierer mit ins Grab genommen hat.
Typische Compu-ter-Infrastruktur heute
Schauen wir uns einmal eine typische Computer-Infrastruktur eines pro-duzierenden Betriebs an. Wohlgemerkt: Die Rede ist von produzierendenBetrieben, also solchen Firmen, die gewöhnlich einen individuell entwor-fenen, hochkomplexen Produktionsprozess steuern. Dies ist anders alsetwa beim Handel, wo die Prozesse überall dem gleichen Schema folgenund deshalb eine einmal geschriebene Software für eine ganze Branchetaugt. In einem solchen produzierenden Betrieb findet man also z.B. diefolgenden Systeme (kein Idealzustand, sondern ein realistisches Szenario):
� zentrales SAP R/3-System (neun Applikationsserver, ein Datenbankser-ver) für
� FI/CO: Buchhaltung und Controlling
� MM: Materialwirtschaft
� SD: Verkaufsabwicklung
� PP: Produktionsgrobplanung
� dezentrales SAP R/3-System (zwei Applikationsserver, ein Datenbank-server) für
� die Verkaufsbüros in Spanien und in Singapur
� teilweise Replizierung der Daten über ALE
� Transportabwicklungssystem (ein PC) mit selbst geschriebener Soft-ware für
� Lagerverwaltung
� Etikettendruck
� Gefahrgutdokumentendruck
� Warenausgangserfassung
� Produktionsrechner (drei AS/400)
� Rezepturverwaltung
� Chargenverwaltung
� Produktionsfeinplanung
� Maschinenleitstand
� Steuerung der Produktion
� Chargenverwaltung (sic! siehe oben)
Kap03.fm Seite 39 Dienstag, 22. April 2003 2:31 14
40 Beispielszenarien und Voraussetzungen
� PC mit hauseigener Software für
� Beschaffung Produktion
� Entsorgung Reste
� ein PC läuft Tag und Nacht und steuert den Datenverkehr mit Zulieferern, istaber in keinem Plan verzeichnet
� eine AS/400darauf laufen alle Programme, die nicht offiziell abgenommen wurden
� acht zentrale NT-Server für das Office-Netzwerk
� drei Linux-Servervon denen aber keiner genau weiß, was sie tun
� drei WWW-Server für das Internet
� ein WWW-Server für das Intranet
� ein WWW-Serverfür den Internetshop, in dem die Bestellungen erfasst werden, dannordentlich ausgedruckt und von Hand im R/3-Zentralsystem eingege-ben werden
� ein Firewall-Server
� ein NT-Proxy-Serverüber den allerdings gar kein Netzverkehr läuft; wahrscheinlich dientdoch einer der Linux-Rechner als Proxy-Server für das WWW
� drei extern aufgestellte NT-Server zum Daten-Backup
� zwei EDI-Server (von denen sich einer nicht mehr booten lässt)
� zwei weitere WWW-Serverdie aber als normale Workstations geführt sind; schaltet man sie ab,bricht der Einkauf zusammen, obwohl der eigentlich über SAP R/3abgewickelt wird
� ...
Programme sinddas Know-how
einer Generation
Es gibt viele Gründe, warum eine zentral organisierte, redundanzfreie IT-Landschaft nicht realistisch ist. Besonders schwer wiegen psychologischeGründe wie Angst vor Neuem, mangelndes Vertrauen in die neue Soft-ware oder fehlende Ausbildung. Der wesentliche Grund ist aber: Compu-ter speichern Wissen und die Programme modellieren mit ihren Algorith-men komplexe Arbeitsprozesse. Genauer gesagt: Die Programme sind dieeinzigen wirklich zuverlässigen Arbeitsanweisungen und Prozessbeschrei-bungen. Da aber Arbeitsprozesse komplex sind und Programmierspra-
Kap03.fm Seite 40 Dienstag, 22. April 2003 2:31 14
Ein Beispiel einer heutigen Unternehmens-IT 41
chen von Natur aus kryptisch (das gilt auch und vor allem für RPG, C undJava), lassen sich die so dokumentierten Arbeitsanweisungen und Pro-zessbeschreibungen nur schwer lesen.
3.3.1 Modellsichten und Abstraktion
Realistisch betrachtet, sind solche Serverfarmen keineswegs so chaotisch,wie sie auf den ersten Blick erscheinen mögen. Tatsächlich spiegeln sienur die ebenso komplexe Realität des Tagesgeschäfts eines Unterneh-mens wider. Auch dieses ist selten gradlinig, einfach und frei von Redun-danz. Um dies zu veranschaulichen, betrachten wir einmal das täglicheGeschäft eines Unternehmens.
Abbildung 3.2 Vereinfachte Darstellung einer Serverfarm
SAP DB Server
Firewall
Webserver
NT/2000
Firewall
WorkstationsLinux
SAPApplication Server
Data
Proxy
WebProxy
Proxy
Proxy
NT PrintServer
?
Kap03.fm Seite 41 Dienstag, 22. April 2003 2:31 14
42 Beispielszenarien und Voraussetzungen
Vertriebswege Die Produkte werden auf verschiedenen Wegen an den Endkunden gelie-fert und jeder Vertriebsweg und sogar jeder Kunde kann noch einmal eineigenes Verfahren bei der Abwicklung nach sich ziehen. So verkauft einUnternehmer die Produkte unter anderem:
� direkt
� über Großhändler
� indirekt als Streckengeschäft an Zwischenhändler, zum Beispiel einVersandhaus. Hierbei lassen sich dann folgende Fälle unterscheiden:
� Der Zwischenhändler erhält für jeden Verkauf eine Sofortprovision.
� Der Zwischenhändler erhält für jede bezahlte Ware eine Endprovi-sion.
� In Einzelfällen fakturiert und liefert das Unternehmen im Namendes Versandhauses und macht auch für einzelne Händler das Inkassobeim Endkunden.
� über einen selbst betriebenen Webshop (mit dem Angebot von Son-derfertigungen)
Wer glaubt, man könne den Kunden seine eigenen standardisiertenStrukturen verordnen, ist nicht nur kundenunfreundlich, sondern verla-gert das Problem schlicht auf die Seite des Kunden, denn dieser hat es jaauch mit vielen Lieferanten zu tun, die sicher nicht alle die gleichen Ver-triebsstrukturen haben. Es gibt nur ganz wenige Branchen, wie zum Bei-spiel den Buchhandel, die es bis heute geschafft haben, einheitliche Ver-triebsstrukturen konsequent durchzusetzen.
Produktion In der Produktion existieren folgende Fertigungsvarianten:
� Serie auf Lager
� Serie auf Termin
� Make-to-order (Variantenkonfiguration)
� Make-to-order mit Überschuss aufs Lager
Versand Auch im Versand gibt es verschiedene und kundenindividuelle Varianten:
� direkte Express-Auslieferung
� direkte Auslieferung durch Sammel-Spedition (Ground-Collect)
� Lagerauffüllung nach Bedarf (KANBAN) und Termin (Lieferplan)
� Bereitstellung zur Abholung auf Termin
Kap03.fm Seite 42 Dienstag, 22. April 2003 2:31 14
Ein Beispiel einer heutigen Unternehmens-IT 43
Technische SichtDie Sicht des Anwenders ist nicht die des Ingenieurs. Um die Szenarienauf einem Computer zu realisieren, brauchen wir eine Abstraktion dergezeigten Anwendungsfälle auf Software-Applikationen, was uns zu fol-gender minimaler Installation führt:
� ein WWW-Server und eine Webshop-Applikation
� eine Applikation zur Verwaltung der Kundenaufträge
� eine Applikation zur Bestellung der Rohwaren
� eine Applikation zur Verwaltung des Lagers
� eine Applikation zur Produktionsplanung
� eine Applikation zur Versandplanung und Versandsteuerung
AblaufUm das Ganze noch einmal aus einem anderen Blickwinkel zu betrachten,beleuchten wir im Folgenden die mögliche zeitliche Abfolge eines Ver-kaufs:
1. Ein Kunde ruft die Webseite auf und fragt ein Produkt an.
2. Der Webserver simuliert die Machbarkeit durch Simulation eines Kun-denauftrags mit Variantenkonfiguration.
3. Der Kundenauftragsrechner lässt sich vom Produktionsrechner eingeschätztes Fertigstellungsdatum errechnen.
Abbildung 3.3 Kommunikationsorbit eines Unternehmens
Orbit
APO
CRM
BW/SEM
Non-R/3 App
SAP R/3
Wireless/RFFirewall
Internet
Non R/3
R/3
Documents
PrintServer Forms
LabelsPrintingSolution
c
Transport
Warehouse
Packaging
Data
Pencomputer
Kap03.fm Seite 43 Dienstag, 22. April 2003 2:31 14
44 Beispielszenarien und Voraussetzungen
4.Der Webserver lässt sich vom Kunden den Auftrag bestätigen undsammelt die Zahlungsinformation (Kreditkarte, Bankeinzug etc.) ein.
5.Der Kundenauftrag wird angelegt und bittet den Produktionsrechner,die Produktion fest einzuplanen.
6.Die Produktion teilt dem Versand die Verfügbarkeit mit.
7. Der Versand avisiert dem Kunden die Lieferung.
8.Der Versand ordert die Spedition entsprechend den Versandbedin-gungen.
9.Der Versand bestätigt den Versand.
10.Der SD-Rechner fakturiert die versandte Ware.
3.3.2 Ansatz für eine zeitgemäße Lösung: Integration mit HTTP und XML
KomplexeSysteme lassen
sich nicht planenund modellieren
Es ist müßig, sich in Theorien zu ergehen, wie man eine solche Strukturdurch eine saubere und gezielte Planung aufräumen kann. Solche Plänefunktionieren nur in der Theorie, denn sie sind fast niemals redundantund sturmsicher. Außerdem wird immer wieder übersehen, dass Pläneselten so umgesetzt werden, wie sie ursprünglich angesetzt wurden,stattdessen werden sie im Alltag rasch zerfleddert und selten mit Konse-quenz zu Ende gebracht. Diese Erkenntnisse aus der Theorie der komple-xen Systeme (auch Chaostheorie genannt) – und ein Produktionsbetriebist ein solches komplexes System – begründen aber nur in nachvollzieh-barer Weise, was in der Praxis bereits eine Binsenweisheit ist.
Integration alseinzig praktikable
Lösung
Klinisch saubere Strukturen sind starre Strukturen. In einem lebendigenBetrieb, wie ihn eine Produktion darstellt, sind aber Flexibilität undGeschwindigkeit der Reaktion das A und O. Und deshalb werden vorallem die produktionsnahen Rechner und die Rechner aus der Lagerver-waltung so bleiben, wie sie sind, weil niemand die Verantwortung über-nehmen wird, einen funktionierenden Rechner ohne Not durch einenanderen, nicht erprobten auszuwechseln. Als Lösung bietet sich alsolediglich die Integration der spezialisierten Einheiten in das gesamteEnterprise Network an.
Um den Planungs- und Abstimmungsaufwand gering zu halten, funktio-niert die Integration der Applikationen immer nach dem gleichenSchema. Dieses fußt auf HTTP und transportiert Daten zwischen den Sys-temen grundsätzlich in XML. Die Aufbereitung und Konvertierung vonDaten erfolgt durch den konsequenten Einsatz von XSLT-Schablonen.
Kap03.fm Seite 44 Dienstag, 22. April 2003 2:31 14
Ein Beispiel einer heutigen Unternehmens-IT 45
Kommunikation mit HTTP und XML
In Abbildung 3.2 ist der Browser repräsentativ für einen beliebigen Client(der Client kann aber auch ein anderes Programm sein). Somit ist derAblauf wie folgt:
1. Ein Client fragt eine bestimmte Ressource an.
2. Ein HTTP-Server nimmt die Anfrage entgegen und führt eine Applika-tion aus.
3. Sobald ein Ergebnis vorliegt, wird dieses in XML aufbereitet.
4. Der Browser nimmt das XML entgegen und formt es mit Hilfe einesXSLT-Dokuments um.
5. Nun liegt das Ergebnis in der gewünschten Form vor und kann weiter-verarbeitet werden.
Abbildung 3.4 Typischer Programmfluss einer Client-Server-Applikation mit HTTP
�������
������������
�������
����� �������������
�� ����� ��� �����������
���� ���������
���� �����
�
�������
�� �������������
���������
�������
�������������
����� ���
����
�
���������
� ������ ������
���� ��� �����
Kap03.fm Seite 45 Dienstag, 22. April 2003 2:31 14
Kap03.fm Seite 46 Dienstag, 22. April 2003 2:31 14
Teil 2 Remote Procedure Calls und Business API
Remote Procedure Calls (RPC) sind das Herz jeder Client-Server-Architektur. Durch sie wird es möglich, Programme von einem Computer aus auf einem anderen Computer auszuführen. Durch dieses Konzept kann man ein Netzwerk von spezialisierten Ein-zelcomputern entwickeln, die reibungslos miteinander kommu-nizieren.
Kap03.fm Seite 47 Dienstag, 22. April 2003 2:31 14
Kap03.fm Seite 48 Dienstag, 22. April 2003 2:31 14
SAP R/3 Remote Function Call 49
4 SAP R/3 Remote Function Call
Es gibt verschiedene Begriffsvarianten für RPC, so heißt es bei SAP Remote Function Call (RFC) und bei Java Remote Method Invokation (RMI).
RFC ist Grundlage für den Erfolg von R/3
Es ist sicher nicht vermessen, zu sagen, dass der andauernde Erfolg vonSAP R/3 zu einem großen Teil dessen RFC-Funktionalität zu verdanken ist.RFC hat SAP R/3 zu einem offenen System gemacht und das ist es, wasdie IT-Welt benötigt. Keine Software ist so integriert und perfekt, dass siealle Fälle und Sonderfälle eines Geschäftszweiges abdecken kann. DieMöglichkeit, mit einem Programm all das zu erzielen, was man auchdurch eine Benutzereingabe erreichen kann, ist eine Grundforderung anein modernes Software-Paket.
RFC ist Grundlage für IDoc/ALE und BAPI
RFC bildet auch die Grundlage der R/3-Technologien ALE/IDoc und BAPI.In beiden Fällen kommuniziert SAP R/3 mit einem externen Programm,im Falle von ALE/IDocs durch asynchronen Austausch von Nachrichten,im Falle von BAPIs durch direkten Aufruf eines Funktionsbausteins.
4.1 Was ist RFC?RFC baut auf CPI-C auf
Die SAP-Technologie RFC ist eine auf dem IBM-Protokoll CPI-C aufbau-ende Schnittstellentechnologie, die es externen Programmen oder ande-ren R/3-Instanzen erlaubt, auf eine bestimmte R/3-Instanz zuzugreifen.
RFC ist ein sicheres, bidirek-tionales Protokoll
Das RFC-Protokoll ist ein bidirektionales, synchrones Kommunikations-protokoll zum Austausch von Nachrichten über ein Netzwerk. RFC sen-det dazu Datagramme von einem Client zu einer Server-Applikation überein UDP/IP-Netzwerk. Grundsätzlich tut RFC nichts anderes als HTTP, nurdie benutzte Codierung und Konvention unterscheiden sich.
Genaue Kenntnis der Details des RFC-Protokolls sind für einen Entwicklernormalerweise nicht notwendig. Um den Zugriff auf RFC zu erleichtern,stellt SAP eigene RFC-Bibliotheken für die verschiedenen Frameworks zurVerfügung. Derzeit gibt es RFC-Libraries für alle Plattformen, auf denenSAP R/3 läuft, namentlich Windows, UNIX, Linux, AS/400 und z/OS.
RFC erlaubt es einem Programm,
� R/3-Funktionen in einem anderen R/3-System oder einer weiterenR/3-Instanz aufzurufen
Kap04.fm Seite 49 Dienstag, 22. April 2003 2:31 14
50 SAP R/3 Remote Function Call
� R/3-Funktionen von Nicht-SAP-Programmen aufzurufen, zum BeispielJava, C++ oder Visual Basic
� externe Programme außerhalb eines SAP-Systems von SAP R/3 aus auf-zurufen
Die folgenden Abschnitte zeigen konkrete Beispiele zum Aufruf von Pro-grammen über RFC. Den Zugriff von externen Computern zeigen wirunter Verwendung von DCOM für alle Windows-Betriebssysteme undvon Java aus. Grundsätzlich gibt es auch Zugriffsmöglichkeiten von allenBetriebssystemen aus, die auch eine R/3-Instanz unterstützen, zum Bei-spiel einer AS/400 oder von IBM/390. Allerdings werden diese Zugriffs-variationen so selten in der Praxis verwendet, dass auch die Unterstüt-zung dafür leidet. Für all diese Betriebssysteme ist es empfehlenswerter,die Kommunikation über einen HTTP-Proxy-Server durchzuführen.
Abbildung 4.1 Remote Program Calls als Kernfunktionalität einer Client-Server-Landschaft
������
���������
������
������
���������
���� �������
���������
���������������
������� �
������
���������
!"#��$%
�������$&�
������
�����������
����������&�
"���������
����������&�
"���������
������
'����������
���
���
���
���
Kap04.fm Seite 50 Dienstag, 22. April 2003 2:31 14
R/3-RFC von einer anderen R/3-Instanz 51
4.2 R/3-RFC von einer anderen R/3-InstanzRFCs via R/3-Destination werden in SM59 definiert
Eine R/3-Verbindung von einer anderen SAP R/3-Instanz aus erfolgtimmer über die Angabe einer Destination. Eine Destination wird in Trans-aktion SM59 gepflegt und kann dann von allen ABAPs dieser Instanzbenutzt werden. Im Beispiel in Listing 4.1 definieren wir eine RFC-Verbin-dung zu einem R/3-Computer, in diesem Fall ist es der SAPOSS-Server.
Funktionsaufrufe erhalten den Parameter DESTINATION
Für alle nachfolgenden Aufrufe in das Remote-System brauchen wir unsfortan nicht mehr um die Logon-Daten zu kümmern, da grundsätzlich aufdie Angabe in SM59 zurückgegriffen wird. Ein RFC-Aufruf von ABAP indas Remote-System fügt dann dem CALL FUNCTION einfach noch denParameter DESTINATION hinzu (siehe Listing 4.1). Wenn Sie keine Desti-nation definiert haben, aber dennoch einen RFC testen wollen, könnenSie die vordefinierte Destination NONE verwenden, die immer auf daseigene System verweist und implizit vorhanden ist und demnach nichterst mit SM59 angelegt werden muss.
Listing 4.1 Aufruf einer RFC-Function von ABAP via Destination NONE (= eigenes System)
DATA: from_curr_range TYPE STANDARD TABLE OF bapi1093_3.DATA: to_currncy_range TYPE STANDARD TABLE OF bapi1093_4.DATA: exch_rate_list TYPE STANDARD TABLE OF bapi1093_0 WITH HEADER LINE.DATA: return TYPE STANDARD TABLE OF bapiret1 WITH HEA-DER LINE.CALL FUNCTION 'BAPI_EXCHRATE_GETCURRENTRATES' DESTINATION ‘NONE’ EXPORTING date = sy-datum TABLES from_curr_range = from_curr_range to_currncy_range = to_currncy_range exch_rate_list = exch_rate_list return = return.LOOP AT exch_rate_list. WRITE: / exch_rate_list-from_curr. WRITE: exch_rate_list-to_currncy. WRITE: exch_rate_list-exch_rate.ENDLOOP.
Kap04.fm Seite 51 Dienstag, 22. April 2003 2:31 14
52 SAP R/3 Remote Function Call
4.2.1 Interne Destination NONE
RFC-DestinationNONE
R/3 hat bereits einige RFC-Destinationen fest vorgegeben, unter ande-rem die Destination NONE. Gibt man NONE als Ziel des Aufrufs an, wird einRFC in das rufende, also das eigene System ausgeführt. Hierzu sind natür-lich keine Logon-Daten erforderlich. NONE eignet sich zum Testen vonRFC-Aufrufen, wenn das entfernte System nicht zur Verfügung steht. Alsbesonderen Nebeneffekt gestattet es aber auch ein Entkoppeln des Auf-rufs von der laufenden Transaktion.
Jeder RFC öffneteine eigene LUW
Ein RFC startet grundsätzlich einen eigenen Programmkontext (LogicalUnit of Work, LUW). Sie können somit aus einer laufenden Transaktionheraus mehrere RFC-Bausteine mit Destination NONE aufrufen. ZumAbschluss können Sie dann mit den BAPI-Bausteinen BAPI_COMMIT_WORK beziehungsweise BAPI_ROLLBACK_WORK die Remote-Aufrufe been-den, ohne dass sich der COMMIT auf die rufende Transaktion auswirkt.
4.3 Windows-zu-R/3-Connectivity mit DCOMZugriff auf R/3
erfolgt via DCOMDer Zugriff von Windows-Systemen aus nach R/3 via RFC bedient sicheiner Reihe von DLLs, die mit dem SAP GUI oder dem RFC-Software-Development-Kit (RFCSDK) ausgeliefert werden. Diese DLLs basieren auf
Abbildung 4.2 Definition einer RFC-Destination mit SM59
Kap04.fm Seite 52 Dienstag, 22. April 2003 2:31 14
Windows-zu-R/3-Connectivity mit DCOM 53
DCOM, dem Distributed Common Object Protocol von Microsoft, mit demalle Kommunikationen zwischen Applikationen innerhalb einer Win-dows-Umgebung durchgeführt werden.
Für den Zugriff auf SAP R/3 müssen beim Aufbau der Connection immerdie richtigen Anmeldedaten (englisch Logon-Credentials) angegeben wer-den. Dies erledigen Sie normalerweise im SAP-Logon-Panel, das dieDaten wiederum in der Konfigurationsdatei SAPLOGON.INI abspeichert.
Befindet sich eine solche SAPLOGON.INI (normalerweise im Windows-System-Ordner, zum Beispiel C:\WINNT) auf Ihrem Rechner, können auchdie auf der librfc32.dll basierenden Libraries wie wdtlog.ocx oder der Java-Connector darauf zurückgreifen; es müssen nur noch UserID und Pass-word explizit angegeben werden. Wollen Sie nicht auf die SAPLOGON.INIzurückgreifen, müssen Sie alle Logon-Credentials selbst vollständig ange-ben. Abbildung 1.5 zeigt, wie die Credentials aus dem SAP Logon ent-nommen werden können.
Abbildung 4.3 Angabe der Credentials in SM59
Kap04.fm Seite 53 Dienstag, 22. April 2003 2:31 14
54 SAP R/3 Remote Function Call
4.3.1 R/3-Logon mit VBA
Zugriff von Win-dows erfolgt über
ActiveX
Das Logon von einer Windows-Applikation – also auch von VBA aus –erfolgt grundsätzlich über die SAP.LogonCtrl (in wdtlog.ocx) oder aufunterster Ebene durch die zentrale RFC-Library librfc32.dll. Wir beschrän-ken uns hier immer auf das SAP.LogonCtrl.
Alle folgenden Beispiele für Windows wurden entweder mit Visual Basicfor Applications (VBA) oder Visual Basic Script (VBS) erstellt.
Aufruf eines BAPIvon VBA
Das Beispiel, das jetzt folgt, zeigt zunächst ein ganz einfaches VB-Pro-gramm, das einen Logon zu R/3 durchführt, und zwar ohne Verwendungvon Klassen. Das Programm beschafft sich ein Connection-Objekt zu R/3,setzt die Parameter und führt den Logon durch. Anschließend ruft esnoch den Funktionsbaustein BAPI_EXCHRATE_GETCURRENTRATES mitdem aktuellen Datum auf.
Listing 4.2 Logon zu R/3 und Aufruf des Funktionsbausteins BAPI_EXCHRATE_GET-CURRENTRATES
' Example calling BAPI BAPI_EXCHRATE_GETCURRENTRATESOption ExplicitPublic Functions As SAPFunctionsOCX.SAPFunctions
Abbildung 4.4 Mapping der Logon-Credentials mit SAPLOGON.INI
Kap04.fm Seite 54 Dienstag, 22. April 2003 2:31 14
Windows-zu-R/3-Connectivity mit DCOM 55
Private LogonControl As SAPLogonCtrl.SAPLogonControlPrivate R3Connection As SAPLogonCtrl.ConnectionDim Func As SAPFunctionsOCX.FunctionPublic iDATE As SAPFunctionsOCX.ParameterPublic tEXCH_RATE_LIST As SAPTableFactoryCtrl.TablePrivate Sub Main() Dim ix As Integer Dim retcd As Boolean Dim SilentLogon As Boolean Set LogonControl = CreateObject("SAP.LogonControl.1") Set Functions = CreateObject("SAP.Functions") Set R3Connection = LogonControl.NewConnection R3Connection.Client = "000" R3Connection.ApplicationServer = "192.168.69.111" R3Connection.Language = "EN" R3Connection.User = "DEVELOPER" R3Connection.Password = "19920607" R3Connection.System = "WAS" R3Connection.SystemID = "$WebAS" R3Connection.SystemNumber = "18" R3Connection.UseSAPLogonIni = False SilentLogon = True retcd = R3Connection.Logon(0, SilentLogon) If retcd <> True Then MsgBox "Logon failed": Exit Sub Functions.Connection = R3Connection Set Func = Functions.Add("BAPI_EXCHRATE_GETCURRENTRATES") Set iDATE = Func.Exports("DATE") Set tEXCH_RATE_LIST = Func.Tables("EXCH_RATE_LIST") iDATE.Value = "20030101" Func.Call For ix = 1 To tEXCH_RATE_LIST.RowCount Debug.Print tEXCH_RATE_LIST.Cell(ix, 2), Debug.Print tEXCH_RATE_LIST(ix, 3), 'Different ways to access matrix Debug.Print tEXCH_RATE_LIST(ix, "EXCH_RATE")
Kap04.fm Seite 55 Dienstag, 22. April 2003 2:31 14
56 SAP R/3 Remote Function Call
Next R3Connection.logoffEnd Sub
4.3.2 Anatomie der RFC- und BAPI-Aufrufe von Windows
RFC-Aufruf mitRFC_READ_TABLE
In diesem Abschnitt gehen wir noch einmal ins Detail und sezieren dieRFC-Aufrufe von einer Visual-Basic-Applikation aus. Dazu nehmen wirdieses Mal den RFC-Baustein RFC_READ_TABLE, mit dem man den Inhaltfast jeder beliebigen R/3-Tabelle via RFC lesen kann. Das verwendete Bei-spiel wird RFC_READ_TABLE von VBA aufrufen und den Inhalt der SAP-Mandantentabelle T000 lesen. Wenn Sie dieses Beispiel verstandenhaben, dürfte es Ihnen keine Schwierigkeit mehr bereiten, eine Anwen-dung mit Zugriff auf einen beliebigen anderen RFC-Baustein zu entwi-ckeln.
Daten einer belie-bigen SAP R/3-
Tabelle mit RFC_READ_TABLE
lesen
Listing 4.3 Lesen einer beliebigen R/3-Tabelle via RFC
Sub R3RFC_READ_TABLE(pQueryTab)'------------------------------------------------------' Add the R/3 RFC function RFC_READ_TABLE to the collec-tion'------------------------------------------------------Set RFC_READ_TABLE = funcControl.Add("RFC_READ_TABLE")'------------------------------------------------------' Create objects for each parameter'------------------------------------------------------Set eQUERY_TAB = RFC_READ_TABLE.Exports("QUERY_TABLE")Set TOPTIONS = RFC_READ_TABLE.Tables("OPTIONS") 'Set TDATA = RFC_READ_TABLE.Tables("DATA") 'Set TFIELDS = RFC_READ_TABLE.Tables("FIELDS") 'eQUERY_TAB.Value = pQueryTab ' pQueryTab is the R/3 name of the tableTOPTIONS.AppendRow ' new item lineTOPTIONS(1, "TEXT") = "MANDT EQ '000'"If RFC_READ_TABLE.Call = True Then If TDATA.RowCount > 0 Then MsgBox "Call to RFC_READ_TABLE successful! Data found" MsgBox TDATA(1, "WA") Else MsgBox "Call to RFC_READ_TABLE successful! No
Kap04.fm Seite 56 Dienstag, 22. April 2003 2:31 14
Windows-zu-R/3-Connectivity mit DCOM 57
data found" End IfElse MsgBox "Call to RFC_READ_TABLE failed!"End IfEnd Sub
SAP stellt uns eine Anzahl von ActiveX-Controls und DLLs zur Verfügung,die als intelligenter Proxy für die gesamte Kommunikation mit R/3 die-nen. Ein ActiveX-Control ist ein DCOM-Objekt und deshalb auch kom-patibel mit Visual Basic oder anderen DCOM-Anwendungen. Somiterscheint SAP R/3 aus der Sicht eines ActiveX-Entwicklers wie jedesandere DCOM-Objekt, wird also genauso behandelt wie etwa ein ADO-oder ein DAO-Objekt. Mit anderen Worten ist aus der Sicht eines Ent-wicklers die SAP R/3-Instanz nichts weiter als ein Datenbankserver unddie Funktionsbausteine entsprechen aus dieser Sicht in etwa den StoredProcedures eines Datenbanksystems.
DCOM ist das RPC-Protokoll von Windows
DCOM ist das Zugriffsprotokoll von Windows für verteilte Objekte, imGrunde das Gleiche wie RFC, aber für Windows.
Hauptgrund für Fehler: korrupte Installation der DLLs
Sollte es dennoch Probleme geben, die ActiveX-Controls von SAP aufzu-rufen, liegt das Problem mit sehr großer Sicherheit bei der Installation derControls oder an einer mangelhaften Windows-Installation.
Über SAP ActiveX-Controls brauchen Sie außer den Logon Credentials unddem Namen des aufzurufenden Funktionsbausteins nichts weiter zu wis-sen. Die Controls bauen eine Session mit R/3 auf, und sobald Sie denFunktionsbaustein dem lokalen Repository des ActiveX-Controls hinzufü-gen, können Sie alle Eigenschaften des Bausteins einschließlich derNamen und Typen der Parameter abfragen.
Visual-Basic-Code zum Lesen von Tabelle T000 via RFC
Die folgenden kommentierten Code-Zeilen geben Ihnen Schritt fürSchritt einen Überblick über die einzelnen Methoden der RFC-Controlsam Beispiel eines einfachen Visual-Basic-Programms. Das Beispiel ver-zichtet auf die Typisierung der Variablen und ist somit auch unter VisualBasic Script ausführbar. Dazu muss der Code nur in einer ASCII-Datei mitder Dateierweiterung .vbs abgespeichert sein. Ein Doppelklick auf dieDatei vom Windows-Explorer aus führt das Script dann aus.
Kap04.fm Seite 57 Dienstag, 22. April 2003 2:31 14
58 SAP R/3 Remote Function Call
Declarations
Zunächst deklarieren wir eine neue R/3-Logon-OCX-Komponente:
Dim LogonControl As SAPLogonCtrl.SAPLogonControl
Deklarieren einesConnection-
Objekts
Das Connection-Objekt ist das Gateway zwischen lokaler Instanz undR/3. Über die Connection wird zu Beginn eine Session durch Übermitt-lung der Anmeldedaten hergestellt. Grundsätzlich kann die Verbindungvon beliebig vielen Routinen gleichzeitig verwendet werden (Connec-tion-Pooling):
Dim conn As SAPLogonCtrl.Connection
Deklarieren einesPointers auf ein
R/3 RFC-Reposi-tory-Objekt
Diesem Pointer wird später eine Referenz auf die Verwaltungsinformatio-nen der gewünschten Funktionsbausteine zugewiesen. Die Eigenschaftender Funktion werden demnach dynamisch bestimmt:
Dim funcControl As SAPFunctionsOCX.SAPFunctions
Dies ist der Pointer zum aktuellen R/3 RFC-Funktionsbaustein:
Dim RFC_READ_TABLE As SAPFunctionsOCX.Function
Als nächstes folgt die Deklaration eines Pointers für jeden Parameter:
Dim eQUERY_TAB As SAPFunctionsOCX.ParameterDim TOPTIONS As SAPFunctionsOCX.TableDim TDATA As SAPFunctionsOCX.TableDim TFIELDS As SAPFunctionsOCX.Table
Logon-Routine
Das Logon zu R/3 fassen wir in einer eigenen Unterroutine zusammen.Darin legen wir eine neue Connection zu R/3 an, die die Verbindungsda-ten über die ganze Programmlaufzeit hinweg hält und die Anmeldung anR/3 zur Applikation hin abschottet.
Sub R3Logon()
Erzeugen einerneuen Connection
Eine neue Connection muss mit der Methode NewConnection angelegtwerden. Das Anlegen eines Connection-Objekts mit CreateObjectfunktioniert ausdrücklich nicht, weil es durch die fehlende Vererbung inVisual Basic nicht möglich ist, das Objekt mit CreateObject sauber zuinitialisieren.
Set conn = LogonControl.NewConnection
Kap04.fm Seite 58 Dienstag, 22. April 2003 2:31 14
Windows-zu-R/3-Connectivity mit DCOM 59
Angabe der Logon-Credentials
Lediglich die Angabe von Applikationsserver und Systemnummer istzwingend, alle anderen Daten werden gegebenenfalls in einem Popupabgefragt. Selbstverständlich ist dies in einer automatisierten Umgebungnicht wünschenswert, weshalb Sie schließlich dann doch alle Angabenmachen oder in der SAPLOGON.INI auf dem Server hinterlegen müssen.
conn.ApplicationServer = "R3Linux"' IP or DNS-Name of the R/3 application server conn.System = "00" ' System ID of the instance, usually 00 conn.Client = "100" ' opt. Client number to logon to conn.Language = "EN" ' opt. Your login language conn.User = "" ' opt. Your user id conn.Password = "" ' opt. Your password
Dann folgt der Aufruf der Logon-Methode:
retcd = conn.Logon(0, False)
Und schließlich die Prüfung, ob das Login erfolgreich war:
If retcd <> True Then MsgBox " Cannot log on! " MsgBox retcd Stop else MsgBox " Logon OK." End IfEnd Sub
Aufruf eines RFC-Funktionsbausteins
RFC-Aufruf benutzt die zuvor eröffnete Connec-tion
Der RFC-Funktionsbaustein wird über die Connection aufgerufen, die wirim Logon-Schritt erzeugt haben. Das Coding lässt die lokalen Pointer aufdie Parameter des Funktionsbausteins verweisen. Das ist zwar nicht wirk-lich notwendig, macht aber das Programm lesbarer, als wenn immer derganze Parameterkontext angegeben werden muss. Hat ein RFC-Funkti-onsbaustein Tabellenparameter, erscheinen die in Visual Basic wie ADO-Recordsets und werden auch wie solche behandelt. Die Typisierung derRecordsets erfolgt automatisch beim Hinzufügen des Funktionsbausteinszum lokalen RFC-Repository:
Kap04.fm Seite 59 Dienstag, 22. April 2003 2:31 14
60 SAP R/3 Remote Function Call
Sub R3RFC_READ_TABLE(pQueryTab)
Erzeugen einerneuen Collection
für den Funktions-baustein
Alle zu verwendenden Funktionsbausteine müssen einer lokalen Collec-tion hinzugefügt werden, die als Cache für die Parameterinformationdient:
Set RFC_READ_TABLE = funcControl.Add("RFC_READ_TABLE")
Als Nächstes wird ein Pointer auf die Import- und Exportparametergesetzt:
Set eQUERY_TAB = RFC_READ_TABLE.Exports("QUERY_TABLE") Set TOPTIONS = RFC_READ_TABLE.Tables("OPTIONS") ' Set TDATA = RFC_READ_TABLE.Tables("DATA") ' Set TFIELDS = RFC_READ_TABLE.Tables("FIELDS") '
Import-, Export- und Tables-Parameter werden durch einen Visual-Basic-Pointer referenziert. Die function collection, die wir oben mit funcCont-rol.Add erzeugt haben, stellt uns dynamisch einen Proxy für die Metho-den und Pointer auf alle Parameter des Funktionsbausteins zur Verfügung.
Bevor wir den Funktionsbaustein aufrufen, müssen wir den Parameterndie gewünschten Werte zuweisen:
Lesen undSchreiben der
Parameterwerte
eQUERY_TAB.Value = pQueryTab ' pQueryTab is the R/3 name of the table TOPTIONS.AppendRow ' new item line TOPTIONS(1,"TEXT") = "MANDT EQ '000'"
Sobald den Parametern gültige Werte zugewiesen wurden, kann derFunktionsbaustein aufgerufen werden. Der Aufruf retourniert TRUE oderFALSE, je nachdem, ob der Aufruf erfolgreich war oder nicht:
If RFC_READ_TABLE.Call = True Then
Wenn der RFC-Aufruf erfolgreich war, können die Werte weiter verarbei-tet werden. Im Beispiel hier zeigen wir jeweils die erste Zeile der Tabellein einer VB Messagebox an.
Ausgabe desErgebnisses
If TDATA.RowCount > 0 Then MsgBox "Call to RFC_READ_TABLE successful! Data found" MsgBox TDATA(1, "WA")
Kap04.fm Seite 60 Dienstag, 22. April 2003 2:31 14
Windows-zu-R/3-Connectivity mit DCOM 61
Else MsgBox "Call to RFC_READ_TABLE successful! No data found" End If Else MsgBox "Call to RFC_READ_TABLE failed!" End IfEnd Sub
Hauptprogramm
Damit hätten wir den spannenden Teil des Codings auch schon hinteruns. Im Folgenden packen wir dem Ganzen noch eine Main-Routinehinzu:
Main() procedureSub Main()
Nun erzeugen wir noch eine Instanz der SAP.LogonControl-Klasse(Version 1)
Set LogonControl = CreateObject("SAP.LogonControl.1")
Dieses Statement hat eine neue Instanz des Logon-Objekts erzeugt. DieNummer 1 am Ende des Klassennamens SAP.LogonControl.1 ist dieVersionsnummer der Klasse. Normalerweise gibt man die Version einerKlasse nur an, wenn man wirklich explizit die Verwendung einerbestimmten Version erzwingen will. Im Falle des SAP.LogonControlgibt es nur die eine Version.
Nun erzeugen wir eine Instanz der SAP.Functions collection:
Set funcControl = CreateObject("SAP.Functions")
Als Nächstes erfolgt der Aufruf der Logon-Routine:
call R3Logon
Und dann die Zuweisung des Connection-Objekts:
funcControl.Connection = conn
Dann wird der RFC-Call ausgeführt und es folgt der Logoff:
call R3RFC_READ_TABLE("T000") conn.Logoff MsgBox " Logged off from R/3! " End Sub
Kap04.fm Seite 61 Dienstag, 22. April 2003 2:31 14
62 SAP R/3 Remote Function Call
Start des Programms
Call Main() Abhängig davon, welche Visual-Basic-Variante Sie verwenden, ist derAufruf leicht unterschiedlich. Im Falle von VBS müssen Sie dem Script-File noch das Statement Call Main() hinzufügen, um das Hauptpro-gramm explizit aufzurufen.
ASP
Call Main() ineiner ASP-Seite
Falls Sie das VBS-Script in eine ASP-Seite einbinden wollen, können Siedas Coding in der VBS-Datei lassen und mit dem #include-Befehl vonASP in die HTML-Seite einbinden:
<HTML> <HEAD> <#include RfcReadTable.vbs > </HEAD><BODY><%>Call Main()<%></BODY>
Funktionsaufruf im Überblick
Das nachstehende Beispiel zeigt noch einmal den Aufruf eines Funktions-baussteins im Überblick. Diesmal wurde ein anderer Funktionsbaustein(RFC_GET_TABLE_ENTRIES) ausgewählt, der ebenfalls den Inhalt einerbeliebigen SAP R/3-Tabelle ausliest, jedoch etwas andere Parameter alsRFC_READ_TABLE hat.
Listing 4.4 Vollständiges Coding zum Aufruf der RFC-Funktion RFC_READ_TABLE
Dim LogonControl 'As SAPLogonCtrl.SAPLogonControlDim conn 'As SAPLogonCtrl.ConnectionDim funcControl 'As SAPFunctionsOCX.SAPFunctionsDim TableFactoryCtrl 'As SAPTableFactoryCtrl.SAPTableF-actory'------------------------------------------------------' Pointer to functions'------------------------------------------------------Dim RFC_READ_TABLE'------------------------------------------------------' Pointers to function parameters'------------------------------------------------------Dim eQUERY_TABDim TOPTIONSDim TDATADim TFIELDS
Kap04.fm Seite 62 Dienstag, 22. April 2003 2:31 14
Windows-zu-R/3-Connectivity mit DCOM 63
'******************************************************' Main Program'******************************************************Call Main'******************************************************' Subroutines'******************************************************Sub Main()Set LogonControl = CreateObject("SAP.LogonControl.1")Set funcControl = CreateObject("SAP.Functions")Set TableFactoryCtrl = CreateObject("SAP.TableFac-tory.1")Call R3LogonfuncControl.Connection = connCall R3RFC_READ_TABLE("T000")conn.LogoffMsgBox " Logged off from R/3! "End Sub Sub R3Logon()Set conn = LogonControl.NewConnectionconn.ApplicationServer = "r3dev" ' IP or DNS-Name of the R/3 application serverconn.System = "00" ' System ID of the instance, usually 00conn.Client = "100" ' opt. Client number to logon toconn.Language = "EN" ' opt. Your login languageconn.User = "" ' opt. Your user idconn.Password = "" ' opt. Your password
retcd = conn.Logon(0, False)If retcd <> True Then MsgBox " Cannot log on! " MsgBox retcd StopElse MsgBox " Logon OK."End IfEnd Sub
Kap04.fm Seite 63 Dienstag, 22. April 2003 2:31 14
64 SAP R/3 Remote Function Call
Sub R3RFC_READ_TABLE(pQueryTab)'------------------------------------------------------' Add the R/3 RFC function RFC_READ_TABLE to the collec-tion'------------------------------------------------------Set RFC_READ_TABLE = funcControl.Add("RFC_READ_TABLE")'------------------------------------------------------' Create objects for each parameter'------------------------------------------------------Set eQUERY_TAB = RFC_READ_TABLE.Exports("QUERY_TABLE")Set TOPTIONS = RFC_READ_TABLE.Tables("OPTIONS") 'Set TDATA = RFC_READ_TABLE.Tables("DATA") 'Set TFIELDS = RFC_READ_TABLE.Tables("FIELDS") 'eQUERY_TAB.Value = pQueryTab ' pQueryTab is the R/3 name of the tableTOPTIONS.AppendRow ' new item lineTOPTIONS(1, "TEXT") = "MANDT EQ '000'"If RFC_READ_TABLE.Call = True Then If TDATA.RowCount > 0 Then MsgBox "Call to RFC_READ_TABLE successful! Data found" MsgBox TDATA(1, "WA") Else MsgBox "Call to RFC_READ_TABLE successful! No data found" End IfElse MsgBox "Call to RFC_READ_TABLE failed!"End IfEnd Sub
Das nachstehende Programmbeispiel zeigt noch einmal den Aufruf einesRFC-Bausteins an einem Stück. Um ein Vergleichsbeispiel zu haben, ver-wendet es diesmal den Aufruf des Bausteins RFC_GET_TABLE_ENTRIES.
Listing 4.5 Einfacher Aufruf von RFC_GET_TABLE_ENTRIES via RFC und VB
' Example calling BAPI RFC_GET_TABLE_ENTRIESOption ExplicitPublic Functions As SAPFunctionsOCX.SAPFunctionsPrivate LogonControl As SAPLogonCtrl.SAPLogonControlPrivate R3Connection As SAPLogonCtrl.Connection
Kap04.fm Seite 64 Dienstag, 22. April 2003 2:31 14
Windows-zu-R/3-Connectivity mit DCOM 65
Dim Func As SAPFunctionsOCX.FunctionPublic iTABLE_NAME As SAPFunctionsOCX.ParameterPublic eNUMBER_OF_ENTRIES As SAPFunctionsOCX.ParameterPublic tENTRIES As SAPTableFactoryCtrl.Table
Private Sub Main() Dim ix As Integer Dim retcd As Boolean Dim SilentLogon As Boolean Set LogonControl = CreateObject("SAP.LogonControl.1") Set Functions = CreateObject("SAP.Functions") Set TableFactory = CreateObject("SAP.TableFactory.1") Set R3Connection = LogonControl.NewConnection R3Connection.Client = "000" R3Connection.ApplicationServer = "192.168.69.111" R3Connection.Language = "EN" R3Connection.User = "DEVELOPER" R3Connection.Password = "19920607" R3Connection.System = "WAS" R3Connection.SystemID = "$WebAS" R3Connection.SystemNumber = "18" R3Connection.UseSAPLogonIni = False SilentLogon = True retcd = R3Connection.Logon(0, SilentLogon) If retcd <> True Then MsgBox "Logon failed": Exit Sub Functions.Connection = R3Connection Set Func = Functions.Add("RFC_GET_TABLE_ENTRIES") Set iTABLE_NAME = Func.Exports("TABLE_NAME") Set eNUMBER_OF_ENTRIES = Func.Imports("NUMBER_OF_ENTRIES") Set tENTRIES = Func.Tables("ENTRIES") iTABLE_NAME.Value = "TCURR" Func.Call Debug.Print eNUMBER_OF_ENTRIES For ix = 1 To tENTRIES.RowCount
Kap04.fm Seite 65 Dienstag, 22. April 2003 2:31 14
66 SAP R/3 Remote Function Call
Debug.Print tENTRIES(ix, 1) Next R3Connection.logoffEnd Sub
4.4 Helper-Klassen für den Zugriff auf R/3 via RFC
Hilfsklassen fürwiederkehrende
Arbeiten
Um Programme klarer zu gestalten und von immer wiederkehrendenRoutinearbeiten zu säubern, macht es Sinn, sich eine Reihe von Hilfsklas-sen zu erstellen. Im Folgenden sind ein paar Ideen aufgezeigt, wie solcheHelper-Klassen aussehen können. Diese sind weniger dazu gedacht,direkt und unverändert übernommen zu werden, vielmehr sollen sieAnregungen geben, was man alles machen kann oder bedenken sollte.
4.4.1 Class R3LogonObj
Logon von VBdurch die Klasse
R3LogonObj
In unseren Beispielen führen wir das Logon zu SAP R/3 von Visual Basicdurchweg mit einer selbst geschriebenen Proxy-Klasse R3LogonObjdurch. Diese Klasse führt den Logon zu SAP R/3 zentral durch, so dass wiruns nur an dieser Stelle um Logon-Daten wie Name des Applikationsser-vers, UserID, Passwort usw. kümmern müssen.
Referenz aufein Objekt
SAPFunctions-OCX.Functions
Die Klasse selbst exportiert dann im Wesentlichen das Objekt Functionsas SAPFunctionsOCX.Functions, das das zentrale Gateway zur RFC-Funktionsbibliothek von SAP R/3 darstellt.
Listing 4.6 Class R3LogonObj
Public Functions As SAPFunctionsOCX.SAPFunctionsPublic TableFactory As SAPTableFactoryCtrl.SAPTableFac-toryPublic SilentLogon As Boolean'------------------------------------------------------Private LogonControl As SAPLogonCtrl.SAPLogonControlPrivate myCredentials As New R3CredentialsPrivate retcdPrivate err As New ErrObjectPublic Property Get R3Connection() As SAPLogonCtrl.con-nection Set R3Connection = Me.Functions.connectionEnd Property
Kap04.fm Seite 66 Dienstag, 22. April 2003 2:31 14
Helper-Klassen für den Zugriff auf R/3 via RFC 67
Private Property Set R3Connection(conn As SAPLogonC-trl.connection) Set Functions.connection = connEnd PropertyPublic Sub R3Logon() retcd = R3Connection.Logon(0, SilentLogon) If retcd <> True Then Exit Sub Else' MsgBox " Logon OK." End IfEnd SubPublic Sub R3logoff() R3Connection.logoffEnd SubPrivate Sub Class_Initialize() Set LogonControl = CreateObject("SAP.LogonControl.1") Set Functions = CreateObject("SAP.Functions") Set TableFactory = CreateObject("SAP.TableFactory.1") Set R3Connection = LogonControl.NewConnection myCredentials.Read R3Connection Me.SilentLogon = FalseEnd SubPrivate Sub Class_Terminate() Me.R3logoffEnd Sub
4.4.2 Class R3Credentials
Logon-Credenti-als stecken in R3Credentials
Die eigentlichen Logon-Credentials sind noch einmal in einer eigenenKlasse, den R3Credentials, realisiert. Das erlaubt uns, einen geheimenMechanismus zu implementieren, um die Logon-Daten zu verstecken.Diese Klasse kann dann in den Verantwortungsbereich der Systemadmi-nistration gegeben werden, die ohnehin die Logon-Daten verwaltet,ohne dass sie dem Anwendungsentwickler bekannt sind, denn der weistdie Daten durch die Methode READ automatisch dem Connection-Objektzu, ohne sie im Detail zu kennen.
Kap04.fm Seite 67 Dienstag, 22. April 2003 2:31 14
68 SAP R/3 Remote Function Call
Listing 4.7 Class R3Credentials
Sub Read(ByRef oR3 As SAPLogonCtrl.Connection) Set LogonDataWS = Excel.Worksheets("LogonData") Set LogonData = LogonDataWS.Columns(2) R3Connection.Client = "000" R3Connection.ApplicationServer = "192.168.69.111" R3Connection.Language = "EN" R3Connection.User = "DEVELOPER" R3Connection.Password = "06071992" R3Connection.System = "WAS" R3Connection.SystemID = "$WebAS" R3Connection.SystemNumber = "18" R3Connection.UseSAPLogonIni = False Set LogonData = Nothing Set LogonDataWS = NothingEnd SubSub Class_Initialize()End SubSub Class_Terminate()End Sub
4.4.3 Alternative R3Credentials-Class
Zugriff überExcel-Sheet
Für den Zugriff von Visual Basic benutzen wir in unserer Entwicklungsum-gebung ein Excel-Sheet, das wir einfach mit den Zugriffsdaten mehrererSAP R/3-Systeme füllen. So können wir unsere Anwendung ohne vielAufwand auf mehreren SAP R/3-Systemen testen.
Im folgenden Beispiel sehen Sie ein VBA-Programm, das die Daten ausdem Excel-Sheet herausliest und den Parametern unserer Logon-Klassezuweist.
Listing 4.8 Class R3Credentials mit Daten aus Excel
Private LogonDataWS As Excel.WorksheetPrivate LogonData As Excel.RangeSub Read(ByRef oR3 As SAPLogonCtrl.Connection) Set LogonDataWS = Excel.Worksheets("LogonData") Set LogonData = LogonDataWS.Columns(2) oR3.ApplicationServer = LogonData.Cells(2) ' IP or DNS-Name of app server oR3.System = LogonData.Cells(3) ' System
Kap04.fm Seite 68 Dienstag, 22. April 2003 2:31 14
Helper-Klassen für den Zugriff auf R/3 via RFC 69
ID of the instance oR3.SystemNumber = LogonData.Cells(4) ' Number of Database instance oR3.Client = LogonData.Cells(5) ' opt. Client number to logon to oR3.Language = LogonData.Cells(6) ' opt. Your login language oR3.User = LogonData.Cells(7) ' opt. Your user id oR3.Password = LogonData.Cells(8) ' opt. Your password oR3.SystemID = LogonData.Cells(9) ' System ID of the instance oR3.UseSAPLogonIni = True Set LogonData = Nothing Set LogonDataWS = NothingEnd SubSub Class_Initialize()End SubSub Class_Terminate()End Sub
Die Logon-Daten zu R/3 entsprechen denen aus der saplogon.ini.
Name Wert
Application server 192.168.69.111
System ID WAS
System Number 18
Client 000
Language EN
User DEVELOPER
Password ********
System Web AS
Silent Login FALSCH
Use SAPLOGON.INI FALSCH
Gateway
Tabelle 4.1 Beispiel für Logon-Daten (für die Web AS-Testversion)
Kap04.fm Seite 69 Dienstag, 22. April 2003 2:31 14
70 SAP R/3 Remote Function Call
4.5 R/3 Java Connectivity
4.5.1 SAP R/3 Java Connector JCo
Der Zugriff von Java auf SAP R/3 erfolgt über den Java Connector (JCo). Jenach Plattform gibt es dafür eine kompatible Implementierung, so dass dieAufrufe von Java auf SAP R/3 unabhängig von der Umgebung bleiben. Ineiner Windows-Umgebung ist der Java Connector eine Java-Klassenbib-liothek, die über das JNI (Java Native Interface) die Funktionen der RFC-Library librfc32.dll aufruft.
JCo ist die einzigeempfohleneRFC-Klasse
Der Java Connector ist die einzige unterstützte RFC-Schnittstelle von Javanach SAP R/3. Alle früheren Java-Tools für RFC werden von SAP nichtmehr unterstützt. Der Java Connector wurde ursprünglich von ThomasSchüssler, http://arasoft.de, entwickelt und kann von Kunden und regist-rierten SAPNet-Usern über http://service.sap.com heruntergeladen wer-den. JCo ist derzeit für alle NT-Varianten verfügbar sowie für UNIX, AIXund Linux. Die früher noch unterstützte Bibliothek jRFC wird von SAPnicht mehr ausgeliefert und es wird empfohlen, Anwendungen auf JCoumzustellen.
4.5.2 SAP R/3-Logon mit Java
JCo unterstütztXML-Konver-
tierung
Im nachstehenden Listing erfolgt der Aufruf auf das BAPI BAPI_EXCHRATE_GETCURRENTRATES von Java. Eine Besonderheit des Java-Connectors ist es, dass die Funktionsbausteinparameter bereits eineintrinsische Konvertierung nach XML unterstützen und wir deshalb durchAufruf der Methode toXML() das Ergebnis sofort in XML ausgeben kön-nen:
System.out.println(myFunc.tEXCH_RATE_LIST.toXML());
Listing 4.9 Einfacher Aufruf von BAPI_EXCHRATE_GETCURRENTRATES via RFC und Java
package R3;import com.sap.mw.JCo.*;public class R3Test extends Object { public static BAPI_EXCHRATE_GETCURRENTRATES myFunc; public static void main (String args[]) { R3RFCfunctions funcs = new R3RFCfunctions(); System.out.println("** SYS: Repository created.");
Kap04.fm Seite 70 Dienstag, 22. April 2003 2:31 14
R/3 Java Connectivity 71
funcs.Logon(); myFunc = new BAPI_EXCHRATE_GETCURRENTRATES (funcs, "BAPI_EXCHRATE_GETCURRENTRATES"); myFunc.iDATE.setValue("20030101"); myFunc.Execute(); System.out.println(myFunc.tEXCH_RATE_LIST. toXML()); } }
package R3;import com.sap.mw.JCo.*;public class BAPI_EXCHRATE_GETCURRENTRATES // extends R3RFCfunctions{ public JCO.Function func; private R3RFCfunctions functions; public JCO.Field iDATE; public JCO.Table tEXCH_RATE_LIST; public BAPI_EXCHRATE_GETCURRENTRATES( R3RFCfunctions funcRepository, String funcname) { functions = funcRepository; func = functions.add(funcname.toUpperCase());//---- Set vectors to the appropriate parameters iDATE = func.getImportParameterList() .getField("DATE"); tEXCH_RATE_LIST = func.getTableParameterList() .getTable("EXCH_RATE_LIST"); try functions.add(funcname. toUpperCase()); } catch (Exception ex) { } } public void Execute() {functions.R3session.Connection.execute(func);} }
package R3;import com.sap.mw.JCo.*;public class R3RFCfunctions extends R3RFCrepository
Kap04.fm Seite 71 Dienstag, 22. April 2003 2:31 14
72 SAP R/3 Remote Function Call
{ public R3RFCfunctions() {} public JCO.Function add(String name) { try { return super.R3session.Func-tions.getFunctionTemplate (name.toUpperCase()).getFunction();} catch (Exception ex) {} return null; } public class R3RFCrepository{ public R3LogonObj R3session; public R3RFCrepository() { R3session = new R3LogonObj(); } public R3RFCrepository(R3LogonObj ActiveSession) { R3session = ActiveSession; } public void Logon() { R3session.Connection.connect();} public void Logoff() { R3session.Connection.disconnect();} }
package R3;import com.sap.mw.JCo.*;public class R3LogonObj {public JCO.Repository Functions; public boolean SilentLogon; public JCO.Client Connection; public R3LogonObj() { try {R3.R3Credentials myCred = new R3.R3Credentials(); Connection = myCred.Connect(); } catch (Exception ex) { ex.printStackTrace();System.exit(1);} try {Functions = new JCO.Repository("logosworld", Connection);} catch (Exception ex) { ex.printStackTrace();System.exit(1);} } }
Kap04.fm Seite 72 Dienstag, 22. April 2003 2:31 14
Das SAP RFC-Gateway 73
4.6 Das SAP RFC-GatewayRFC-ListenerMit Hilfe des SAP RFC-Gateways können Sie einem externen Programm,
dem RFC-Listener, erlauben, sich selbst als Proxy-Server bei SAP R/3 anzu-bieten. Dadurch müssen in SAP R/3 selbst keine Verbindungsdaten zumListener gepflegt werden. SAP R/3 spricht den Listener über das Gatewayals eine RFC-Destination mit dem Namen an, unter dem der Listener sichzuvor bei SAP R/3 registriert hat.
4.6.1 Registrierung eines RFC-Listeners beim SAP-Gate-way
Folgendes ist ein Beispiel einer Registrierung am Gateway:
Srfcserv –aMYHOST.srfcserv –gSAPR3.logosworld.com –xSAPGW00 –t
Das gezeigte Beispiel registriert sich selbst über Gateway SAPGW00 beider SAP R/3-Instanz mit dem Namen SAPR3.logosworld.com.
Der Name des SAP-Gateways ist von der Form SAPGWxx, wobei xx dieSystem-Nummer der zugehörigen SAP R/3-Instanz ist. SAPGW00 gehörtalso zur Datenbank-Instanz »00«. Das Gateway des Demo-Web AS istSAPGW18, da dieses sich auf Datenbankinstanz 18 installiert.
Parameter können auch in saprfc.ini hinterlegt werden
Anstatt die Parameter in der Kommandozeile anzugeben, können dieseauch in der Datei saprfc.ini hinterlegt werden. saprfc.ini muss im selbenVerzeichnis wie der zu registrierende RFC-Server liegen.
Listing 4.10 Beispiel einer SAPRFC.INI
/*===================================================*//* Type R: Register a RFC server program at a SAP gateway *//* or connect to an already registered RFC server program *//*===================================================*/DEST=RFCEXT_LISTENERTYPE=RPROGID=SAPR3.srfcservGWHOST=SAPr3.logosworld.comGWSERV=sapgw00RFC_TRACE=0
Kap04.fm Seite 73 Dienstag, 22. April 2003 2:31 14
74 SAP R/3 Remote Function Call
SMGW zeigtregistrierte
Gateway-Dienste
Eine Übersicht der aktuell angemeldeten Dienste am SAP-Gateway liefertdie Transaktion SMGW unter dem Menüpunkt Logged Systems.
Listing 4.11 Optionen der Registrierung eines RFC-Servers an einem SAP-Gateway
C:\Programme\sapgui46b\SAPGUI\RFCSDK\bin>srfcservSyntax for start and run in register mode: srfcserv [options] with options = -D<destination with type 'R' in saprfc.ini> = -t RFC-Trace on or options = -a<program ID> e.g. <own host name>.srfcserv = -g<SAP gateway host name> e.g. hs0311 = -x<SAP gateway service> e.g. sapgw53 = -t RFC-Trace on = -L<SNC library, optional> = -S<SNC myname, optional> = -Q<SNC quality of protection, optional> Option L, S and Q can be set if working with SNC (Secure Network Communication).
4.6.2 Anlegen einer RFC-Destination für einen registrier-ten Listener
Um auf einen SAP-Gateway-Service zugreifen zu können, müssen Sie inder rufenden Instanz das Gateway als Destination in Transaktion SM59bekannt machen. An Stelle der festen IP-Adresse des zu rufenden Serversgeben Sie in diesem Fall den Namen an, unter dem sich das Gateway beiseiner Registrierung bei SAP bekannt macht.
4.6.3 Eigene RFC-Listener erstellen
Kompletter Codeeines Gateway-
Servers imRFC-SDK
Das SAP RFCSDK listet den kompletten Sourcecode der in C geschriebe-nen RFC-Listener rfcexec und srfcserv. Die ausführliche Dokumenta-tion zur Entwicklung eines Listeners findet sich in der Hilfe zum RFCSDKin saprfc.hlp.
Kap04.fm Seite 74 Dienstag, 22. April 2003 2:31 14
Das SAP RFC-Gateway 75
Listing 4.12 Abbildung 1.10Extrakte aus der Implementierung des rfcexec-Servers
static RFC_RC DLL_CALL_BACK_FUNCTION _loadds remote_pipe( RFC_HANDLE handle );static RFC_RC DLL_CALL_BACK_FUNCTION _loadds remote_file( RFC_HANDLE handle );static RFC_RC DLL_CALL_BACK_FUNCTION _loadds remote_exec( RFC_HANDLE handle );static RFC_RC DLL_CALL_BACK_FUNCTION _loadds mail ( RFC_HANDLE handle );/* main function for an RFC server program *//*ARGSUSED*/main( int argc, char ** argv ){ /* initialized data */ static RFC_ENV env; RFC_HANDLE handle; RFC_RC rc; if (argc == 1) { help(); return 0; }/* install error handler */ env.errorhandler = myErrorhandler; RfcEnvironment( &env );/* accept connection * (command line argv must be passed to RfcAccept) */ handle = RfcAccept( argv );/* static function to install offered function modules */ rc = install(handle); if( rc != RFC_OK ) {/* if error occured, close connection with error mes-sage and exit */ RfcAbort( handle, "Initialization error" ); exit(1); }static RFC_RC DLL_CALL_BACK_FUNCTION _loadds remote_pipe( RFC_HANDLE handle ){ char command[256]; RFC_PARAMETER parameter[4]; RFC_TABLE table[2]; RFC_RC rc;
Kap04.fm Seite 75 Dienstag, 22. April 2003 2:31 14
76 SAP R/3 Remote Function Call
RFC_CHAR read_flag = 0; int mode; memset( command, 0, sizeof( command ) ); parameter[0].name = "COMMAND"; parameter[0].nlen = 7; parameter[0].addr = (void *) command; parameter[0].leng = sizeof(command); parameter[0].type = RFCTYPE_CHAR; parameter[1].name = "READ"; parameter[1].nlen = 4; parameter[1].addr = (void *) &read_flag; parameter[1].leng = sizeof(read_flag); parameter[1].type = RFCTYPE_CHAR; parameter[2].name = NULL; table[0].name = "PIPEDATA"; table[0].nlen = 8; table[0].type = RFCTYPE_CHAR; table[0].leng = table_size; table[0].itmode = RFC_ITMODE_BYREFERENCE; table[1].name = NULL; rc = RfcGetData( handle, parameter, table ); if( rc != RFC_OK ) return rc;#ifdef SAPonWINDOWS RfcAbort(handle, "Function RFC_REMOTE_PIPE is not supported on Windows"); exit(1);#endif if( read_flag != 'X' ) mode = RUN_WAIT; else mode = RUN_READ; rc = run( handle, command, sizeof(command), table[0].ithandle, mode, (RFC_INT *)0 ); if( rc != RFC_OK ) return rc; parameter[0].name = NULL; rc = RfcSendData( handle, parameter, table ); return rc;} /* remote_pipe */
Kap04.fm Seite 76 Dienstag, 22. April 2003 2:31 14
Troubleshooting RFC 77
4.7 Troubleshooting RFCSRFCTEST zum Testen von RFC
Es existiert ein Standard-ABAP in SAP R/3, SRFCTEST, in dem die wich-tigsten RFC-Möglichkeiten sehr gut demonstriert werden und auch gleichgetestet werden können.
Lokaler TestWenn ein Zugriff via SAP R/3 permanent versagt, testen Sie diegewünschte Funktionalität immer zunächst lokal im Zielsystem. Zum Bei-spiel setzen die Aufrufe über LOCAL_EXEC voraus, dass rfcexec.exe sichim Zugriffspfad des SAP GUI auf der Workstation befindet. In diesem Fallsollten Sie auf der Arbeitsstation ein DOS-Fenster öffnen und versuchen,rfcexec von einem beliebigen Verzeichnis auszuführen. Klappt diesnicht, müssen Sie rfcexec.exe in eines der Verzeichnisse kopieren, die mitdem PATH-Kommando angezeigt werden, oder Sie müssen den Suchpfadentsprechend erweitern.
Klappt das lokale Ausführen der Programme, haben Sie vermutlich einProblem mit der RFC-Verbindung an sich. Denkbar sind folgende häufigeStörgründe:
� Bei Aufrufen über Frontend ist die Wahrscheinlichkeit groß, dass dasSAP GUI unvollständig oder fehlerhaft installiert wurde. Hier empfiehltsich immer eine Neuinstallation des SAP GUI, um zu sehen, ob dasvielleicht schon den Fehler behebt.
� Prüfen Sie auch die TCP/IP-Verbindungsstrecke vom SAP-Applikations-server zur RFC-Destination. Das können Sie tun, indem Sie auf demApplikationsserver TELNET aufrufen, sich als SAP-Administrator anmel-den (normalerweise USER=SAPsid, wobei sid die System-ID ist) undvon dort einen PING auf die IP-Adresse der RFC-Destination durchfüh-ren. Auch das TRACEROUTE-Utility zum Anzeigen aller Verbindungs-knoten vom Aufrufer bis zum Ziel kann weitere Erkenntnisse geben(Name in Windows: tracert.exe).
Abbildung 4.5 Aufruf von rfcexec.exe über eine DOS-Box
Kap04.fm Seite 77 Dienstag, 22. April 2003 2:31 14
78 SAP R/3 Remote Function Call
4.8 Aufruf von Remote Programs aus R/3 Via RFC
4.8.1 RFC via Remote Shell
Um Programme auf einem entfernten Rechner auszuführen, muss dieserzunächst dafür eingerichtet werden, Remote Program Calls zu akzeptie-ren. Dazu muss ein TCP/IP-Port auf dem Zielrechner so konfiguriert sein,dass er ankommende Nachrichten als Programmaufruf akzeptiert.
UNIX unterstütztstandardmäßig
RPC-Aufrufe
Um von einem UNIX-Rechner ein Programm auf einem anderen UNIX-Rechner aufzurufen, können Sie das Programm RSH (manchmal auchRSHELL) benutzen. RSH nimmt als Parameter die IP-Adresse des Zielrech-ners und einen String, der eine gültige Kommandozeile auf dem Zielrech-ner darstellen muss. Beachten Sie, dass RSH auf dem R/3-Applikationsser-ver ausgeführt wird, gegebenenfalls müssen Sie den Namen desZielrechners explizit spezifizieren.
Abbildung 4.6 Erfolgreicher und nicht erfolgreicher PING eines Remote-Computers
Abbildung 4.7 TRACERT zum Finden eines IP-Hosts
Kap04.fm Seite 78 Dienstag, 22. April 2003 2:31 14
Aufruf von Remote Programs aus R/3 Via RFC 79
UNIX nach Windows
Falls der Zielrechner ein Windows-Rechner ist, müssen Sie auf diesem einUtility installieren, das die RSH-Aufrufe entgegennimmt. Ein bewährtesTool ist der ATAMAN-Manager von ATAMAN.COM.
Windows nach Windows
Falls R/3 und die zu rufende Applikation beide auf einem Windows NT/2000-System laufen, können Sie für den Aufruf auch DCOM verwenden.
Rfcexec für einfache Anwendungen
Falls Sie wenig Erfahrung mit solchen Remote-Aufrufen haben, sollten Siedie Aufrufe immer durch das SAP-Utility rfcexec durchführen. Dies istnormalerweise als RFC-Destination SERVER_EXEC vordefiniert. Zuvortesten Sie dann den Aufruf des Programms auf dem Remote-System vonder Kommandozeile des SAP-Applikationsservers aus. Denn die Aufruf-Kette ist immer die folgende:
1. R/3 bestimmt über die in Transaktion SM59 gegebene Definition, wel-ches Programm aufgerufen werden soll, im Fall der DestinationSERVER_EXEC findet R/3 das Programm rfcexec.
2. Der R/3-Kernel führt jetzt das Programm rfcexec zusammen miteventuellen Parametern auf dem Rechner aus, dessen IP-Adresse inSM59 angegeben wurde.
3. rfcexec ruft eine Command-Shell auf und übergibt dieser die Parame-ter zur Ausführung.
4. rfcexec fängt die Ergebnisse ab und gibt sie an das rufende R/3-Sys-tem zurück.
4.8.2 RFC über Webserver
Sicherheit durch Gateway-Proxies
Im Zuge der Standardisierung von RPC-Aufrufen hat es sich heutebewährt, Daten und Programmaufrufe ausschließlich über HTTP auszu-tauschen. Dazu wird auf allen potenziellen Zielrechnern für unsereRemote-Aufrufe ein HTTP-Server installiert, sofern diese nicht ohnehinschon eingerichtet sind, wie es bei fast allen modernen Windows NT/2000-Systemen und den meisten Linux-Systemen der Fall ist.
Alle Remote-Aufrufe sind fortan ausschließlich HTTP-GET- oder HTTP-POST-Requests, die vom HTTP-Server interpretiert werden. Diegewünschte Aktion wird dann durch die aufgerufene ASP, JSP oder CGI-Page durchgeführt. Damit reduziert sich die Installation der RFCs auf SAP-Seite auf die Konfiguration der HTTP-Server.
Kap04.fm Seite 79 Dienstag, 22. April 2003 2:31 14
80 SAP R/3 Remote Function Call
4.8.3 Aufruf eines Programms auf der Workstation mit RFC
R/3 verwendet die klassische Client-Server-Technik, um Programme aufeinem Remote-Rechner aufzurufen, wobei die Applikation auf demRemote-Rechner den Server darstellt und R/3 in die Client-Rolle schlüpft.
Rfcexec.exe dientals RFC-Server
für R/3
Dabei muss das zu rufende Programm den Konventionen des RFC-Proto-kolls entsprechen. Um Ihnen zu ersparen, jedes Mal dieses Protokoll inIhre Anwendung einzubinden, existiert ein Standard-RFC-Server rfce-xec, der als Proxy zwischen R/3 und einem Betriebssystemkommandodient.
rfcexec stellt festeFunktionsaufrufe
bereit
Das rfcexec-Objekt stellt die in der folgenden Tabelle aufgelistetenMethoden zur Verfügung. Diese erlauben im Wesentlichen, ein auszufüh-rendes Betriebssystemkommando zu übergeben und je nach Methodewahlweise den Ergebnisdatenstrom abzufangen und im rufenden Pro-gramm zur Verfügung zu stellen.
Methode Beschreibung
RFC_REMOTE_PIPEFUNCTION 'RFC_REMOTE_EXEC' IMPORTING command EXCEPTIONS system_failure communication_failure
Programm mit rfcexec ausführen.
RFC_REMOTE_PIPEFUNCTION 'RFC_REMOTE_PIPE' IMPORTING command TABLES pipedata(80) EXCEPTIONS system_failure communication_failure
Ein Programm ausführen, das Eingabe-daten durch die Inputpipe übernimmt und die Ergebnisse der Resultpipe zurückgibt. Die Resultpipe ist gewöhn-lich der Textdatenstrom, der von einer UNIX- oder DOS-Box zurückgegeben wird. Wenn Sie z.B. dir > mydata.txt aus-führen, wird das Ergebnis in die Datei mydata.txt umgeleitet. RFC_REMOTE_PIPE fängt diesen Datenstrom ab und tritt somit an die Stelle des Ausgabefiles.
file: = Name der Remote-Datei
pipedata: = Daten, die in die Input-pipe geschrieben werden
Tabelle 4.2 Vordefinierte Methoden des rfcexec.exe-Programms
Kap04.fm Seite 80 Dienstag, 22. April 2003 2:31 14
Aufruf von Remote Programs aus R/3 Via RFC 81
Syntaktisch sind interne und externe RFC gleich
Für ABAP sieht der Aufruf von rfcexece wie jeder andere RFC-Funkti-onsbaustein aus. Dem ABAP-Programm können Sie also nicht ansehen,dass der gerufene Funktionsbaustein kein R/3-Funktionsbaustein ist. DieDestination des Aufrufs wird mit dem Parameter Destination angege-ben und muss zuvor mit Transaktion SM59 definiert worden sein.
rfcexec.exe über Destination LOCAL_EXEC auf-rufen
In SAP R/3 ist standardmäßig eine RFC-Destination LOCAL_EXEC vorde-finiert, die das Programm rfcexec auf der Workstation des aktuellenUsers aufruft. SAP R/3 kommuniziert dazu über das SAP GUI, das dannüber OLE die gewünschte Aktion ausführt. rfcexec ist ein RFC-Server-program, das ein als Parameter mitgegebenes Programm auf der Kom-mandozeile von Windows ausführt und den zurückerhaltenen Daten-strom an SAP R/3 zurückmeldet.
Listing 4.13 Ausführen eines Programms auf einer Workstation von R/3 aus mit RFC_REMOTE_EXEC
DATA: command(256) DEFAULT 'echo Hello World. >> rfc-test.dat'DATA: rfc_mess(128).CALL FUNCTION 'RFC_REMOTE_EXEC' DESTINATION rfcdest EXPORTING command = command EXCEPTIONS system_failure = 1 MESSAGE rfc_mess communication_failure = 2 MESSAGE rfc_mess.
RFC_REMOTE_FILE
FUNCTION 'RFC_REMOTE_FILE' IMPORTING file(256) Write(1) TABLES filedata(80)
EXCEPTIONS system_failure
communication_failure
Lesen und Schreiben einer Datei via RFC.
file: = Name der Remote-Datei
write: = falls write=’X’, wird file-data in die Datei geschrieben, ansons-ten wird die Datei gelesen und deren Inhalt in filedata retourniert.
filedata: = Inhalt der Datei
Methode Beschreibung
Tabelle 4.2 Vordefinierte Methoden des rfcexec.exe-Programms
Kap04.fm Seite 81 Dienstag, 22. April 2003 2:31 14
82 SAP R/3 Remote Function Call
Listing 4.14 Ausführen eines Programms auf einer Workstation von R/3 aus mit RFC_REMOTE_PIPE
DATA: command(256) DEFAULT 'echo Hello World. >> rfc-test.dat'DATA: rfc_mess(128).DATA: pipedata(80) occurs 0 with header line.CALL FUNCTION 'RFC_REMOTE_PIPE' DESTINATION rfcdest EXPORTING command = command read = 'X' TABLES pipedata = pipedata EXCEPTIONS system_failure = 1 MESSAGE rfc_mess communication_failure = 2 MESSAGE rfc_mess.
Listing 4.15 Lesen einer Datei von der Workstation von R/3 aus mit RFC_REMOTE_FILE
DATA: command(256) DEFAULT 'echo Hello World. >> rfc-test.dat'DATA: rfc_mess(128).DATA: pipedata(80) occurs 0 with header line.CALL FUNCTION 'RFC_REMOTE_FILE' DESTINATION rfcdest EXPORTING file = filename write = write "space: read the file; 'X': save filedata to filename TABLES filedata = filedata EXCEPTIONS system_failure = 1 MESSAGE rfc_mess communication_failure = 2 MESSAGE rfc_mess.
Kap04.fm Seite 82 Dienstag, 22. April 2003 2:31 14
Aufruf von Remote Programs aus R/3 Via RFC 83
Abbildung 4.8 Settings der vordefinierten RFC-Destination LOCAL_EXEC in SM59
Abbildung 4.9 Settings der vordefinierten RFC-Destination SERVER_EXEC in SM59
Kap04.fm Seite 83 Dienstag, 22. April 2003 2:31 14
84 SAP R/3 Remote Function Call
4.8.4 Aufruf eines HTTP-Webservers von SAP R/3
DestinationSAPHTTPA
Um einen HTTP-Server aufzurufen, stellt SAP R/3 bereits geeignete RFC-Utilities zur Verfügung. Dabei handelt es sich um ein Utility SAPHTTP, dasauf dem SAP R/3-Applikationsserver ausgeführt wird. Alternativ kannSAPHTTP auch auf dem Frontend über SAP GUI ausgeführt werden.
FunktionenHTTP_GET und
HTTP_POST
Standardmäßig ist eine RFC-Destination SAPHTTPA bereits mit Transak-tion SM59 vordefiniert. Über diese können Sie dann HTTP-Anfragen ver-senden. Die beiden Funktionsbausteine HTTP_GET und HTTP_POSTerleichtern Ihnen dabei die Arbeit (siehe Listing ### und Listing ###).
Listing 4.16 Abruf einer URL mit ABAP
DATA: ABSOLUTE_URI(128) type c.data: response_headers(80) occurs 0 with header line.data: RESPONSE_ENTITY_BODY(120) occurs 0 with header line.ABSOLUTE_URI ='http://xml.amazon.com/onca/xml2?t=webservices-20' &'&tag=logosworldcom&dev-t=D2H3YO46KJJ615' &'&AsinSearch=3528057297&type=lite&f=xml'.CALL FUNCTION 'HTTP_GET' EXPORTING ABSOLUTE_URI = ABSOLUTE_URI RFC_DESTINATION = 'SAPHTTPA' PROXY = '192.168.69.64:8080'* IMPORTING* STATUS_CODE =* STATUS_TEXT =* RESPONSE_ENTITY_BODY_LENGTH = TABLES* REQUEST_ENTITY_BODY = RESPONSE_ENTITY_BODY = RESPONSE_ENTITY_BODY RESPONSE_HEADERS = RESPONSE_HEADERS* REQUEST_HEADERS = EXCEPTIONS CONNECT_FAILED = 1 TIMEOUT = 2 INTERNAL_ERROR = 3 TCPIP_ERROR = 4
Kap04.fm Seite 84 Dienstag, 22. April 2003 2:31 14
Aufruf von Remote Programs aus R/3 Via RFC 85
DATA_ERROR = 5 SYSTEM_FAILURE = 6 COMMUNICATION_FAILURE = 7 OTHERS = 8 .IF SY-SUBRC <> 0. write: / sy-subrc.ENDIF.loop at response_entity_body. write: / response_entity_body.endloop.
Listing 4.17 Ergebnis der HTTP-Anfrage mit HTTP_GET
Test for function group SFTP Function module HTTP_GET Upper/lower case Import parameters Value ABSOLUTE_URI http://localhost/postinfo.html REQUEST_ENTITY_BODY_LENGTH 0 RFC_DESTINATION SAPHTTP PROXY PROXY_USER PROXY_PASSWORD USER PASSWORD BLANKSTOCRLF Export parameters Value STATUS_CODE 200 STATUS_TEXT OK RESPONSE_ENTITY_BODY_LENGTH 2.651 Tables Value REQUEST_ENTITY_BODY 0 Entries Result: 0 Entries RESPONSE_ENTITY_BODY 0 Entries Result: 14 Entries RESPONSE_HEADERS 0 Entries
Kap04.fm Seite 85 Dienstag, 22. April 2003 2:31 14
86 SAP R/3 Remote Function Call
Result: 11 Entries REQUEST_HEADERS 0 Entries Result: 0 Entries
Die HTTP-Header-Daten werden in genau der gleichen Form zurückgege-ben, wie sie im HTTP-Datenstrom empfangen werden:
Listing 4.18 HTTP-Header in Tabelle RESPONSE_HEADERS
HTTP/1.1 200 OK Server: Microsoft-IIS/5.0 Cache-Control: no-cache Expires: Sat, 08 Sep 2001 12:36:33 GMT Date: Sat, 08 Sep 2001 12:36:33 GMT Content-Type: text/html Accept-Ranges: bytes Last-Modified: Sun, 21 Jan 2001 14:24:08 GMT ETag: "0b4b1d0b583c01:96a" Content-Length: 2651 <blank line>
4.8.5 Proxy-Settings in ABAP
Proxy-Settings inTabelle THTTP
Falls ABAP die HTTP-Aufrufe über einen HTTP-Proxy ausführen muss,kann der Proxy für den ganzen Mandanten in der Tabelle THTTP vordefi-niert werden. Dabei geht SAP davon aus, dass der erste Eintrag in THTTPdie Angaben des System-Proxy darstellt.
Listing 4.19 Standardcoding zum Bestimmen des Proxy für ABAP-HTTP-Requests
form set_http_proxy using uri proxy proxy_user proxy_password. data: proxyflag type c. if proxy ne space. exit. endif. select single * from thttp. if thttp-exitfunc ne space. call function thttp-exitfunc exporting absolute_uri = uri importing proxy = proxyflag. if proxyflag eq 'X'. proxy = thttp-proxy.
Kap04.fm Seite 86 Dienstag, 22. April 2003 2:31 14
RFC von SAP R/3 auf Windows 87
proxy_user = thttp-puser. proxy_password = thttp-ppassword. endif. endif.endform.
Zum besseren Verständnis sehen Sie hier die Struktur der Tabelle THTTP:
4.9 RFC von SAP R/3 auf Windows
4.9.1 Kommunikation mit Excel via OLE/2 und HTTP-Server
Excel ist eines der Akzeptanztools für PCs
Eines der beliebtesten Tools im Enterprise-Computing ist die Tabellenkal-kulation. Die einfache und einleuchtende Bedienung und die Möglich-keit, wiederkehrende Berechnungen in einer WYSIWYG-Umgebung ohneHilfe von EDV-Spezialisten vorzunehmen, ist etwas, das Sachbearbeiter inhohem Maße schätzen.
Da entsteht sehr rasch der Wunsch, die Daten in Excel zu erfassen, aberdoch sofort in SAP zur Verfügung zu haben, ohne diese mehrfach zuerfassen. Zur Lösung dieses Problems gibt es wie so oft mehrere Ansätze.SAP R/3 ist sehr wohl in der Lage, auf ein beliebiges DCOM-Objekt einesWindows-Rechners zuzugreifen und darauf OLE-Befehle abzusetzen. Esgibt auch hier die Möglichkeit eines 2-Tier- und eines 3-Tier-Ansatzes.
2-Tier: Direkt-zugriff via R/3-OLE auf Excel
R/3 bietet eine RFC-zu-OLE-Brücke für ABAP an. Damit kann man überdas SAP GUI mit einem auf der Workstation des Benutzers befindlichenOLE-Objekt kommunizieren. Hinreichende Beispiele für jemanden, derein wenig von VBA-Programmierung in MS Excel, MS Word und so weiterversteht, finden sich in der Transaktion /nOLE2. Der Nachteil dieserLösung ist natürlich, dass das Arbeitsblatt von der Arbeitsstation desangemeldeten SAP R/3-Benutzers aus zugreifbar sein muss. Dies kannman allerdings leicht erreichen, indem man das Arbeitsblatt auf einemvon SAP R/3 zugreifbaren Netzwerk-Verzeichnis abspeichert.
MANDT MANDT CLNT Client
PROXY PROXY CHAR HTTP proxy host name
PUSER PROXY_USER CHAR User name for HTTP proxy
PPASSWORD PROXY_PWD CHAR Password for HTTP proxy
EXITFUNC RS38L_FNAM CHAR Name of function module
Tabelle 4.3 Struktur der Tabelle THTTP
Kap04.fm Seite 87 Dienstag, 22. April 2003 2:31 14
88 SAP R/3 Remote Function Call
3-Tier: Zugriff viaMiddleware
Eine Alternative ist wiederum, die Kommunikation zwischen SAP R/3 undExcel über einen Middleware-Broker durchzuführen. Dazu schickt SAPR/3 seine Anfrage an den Broker, welcher die gewünschte Aufgabe mitExcel aushandelt und das Ergebnis an SAP R/3 zurückmeldet. DieseLösung ist in aller Regel leichter zu realisieren und vor allem ist sie deut-lich stabiler.
4.9.2 Zugriff auf ein Excel-Datenblatt von R/3
Beispiel zumdirekten Zugriff
In diesem Kapitel stellen wir eine Möglichkeit vor, direkt mit SAP R/3 aufein bestehendes Excel-Arbeitsblatt zuzugreifen, in diesem eine Kalku-lation anzustoßen und die Ergebnisse in SAP R/3 zu importieren. DieKommunikation findet dabei über die OLE2-Bridge des SAP GUI derArbeitsstation des Benutzers statt. Diese Technik funktioniert in dergeschilderten Weise nicht, wenn die Transaktion nicht online ausgeführtwird, weil dann kein SAP GUI im Zugriff ist.
Stücklisten-kalkulation als
Beispiel
Für das Beispiel haben wir ein Spreadsheet definiert, in dem eine Stück-liste aufgeführt ist. In dieser Stückliste kann man in einer Zelle eineMenge eintragen. Es sind Formeln hinterlegt, die aus der Eingabe dieMengen der Komponenten errechnen. Die einzelnen Sektionen sind inExcel benannt, so dass wir es einfacher haben, auf die einzelnen Bereichezuzugreifen.
Abbildung 4.10 Spreadsheet zur Berechnung der Stückliste (Bill of Material)
������� ��������������� �� ����
���� � ������ � ������� � ��� ���������� ������ ������������
� � ! ��� �����
� � ��� ��� ���� �� ��
� � ��� ��� ���� ������
� � ��� ��� ��� !���
" � � ��� ���#$%$�#� ���&'(�)
� � "�� �� ����*�+� !��'����
, � �� ��� ����-� (.���'
/ ��� /���� )�0 ��#� ��&
Kap04.fm Seite 88 Dienstag, 22. April 2003 2:31 14
RFC von SAP R/3 auf Windows 89
Testprogramm in VBA
Zugriff auf die Daten durch ein VBA-Programm
Zum Zweck der Entwicklung entwerfen wir erst ein Testprogramm, dasdie gewünschten Aktionen durch ein VBA-Programm simuliert. Die Ent-wicklungsumgebung von VBA hilft uns dabei, durch die Intellisense-Hilfedie richtigen Befehle, Methoden und Properties der Excel-Objekte zu fin-den und im Debugger eine robuste Zugriffsform zu testen. Wenn wir dieAufrufe später von SAP R/3 aus machen, wird uns der Debugger nichtmehr zur Verfügung stehen, weshalb wir das Testen außerhalb von SAPR/3 vornehmen.
Listing 4.20 VBA-Routine zum Setzen und Auslesen der BOM-Werte
Sub Read_Values_From_EXCEL() Dim ix As Integer Dim cellvalue As String Dim rowcount As Integer Dim h_appl As Excel.Application Dim h_book As Excel.Workbook Dim h_books As Excel.Workbooks
Abbildung 4.11 Benannte Bereiche im Spreadsheet
Abbildung 4.12 Formeln zur Berechnung
������� ��������������� �� ����
���� � ������ � ������� � ��� ���������� ������ ������������
� " ��� �����
� � ��� ���� 12()�&3������
� � ��� ���� 1�3���
� � ��� ��� ��&3���
" "� "� ��� ���#$%$�#� ���3���
� �� ��� ����*�+� 2�)( 3���
, � �� ����-� �� 3���
/ � �� ��#� ���&3��� ����������
4���&0�&&�.& ��4���&
��������� ��������������� �� ����
��������� �������� � ���������� ���������� ���������� ����������
� ��� ��� �����
� � ��������� ��� ���� �� ��
� ��������! ��� ��"� �#����
$ � ��������% ��� &��� '#��
( ���� ��� ���)*+*�)� ����,-�.
/ $ ���������� �� ����0"1� '#�,����
2 � ��������� 32 ��� ����4� -5���,
� /�� ���������$ .�6 ��)� ��� �
Kap04.fm Seite 89 Dienstag, 22. April 2003 2:31 14
90 SAP R/3 Remote Function Call
Dim h_sheet As Excel.Worksheet Dim h_sheets As Excel.Sheets Dim h_range As Excel.Range Dim h_rows As Excel.Range Dim h_cell As Excel.Range Dim h_name As Excel.Name Set h_appl = New Excel.Application h_appl.Visible = False Set h_books = h_appl.Workbooks Set h_book = h_books.Open(FileName:="U:\_DEMO\BOM\BOM.XLS") Set h_sheets = h_book.Worksheets h_sheets.Select Set h_sheet = h_sheets.Item("SUPERSAVER") Set h_name = h_sheet.Names("QUANT") Set h_range = h_name.RefersToRange cellvalue = h_range(RowIndex:=1, ColumnIndex:=1).Value Debug.Print "Quant", cellvalue cellvalue = cellvalue + 5 h_range(RowIndex:=1, ColumnIndex:=1).Value = cellvalue h_appl.CalculateFull Set h_name = h_sheet.Names("RETURNS") Set h_range = h_name.RefersToRange Set h_rows = h_range.Rows rowcount = h_rows.Count For ix = 1 To rowcount cellvalue = h_range(RowIndex:=ix, ColumnIndex:=1).Value Debug.Print ix, cellvalue Next ix h_book.Close savechanges:=False h_appl.Quit Set h_appl = NothingEnd Sub
Kap04.fm Seite 90 Dienstag, 22. April 2003 2:31 14
RFC von SAP R/3 auf Windows 91
Testprogramm in ASP
Aufruf als ASP-Skript
In einem nächsten Schritt versuchen wir, den Code aus einer anderenUmgebung aufzurufen. Dazu erzeugen wir ein ASP-Script, um die Datenals Webseite zu erhalten. Das gleiche Script können wir auch später vonSAP R/3 aufrufen und haben so bereits eine 3-Tier-Lösung für den Durch-griff von SAP R/3 auf Excel.
Listing 4.21 ASP-Script zum Setzen und Auslesen der BOM-Werte via OLE
<%Function Read_Values_From_EXCEL_VBS(myquant, filename) Dim Resultstr Dim ix Dim cellvalue Dim rowcount Dim h_appl Dim h_book Dim h_books Dim h_sheet Dim h_sheets Dim h_range Dim h_rows Dim h_cell Dim h_name resultstr = myquant & Chr(13) & Chr(10) Set h_appl = CreateObject("Excel.Application")' h_appl.Visible = False Set h_books = h_appl.Workbooks Set h_book = h_books.Open(filename) Set h_sheets = h_book.Worksheets h_sheets.Select Set h_sheet = h_sheets.Item("SUPERSAVER") Set h_name = h_sheet.Names("QUANT") Set h_range = h_name.RefersToRange cellvalue = h_range(1, 1).Value cellvalue = myquant h_range(1, 1).Value = cellvalue h_appl.CalculateFull
Kap04.fm Seite 91 Dienstag, 22. April 2003 2:31 14
92 SAP R/3 Remote Function Call
Set h_name = h_sheet.Names("RETURNS") Set h_range = h_name.RefersToRange Set h_rows = h_range.Rows rowcount = h_rows.Count For ix = 1 To rowcount cellvalue = h_range(ix, 1).Value resultstr = resultstr & CellValue cellvalue = h_range(ix, 3).Value resultstr = resultstr & "," & CellValue & chr(13) & chr(10) Next' h_book.Save h_book.Close False h_appl.Quit Set h_appl = Nothing Read_Values_From_EXCEL_VBS = resultstrEnd Function
Response.write Read_Values_From_EXCEL_VBS(105, "BOM.XLS")%>
Direktzugriff von SAP R/3 auf Excel
Zugriff viaOLE-Brücke
Die Syntax zum Setzen und Aufrufen von COM-Objekten aus SAP R/3heraus ist etwas von der in Visual Basic verschieden, weshalb wir dasCoding nicht 1:1 übernehmen können. In Listing ### ist die ABAP-Ver-sion zu sehen, die mit den VBA-Kommandos kommentiert ist.
Listing 4.22 ABAP-Routine zum Setzen und Auslesen der BOM-Werte via OLE
REPORT ydemo_excel_bom MESSAGE-ID sy.INCLUDE ole2incl. "<-- Contains the types for OLE-AccessPARAMETER: filename LIKE rlgrap-filename DEFAULT 'U:\_DEMO\BOM\BOM.xls'.* Dim h_appl As Excel.ApplicationDATA: h_appl TYPE ole2_object.* Dim h_books As WorkbooksDATA: h_books TYPE ole2_object.* Dim h_book As WorkbookDATA: h_book TYPE ole2_object.
Kap04.fm Seite 92 Dienstag, 22. April 2003 2:31 14
RFC von SAP R/3 auf Windows 93
* Dim h_sheets As Excel.SheetsDATA: h_sheets TYPE ole2_object.* Dim h_sheet As WorksheetDATA: h_sheet TYPE ole2_object.DATA: x_sheet TYPE ole2_object.* Dim h_name As NameDATA: h_name TYPE ole2_object.* Dim h_range As RangeDATA: h_range TYPE ole2_object.* Dim h_rows As RangeDATA: h_rows TYPE ole2_object.* Dim h_cell As RangeDATA: h_cell TYPE ole2_object.DATA: cellvalue(29).DATA: rowcount TYPE i.START-OF-SELECTION.* Set h_appl = New Excel.Application CREATE OBJECT h_appl 'EXCEL.APPLICATION'. IF sy-subrc NE 0. MESSAGE i002 WITH sy-msgli. ENDIF.* h_appl.Visible = True SET PROPERTY OF h_appl 'VISIBLE' = 1 .* Set h_books = h_appl.Workbooks GET PROPERTY OF h_appl 'WORKBOOKS' = h_books .* Set h_book = h_books.Open(Filename:= "\BOM.*XLS") CALL METHOD OF h_books 'OPEN' = h_book EXPORTING #filename = filename.* GET PROPERTY OF h_appl 'ACTIVEWORKBOOK' = h_book.* Set h_sheets = h_book.Worksheets GET PROPERTY OF h_book 'WORKSHEETS' = h_sheets .* Set h_sheet = h_sheets.Item("SUPERSAVER")* GET PROPERTY OF h_book 'ACTIVESHEET' = h_sheet. CALL METHOD OF h_sheets 'ITEM' = h_sheet EXPORTING #index = 'SUPERSAVER' .****** Modify the Pivot Cell *************************** Set h_name = h_sheet.Names("QUANT") CALL METHOD OF h_sheet 'NAMES' = h_name EXPORTING #index ='QUANT' .* Set h_range = h_name.RefersToRange GET PROPERTY OF h_name 'REFERSTORANGE' = h_range.
Kap04.fm Seite 93 Dienstag, 22. April 2003 2:31 14
94 SAP R/3 Remote Function Call
CALL METHOD OF h_range 'CELLS' = h_cell EXPORTING #1 = 1 #2 = 1. GET PROPERTY OF h_cell 'VALUE' = cellvalue. WRITE: / 'Old value':, cellvalue. cellvalue = cellvalue + 5. WRITE: / 'New value':, cellvalue. ULINE. SET PROPERTY OF h_cell 'VALUE' = cellvalue. CALL METHOD OF h_appl 'CALCULATEFULL'.****** Now, Pick up results **************************** Set h_name = h_sheet.Names("SUBQUANT") CALL METHOD OF h_sheet 'NAMES' = h_name EXPORTING #index ='RETURNS'.* Set h_range = h_name.RefersToRange GET PROPERTY OF h_name 'REFERSTORANGE' = h_range.* GET PROPERTY OF h_appl 'ACTIVECELL' = h_range.* cellvalue = h_cell.Value CALL METHOD OF h_range 'ROWS' = h_rows.* Set h_rows = h_range.Rows CALL METHOD OF h_rows 'COUNT' = rowcount.
DO rowcount TIMES. CALL METHOD OF h_range 'CELLS' = h_cell EXPORTING #1 = sy-index #2 = 1.* EXPORTING #rowindex = 1 #columnindex = sy-index. CALL METHOD OF h_cell 'VALUE' = cellvalue. WRITE: / sy-index, cellvalue. ENDDO.* h_book.Close false* CALL METHOD OF h_book 'SAVE'. CALL METHOD OF h_book 'CLOSE' EXPORTING #1 = 0.* h_appl.Quit CALL METHOD OF h_appl 'QUIT'.* Set h_appl = Nothing FREE OBJECT h_appl.
Kap04.fm Seite 94 Dienstag, 22. April 2003 2:31 14
Business-Objekte und BAPI 95
4.10 Business-Objekte und BAPI
Eine der großen Stärken von SAP R/3 liegt darin, dass es Geschäftspro-zesse de facto standardisiert. Solche Quasi-Standards werden als Busi-ness-Objekte bezeichnet. Um auf die Business-Objekte zugreifen zu kön-nen, wurden für diese Schnittstellen geschaffen, die als BAPI bezeichnetwerden.
Business-Objekte sind formale Modelle von realen Prozessen
Eines der Kernziele einer modernen Business-Software ist die Geschäfts-prozessmodellierung mit Hilfe einer Programmiersprache. Damit soll eineStandardisierung der Geschäftsprozesse möglich werden. SAP ist alleindurch seine Marktmacht dazu prädestiniert, solche Business-Modelle vor-zugeben und zu vereinheitlichen. Business-Objekte sind solche Modellie-rungen von realen Geschäftsprozessen innerhalb von SAP-Systemen. Busi-ness-Objekte beschreiben und implementieren die Methoden, Propertiesund Interfaces dieser Prozesse mit den Mitteln von ABAP Objects.
Geschäftsmodelle aus Sicht eines Entwicklers
Aus der Sicht eines Entwicklers besteht ein Geschäftsprozessmodell ausden drei Elementen:
� DatabaseHier werden die Daten in proprietärer Form abgespeichert.
� Business-ObjektEine abstrakte Projektion der Realität mit den Mitteln der Program-miersprache.
� Application Programming Interface (API)Schnittstelle für den Zugriff auf die Business-Objekte von einer Pro-grammiersprache aus.
Zugriff über Business-API
Der Zugriff auf die Business-Objekte erfolgt über eine öffentlich bekannteBusiness-API – das Business Application Programming Interface, kurzBAPI – und ist technisch eine Untermenge der RFC-fähigen Funktions-bausteine in R/3. BAPIs sind die offizielle Außenschnittstelle, mit derZugriffe von Fremdsystemen auf R/3 erfolgen sollen.
4.10.1 Business-Objekte und Modellsichten
Business-Objekte sind die technische Beschreibung einer der Modellsich-ten auf einen Prozess. In einfachen Fällen kommen wir mit den folgendenModellsichten aus:
Kap04.fm Seite 95 Dienstag, 22. April 2003 2:31 14
96 SAP R/3 Remote Function Call
� Technische Sicht (Komponentensicht)In der Technischen Sicht werden die Objekte beschrieben, wie sie tat-sächlich auf dem Computer realisiert werden. Hier bestimmen wir also,welche Tabellen in der Datenbank angelegt werden, welche Daten-bank-Engine überhaupt verwendet wird, welche Protokolle zum Aus-tausch der Daten benutzt werden, und in welcher Programmierspra-che wir arbeiten.
� Anwendungsfall (Use Case) Die Anwendungsfälle beschreiben die Operationen, die wir auf denDaten durchführen wollen, etwa einen Logon, Aufträge speichern,nach Aufträgen suchen und so weiter.
� Business View (Logische Sicht)Der Business View ist die abstrakte Ebene, die versucht, unbelastet vonden technischen Details die logischen Komponenten einer Applikationzu beschreiben. Dabei denken wir an die Organisation in Stammdaten,an Kundenaufträge oder einen Internetshop. Wichtig dabei ist, dassdie Logische Sicht zunächst frei von Restriktionen formuliert werdendarf, also so nah wie möglich dem Denken bei der realen Arbeit ent-sprechen soll.
Abbildung 4.13 Beispiel für Modellsichten
��������������� ����� ���������������
� �����!����������� "���#���������
$%&� ��������� '�(�� ��������(���
�)�**���� ���
�����)
)��+�'"�
������� �����7*�& ���*����7*�&
-+���)��)��� ��8*� ��)�
� � �
��09��)�7*�& �������� :�4*�1�7*�&
��;*�;�� *;) �&���4�+<11� :�4*�;�� *;)
��(��!��,�
Kap04.fm Seite 96 Dienstag, 22. April 2003 2:31 14
Business-Objekte und BAPI 97
Formale Beschrei-bung eines Business-View
Ein Business-Objekt ist nun eine formale Beschreibung eines BusinessViews. Demnach gibt es Business Views für jede logische Entität, zum Bei-spiel für den Materialstamm, Kundenstamm, Kundenaufträge oder füreine ganze Shopping-Cart-Applikation. Materialstamm, Kundenstammund Kundenaufträge sind als Business-Objekte schon in SAP R/3 definiertund dafür gibt es auch schon die passenden BAPIs.
Business Object Repository – BOR
Alle öffentlichen Business-Objekte sind im SAP R/3 Business Object Repo-sitory (BOR) registriert. Dieses mit den Transaktionen BAPI und SWO1(Business Object Builder) zugängliche Verzeichnis zeigt die vorhandenenBusiness-Objekte, deren Methoden und die Implementierung an.
Die Shopping-Cart-Applikation als Business-Objekt ist eine Sonderent-wicklung von Logos! Informatik GmbH und Casabac GmbH. Näheres undeinen Download der neuesten Versionen finden Sie unter shopping-cart.logosworld.com.
Abbildung 4.14 Business-Sichten in SAP R/3
����������� �������� ������������ ����� �� �������� �� �������������������������������
������������� ���������
�������������� ���� ���� ����� ��
��� �!�"����
���#�!�"$�����%�!�& ����
���� '���� ��
���� �������
���� � ������
�������������� ���� ���� ����� ��
(&� �!�"����(&�#�!�"$��
(&�%�!�& ����
���� ������ ��
����������� ���� ���� ����� ��
�)� �!�"����
�)�#�!�"$���)�%�!�& ����
�� � '���$���
*���� ��
�����!��������
��������"��
�#�� #$�� ����� ��
�+ �!�"����
�+ #�!�"$���+ %�!�& ����
#$�# '���$���
*���� ��
����%������
����������� ����� ��� ����
Kap04.fm Seite 97 Dienstag, 22. April 2003 2:31 14
98 SAP R/3 Remote Function Call
Abbildung 4.15 Business-Objekte in SAP R/3-SD
Abbildung 4.16 Business-Objekt BUS1093 (ExchangeRate) in Transaktion BAPI
����������� �� ��� ����
�������� �
����������
�����������
���
���
� ���
���������� �� ���� ����
�������� �
����������
�����������
���� � ���
����������
���������
�� ��� ����
������������� ���� �������� �
����������
�����������
��� � ���
������� � �!� ����
�������� �
����������
�����������
�!� � ���
�"����������� #�$ ���� ����
�������� �
����������
�����������
���� � ���
����%������&��
!�'"����
#�$ �#�$( ���� ����
�������� �
����������
�����������
��� ���
�! ���
���� � ���
�"����������� #�$ ���� ����
�������� �
����������
�����������
���� � ���
�#���� ��$�%� �%%�&��'%�� �()*��+
Kap04.fm Seite 98 Dienstag, 22. April 2003 2:31 14
Business-Objekte und BAPI 99
4.10.2 Technische Kriterien eines BAPI
BAPI ist die Implementierung eines Business-Objekts
Ein BAPI ist eine Implementierung eines Business-Objekts, die öffentlicheMethoden zur Verfügung stellt. In der Realisierung verbirgt sich hinterjeder Methode ein Funktionsbaustein. Zusätzlich erhält aber jedeMethode noch eine zum SAP Business Workflow kompatible Objekt-schnittstelle in SWO1. Wenn von BAPI die Rede ist, ist selten das Busi-ness-Objekt selbst gemeint, sondern meistens der BAPI-Funktionsbau-stein, der eine der vielen Methoden eines BAPI implementiert. So istbeispielsweise das BAPI zum Kundenauftragsmodell BUS2032, und BAPI_SALESORDER_CREATEFROMDAT2 ist der BAPI-Funktionsbaustein zurMethode CreateFromDat2.
Technisch ist eine BAPI-Funktion ein RFC-Funktions-baustein
Aus technischer Sicht besteht kein Unterschied zwischen einem BAPI-Funktionsbaustein und gewöhnlichen RFC-Bausteinen. Allerdings unter-wirft SAP ein BAPI gewissen Konventionen, die jeder beachten sollte, derstandardkonforme BAPIs entwickeln möchte:
� Ein BAPI führt niemals ein COMMIT WORK oder einen ROLLBACK WORKaus. Der Sinn davon ist, dass eine externe Applikation eigene Transak-tionen als Sequenzen von BAPI-Methoden ausführen kann.
� Das Ende einer Transaktion wird durch die speziellen BAPI-Funktions-bausteine BAPI_TRANSACTION_COMMIT und BAPI_TRANSACTION_ROLLBACK erreicht.
� Alle Schnittstellenparameter sollen einen aussagekräftigen, englischenNamen haben.
Abbildung 4.17 Business-Objekt BUS1093 (ExchangeRate) in Transaktion SWO1
Kap04.fm Seite 99 Dienstag, 22. April 2003 2:31 14
100 SAP R/3 Remote Function Call
4.10.3 Anwendungsbeispiel: Das Sales-Order-BAPI
Kundenaufträgesind zentral für SD
Wir haben als Beispiel für die Anwendung eines BAPI das Sales-Order-Objekt ausgewählt, das ein ganz zentrales Business-Objekt in SAP ist.Dieses wird verwendet für das Anlegen, Ändern und Anzeigen von
� Kundenaufträgen
� Angebotsanfragen (Request for quotation – RFQ)
� Gut- und Lastschriftenanforderungen
� AuslieferungsaufträgenAuslieferungsaufträge sind Aufträge, die automatisch eine Lieferungerzeugen. Man verwendet sie unter anderem zum Ausliefern in meh-reren Einzellieferungen. Dabei wird der Auslieferungsauftrag mit Bezugzum Originalauftrag angelegt. Der Auslieferungsauftrag ist so einge-stellt, dass automatisch eine Auslieferung (Objekt LIKP) erstellt wird,gegebenenfalls mit anschließendem automatischen Versand.
� Anstoßen von Auslieferungen Das Business-Objekt-Konzept von SAP R/3 sieht es nicht vor, Ausliefe-rungen direkt durch eine Schnittstelle anzulegen. Der zentrale Einstiegs-punkt für jede SD-Transaktion ist das Sales-Order-BAPI. Dazu muss derKundenauftrag bestimmte Customizing-Anforderungen erfüllen:
� Der Kundenauftragstyp (TVAK-AUART) muss auf automatischesAnlegen einer Auslieferung eingestellt sein.
� Das Anlegen der Auslieferung muss vom Status des Kundenauftragsabhängig sein, zum Beispiel durch Setzen des Feldes Liefersperre imKopf (VBAK-LIFSK) oder Position (VBAP-LIFSP).
� Anstoßen von Fakturen.
� Der Kundenauftragstyp (TVAK-AUART) muss auf automatischesAnlegen einer Faktura eingestellt sein.
� Das Anlegen der Faktura muss vom Status des Kundenauftragsabhängig sein, zum Beispiel durch Setzen des Feldes Fakturasperreim Kopf (VBAK-FAKSK) oder Position (VBAP-FAKSP)
Kundenauftragsbestand abfragen
� Methode: SalesOrder.GetList
� Funktion: BAPI_SALESORDER_GETLIST
Die BAPI-Methode gibt eine Liste aller Kundenaufträge eines bestimmtenKunden zurück. Die Liste kann auf Materialnummern und bestimmteZeiträume eingeschränkt werden.
Kap04.fm Seite 100 Dienstag, 22. April 2003 2:31 14
Business-Objekte und BAPI 101
Kundenauftrag anlegen
� Methode: SalesOrder.CreateFromDat2
� Funktion: BAPI_SALESORDER_CREATEFROMDAT2
Diese BAPI-Methode legt einen Kundenauftrag komplett neu an und ver-wendet dazu die übergebenen Daten. Die Methode kann alle business-relevanten Daten aufnehmen und erlaubt es, einen Kundenauftrag aufeinen Schlag anzulegen.
Erst Kopf, dann Position anlegen
In unseren Beispielen weiter unten zeigen wir einen Mehrschritt-Ansatz,indem wir zunächst den Auftragskopf (also nur VBAK) ohne Verkaufspo-sitionen (VBAP) anlegen. Später fügen wir die Positionen mit derMethode BAPI_SALESORDER_CHANGE hinzu.
Kundenauftrag ändern
� Methode: SalesOrder.Change
� Funktion: BAPI_SALESORDER_CHANGE
Einzelnes Ändern von Feldwerten
Diese BAPI-Methode ermöglicht es, einen bestehenden Kundenauftrag inallen Einzelheiten zu ändern, also insbesondere auch Positionen oder Ein-teilungsdaten hinzuzufügen oder zu löschen und selbstverständlich allebereits bestehenden Werte einzeln zu ändern.
Kundenauftrag oder Kundenauftragspositionen löschen
Löschen: Updateflag = »D«
Löschen ist wie in jeder professionellen Datenbank oder Transaktionsum-gebung nur eine Variante des Änderns. Dazu muss lediglich dasUpdateflag = "D" für Delete gesetzt werden.
4.10.4 Beispiel: BAPI_SALESORDER_GETLIST
Liste aller Kun-denaufträge
Im Folgenden sehen Sie ein fertiges Rahmenprogramm zum Aufruf desBAPIs, das eine Liste aller Kundenaufträge zu einem Kunden zurückgibt.
Listing 4.23 ABAP: Call BAPI_SALESORDER_GETLIST
'**** Functions in LibraryPublic func As SAPFunctionsOCX.FunctionPublic XMLDOC As New MSXML2.DOMDocumentPrivate myR3 As R3LogonObjPrivate XMLhelp As New XMLhelper'**** ParametersPublic iCUSTOMER_NUMBER As SAPFunctionsOCX.Parameter
Kap04.fm Seite 101 Dienstag, 22. April 2003 2:31 14
102 SAP R/3 Remote Function Call
Public iDOCUMENT_DATE As SAPFunctionsOCX.ParameterPublic iDOCUMENT_DATE_TO As SAPFunctionsOCX.ParameterPublic iMATERIAL As SAPFunctionsOCX.ParameterPublic iPURCHASE_ORDER As SAPFunctionsOCX.ParameterPublic iPURCHASE_ORDER_NUMBER As SAPFunctionsOCX.Para-meterPublic iSALES_ORGANIZATION As SAPFunctionsOCX.ParameterPublic iTRANSACTION_GROUP As SAPFunctionsOCX.ParameterPublic eRETURN As SAPFunctionsOCX.StructurePublic tSALES_ORDERS As SAPTableFactoryCtrl.Table
Public Sub Class_Initialize() Set myR3 = New R3LogonObj myR3.R3Logon'*************** Creating the object reference for the RFC Functions'==================================================== Set func = myR3.Functions.Add("BAPI_SALESORDER_GETLIST")'*************** Creating the object reference for the Parameters'=================================================='**** Importing Parameters Set iCUSTOMER_NUMBER = func.Exports("CUSTOMER_NUMBER") Set iDOCUMENT_DATE = func.Exports("DOCUMENT_DATE") Set iDOCUMENT_DATE_TO = func.Exports("DOCUMENT_DATE_TO") Set iMATERIAL = func.Exports("MATERIAL") Set iPURCHASE_ORDER = func.Exports("PURCHASE_ORDER") Set iPURCHASE_ORDER_NUMBER = func.Exports("PURCHASE_ORDER_NUMBER") Set iSALES_ORGANIZATION = func.Exports("SALES_ORGANIZATION") Set iTRANSACTION_GROUP = func.Exports("TRANSACTION_GROUP")'**** Exporting Parameters Set eRETURN = func.Imports("RETURN")'**** Table Parameters
Kap04.fm Seite 102 Dienstag, 22. April 2003 2:31 14
Business-Objekte und BAPI 103
Set tSALES_ORDERS = func.Tables("SALES_ORDERS")End Sub ' Class_Initialize()
Public Sub Class_Terminate() Set func = Nothing Set myR3 = NothingEnd Sub ' Class_Terminate()
Public Sub Execute() func.CallEnd Sub ' Class_Initialize()
Public Sub Connect()End Sub ' Connect
Public Function toXMLDoc() As MSXML2.DOMDocument Set toXMLDoc = XMLhelp.toXMLDoc(func)End Function
Public Function toXML() As String toXML = toXMLDoc.XMLEnd Function
Listing 4.24 ABAP: Anlegen eines Auftragskopfs mit BAPI_SALESORDER_CREATEFROMDAT2
*&----------------------------------------------------**& Report YDEMO_BAPI_2032_CREATE_HEADER*&----------------------------------------------------**& This routines demonstrates the use of the BAPI **& BAPI_SALESORDER_CREATEFROMDAT2*& It calls the BAPI and creates the header of a sales *& orders*& w/o creating any items so far.*&----------------------------------------------------*REPORT YDEMO_BAPI_2032_CREATE_HEADER.TYPE-POOLS: SYDES.PARAMETERS: VBELN LIKE VBCOM-VBELN OBLIGATORY MEMORY ID AUN.PARAMETERS: AUART LIKE VBCOM-AUART OBLIGATORY MEMORY ID AUA.
Kap04.fm Seite 103 Dienstag, 22. April 2003 2:31 14
104 SAP R/3 Remote Function Call
PARAMETERS: KUNAG LIKE VBCO2-KUNNR OBLIGATORY MEMORY ID KUN.PARAMETERS: KUNWE LIKE VBCO2-KUNWE OBLIGATORY MEMORY ID WEM.PARAMETERS: VKORG LIKE VBCOM-VKORG OBLIGATORY MEMORY ID VKO.PARAMETERS: VTWEG LIKE VBCOM-VTWEG OBLIGATORY MEMORY ID VTW.PARAMETERS: SPART LIKE VBCOM-SPART OBLIGATORY MEMORY ID SPA.PARAMETERS: AUDAT LIKE VBCOM-AUDAT OBLIGATORY MEMORY ID AUD.PARAMETERS: REFVBELN LIKE VBCOM-VBELN MEMORY ID AUB.PARAMETERS: REFVGTYP LIKE VBAK-VGTYP DEFAULT 'C'.
DATA: ORDER_HEADER_IN LIKE BAPISDHD1.DATA: ORDER_HEADER_OUT LIKE BAPISDHD1.DATA: SALESDOCUMENT LIKE BAPIVBELN-VBELN.DATA: RETURN LIKE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE.DATA: ORDER_ITEMS_IN LIKE STANDARD TABLE OF BAPISDITM WITH HEADER LINE.DATA: ORDER_PARTNERS LIKE STANDARD TABLE OF BAPIPARNR WITH HEADER LINE.
START-OF-SELECTION. PERFORM BAPI_SALESORDER_CREATE USING VBELN AUART KUNAG KUNWE VKORG VTWEG SPART AUDAT REFVBELN REFVGTYP.*ERFORM bapi_salesorder_getcreate WRITE: / 'Returned sales order number:' , SALESDOCUMENT COLOR COL_TOTAL. ULINE. LOOP AT RETURN. CALL FUNCTION 'MESSAGE_TEXT_BUILD' EXPORTING MSGID = RETURN-ID MSGNR = RETURN-NUMBER MSGV1 = RETURN-MESSAGE_V1 MSGV2 = RETURN-MESSAGE_V2
Kap04.fm Seite 104 Dienstag, 22. April 2003 2:31 14
Business-Objekte und BAPI 105
MSGV3 = RETURN-MESSAGE_V3 MSGV4 = RETURN-MESSAGE_V4 IMPORTING MESSAGE_TEXT_OUTPUT = SY-LISEL EXCEPTIONS OTHERS = 1. WRITE: / SY-LISEL COLOR COL_NORMAL.. ENDLOOP.*-----------------------------------------------------*FORM BAPI_SALESORDER_CREATE USING VALUE(DOCNO) LIKE VBCOM-VBELN VALUE(DOC_TYPE) LIKE VBCOM-AUART VALUE(SOLDTO) LIKE VBCOM-KUNNR VALUE(SHIPTO) LIKE VBCOM-KUNNR VALUE(SALESORG) LIKE VBCOM-VKORG VALUE(DISTRCHANNEL) LIKE VBAK-VTWEG VALUE(DIVISION) LIKE VBCOM-SPART VALUE(ORDERDATE) LIKE VBCOM-AUDAT VALUE(REFDOCNO) LIKE VBCOM-VBELN VALUE(REFDOC_TYPE) LIKE VBAK-VGTYP.
REFRESH ORDER_ITEMS_IN. REFRESH ORDER_PARTNERS. CLEAR ORDER_HEADER_IN. CLEAR RETURN. CLEAR SALESDOCUMENT.
SALESDOCUMENT = VBELN. IF NOT REFDOCNO IS INITIAL. ULINE. FORMAT RESET COLOR COL_NEGATIVE. WRITE:/ 'The reference does not work in 40B HP65 due to an error when'. WRITE:/ 'calling SD_SALES_DOCU_SAVE from SD_SALES_DOCUMENT_MAINTAIN. '. ULINE. FORMAT RESET. ENDIF. ORDER_HEADER_IN-REFOBJTYPE = 'BUS2032'. ORDER_HEADER_IN-REFOBJKEY = REFDOCNO. ORDER_HEADER_IN-REFDOCTYPE = REFDOC_TYPE. ORDER_HEADER_IN-DOC_TYPE = AUART.
Kap04.fm Seite 105 Dienstag, 22. April 2003 2:31 14
106 SAP R/3 Remote Function Call
ORDER_HEADER_IN-SALES_ORG = SALESORG. ORDER_HEADER_IN-DISTR_CHAN = DISTRCHANNEL. ORDER_HEADER_IN-DIVISION = DIVISION. ORDER_HEADER_IN-REQ_DATE_H = ORDERDATE.
ORDER_PARTNERS-PARTN_ROLE = 'AG'. ORDER_PARTNERS-PARTN_NUMB = SOLDTO. APPEND ORDER_PARTNERS. ORDER_PARTNERS-PARTN_ROLE = 'WE'. ORDER_PARTNERS-PARTN_NUMB = SHIPTO. APPEND ORDER_PARTNERS.
CALL FUNCTION 'BAPI_SALESORDER_CREATEFROMDAT2' EXPORTING SALESDOCUMENT = SALESDOCUMENT ORDER_HEADER_IN = ORDER_HEADER_IN* ORDER_HEADER_INX =* SENDER =* BINARY_RELATIONSHIPTYPE = ' '* INT_NUMBER_ASSIGNMENT = ' '* BEHAVE_WHEN_ERROR = ' '* LOGIC_SWITCH = ' '* TESTRUN = ' '* CONVERT = ' ' IMPORTING SALESDOCUMENT_EX = SALESDOCUMENT TABLES RETURN = RETURN* order_items_in = order_items_in* ORDER_ITEMS_INX = ORDER_PARTNERS = ORDER_PARTNERS* ORDER_SCHEDULES_IN =* ORDER_SCHEDULES_INX =* ORDER_CONDITIONS_IN =* ORDER_CFGS_REF =* ORDER_CFGS_INST =* ORDER_CFGS_PART_OF =* ORDER_CFGS_VALUE =* ORDER_CFGS_BLOB =* ORDER_CFGS_VK =
Kap04.fm Seite 106 Dienstag, 22. April 2003 2:31 14
Business-Objekte und BAPI 107
* ORDER_CFGS_REFINST =* ORDER_CCARD =* ORDER_TEXT =* ORDER_KEYS =* EXTENSIONIN =* PARTNERADDRESSES = EXCEPTIONS OTHERS = 1. COMMIT WORK.
ENDFORM.
Die Auftragspositionen können jederzeit an einen bestehenden Auftragangefügt werden. Das wird genau wie das Ändern eines Auftrags durchden BAPI BAPI_SALESORDER_CHANGE erledigt:
Listing 4.25 ABAP: Zufügen von Auftragspositionen mit BAPI_SALESORDER_CHANGE
TYPE-POOLS: SYDES.FORM BAPI_SALESITEM_ADD USING VALUE(DOCNO) LIKE VBCOM-VBELN VALUE(POSNR) LIKE VBAP-POSNR VALUE(MATNR) LIKE VBAP-MATNR VALUE(QUANT) LIKE VBAP-KWMENG VALUE(VRKME) LIKE VBAP-VRKME VALUE(CONDI) LIKE KONV-KSCHL VALUE(NETPR) LIKE VBAP-NETPR VALUE(CURR_ISO) LIKE BAPISDITM-CURR_ISO. DATA: ORDER_HEADER_IN LIKE BAPISDH1. DATA: ORDER_HEADER_INX LIKE BAPISDH1X. DATA: ORDER_HEADER_OUT LIKE BAPISDHD1. DATA: SALESDOCUMENT LIKE BAPIVBELN-VBELN. DATA: ORDER_ITEMS_IN LIKE STANDARD TABLE OF BAPISDITM WITH HEADER LINE. DATA: ORDER_ITEMS_INX LIKE STANDARD TABLE OF BAPISDITMX WITH HEADER LINE. DATA: SCHEDULE_LINES LIKE STANDARD TABLE OF BAPISCHDL WITH HEADER LINE. DATA: SCHEDULE_LINESX LIKE STANDARD TABLE OF BAPISCHDLX WITH HEADER LINE. DATA: CONDITIONS_IN LIKE STANDARD TABLE OF
Kap04.fm Seite 107 Dienstag, 22. April 2003 2:31 14
108 SAP R/3 Remote Function Call
BAPICOND WITH HEADER LINE. DATA: CONDITIONS_INX LIKE STANDARD TABLE OF BAPICONDX WITH HEADER LINE. DATA: RETURN LIKE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE. REFRESH: ORDER_ITEMS_IN, ORDER_ITEMS_INX. REFRESH: SCHEDULE_LINES, SCHEDULE_LINESX. CLEAR: ORDER_HEADER_IN, ORDER_HEADER_INX. CLEAR: SCHEDULE_LINES, SCHEDULE_LINESX. CLEAR: RETURN, SALESDOCUMENT. SALESDOCUMENT = DOCNO. ORDER_HEADER_INX-UPDATEFLAG = 'U'. ORDER_ITEMS_IN-ITM_NUMBER = POSNR. ORDER_ITEMS_IN-MATERIAL = MATNR. ORDER_ITEMS_IN-TARGET_QTY = QUANT. ORDER_ITEMS_IN-TARGET_QU = VRKME. ORDER_ITEMS_IN-SALES_UNIT = VRKME. ORDER_ITEMS_IN-TARGET_VAL = PRICE. ORDER_ITEMS_IN-CURR_ISO = CURR_ISO. ORDER_ITEMS_INX-ITM_NUMBER = ORDER_ITEMS_IN- ITM_NUMBER. ORDER_ITEMS_INX-UPDATEFLAG = 'I'. APPEND ORDER_ITEMS_IN.*-----------------------------------------------------* SCHEDULE_LINES-ITM_NUMBER = ORDER_ITEMS_IN- ITM_NUMBER. SCHEDULE_LINES-REQ_DATE = SY-DATUM + 7. SCHEDULE_LINES-REQ_QTY = QUANT. APPEND SCHEDULE_LINES. SCHEDULE_LINESX-ITM_NUMBER = SCHEDULE_LINES- ITM_NUMBER. SCHEDULE_LINESX-UPDATEFLAG = 'I'. APPEND SCHEDULE_LINESX.*-----------------------------------------------------* IF NOT ( PRICE IS INITIAL OR CONDI IS INITIAL ). CONDITIONS_IN-ITM_NUMBER = ORDER_ITEMS_IN- ITM_NUMBER. CONDITIONS_IN-COND_TYPE = CONDI. CONDITIONS_IN-COND_VALUE = PRICE. CONDITIONS_IN-CURR_ISO = CURR_ISO.
Kap04.fm Seite 108 Dienstag, 22. April 2003 2:31 14
Business-Objekte und BAPI 109
APPEND CONDITIONS_IN. CONDITIONS_INX-ITM_NUMBER = CONDITIONS_IN- ITM_NUMBER. CONDITIONS_INX-UPDATEFLAG = 'I'. APPEND CONDITIONS_INX. ENDIF.*-----------------------------------------------------* CALL FUNCTION 'BAPI_SALESORDER_CHANGE' EXPORTING SALESDOCUMENT = SALESDOCUMENT ORDER_HEADER_IN = ORDER_HEADER_IN ORDER_HEADER_INX = ORDER_HEADER_INX TABLES RETURN = RETURN ORDER_ITEM_IN = ORDER_ITEMS_IN SCHEDULE_LINES = SCHEDULE_LINES SCHEDULE_LINESX = SCHEDULE_LINESX CONDITIONS_IN = CONDITIONS_IN CONDITIONS_INX = CONDITIONS_INX.ENDFORM.
4.10.5 VBA-Beispiel zu BAPI_SALESORDER_GETLIST
Liste aller Kundenaufträge
Hier folgt nun zum Vergleich die Auflistung der Kundenaufträge mit Hilfeeines VBA-Programms.
Listing 4.26 VBA: Call BAPI_SALESORDER_GETLIST
'**** Functions in LibraryPublic func As SAPFunctionsOCX.FunctionPublic XMLDOC As New MSXML2.DOMDocumentPrivate myR3 As R3LogonObjPrivate XMLhelp As New XMLhelper'**** ParametersPublic iCUSTOMER_NUMBER As SAPFunctionsOCX.ParameterPublic iDOCUMENT_DATE As SAPFunctionsOCX.ParameterPublic iDOCUMENT_DATE_TO As SAPFunctionsOCX.ParameterPublic iMATERIAL As SAPFunctionsOCX.ParameterPublic iPURCHASE_ORDER As SAPFunctionsOCX.ParameterPublic iPURCHASE_ORDER_NUMBER As SAPFunctionsOCX.Para-meterPublic iSALES_ORGANIZATION As SAPFunctionsOCX.Parameter
Kap04.fm Seite 109 Dienstag, 22. April 2003 2:31 14
110 SAP R/3 Remote Function Call
Public iTRANSACTION_GROUP As SAPFunctionsOCX.ParameterPublic eRETURN As SAPFunctionsOCX.StructurePublic tSALES_ORDERS As SAPTableFactoryCtrl.Table
Public Sub Class_Initialize() Set myR3 = New R3LogonObj myR3.R3Logon'*************** Creating the object reference for the RFC Functions'==================================================== Set func = myR3.Functions.Add("BAPI_SALESORDER_GETLIST")'*************** Creating the object reference for the Parameters'=================================================='**** Importing Parameters Set iCUSTOMER_NUMBER = func.Exports("CUSTOMER_NUMBER") Set iDOCUMENT_DATE = func.Exports("DOCUMENT_DATE") Set iDOCUMENT_DATE_TO = func.Exports("DOCUMENT_DATE_TO") Set iMATERIAL = func.Exports("MATERIAL") Set iPURCHASE_ORDER = func.Exports("PURCHASE_ORDER") Set iPURCHASE_ORDER_NUMBER = func.Exports("PURCHASE_ORDER_NUMBER") Set iSALES_ORGANIZATION = func.Exports("SALES_ORGANIZATION") Set iTRANSACTION_GROUP = func.Exports("TRANSACTION_GROUP")'**** Exporting Parameters Set eRETURN = func.Imports("RETURN")'**** Table Parameters Set tSALES_ORDERS = func.Tables("SALES_ORDERS")End Sub ' Class_Initialize()
Public Sub Class_Terminate() Set func = Nothing Set myR3 = NothingEnd Sub ' Class_Terminate()
Kap04.fm Seite 110 Dienstag, 22. April 2003 2:31 14
SAP Interface Repository 111
Public Sub Execute() func.CallEnd Sub ' Class_Initialize()
Public Sub Connect()End Sub ' Connect
Public Function toXMLDoc() As MSXML2.DOMDocument Set toXMLDoc = XMLhelp.toXMLDoc(func)End Function
Public Function toXML() As String toXML = toXMLDoc.XMLEnd Function
4.11 SAP Interface Repository Alle BAPIs sind im IFR dokumentiert
Alle offiziell von SAP freigegebenen BAPIs, IDocs und RFC-Bausteine sindim Interface Repository von SAP dokumentiert, das unter der URL http://ifr.sap.com abrufbar ist. Es ist für jedermann zugänglich und gibt dieStruktur der BAPIs sowohl in Textform als auch als formales XML-Doku-ment zurück.
Anfrage in Form einer Canonical URL
Zum Abrufen der Information verwendet SAP so genannte CanonicalURLs, die im Wesentlichen eine vom W3C abgesegnete Variante der CGI-Spezifikation zur Codierung von Parametern in eine URI sind. Eine Ver-sion des IFR kann auch mit der Transaktion BAPI in einer SAP R/3-Instanzaufgerufen werden.
Typische Anfrage an das IFR
Das nachstehende Beispiel ist eine typische Anfrage an das IFR, die unsein XML-Schema für die GetList-Methode des Sales-Order-BAPIszurückgibt.
Listing 4.27 Eine typische Anfrage an das IFR
http://ifr.sap.com/catalog/query.asp?namespace=urn:sap-com:ifr:LO:46C&type=bapi&name=SalesOrder.GetList&xml=schema.w3c-2000-04&xdir=response
Tabelle 4.4 erläutert die Bestandteile der Canonical URLs, Tabelle 4.5 lis-tet die möglichen Werte für die einzelnen Elemente auf, und Tabelle 4.6die verwendeten Objekttypen.
Kap04.fm Seite 111 Dienstag, 22. April 2003 2:31 14
112 SAP R/3 Remote Function Call
Element Bedeutung
http://ifr.sap.com/cata-log/query.asp?
Einstiegs-URL ins IFR
namespace=urn:sap-com:ifr:LO:46C
Namespace für das XML-Dokument
&type=bapi Anfrage nach einem BAPI
&name=SalesOrder.GetList Name des BAPI
&xml=schema.w3c-2000-04 Anfrage nach XML-Schema gemäß W3C-Spezifika-tion
&xdir=response Anfrage nach Schema für die Antwort
Tabelle 4.4 Objekt-Typen, die in den Canonical URLs von SAP verwendet werden
Element Erlaubte Werte
type= bobj | bapi | rfc | imsg | idoc | iseg | area | docu
name= Name des Objekts
key= Schlüssel des Dokuments, zum Beispiel Auftragsnummer
param= Parameter, die kein Schlüsselfeld sind, zum Beispiel Auftragsdatum
language= Sprache des Ergebnisdokuments, falls sinnvoll
xml= schema | template [W3C-Version]
xdir= send | response
Tabelle 4.5 Mögliche Werte innerhalb der Canonical URL
type= Bedeutung
area Area
bapi BAPI
bobj Business Object
idoc Intermediate Document (IDoc)
imsg IDoc message type
iseg IDoc segment
Rfc Remote Function Call
Tabelle 4.6 Objekt-Typen, die in den Canonical URLs von SAP verwendet werden
Kap04.fm Seite 112 Dienstag, 22. April 2003 2:31 14
SAP Interface Repository 113
Folgendermaßen gestaltet sich die Abfrage des XSD-Schemas für RFCIDOCTYPE_READ-COMPLETE:
http://ifr.sap.com/catalog/query.asp?namespace=urn:sap-com:ifr:BASIS:46C&type=rfc&name=IDOCTYPE_READ_COM-PLETE&xml=SCHEMA&xdir=SEND<?xml version="1.0" encoding="utf-8"?><xsd:schema xmlns:xsd="http://www.w3.org/2001/XML-Schema" xmlns="urn:sap-com:document:sap:rfc:functions" targetNamespace="urn:sap-com:document:sap:rfc:func-tions" version="1.0"> <xsd:element name="IDOCTYPE_READ_COMPLETE"> <xsd:annotation> <xsd:documentation>Read IDoc type with segments (RFC-compatible)</xsd:documentation> </xsd:annotation> <xsd:complexType> <xsd:all> <xsd:element name="PI_IDOCTYP"> <xsd:annotation> <xsd:documentation>Basic type</xsd:documentation> </xsd:annotation> <xsd:simpleType> <xsd:restriction base="xsd:string"> <xsd:maxLength value="30"/> </xsd:restriction> </xsd:simpleType> </xsd:element> <xsd:element name="PI_CIMTYP" minOccurs="0">...
Name Name
Param Parameter
docu Documentation
type= Bedeutung
Tabelle 4.6 Objekt-Typen, die in den Canonical URLs von SAP verwendet werden (Forts.)
Kap04.fm Seite 113 Dienstag, 22. April 2003 2:31 14
Kap04.fm Seite 114 Dienstag, 22. April 2003 2:31 14
Frontend und GUIs 115
5 Frontend und GUIs
Während früher die Gestaltung der Benutzeroberflächen einer Software als nachrangig eingestuft wurde, spielt die Leis-tungsfähigkeit des Frontends heutzutage eine Schlüsselrolle bei der Akzeptanz einer Applikation.
Anwendungssoft-ware wird vom Frontend aus ent-wickelt
Anwendungssoftware wird heute bei Tage entwickelt. Ausgehend von derDevise WYSIWYG (What You See Is What You Get), legt man zu Beginneiner Entwicklung zunächst einmal fest, wie man dem Anwender diegewünschten Informationen präsentieren möchte und auf welche WeiseEingaben erfolgen.
Oberfläche muss Teil der Netzwerk-intelligenz über-nehmen
Es ist nicht mehr zeitgemäß, raffinierte Routinen zu schreiben und danneine lieblose Oberfläche hinzuzufügen. Vielmehr muss die Oberfläche miteiner angemessenen eigenen Intelligenz ausgestattet sein, um typische,an Oberflächen orientierte Handlungen auch direkt ohne Rücksprachemit dem Server durchführen zu können.
Bisher haben die meisten Entwickler mit Vorliebe »im Dunkeln« program-miert. Lange Strecken eines Programms wurden auf gut Glück und Gott-vertrauen hin entwickelt und am Ende einem mehr oder minder komple-xen, aber immer unvollständigen Testszenario zugeführt.
Holistic Develop-ment oder Extreme Program-ming
Heute programmiert man ganzheitlich. Man beginnt bei der Oberfläche,die der Benutzer zu sehen bekommt. Am Anfang ist diese Oberflächeganz einfach und einfach ist auch das Programm, das die ersten Daten lie-fert. Jedes Feature an der Oberfläche bekommt ein überschaubares Pen-dant in der Applikation und jede Änderung an der Logik der Applikationmuss sich sichtbar an der Oberfläche widerspiegeln. Dieser neue Pro-grammierstil hat auch einen Namen in der Entwicklergemeinde: ExtremeProgramming oder Holistic Development.
Leider ist die Entwicklung von Weboberflächen keineswegs so trivial, wiees zunächst den Anschein hat. Zwar kann jeder nach spätestens einerStunde Crash-Kurs seine ersten HTML-Seiten gestalten und nach einerkurzen Spielphase mit Cascading Style Sheets gelingt es auch, die Seitenansprechend zu gestalten und ein halbwegs einheitliches Layout übermehrere Seiten hinweg durchzuhalten. Das Problem bei der Entwicklungvon Oberflächen für das Web liegt darin, dass es nur sehr wenige Toolsauf dem Markt gibt, die es erlauben, gleichermaßen ansprechende wie
Kap05.fm Seite 115 Dienstag, 22. April 2003 2:32 14
116 Frontend und GUIs
performante Oberflächen zu gestalten und dies noch dazu mit möglichstgeringem Entwicklungsaufwand.
Klassische Web-seiten sind lang-sam und flackern
Wenn Sie häufiger Ihre Einkäufe im Internet tätigen, ist Ihnen sicherlichaufgefallen, dass der Aufbau der Seiten bei sehr vielen Webshops langedauert. Klickt man auf einen Link, tut sich zuerst gar nichts, dann ver-schwindet die Seite ganz und die neue Seite wird endlich aufgebaut. Diesgeschieht auch dann, wenn sich nur ein kleines Detail in Ihrer Eingabeändert, etwa Sie geben an, dass Ihre Adresse in den USA und nicht in Eur-opa ist, welches ein etwas verändertes Eingabeschema verlangt. In derPraxis erweckt das den Eindruck, die Webseiten flackerten. Der Grundliegt darin, dass Webserver den Datenstrom zwischen Server und Browsernicht optimieren und auch keine Transaktionsunterstützung bieten.
Transaktionsma-nagement findet
auf Applikations-server statt
Das Transaktionsmanagement wird heutzutage auf die Applikationsserverausgelagert. Hierfür bietet Java jetzt die J2EE-Technologie, der Web ASvon SAP greift auf die bewährte SAP R/3-Infrastruktur zurück und Micro-soft.NET hat seinen Webserver um den Microsoft Transaction Servererweitert. Mit jeder dieser Technologien muss sich der Entwickler derWeboberflächen und auch der Weblogiken keine Gedanken mehr überdie Probleme machen, die mit unvollendeten Transaktionen in Verbin-dung stehen.
GUI-Server sindeine viel verspre-
chende Lösung
Bei der Optimierung der Entwicklung und Ausführung von Weboberflä-chen sind die Werkzeuge noch sehr rar gesät. Für den Einsatz zusammenmit SAP R/3 bieten sich die folgenden drei Lösungen an:
� Synactive Viewer von Synactive, der Firma des Schöpfers von ABAP, Dr. Gerhard Rodé
� Web Dynprodie Webentwicklungsplattform von SAP
� CASABAC GUI-Servervon der Firma CASABAC
5.1 Casabac GUI-Server
Als Beispiel für eine bereits verfügbare Technologie (Web Dynpro wirderst mit dem Web AS-Release 6.30 verfügbar sein) stellen wir hier denCasabac GUI-Server vor. Der Casabac GUI-Server erweitert die Funktio-nalität und die Performance eines Browsers um Anwendungsgebiete, diebislang auf Grund ihrer Anforderungen an Interaktion nicht vernünftigrealisiert werden konnten oder ein zusätzliches Plug-In wie MacromediaFlash auf der Browserseite erforderten.
Kap05.fm Seite 116 Dienstag, 22. April 2003 2:32 14
Casabac GUI-Server 117
Casabac ist eine Entwicklung von Björn Müller, einem ehemaligen Soft-ware-Ingenieur von SAP, dessen Ideen zu großen Teilen die Entwicklungder Web-Dynpro-Technologie des SAP Web AS beeinflusst haben. Wäh-rend Web Dynpro als Teil des Web AS (ab Release 6.30) positioniert ist,ist Casabac unabhängig von der SAP-Kerntechnologie.
5.1.1 Technologie
Genau wie Web Dynpro ist Casabac eine Entwicklungs- und Runtime-Umgebung zur Interaktion von Browseroberflächen mit Unternehmens-applikationen. Das besondere Kennzeichen von Casabac ist einerseits dieflackerfreie Darstellung von Seiteninteraktionen auf Basis einer erweiter-baren reichhaltigen Control-Bibliothek. Andererseits ist die Programmie-rung von komplexen Oberflächen und deren serverseitige Anbindung anexistierende Logik extrem einfach und offen.
CASABAC setzt auf Servlets auf
Technisch gesehen ist der Casabac GUI-Server eine auf dem Java-Servlet-Interface aufsetzende Infrastruktur: Seiten werden in einem WYSIWYG-Editor erstellt und als XML-Layout-Definition abgelegt. Aus dieser Lay-out-Definition wird Code für DHTML oder JavaScript generiert. JedeSeite hat einen Bezug auf eine serverseitige Java-Klasse, die so genannteAdapterklasse. Controls auf der Seite beziehen sich auf Properties undMethoden dieser Adapterklasse. Die Adapterklasse ist somit ein logischesSpiegelbild der Seite.
���Bild
���Bild 04_01 fehlt!!!���
Abbildung 5.1 Casabac GUI-Server – Beispielseite
Kap05.fm Seite 117 Dienstag, 22. April 2003 2:32 14
118 Frontend und GUIs
Informationen-saustausch über
Hidden Frame undDHTML
Das Besondere ist, dass die Seite nicht wie normale HTML-Seiten direktmit Ihrer Serververarbeitung kommuniziert, sondern über einen »HiddenFrame« innerhalb der Seite. Hierdurch bleibt einerseits die Seite stabil imBrowser und flackert nicht bei Serverinteraktionen. Andererseits wirdzwischen Browser-Client und Server nur der logische Inhalt der Seitekommuniziert. Gegenüber normalen Webanwendungen, in denen derServer immer eine gesamte HTML-Seite zum Client schickt, bedeutet dieseine massive Reduzierung des ausgetauschten Datenvolumens.
Die Interaktivität der Browserseite entspricht somit der Interaktivität vonnormalen »Rich Clients«, die in C++, Java-Swing und so weiter codiertsind. Der Browser wird um Anwendungsgebiete erweitert, die bislang aufGrund ihrer Interaktionsanforderungen nur durch Erweiterung des Brow-sers mit Plug-Ins möglich waren. Plug-Ins bedeuten jedoch eine Manipu-lation des Standardsystems, was in einer sicherheitssensiblen Umgebungnicht ohne weiteres machbar ist.
Casabac läuftinnerhalb von
J2EE
CASABAC selbst läuft innerhalb jedes J2EE Servers – z.B. auch innerhalbdes SAP Web Application Servers. Die Standardauslieferung erfolgt aufBasis von Tomcat. Features wie Mehrsprachenverwaltung, internationali-sierte Controls und Adapter-Code-Generator gehören zur Standardaus-stattung.
Im Browser werden nur Standardtechnologien wie JavaScript undDHTML genutzt, es wird kein Plug-In oder Ähnliches verwendet.
Abbildung 5.2 Casabac-Technologie
Kap05.fm Seite 118 Dienstag, 22. April 2003 2:32 14
Casabac GUI-Server 119
5.1.2 Beispiel zur Kalkulation der Mehrwertsteuer
Das Beispiel aus Abbildung 5.3 ist eine Mini-Anwendung, innerhalb dererein Mehrwertsteuerbetrag errechnet wird.
Im Layout Painter wird zunächst die Seite designt. Der Inhalt der Seitebesteht aus einzelnen Controls. Es gibt Container Controls, die wiederumselbst andere Controls enthalten können, und es gibt normale Controls,wie z.B. Eingabefelder und Buttons. Das XML-Layout der Seite sieht fol-gendermaßen aus:
Listing 5.1 XML-Layout einer Casabac-Seite
<page model="TaxCalcAdapter"> <titlebar name="VAT Calculator"></titlebar> <header withdistance="false"> <button name="Exit" method="endProcess"></button> </header> <pagebody> <rowarea name="VAT Input"> <itr> <label name="Net Amount" width="120"/> <field valueprop="netAmount" width="200" datatype="float"/> </itr>
Abbildung 5.3 Beispiel einer Mini-Anwendung zur Berechnung der Mehrwertsteuer
Kap05.fm Seite 119 Dienstag, 22. April 2003 2:32 14
120 Frontend und GUIs
<vdist height="10"/> <itr> <label name="VAT Category" width="120"/> <radiobutton valueprop="vatCategory" value="0"/> <label name="Without VAT" width="200" asplaintext="true"/> </itr> <itr width="120"> <hdist width="120"/> <radiobutton valueprop="vatCategory" value="8"/> <label name="Reduced VAT" width="200" asplaintext="true"/> </itr> <itr width="120"> <hdist width="120"/> <radiobutton valueprop="vatCategory" value="16"/> <label name="Full VAT" width="200" asplaintext="true"/> </itr> <vdist height="10"/> <itr> <hdist width="120"/> <button name="Calculate" method="onCalculate"/> </itr> </rowarea> <rowarea name="VAT Result"> <itr> <label name="VAT Amount" width="120"/> <field valueprop="vatAmount" width="200" displayonly="true" datatype="float"/> </itr> </rowarea> </pagebody> <statusbar withdistance="false"/></page>
Kap05.fm Seite 120 Dienstag, 22. April 2003 2:32 14
Casabac GUI-Server 121
Sie sehen, die XML-Layout-Definition entspricht genau der Darstellungder Seite. Die Seite selbst (page-Control) bezieht sich auf die Adapter-klasse TaxCalcAdapter. Die Felder beziehen sich auf Properties derKlassen, z.B. bezieht sich ein Feld (field-Control) über sein valueprop-Attribut auf einen bestimmten Property-Namen. Der Button wiederumbezieht sich auf eine Methode onCalculate.
Die in der Seitendefinition referenzierten Properties und Methoden wer-den über die Adapterklasse zur Verfügung gestellt:
Listing 5.2 Eine Minimal-Implementierung der Adapterklasse
import java.util.*;import java.math.*;import com.casabac.server.*;import com.casabac.server.util.*;import com.casabac.util.*;
public class TaxCalcAdapter extends Model{ // ----------------------------------------------- // property access // -----------------------------------------------
���Bild
���Bild 04_04 fehlt!!!���
Abbildung 5.4 Das Layout-Painter-Tool selbst läuft im Browser
Kap05.fm Seite 121 Dienstag, 22. April 2003 2:32 14
122 Frontend und GUIs
BigDecimal m_netAmount = new BigDecimal(0); public BigDecimal getNetAmount() { return m_netAmount; } public void setNetAmount(BigDecimal value) { m_netAmount = value; }
BigDecimal m_vatAmount = new BigDecimal(0); public BigDecimal getVatAmount() { return m_vatAmount; } public void setVatAmount(BigDecimal value) { m_vatAmount = value; }
BigDecimal m_vatCategory = new BigDecimal(0); public BigDecimal getVatCategory() { return m_vatCategory; } public void setVatCategory(BigDecimal value) { m_vatCategory = value; }
// ----------------------------------------------- // public adapter methods // ----------------------------------------------- public void onCalculate() { m_vatAmount = m_netAmount.multiply(m_vatCategory); m_vatAmount = m_vatAmount.divide(new BigDecimal(100),2); }}
In diesem Beispiel wurde der für eine Geschäftslogik passende DatentypBigDecimal verwendet. Natürlich können auch alle anderen Datentypenwie z.B. float, int etc. verwendet werden.
Mehr als die beiden gezeigten Bestandteile – Layout-Definition undKlasse – werden nicht benötigt. Der Anwendungsentwickler kommt nichtin Kontakt mit Stylesheets, JavaScript, Server-Session-Verwaltung, server-seitigem Scripting oder Ähnlichem.
Kap05.fm Seite 122 Dienstag, 22. April 2003 2:32 14
Web Dynpro und Business Server Pages 123
In dem Beispiel wurde die Mehrwertsteuer direkt im Adapter berechnet.In einem strukturierteren Ansatz würde man alle Geschäftslogik natürlichnicht direkt in dem Adapter codieren, sondern über APIs kapseln. VomAdapter aus können diese APIs dann angesprochen werden. Beispielehierzu sind
� Aufruf von SAP-BAPIs über Java Connector, Web AS, Business Connec-tor oder einen anderen HTTP-Message-Server
� Aufruf von auf Enterprise JavaBeans (EJB) basierenden Systemen
� Aufruf von beliebigen Webservices
5.2 Web Dynpro und Business Server PagesWeb Dynpro ist eine Entwick-lungsumgebung zur Frontend-Entwicklung
Mit Web Dynpro versucht SAP, die klaffende Lücke zwischen Applikationund Browseroberfläche für Anwender und Entwickler gleichermaßen zuschließen. Aufbauend auf Business Server Pages, bietet Web Dynpro eineEntwicklungsumgebung und einen intelligenten GUI-Server, der das Ent-wickeln von Transaktionen für das Internet unterstützt.
Web Dynpro ab Release 6.30
Web Dynpro wird nach dem jetzigen Stand ab Web AS Release 6.30 zurVerfügung stehen. Es wird keine Lösungen für ein früheres Release geben.Frontends werden fortan auf einem dedizierten Web AS entwickelt, derdann über RFC auf andere SAP R/3-Instanzen zugreift.
Model View Controller
Die Grundlage von Web Dynpro ist der Model View Controller (MVC).Dies ist ein Repository, das die Informationen über Aufbereitung undTransaktion abspeichert und bei Anforderung den passenden HTML-Codegeneriert.
Runtime-Code wird aus Meta-daten erzeugt
Eine ganze Reihe von Tools erlauben es, entweder auf vordefinierte Lay-outs zur Bildschirmgestaltung zurückzugreifen oder selbst eigene Layouts
Abbildung 5.5 Web Dynpro innerhalb von mySAP Technology/SAP NetWeaver
Kap05.fm Seite 123 Dienstag, 22. April 2003 2:32 14
124 Frontend und GUIs
zu entwerfen. Aus diesen Metadaten wird dann der Runtime-Code fürdie verschiedenen Plattformen ABAP, Java oder Microsoft.NET erzeugt.
Entwickler codiertnur noch Ereig-
nisse in derAnwendung
Damit schließt Web Dynpro die Lücke zwischen der klassischen SAP-Dyn-pro-Technik und flexibler Webentwicklung. Der Controller von Web Dyn-pro kümmert sich um die wiederkehrenden Arbeiten auf unterer Ebenewie die Anpassung des Codes an die Möglichkeiten des Browsers. DerEntwickler kümmert sich nur um das Ausfüllen der Code-Segmente fürdie jeweiligen Webevents, die bei üblichen Ereignissen ausgelöst werden,zum Beispiel beim Laden einer Seite, bei einem Mausklick oder einer Ein-gabe.
Web Dynproersetzt SAP GUI
Web Dynpro zielt auch darauf, den Zugang zu SAP-Daten von besonde-ren Applikationen aus möglich zu machen. Man denkt da in erster Liniean mobile Eingabegeräte wie PDAs, GSM-Telefone mit Browser oder dieBereitstellung der Dienste als Webservice. Langfristig ist das Ziel, dasbestehende klassische SAP GUI durch Web Dynpro zu ersetzen.
Kap05.fm Seite 124 Dienstag, 22. April 2003 2:32 14
Message-Queues und Message-Server 125
6 Message-Queues und Message-Server
Der wesentliche Unterschied zwischen moderner objektorien-tierter Programmierung und traditioneller imperativer Ent-wicklung liegt in der gezielten Verwendung von Nachrichten. Messages erlauben ein gleichberechtigtes Nebeneinander von spezialisierten Programmkomponenten, die sich gegenseitig über Status und Ergebnisse informieren und auf die ausgelös-ten Events reagieren.
Eine Message-Queue ist intelligente Software, deren Aufgabe es ist, denAustausch von Informationen zwischen Programmen sicherzustellen.Dabei handelt es sich nicht um eine neue Technologie, sondern um dieRenaissance einer Methodik, die bei Mainframes schon immer gang undgäbe war. Dort liefen Prozesse in Hintergrund-Jobs und Terminals habengrundsätzlich durch Senden von Nachrichtenströmen mit dem Main-frame kommuniziert.
6.1 Anwendungen von Message Queues
6.1.1 Modelle von Message-Queues
Der Gedanke hinter der Verarbeitung von Messages ist weithin ein Spie-gelbild der Kommunikationsabläufe im realen Leben. Jemand (der Client)benötigt die Hilfe eines kompetenten Dienstleisters (des Servers). Häufigkennt der Client aber niemanden, der die Dienstleistung erbringen kann.
Stellen wir uns vor, der Client sei ein Handwerksmeister und er sucheeinen Betrieb, der ihm seine Werkstatt renoviere und neu einrichte.Natürlich möchte er das beste Angebot haben. Er hat nun mehrere Mög-lichkeiten:
� Branchenverzeichnis – Directory ServiceEr kann entweder in einem Verzeichnis wie den Gelben Seiten oder»Wer liefert was?«, Google oder Yahoo! nachsehen und dann alle Ein-richter anschreiben und ein Angebot einholen. Das Problem entstehtschon beim Durchsuchen des Verzeichnisses: Es gibt mehr als eineBranche, die Werkstätten einrichtet, darunter auch solche, die dies garnicht ausdrücklich erwähnen, sondern die Leistung unter anderemNamen erbringen.
Kap06.fm Seite 125 Dienstag, 22. April 2003 2:32 14
126 Message-Queues und Message-Server
Directory Service Im Falle einer Message-Queue nennt man eine solche Dienstleistungeinen Directory Service. Da der Anfragende dabei in der Regel auf eineAntwort des Directory Service wartet, spricht man hier von einerpseudo-synchronen Verarbeitung.
� Ausschreibung und KleinanzeigeDer Handwerksmeister kann aber auch in einer Zeitung oder im Inter-net die Leistung ausschreiben und auf eingehende Angebote warten.Leider steht und fällt diese Idee mit der Reichweite der Anzeige, alsodamit, wie viele geeignete Bewerber die Anzeige überhaupt sehen.
Broadcast andSubscribe
Im Falle einer Message-Queue nennt man dies Broadcast and Subscribe,damit ist gemeint, dass eine Nachricht verteilt wird und man anschlie-ßend auf eine Antwort wartet. Alternative Namen dafür sind auch Fireand Subscribe und Mail-Out.
� Spezialdienst oder NachrichtendienstUnser Meister hat aber noch eine bessere Idee, er möchte jemandenfragen, der vielleicht einen geeigneten Betrieb empfehlen kann. Alsogeht er zum Bürgermeister, der ja alle Handwerksbetriebe vor Ortkennt, und erkundigt sich bei ihm, wer denn genau hierfür geeignetsei. Alternativ kann er auch auf eine Preisagentur zurückgreifen, dem-nach ein Unternehmen, das sich darauf spezialisiert hat, Anbieter undDienstleister zusammenzuführen.
Content DrivenDelivery
Dies nennt man im Workflow-Umfeld Content Driven Delivery undmeint die Fähigkeit eines Message-Servers, den Empfänger und dieFolgehandlung einer Nachricht aus dem Inhalt abzuleiten. Ein vordefi-niertes Prozedere für den Workflow nennt man auch Standard Opera-tion Procedure (SOP).
6.1.2 Nutzen der Message-Queues
Für die Verteilung der Nachrichten und ihre Zustellung an eine Applika-tion gibt es verschiedene Strategien, die von den Message-Queues erfülltwerden. Insbesondere erfüllt die Message-Queue die Routineaufgaben,die ansonsten von jeder Applikation selbst realisiert werden müssten:
Sichere Zustellung
� Guaranteed DeliveryDie Angst jedes Senders einer Nachricht ist es, dass die Nachricht nichtzugestellt werden kann. Dabei kann die Nachricht einfach verlorengehen oder sie wird an den Sender zurückgeliefert. In jedem Fall hatder Sender die Pflicht, Maßnahmen zu ergreifen, dass die Daten beimEmpfänger ankommen. Da kann es schon einmal vorkommen, dass die
Kap06.fm Seite 126 Dienstag, 22. April 2003 2:32 14
Anwendungen von Message Queues 127
schöne EDIFACT-Nachricht plötzlich auf Papier ausgedruckt via Faxnachgereicht wird.
Die Message-Queue implementiert nun Standardalgorithmen, die ver-suchen, die gängigen Fälle von Zustellfehlern automatisch und unbe-merkt von den Nutzern zu beheben. Bewährte Strategien sind:
� Regelmäßiges Neusenden in Intervallen
� Zustellungen an eine alternative Notfalladresse
� Alarmierung des Bereitschaftsdienstes
� Auswahl eines Empfängers einer NachrichtZustellung nach Inhalt, nicht nach Adresse
Häufig ist dem Sender einer Nachricht überhaupt nicht bekannt, wel-cher der möglichen Server auf der Empfängerseite der geeignete Part-ner für die Nachricht ist. Senden wir zum Beispiel einen Werkstattauf-trag als E-Mail an »Herrn Müller«. Wenn nun Herr Müller in Pensiongeht, müsste in allen Client-Systemen die Adresse von Herrn Müllerdurch die des neuen Zuständigen ausgetauscht werden. Anstatt nunEmpfängerlisten auf jedem Client-System zu replizieren und zu pfle-gen, wird eine logische Adresse, zum Beispiel »Werkstatt«, auf Dauervergeben. Ändert sich dann die Adresse, wird diese nur auf dem Mes-sage-Queue-Server geändert.
Anwendung für inhaltsbezogene Adressierung
In der Praxis sendet deshalb der Requester seine Anfrage an den Mes-sage-Server mit einer hinreichenden Beschreibung des gewünschtenKommunikationspartners. Typische Anwendungen für eine solcheinhaltsbezogene Adressierung sind:
� Load-BalancingWenn eine Instanz eines Servers – zum Beispiel SAP R/3 – auf meh-reren Applikationsservern läuft, werden Anfragen für eine neue Ver-bindung durch den Message-Server auf den Applikationsservergeleitet, der momentan am wenigsten ausgelastet ist. Die Intelli-genz für die Bestimmung der geeigneten Maschine ist dabei in derMessage-Queue programmiert.
� Connection-PoolingBei teuren Leitungsverbindungen zwischen Sender und Empfängerkann es sinnvoll sein, dass die Verbindung nur einmal aufgebaut undvon mehreren Nutzern verwendet wird. Als teure Verbindung sindalle Wählverbindungen anzusehen, aber auch Flaschenhälse imNetzwerk, wenn der Verhandlungsaufwand zwischen den Servernunverhältnismäßig hoch ist.
Kap06.fm Seite 127 Dienstag, 22. April 2003 2:32 14
128 Message-Queues und Message-Server
� EDI-NachrichtenEDI-Nachrichten beschreiben typischerweise im Kopfsatz den Inhaltder gesendeten Nachricht. Es ist Aufgabe des EDI-Message-Servers,die Nachricht gegebenenfalls zu konvertieren und an ein geeignetesVerarbeitungsprogramm weiterzuleiten.
6.2 Message-Server Software
Entsprechend der herausragenden Bedeutung von Message-Queues gibtes mittlerweile auch unzählige Produkte von namhaften und auch vonweniger bekannten Herstellern:
� IBMIBM positioniert sich gleich mit mehreren konkurrierenden Produktenauf dem Markt:
� IBM WebSphere/MQ und WebSphere IntegratorDas Produkt hieß bis vor kurzem noch IBM MQ Series und ist einplattformunabhängiger, äußerst robuster Message-Server. Wenn esdarum geht, zuverlässig, schnell und ausfallsicher Massen von Nach-richten zu verarbeiten, ist WebSphere/MQ das Produkt der erstenWahl und wird es wohl auch noch auf lange Sicht bleiben, auchwenn das Einrichten und Programmieren für WebSphere/MQ alle-mal noch ein Albtraum sein kann.
� Lotus NotesLotus Notes war eines der ersten Message-Queue-Systeme, dienicht auf Mainframes abliefen. Damit hatte Lotus zwar frühzeitigerkannt, welche Produkte der Markt benötigt, aber ein ungeschick-tes Marketing führte dazu, dass zwar zunächst in allen bedeutendenUnternehmen Notes installiert wurde, aber die Nachricht, wozuLotus Notes geeignet ist, blieb weitestgehend verborgen. Grund-sätzlich kann man sagen, wenn Ihr Unternehmen bereits LotusNotes installiert hat – und die Chancen dafür sind groß –, dann bie-tet sich diese Installation auch als Middleware für die komplexenAnwendungen an.
� IBM CrossWorldsIBM hat sich mit CrossWorlds noch ein drittes Middleware-Produktin sein Portfolio gelegt. Die Motivation war vor allem, das SAP-Know-how von CrossWorlds abzugreifen, da es einfacher erschien,zusätzlich zu MQ noch Crossworlds zu installieren, als die Adaptervon MQ neu zu schreiben.
Kap06.fm Seite 128 Dienstag, 22. April 2003 2:32 14
Message-Server Software 129
� IONABei IONA Orbix XML-Bus geht der Hersteller einen etwas anderenWeg. Im Kern haben wir es weiterhin mit einer Message-Queue zutun. Der Unterschied liegt in einer vereinfachten Betrachtung des Aus-tauschs der Nachrichten und dem konsequenten Einsatz von XML fürden gesamten Workflow.
Das ist etwa vergleichbar mit der philosophischen Frage, ob sich dieErde um die Sonne oder die Sonne um die Erde drehe. Die Antwortliegt in der Wahl des Modells. Natürlich kann man die Erde in dasZentrum des Sonnensystems stellen und kommt zu den gleichenErkenntnissen wie mit der Sonne als Dreh- und Angelpunkt. DerUnterschied liegt darin, dass mit einem geozentrischen Weltbild dieastronomischen Berechnungen ungleich komplizierter werden. So istes auch bei der Wahl des richtigen Modells für Message-Queues, undhier hat IONA deutliche Vorteile. IONA gehört neuerdings auch zumEinflussbereich von IBM.
� Microsoft MSMQMicrosoft bietet für seine NT-Server-Reihen einschließlich Windows2000 (NT 5) und Windows XP (= NT 6) die Microsoft-Message-Queue,kurz MSMQ, an und bleibt dabei auch seiner bewährten Marke-tingstrategie treu. Anstatt auf interessierte Kunden zu warten, werdenalle Windows-Server-Nutzer mit MSMQ zwangsweise beglückt: DasProgramm ist kostenloser Bestandteil jeder NT-Server-Installation. DieFolge ist, dass MSMQ die zahlenmäßig am weitesten verbreitete Mes-sage-Server-Software ist, wohingegen die Zahl der Produktivnutzervon MSMQ gegenwärtig noch überschaubar erscheint. Jedoch istdabei auch zu beachten, dass Microsoft diese Dienste auch für andereZwecke, etwa für Outlook und Workflow, nutzt.
� Microsoft BIZTALKAuch Microsoft geht mit mehreren alternativen Produkten in dieArena. Aufbauend auf MSMQ, bietet Microsoft sein professionellesWorkflow-Management-System BIZTALK an.
� MercatorMercator ist eigentlich ein EDI-Konverter, der aber mittlerweile zueinem flexiblen Message-Handling-System gewachsen ist. Die Basisdes Erfolgs von Mercator ist dessen weitgehende und einfache Unter-stützung der R/3-Anbindung.
Kap06.fm Seite 129 Dienstag, 22. April 2003 2:32 14
130 Message-Queues und Message-Server
� TibcoTibco gehört ebenfalls zu den ganz großen und namhaften Lieferantenvon Messaging-Software. Auch Tibco unterstützt SAP R/3 sehr gut, wasauch wichtig ist, denn der Austausch von Messages von und nach SAPR/3 ist weiterhin einer der wichtigsten Anwendungen für Middleware.
� SAP Exchange InfrastructureSAP spielt mit SAP Exchange Infrastructure seit Mitte 2002 ebenfalls inder Liga der Message-Server. Als Bestandteil von SAP-NetWeaver sollSAP XI mittelfristig den gesamten Nachrichtenfluss von, nach und zwi-schen SAP-Systemen innerhalb einer IT-Landschaft gewährleisten. Auchwenn das Produkt gegenwärtig noch kaum auf dem Markt vertreten ist,verspricht es doch, eines der stärksten mySAP-Produkte zu werden.
6.3 Kommunikation mit Messages-QueuesOrchestrierung
aller Nachrichten-ströme
Eine Message-Queue ist technisch gesehen eine zentral zugänglicheDatenbank, an die ein Client seine Nachrichten sendet. Die Nachrichtenwerden in der Datenbank zwischengespeichert, bis sie von einer Applika-tion verarbeitet werden können.
Grundlage fürasynchrone
Prozesse
Message-Queues erlauben die asynchrone Verarbeitung von Nachrichtenund Anfragen, bei der eine Applikation eine Anfrage an die Message-Queue zur weiteren Verfolgung abgibt. Die verarbeitende Applikationmeldet das Ergebnis der Verarbeitung dann an die Message-Queue wei-ter, von der der ursprüngliche Requester die Antwort dann abholen kann,sobald er dafür Zeit hat.
Wenn eine Applikation eine ressourcenintensive Anfrage startet, sendetsie die Anfrage an die Message-Queue und erhält von dieser eine eindeu-tige Ticketnummer. Mit dieser Nummer kann dann der Vorgang spätereindeutig verfolgt werden.
Serialisierungvon Anfragen
Die eingegangenen Nachrichten werden von der Message-Queue auto-matisch in einer sinnvollen Folge serialisiert und an die Applikation wei-tergeleitet. Abhängig von der gewünschten Aktion speichert die Message-Queue auch Zwischenergebnisse und den Status der Verarbeitung ab.
Es gibt nun zwei Typen von Applikationen: solche, die von der Message-Queue aufgerufen werden, und solche, die regelmäßig die Message-Queuenach neuer Arbeit durchsuchen. Letztere nennt man einen Daemon, es sindProgramme, die als Hintergrundprozesse permanent ausgeführt werdenund nur in Aktion treten, wenn ein bestimmtes Ereignis, wie etwa der Ein-gang einer Nachricht, auftritt.
Kap06.fm Seite 130 Dienstag, 22. April 2003 2:32 14
Kommunikation mit Messages-Queues 131
TriggerAlternativ bietet eine Message-Queue immer die Möglichkeit, eine Appli-kation bei Bedarf zu starten. Das sorgt ebenfalls dafür, dass wertvollerHauptspeicher nicht durch schlafende Prozesse ausgelastet wird. Zum Bei-spiel stellt Microsoft in der MSMQ die Applikation Microsoft MSMQ Trig-ger zur Verfügung, die es erlaubt, Nachrichten nach Inhalten, etwabestimmten Strings, zu durchsuchen und dann eine Aktion auszulösen.Der regelbasierte Mail-Organizer Microsoft Outlook benutzt diese Tech-nik.
Der Daemon meldet die Ergebnisse der Verarbeitung an die Message-Queue zur Abspeicherung zurück. Heutzutage werden die Ergebnisse fastimmer als XML-Dokumente ausgetauscht.
Denken wir an die bekannte Situation, eine Datenbank über eine hochfrequentierte Webseite abzufragen. Wenn viele Anfragen gleichzeitig aufdie Datenbank zugreifen, können die Wartezeiten unerträglich sein. Miteiner Message-Queue dahinter können Sie die Anfrage in den Hinter-grund verlagern und das Ergebnis zu einem späteren Zeitpunkt abholen.
Tatsächlich spielen mächtige Message-Queue-Systeme eine wichtigeRolle im modernen Enterprise-Computing. Wenn die Serverfarmen nurhinreichend groß werden, geht ohne die Message-Queues nichts mehr.Zusammen mit dem Transaktionsmanagement orchestrieren sie die Lastder Anfragen (Load Balancing)und versuchen durch gemeinsame Nutzungbereits bestehender und laufender Prozesse (Pooling), besonders die teu-ren Ressourcen besser auszunutzen.
Message-Queues steuern auch die Batch-Verarbei-tung
Eine weitere Aufgabe einer Message-Queue ist es, Nachrichten für eineverzögerte Verarbeitung aufzubewahren. Dazu gehören vor allem dieMassen-Batch-Läufe, etwa das Ausdrucken von Fakturen und Auftragsbe-stätigungen während der weniger belasteten Nachtzeiten. Auch SAP R/3bedient sich dieser Mechanismen mit den Einträgen in der Tabelle NAST(für Nachrichtensteuerung), bei der es sich ebenfalls um eine Message-Queue handelt.
WorkflowBaut man nun ganze Ketten von Nachrichten, die Applikationen antrig-gern und dann ihrerseits wieder Nachrichten versenden, kommen wirzum Prinzip des Workflows, heute oft auch Webflow genannt, um anzu-zeigen, dass die Nachrichten auf Wunsch auch über das Web ausge-tauscht werden können.
Kap06.fm Seite 131 Dienstag, 22. April 2003 2:32 14
132 Message-Queues und Message-Server
Abbildung 6.1 Message-Queue als Dispatcher in einer Application Server Farm
Central Message Queue
n 4 3 2 1
R/3 Application Server Farm
R/3 App Server
R/3 App Server
R/3 App Server
Web Server Farm
IISServer
IISServer
IISServer
Kap06.fm Seite 132 Dienstag, 22. April 2003 2:32 14
Internes Messaging in R/3 133
7 Internes Messaging in R/3
Auch SAP R/3 verwendet ein sehr ausgefeiltes Messaging-Konzept, um die parallele Verarbeitung der Anwendung sicherzustellen. Grundsätzlich kennt SAP R/3 folgende Mes-sage-Pipes: Verbucher, Nachrichtensteuerung, Workflow und IDocs.
7.0.1 NAST Message Control
Die Nachrichtensteuerung in SAP R/3 ist um die Tabelle NAST herum-gebaut, die auch ihren Namen davon ableitet (NAchrichtenSTeuerung).Wie bei jeder Message-Queue legt die anfragende Applikation ihre Nach-richten in NAST ab, wo sie dann von einem interessierten Verbraucherirgendwann abgegriffen und verarbeitet wird.
Der Verbraucher läuft asynchron
Ein Programm, das eine Nachricht abarbeitet, nennt man Verbraucher(englisch: consumer) oder Handler. Der Verbraucher läuft asynchron zumRequester ab, ist also vollkommen von diesem entkoppelt. Der Zeitpunktder Abarbeitung der Nachricht ist nicht vorher bestimmt und die Verar-beitung der Nachricht läuft als separate Transaktion ab. Falls die rufendeTransaktion das Ergebnis benötigt, muss sie die eigene Transaktion erst selbst beenden und dann das Ergebnis pollen.
Entkopplung der Transaktion nur eingeschränkt
Die Entkopplung von NAST-Routinen aus einer Transaktion ist leider nichtvollständig. Tatsächlich wird im Falle eines Verarbeitungszeitpunkts »4 =sofort nach Sichern verarbeiten« die Verarbeitung noch innerhalb desVerbuchens angestoßen und unterliegt somit den Restriktionen der Ver-bucherverarbeitung. Es besteht die Möglichkeit, dies zu umgehen, indemman aus der Verarbeitungsroutine heraus einen RFC absetzt, allerdings istes dann schwierig, den Verarbeitungsstatus synchron zu halten:
� Der Requester speichert seine Nachricht in der Tabelle NAST.
� Ein Programm, gewöhnlich RSNAST00, pollt die Tabelle NAST nachunverarbeiteten Nachrichten und aktiviert das Programm, das für dieVerarbeitung der Nachricht als Verbraucher vorgesehen ist.
� Die Verarbeitungsroutine schließt die Verarbeitung ab, indem sie dieNachricht als verarbeitet kennzeichnet und einen Status in NASTzurückschreibt.
Kap07.fm Seite 133 Dienstag, 22. April 2003 2:32 14
134 Internes Messaging in R/3
� Wenn RSNAST00 zur Verarbeitung verwendet wird, werden alle Ver-waltungsaufgaben von diesem übernommen und lediglich eine imCustomizing vorzugebende Routine zur Verarbeitung aufgerufen.
7.0.2 Entwicklung eigener NAST-Handler
Standardverarbei-tung in SAP R/3
via RSNAST00
Wenn Sie planen, selbst Nachrichten aus der Tabelle NAST zu verarbei-ten, sollten die Verarbeitungsroutinen kompatibel mit der allgemeinenNachrichtenverarbeitung in RSNAST00 sein. Die Standardverarbeitungvon SAP R/3 legt Nachrichten in der Tabelle NAST über die Nachrichten-findung mit dem Funktionsbaustein function MESSAGING an. Dieserbenutzt zum einen die Konditionstabellen für die Nachrichtenfindung,sofern diese für die gewünschte Applikation definiert worden sind. AmEnde einer Transaktion, die die Standardverarbeitung verwendet, ruft SAPR/3 die Routine
PERFORM einzelnachricht IN PROGRAM RSNAST00
auf. Diese Routine geht davon aus, dass in der Tabelle TNAPR für diegewünschte Nachricht ein Eintrag vorhanden ist, der den Namen des Ver-arbeitungsprogramms enthält. Das folgende Listing zeigt ein Beispiel füreine solche Routine.
Listing 7.1 ZSNASTWF – Beispiel einer NAST-Routine zum Triggern eines Workflows
****************************************************** Collection of NAST processing routines ** for media = 8 : special processing ** for media = 9 : Workflow Event ** for media = T : Workflow Task ** ******************************************************* <object> contains call declarations for object hand-lingINCLUDE <OBJECT>.* Following are the declarations for standard NASTINCLUDE RVADTABL .DATA: RETCODE LIKE SY-SUBRC.DATA: XSCREEN.*----------------------------------------------------** FORM CREATE_EVENT **----------------------------------------------------*
Kap07.fm Seite 134 Dienstag, 22. April 2003 2:32 14
Internes Messaging in R/3 135
* Routine is used to process NAST media type "9" (Work-flow Event) ** It will actually raise the specified workflow Event* as defined in NAST-OBJECT and NAST-EVENT* Note: NAST-EVENT must exist for object NAST-OBJECT* or its delegation type (=derived subtype)*----------------------------------------------------*FORM ENTRY_CREATE_EVENT USING RETURN_CODE US_SCREEN. PERFORM CREATE_EVENT(RSWEMC01) USING RETURN_CODE US_SCREEN.ENDFORM. " create_Event.
Das folgende Listing zeigt eine Routine zum Rückschreiben eines Verar-beitungsprotokolls.
Listing 7.2 Update des Verarbeitungsprotokolls im NAST-Handler
FORM PROTOCOL_UPDATE USING MSG_ARBGB MSG_NR MSG_TY MSG_V1 MSG_V2 MSG_V3 MSG_V4. CHECK XSCREEN = SPACE. SYST-MSGID = MSG_ARBGB. SYST-MSGNO = MSG_NR. SYST-MSGTY = MSG_TY. SYST-MSGV1 = MSG_V1. SYST-MSGV2 = MSG_V2. SYST-MSGV3 = MSG_V3. SYST-MSGV4 = MSG_V4.
CALL FUNCTION 'NAST_PROTOCOL_UPDATE' EXPORTING MSG_ARBGB = SYST-MSGID MSG_NR = SYST-MSGNO MSG_TY = SYST-MSGTY MSG_V1 = SYST-MSGV1 MSG_V2 = SYST-MSGV2
Kap07.fm Seite 135 Dienstag, 22. April 2003 2:32 14
136 Internes Messaging in R/3
MSG_V3 = SYST-MSGV3 MSG_V4 = SYST-MSGV4 EXCEPTIONS OTHERS = 1.ENDFORM.
Im nächsten Beispiel erzeugen wir ein Workitem aus einer NAST-Nach-richt. Ein Workitem ist eine E-Mail, die eine Entscheidung vom Empfän-ger erwartet. Sobald der Entscheider sein Workitem beantwortet hat,wird der Workflow unter Auswertung der Antwort fortgeführt.
Listing 7.3 Workitem erzeugen aus einem NAST-Eintrag
FORM ENTRY_WORKITEM USING RETURN_CODE US_SCREEN. CLEAR RETCODE. XSCREEN = US_SCREEN. PERFORM DO_WORKITEM USING US_SCREEN NAST-OBJKY. CASE RETCODE. WHEN 0. RETURN_CODE = 0. "all well done, sets VSTAT = 1 WHEN 3. RETURN_CODE = 3. "means not processed, leaves VSTAT = 0 WHEN OTHERS. RETURN_CODE = 1. "Errors, sets VSTAT = 2 ENDCASE.ENDFORM.
FORM DO_WORKITEM USING RETURN_CODE US_SCREEN.DATA: WI_CONTAINER LIKE SWCONT OCCURS 0 WITH HEADER LINE.DATA: AGENTS LIKE SWHACTOR OCCURS 0 WITH HEADER LINE.DATA: SWWWIHEAD LIKE SWWWIHEAD.DATA: BEGIN OF OBJECT_ID, LOGSYS LIKE T000-LOGSYS, OBJTYPE LIKE SWOTENTRY-OBJTYPE, KEY LIKE SWCONT-VALUE, END OF OBJECT_ID.*
Kap07.fm Seite 136 Dienstag, 22. April 2003 2:32 14
Internes Messaging in R/3 137
DATA: TASKNAME LIKE HRP1000-MC_SHORT.DATA: OBJNAME LIKE SWOTENTRY-OBJTYPE.*ARAMETERS: taskname LIKE hrp1000-mc_short DEFAULT 'ZAXXVA02'.*ARAMETERS: objname LIKE swotentry-objtype DEFAULT 'BUS2032'.* *** ************ Object ID ************************* The logical system is retrieved from table T000-logsys CALL FUNCTION 'OWN_LOGICAL_SYSTEM_GET' IMPORTING OWN_LOGICAL_SYSTEM = OBJECT_ID-LOGSYS.* BUS2032 is the sales order BAPI OBJECT_ID-OBJTYPE = NAST-OBJTYPE. TASKNAME = NAST-EVENT. OBJECT_ID-KEY = NAST-OBJKY.* *** Load Container REFRESH WI_CONTAINER.* The object_id must be passed to the macro as an unstructured type* If the type is structured, one single entry for every sub-field* of the parameter is created. This is not what we want. WI_CONTAINER-VALUE = OBJECT_ID. SWC_SET_ELEMENT WI_CONTAINER '_WI_OBJECT_ID' WI_CONTAINER-VALUE.*swc_set_element wi_container 'SALESDOCUMENT' object_id-key. SWC_SET_ELEMENT WI_CONTAINER 'VBELN' OBJECT_ID-KEY.* *** Identify yourselfSWWWIHEAD-WI_CREATOR = SY-UNAME.* *** Set the action that continues the WorkitemSELECT OBJID INTO SWWWIHEAD-WI_RH_TASK "need internal object id FROM HRP1000 UP TO 1 ROWS WHERE MC_SHORT EQ TASKNAME.ENDSELECT.IF SY-SUBRC NE 0. MESSAGE A000(38) WITH 'Task not found' TASKNAME.ENDIF.* *** Define the users, which are meant to check the workitemREFRESH AGENTS.
Kap07.fm Seite 137 Dienstag, 22. April 2003 2:32 14
138 Internes Messaging in R/3
AGENTS-OTYPE = 'US'.AGENTS-OBJID = 'ANGELIAX1'.APPEND AGENTS.CALL FUNCTION 'SWW_WI_START_SIMPLE' EXPORTING CREATOR = SWWWIHEAD- WI_CREATOR TASK = SWWWIHEAD- WI_RH_TASK TABLES AGENTS = AGENTS WI_CONTAINER = WI_CONTAINER EXCEPTIONS ID_NOT_CREATED = 1 READ_FAILED = 2 IMMEDIATE_START_NOT_POSSIBLE = 3 EXECUTION_FAILED = 4 INVALID_STATUS = 5 OTHERS = 6.ENDFORM. " entry_workitemh USING return_code us_screen.
7.0.3 Workflow-Events
Mit Workflow-Ereignissen kann man nachfolgende Verarbeitungenunmittelbar aufrufen. Die Idee dahinter ist, dass das rufende Programmder Öffentlichkeit, de facto der Workflow-Engine, seinen eigenen Verar-beitungsstatus anzeigt. Man sagt, es feuert einen Event. Die Workflow-Engine analysiert den Event und reagiert entsprechend darauf. Dazu wirddie Liste der interessierten Applikationen durchgegangen und diese gege-benenfalls aufgerufen. Falls keine Applikation für den Event vorgesehenist, wird er ignoriert, man spricht davon, dass der Event verbrannt werde.
7.0.4 Pro und Kontra Workflow versus NAST
Pro und KontraWorkflow und
NAST
Die Entscheidung zwischen NAST und Workflow hängt von verschiede-nen Kriterien ab. Beide Messaging-Varianten leisten im Endergebnis dasGleiche:
� Die Protokollierung bei NAST ist einfacher, da bereits Mechanismenzum Wegschreiben der Status und von Langprotokollen vorgesehensind. Dazu bedient sich der NAST-Handler des FunktionsbausteinsFunction NAST_PROTOCOL_UPDATE.
Kap07.fm Seite 138 Dienstag, 22. April 2003 2:32 14
Messaging mit R/3-IDocs 139
� Zur Protokollierung von Langtexten bei Workflow müssen Sie entwe-der eigene Mechanismen verwenden oder Sie greifen auf den Applika-tionslog von R/3 zurück, der mit den Funktionsbausteinen der Funkti-onsgruppe SLG0, die mit APPL_LOG_... beginnen, geschrieben wird.
� Workflows werden grundsätzlich synchron gestartet. Versagt derWorkflow, wird er nicht mehr neu gestartet.
� Nur einzelne Transaktionen unterstützen die Nachrichtenverarbeitungmit NAST. Ein nachträglicher Einbau innerhalb eines User-Exits ist zwaroft möglich, aber in jedem Fall schwierig.
� NAST erlaubt in der Verarbeitungsroutine keine Befehle, die nicht fürVerbuchungsroutinen zugelassen sind, solange die Verarbeitung durchdie auslösende Transaktion auch gestartet werden soll.
� Workflow erlaubt jede beliebige Verarbeitung, da der Aufruf immer ineinem eigenen Programmkontext in einer eigenen RFC-Destinationausgeführt wird. Die übliche RFC-Destination für einen Workflow lau-tet WORKFLOW_LOCAL_nnn, wobei nnn die Nummer des R/3-Mandan-ten ist, in dem der Workflow ausgeführt werden soll.
7.1 Messaging mit R/3-IDocs
IDoc ist die Abkürzung für Intermediate Document. Dabei handelt es sichum ein formales Dateiformat, das von SAP festgelegt wurde, um Datenmit externen Systemen auszutauschen. Der Aufbau eines IDocs ist immergleich und besteht aus
� einem Kopfsatz
� einer beliebigen Anzahl von Datensätzen wobei jeder Datensatz aus einer führenden Sequenz als Segmentken-nung und einem Datensatz mit fester Länge von 1.000 Zeichen besteht
IDoc versendet eine Nachricht mit Daten
SAPs IDocs wurden ursprünglich als asynchrone Message-Queue für ein-gehende und ausgehende EDI-Daten entworfen. Im Unterschied zu ein-fachen Nachrichten mit NAST überträgt ein IDoc mit der Nachricht auchdie gesamten Daten.1
SAP erzeugt keine EDI-Formate
SAP erzeugt keine klassischen EDI-Datenformate wie EDIFACT oder ANSIX.12. Ab Release 4.6 können IDocs auch als XML-Datei ausgegeben wer-den.
1 Für weitere Informationen zu IDocs empfehlen wir Axel Angeli: The R/3 Guide toEDI and Interfaces. Wiesbaden 2001.
Kap07.fm Seite 139 Dienstag, 22. April 2003 2:32 14
140 Internes Messaging in R/3
Die folgende Tabelle zeigt das Beispiel eines IDocs mit Segment-Info undfestem 1000-Zeichen-Datenblock rechts.
Listing 7.4 Beispiel eines IDocs zur Übertragung von Materialstammdaten
EDI_DC40 043000000000001234540B 3012 MATMAS03 MAT-MAS DEVCLNT100 PROCLNT100 E2MARAM001 043000000000001234500000100000002005TESTMAT1 19980303ANGELI 19981027SAPOSS E2MAKTM001 043000000000001234500000300000103005EEnglish Name for TEST Material 1 ENE2MAKTM001 043000000000001234500000400000103005FFrench Name for TEST Material 1 FR
Segment Info Segment Data-à
...E1MARAM ....00000001234567… Material base segment
...E1MARCM ....PL01… Plant Segment
...E1MARDM ....SL01 Storage location data
...E1MARDM ....SL02 Another storage location
...E1MARCM ....PL02 Another plant
Tabelle 7.1 Beispiel-IDoc
Abbildung 7.1 Tabellen, in denen IDocs in SAP R/3 gespeichert werden
Kap07.fm Seite 140 Dienstag, 22. April 2003 2:32 14
Messaging mit R/3-IDocs 141
E2MARCM001 0430000000000012345000005000001030050100DEAVB 901 PD9010 0 0.00 EXX 0.000E2MARDM001 0430000000000012345000006000005040051000D 0.000 0.000 E2MARDM001 0430000000000012345000007000005040051200D 0.000 0.000 E2MARMM 043000000000001234500000900000103005KGM1 1 0.000 0.000
Listing 7.5 Teil des Inhalts eines IDoc-Files für IDoc-Type MATMAS01
0000000000012345 DEVCLNT100 PROCLNT100 19991103 210102 E1MARAM 005 TESTMAT1 19980303 ANGELI 19981027SAPOSS KDEAVCB E1MAKTM 005 D Ger-man Name for TEST Material 1 DE E1MAKTM 005 E Eng-lish Name for TEST Material 1 EN E1MAKTM 005 F French Name for TEST Material 1 FR E1MARCM 005 0100 DEAVB 901
IDocs harmonisch in Applikationen eingefügt
Abbildung 7.2 zeigt das Funktionsprinzip der SAP-IDoc-Engine. Darinwird deutlich, dass IDocs harmonisch in das gesamte Geflecht der Appli-kationen von SAP eingefügt werden. IDocs werden gewöhnlich durcheinen Eintrag in die NAST-Datenbank ausgelöst, können aber auch direktaus der Applikation erzeugt werden.
Die folgenden Listings zeigen Auszüge aus einem IDoc. Jedes IDoc wirddurch einen standardisierten Header-Satz eingeleitet. Die Datensätzehaben eine Segmentkennung und einen Datenblock von fester Länge.
Kap07.fm Seite 141 Dienstag, 22. April 2003 2:32 14
142 Internes Messaging in R/3
Listing 7.6 Einfaches Beispiel eines IDoc Control Record für Kundenaufträge
IDOC Number Sender Receiver Port Message Type IDoc Type0000123456 R3PARIS R3MUENCHEN FILE ORDERS ORDERS01
Listing 7.7 Einfaches Beispiel eines IDoc-Datensatzes für Kundenaufträge
SegmentType Sold-To Ship-To Value Deldate UserORDERHEADER 1088 1089 12500,50 24121998 Micky Maus
7.2 SAP R/3 Workflow programmierenAutomatischeAbfolgen vonProgrammen
Ein Workflow dient dem automatisierten Verketten von einzelnen Trans-aktionen auf der Basis eines ausgelösten Events. R/3-Workflows erlaubenauch konditionale Handlungsabläufe und die Weitergabe von Daten zwi-schen den einzelnen Schritten der Verarbeitung. Workflows könnenangehalten werden, um Benutzeraktionen zu erfragen, etwa das Sendeneiner E-Mail, das eine Benutzerentscheidung verlangt.
Abbildung 7.2 Ein typisches IDoc/EDI-Ausgangsszenario aus Sicht von R/3
R/3 Database File(e.g. DB/2, ADABAS,
ORACLE)
IDoc CreatingFunction Module
IDoc DocumentStructured ASCII
File
R/3 Application
ABAP
Transaction
11 Application writesdata to R/3 databasetables.
2 An Applicationrequest sending ofan IDoc.
3 An IDoc handlercreates the IDoc andconverts data to ASCIIformat.
XML, X.12.EDIFACT ...Converter
(PC program)
4 An external program (e.g.running on NT) converts tointernational standards.
5 Data is sentto receiver, e.g.via FTP, ISDNprotocol.
optional
Kap07.fm Seite 142 Dienstag, 22. April 2003 2:32 14
SAP R/3 Workflow programmieren 143
Kopplungstabelle Ein Workflow ist eine Kette von Workflow-Schritten, die nacheinanderausgeführt werden. Ein solcher Workflow ist in der Tabelle SWETYPECOUfestgelegt, beziehungsweise ab R/3 Enterprise in den Tabellen SWFDE-VENA und SWFDEVTYP. Bei diesen Schritten handelt es sich entwederum einen Funktionsbaustein oder um einen mit der Transaktion PFTCangelegten Workflow-Task.
Bedingungen festlegen
Zu jedem Schritt kann ein Funktionsbaustein festgelegt werden, derbestimmt, ob der Schritt ausgeführt wird oder nicht.
Abbildung 7.3 Workflow-Kopplung zwischen Ereignis und Verbraucher
Field name Example Description
OBJCATEG BO Object Type Category
OBJTYPE IDOCAPPL Type of Objects in Persistent Object References
EVENT INPUTERROROCCURRED Event
RECTYPE TS20000051 Name of Receiver Type
RECMODE Indicator for Event Handler
Tabelle 7.2 Einzeleintrag in der Kopplungstabelle SWFDEVTYP mit Beispielwerten
Kap07.fm Seite 143 Dienstag, 22. April 2003 2:32 14
144 Internes Messaging in R/3
Listing 7.8 SAP R/3 Standard-Routine zum Auslösen eines Workflow Events
REPORT RSWEMC01.INCLUDE <CNTAIN>.TABLES: NAST, T681Z.*-----------------------------------------------------** FORM CREATE_EVENT **-----------------------------------------------------*FORM CREATE_EVENT USING RETURNCODE US_SCREEN. INCLUDE RSWUINCL. DATA: L_EVENT_CREATOR LIKE SWHACTOR .
RECCLASS Class Name of Handler
RECINTERF Interface Name of Handler
RECMETH Name of Handler Method
RECMETYP Method Type
RECFB SWE_TEMPLATE_REC_FB Name of Receiver Function Module
RECFBTYP Type of Receiver Function Module
CHECKFB SWE_TEMPLATE_CHECK_FB Name of Check Function Module
CHKFBTYP Type of Function Module
RECGETFB SWE_TEMPLATE_RECTYPE_FB Name of Receiver Type Function Module
GETFBTYP Type of Function Module
RFCDEST WORKFLOW_LOCAL_018 Name of logical RFC destination
DESTTYP Type for Call Destination
TYPELINK Flag: Global event linkage activated
QUEUE X Event Linkage: Enable Use of Queue
REC_ERROR Event Linkage: Behavior Upon Error in Receiver
RECCATEG Workflow: Object Category
RECTYPEID Type of Objects in Persistent Object References
Field name Example Description
Tabelle 7.2 Einzeleintrag in der Kopplungstabelle SWFDEVTYP mit Beispielwerten
Kap07.fm Seite 144 Dienstag, 22. April 2003 2:32 14
SAP R/3 Workflow programmieren 145
DATA: L_OBJKEY LIKE SWEINSTCOU-OBJKEY. DATA: L_EVENTID LIKE SWEDUMEVID-EVTID.* IF NAST-EVENT EQ SPACE OR NAST-OBJTYPE EQ SPACE. RETURNCODE = 4. ELSE. SWC_CONTAINER L_CONT. L_EVENT_CREATOR-OTYPE = ORG_OBJTYPE_USER . "global in RSWUINCL L_EVENT_CREATOR-OBJID = SY-UNAME. "hopefully sy-uname does exist!* Ereignis absetzen L_OBJKEY = NAST-OBJKY. CALL FUNCTION 'SWE_EVENT_CREATE' EXPORTING OBJTYPE = NAST-OBJTYPE OBJKEY = L_OBJKEY EVENT = NAST-EVENT CREATOR = L_EVENT_CREATOR IMPORTING EVENT_ID = L_EVENTID TABLES EVENT_CONTAINER = L_CONT EXCEPTIONS OBJTYPE_NOT_FOUND = 01.
IF SY-SUBRC <> 0. RETURNCODE = 4. ELSEIF NOT L_EVENTID IS INITIAL. RETURNCODE = 0. ELSE. RETURNCODE = 4. ENDIF. ENDIF.ENDFORM.
Kap07.fm Seite 145 Dienstag, 22. April 2003 2:32 14
146 Internes Messaging in R/3
7.3 Workflow-HandlerWorkflow braucht
EventhandlerNachdem ein Workflow einen Event ausgelöst hat, wird noch ein Pro-gramm benötigt, das auf diesen Event reagiert und eine Handlung aus-führt. Ein solcher Eventhandler kann in SAP R/3 entweder eine Methodevon einem Business-Objekt sein oder ein Funktionsbaustein, der einerbestimmten Parameterkonvention folgt.
Vorlage fürWorkflow-Handler
Im Falle eines Funktionsbausteins haben wir die gleiche Abarbeitungslo-gik wie bei einem IDoc, nur dass diesmal keine Nachricht erstellt undabgespeichert, sondern eine Aktion direkt ausgeführt wird. Als Vorlagefür das Interface des Funktionsbausteins kann man SWW_WI_CREATE_VIA_EVENT nehmen. Der neu angelegte Funktionsbaustein kann dann indie Kopplungstabellen für den Workflow (SWETYPECOU beziehungs-weise SWFDEVTYP) eingetragen werden und wird nach Auslösen einesentsprechenden Events vom Funktionsbaustein SWE_EVENT_CREATEdynamisch aufgerufen.
Das folgende Listing kann als Vorlage für ein Interface eines Workflow-Handlers dienen.
Listing 7.9 Interface eines typischen Workflow-Handlers
FUNCTION SWW_WI_CREATE_VIA_EVENT.*"----------------------------------------------------*"*"Lokale Schnittstelle:*" IMPORTING*" VALUE(EVENT) LIKE SWETYPECOU-EVENT*" VALUE(RECTYPE) LIKE SWETYPECOU-RECTYPE*" VALUE(OBJTYPE) LIKE SWETYPECOU-OBJTYPE*" VALUE(OBJKEY) LIKE SWEINSTCOU-OBJKEY*" TABLES*" EVENT_CONTAINER STRUCTURE SWCONT*"----------------------------------------------------
Kap07.fm Seite 146 Dienstag, 22. April 2003 2:32 14
Programmieren mit mehreren Programmiersprachen 147
8 Programmieren mit mehreren Programmiersprachen
Zu den besonderen Kennzeichen der modernen, kollaborativer Programmierung gehört es, dass man nicht mehr in nur einer einzigen Programmiersprache entwickelt, sondern jeweils die für die Anwendung vorteilhafteste Sprache kennen muss.
»Die Grenzen deiner Sprache sind auch die Grenzen deiner Welt.«»The limits of your language are the limits of your world.«
Ludwig Wittgenstein, deutscher Philosoph und Begründer der modernenLinguistik
8.1 Von Plattformen, Frameworks und Personalities
Beim Konkurrenzkampf der Anbieter moderner Softwarelösungen ist sehrviel die Rede von Plattformen, von Frameworks und von Personalities.Dabei versteht man unter Plattform die Hardware, mit Frameworkbezeichnet man die Laufzeitumgebung, unter der die Programme ausge-führt werden, und die Personality ist der »Charakter«, die verwendeteProgrammiersprache.
8.1.1 Plattformen
Für die Bedeutung des Begriffs »Plattform« gibt es zwei Definitionen:
� Hardware-PlattformEine Plattform ist die Hardware-Umgebung, unter der eine bestimmteApplikation ausgeführt wird.
� virtuelle Plattformalternative Namen: virtuelle Maschine, Framework, Runtime, sieheauch Framework. Eine virtuelle Maschine, auf der eine Applikation aus-geführt wird und die sich der Applikation gegenüber wie eine realeHardware-Plattform mit einem eigenen, abgeschlossenen Betriebssys-tem präsentiert.
Um die Mehrdeutigkeit hinter uns zu lassen, werden wir als »Plattform«grundsätzlich nur die Hardware-Umgebung bezeichnen. Folgende Platt-formen sind im SAP-Umfeld relevant:
Kap08.fm Seite 147 Dienstag, 22. April 2003 2:32 14
148 Programmieren mit mehreren Programmiersprachen
� Intel-basierte Plattformen, auch Windows-NT-Plattform Dies sind all die Plattformen, die mit einem Intel-kompatiblen Prozes-sor ausgestattet sind. In der Praxis ist das gleichbedeutend damit, dasswir einen Computer mit einer Windows-Variante als Betriebssystemhaben.
� Nicht-Intel-basierte PlattformenEs geht hier um die Computer, die nicht das Betriebssystem Windowsunterstützen. Dabei handelt es sich in der Mehrzahl um UNIX-Sys-teme, aber auch andere Betriebssysteme kommen hier durchaus inFrage. Die wichtigsten Betriebssysteme sind:
� UNIXUNIX wird heutzutage von nahezu jeder Standardware unterstützt.Es ist jedoch zu beachten, dass jeder Hersteller seine Variante einesUNIX anbietet, die nicht in allen Details zueinander kompatibelsind, weder abwärts noch aufwärts.
� Linux – die Open-Source-Variante von UNIXLinux ist eine weitere Variation von UNIX, hat jedoch durch die OSFeine ungewöhnlich hohe Verbreitung. Zwar gibt es auch bei LinuxDialekte, aber dadurch, dass Open-Source-Projekte Linux ihrenSourcecode grundsätzlich offen legen müssen, ist die Dialektvielfaltparadoxerweise geringer als zwischen proprietären Implementie-rungen des UNIX-Standards.
� IBM AS/400Insbesondere in der produzierenden Industrie mit einer hoch auto-matisierten Maschinensteuerung finden sich noch viele AS/400-Computer. Auf diesen Computern läuft sehr häufig über viele Jahregewachsene Software, die hoch spezialisiertes Know-how beinhal-tet oder gesondert entwickelte Anpassungen an die zu steuerndeMaschine enthält. Da diese Anwendungen nur schwer zu portierensind, ist es sehr kompliziert, diese Computer zu ersetzen.
� Mac OS – Apple MacintoshDer Mac ist immer noch der Exot unter den Personal Computernund wird es wohl auch bleiben. Dennoch gibt es Industriezweige,zum Beispiel die Werbe- und Druckerei-Branche, die auf dieseGeräte setzen. Dank der Webtechnologie lässt sich ein Mac heutzu-tage auch in Enterprise-Netzwerke einbinden.
� MainframeAlles, was von den klassischen Mainframes übrig geblieben ist, sinddie S/390-Rechner von IBM, deren Nachfolger, die z-Series, und
Kap08.fm Seite 148 Dienstag, 22. April 2003 2:32 14
Von Plattformen, Frameworks und Personalities 149
eine Anzahl von Klonen, die diese Rechner nachbauen. Auch für dieMainframes ist es heute nicht mehr opportun, den Geist aus der Fla-sche zu lassen und sich mit den Protokolldetails zu befassen. Statt-dessen kommuniziert man auch mit Mainframes über Webservices.
8.1.2 Frameworks und Personalities
Framework = Laufzeitumgebung
Ein Framework stellt der Applikation eine Laufzeitumgebung zur Verfü-gung, die bereits den größten Teil der immer wiederkehrenden Funktio-nalitäten implementiert. Das garantiert eine einheitliche Gestaltung derApplikationen auf dem Framework, zum Beispiel ein gemeinsames Look-and-Feel der Oberfläche oder ein standardisiertes Verfahren, auf eineDatenbank oder ein Dateisystem zuzugreifen. Gleichzeitig liefert ein Fra-mework alle Werkzeuge, um Programme für die Runtime-Umgebung auf-zubereiten, zum Beispiel Direkthilfen für die Nutzung der Runtime-Bibli-otheken.
Frameworks ersetzen das Betriebssystem
Frameworks sind mittlerweile zu einer strategischen Basis für Enterprise-Applikationen geworden. Durch Frameworks ist Rapid Application Deve-lopment (RAD) erst möglich geworden. Für einen Entwickler ersetzt dasFramework weitgehend das Betriebssystem.
Wahl der Programmier-sprache
Es hat sich mittlerweile durchgesetzt, dass man eine Applikation nicht not-wendigerweise in einer einzigen Programmiersprache programmierenmuss. Vielmehr unterstützen moderne Frameworks verschiedene Pro-grammiersprachen und Programmierkonzepte, zum Beispiel objektorien-tiert oder sequenziell, imperativ oder abfrageorientiert. Damit ist die Wahlder Programmiersprache keine Design-Entscheidung mehr, sondern kannsich nach den Fähigkeiten oder Vorlieben des Entwicklers richten. Je nach-dem, in welcher Programmiersprache oder nach welchem Programmier-modell man entwickelt, spricht man von einer Personality des Frameworks.
Hier sind Beispiele für Frameworks und die enthaltenen Personalities:
� Microsoft.NET-Framework Das Microsoft.NET-Framework ist eine stabile, auf Transaktionenbasierende Laufzeitumgebung für NT und Windows 2000 und die kon-sequente Weiterentwicklung von Microsofts COM+-Architektur, diewiederum der Zusammenschluss von COM und MTS, dem MicrosoftTransaction Server, ist. Microsoft.NET unterstützt eine Anzahl von Pro-grammiersprachen, die jede für sich genutzt, aber auch gemischt ver-wendet werden können. Der Kern von Microsoft.NET ist die CommonLanguage Runtime (CLR), welche die eigentliche Virtual Machine vonMicrosoft.NET darstellt und in etwa der Java VM entspricht.
Kap08.fm Seite 149 Dienstag, 22. April 2003 2:32 14
150 Programmieren mit mehreren Programmiersprachen
� SAP Web Application Server (ABAP Personality) Der SAP Web Application Server (Web AS) ist der um einen Webservererweiterte Kernel von SAP R/3 und auch bekannt als SAP-Basis Release6.x. Anders, als der Name Web AS suggeriert, handelt es sich nicht umeinen reinen webbasierten Applikationsserver, sondern um die verbes-serte, vollständige Entwicklungs- und Laufzeitumgebung von ABAP.
� Java Virtual Machine (JVM)Bei Java muss man etwas weiter ausholen, denn Java machte die virtu-ellen Maschinen wieder hoffähig (auch wenn ABAP noch nie andersfunktionierte). Die virtuellen Maschinen waren immer das hässlicheEntlein der Entwicklerwelt, immer geschmäht, weil sie angeblich zugroß, zu langsam und zu unflexibel waren, aber wenn sie, wie im Fallevon ABAP, auf der richtigen Plattform liefen, zeigte sich ihre wahreÜberlegenheit.
Es macht zwar den Anschein, als ob mittlerweile jeder ProgrammiererJava beherrsche, aber das ist wohl ein Trugschluss. Deshalb hier einekleine Einführung auch in die Konzepte von Java.
Wenn man von Java sprechen, meinen man damit in Wirklichkeit dreiverschiedene Dinge:
� die Programmiersprache Javaeine an die Syntax von C++ angelehnte Programmiersprache
� Die Java Virtual Machine, JVMdie Runtime-Umgebung, auf der Java ausgeführt wird
� Java Appletseine besondere Version von Java-Runtime-Code, die dafür gedachtist, über einen Browser geladen und auf der Workstation ausgeführtzu werden
Java ist einP-Code-Compiler
Das Konzept von Java sieht vor, dass in Java geschriebene Programme(Dateisuffix: .java) durch einen Compiler in einen optimierten Zwi-schencode übersetzt werden (Dateisuffix: .class). Der Zwischencodewird dann beim Aufrufen der Klasse durch die Runtime interpretiertund ausgeführt.
Kein Compile-on-Demand
Grundsätzlich ist das das gleiche Prinzip wie bei ABAP. Allerdings merktJava selbst nicht, wenn sich der Sourcecode geändert hat, demnachcompiliert Java nicht automatisch den Zwischencode nach jeder Ände-rung neu.
Kap08.fm Seite 150 Dienstag, 22. April 2003 2:32 14
Programmiersprachen und Entwicklungsumgebung 151
Sprache und Virtual Machine sind unabhängig
Es ist wichtig, sich dieses Unterschiedes bewusst zu sein, denn vieleMissverständnisse bei Diskussionen um Java entstehen dadurch, dassman die beiden Entitäten durcheinander bringt. Es wäre zum Beispielvöllig problemlos, Compiler für andere Programmiersprachen zuschreiben, die als Ergebnis einen JVM-kompatiblen Zwischencodeerzeugen. Andererseits ist auch ein Compiler denkbar, der aus Java-Code eine ausführbare Datei oder den Zwischencode für eine andereUmgebung erzeugt. Microsoft.NET macht gerade dies mit der SpracheJ#, hinter der sich Java-ähnliche Konzepte verbergen.
Java gehört in die Gruppe der reinen objektorientierten Sprachen undwurde als solche von SUN Microsystems entwickelt. SUN hat sich denNamen Java und Design der Sprache Java mit einem Copyright schüt-zen lassen, so dass SUN die volle Kontrolle über die weitere Entwick-lung und den Einsatz von Java behalten kann. Insbesondere möchteman damit die zu starke Dialektbildung der Sprache verhindern, aberauch sicherstellen, dass niemand mit dem Namen Java werben darf,der nicht die Zertifizierung von SUN besitzt.
8.2 Programmiersprachen und Entwicklungs-umgebung
Die Auswahl der richtigen Programmiersprache gehört zu den kritischenEntscheidungen innerhalb eines Projekts. Von der Wahl der Program-miersprache hängt oft ab, auf welcher Plattform die Applikation ausge-führt werden kann. Andererseits kann, wie im Falle von Microsoft.NET,auch die Plattform die Wahl der Programmiersprache diktieren.
Ein zu großes Gewicht wird jedoch immer dem Punkt der Portabilität bei-gemessen. Java ist portabel, weil es grundsätzlich auf fast allen Compu-terplattformen läuft. Die Portabilität spielt jedoch im Enterprise-Compu-ting eine sehr geringe Rolle, denn wenn sich ein Unternehmen für einePlattform entschieden hat, ist dies eine Entscheidung für Jahrzehnte.Bereits Upgrades und Release-Wechsel von Applikationen sind normaler-weise mit so vielen Risiken verbunden, dass man die Plattform bezie-hungsweise das Framework, auf dem eine Applikation einmal läuft, nichtschnell wechselt. Viel bedeutender sind folgende Aspekte:
� Erfahrung der Entwickler mit der Programmiersprache
� Kompatibilität mit vorhandenen Diensten
� Lesbarkeit der Programme und Nachvollziehbarkeit der Programmlogik
� Zuverlässige Entwicklungsumgebung mit sehr gutem Debugger
Kap08.fm Seite 151 Dienstag, 22. April 2003 2:32 14
152 Programmieren mit mehreren Programmiersprachen
ABAP entschei-dend für Erfolg
von R/3
Es steht außer Zweifel, dass der Erfolg von SAP R/2 und von SAP R/3 ent-scheidend durch die Programmierumgebung ABAP geprägt wurde. Dabeigab weniger die Programmiersprache ABAP an sich den Ausschlag als dieausgereifte und am Zweck orientierte Entwicklungsumgebung.
8.2.1 Die Entwicklungsumgebung
Volle Integrationdes Data
Dictionary
Die ABAP-Entwicklungsumgebung basiert auf einem vollständigen DataDictionary, das schon zu R/2-Zeiten vom Programmeditor aus zugänglichwar, in dem alle wesentlichen Entwicklungselemente durch vernetzte Ver-wendungsnachweise rasch erreichbar sind. Kaum eine IDE kann durch ein-fachen Doppelklick auf einen Tabellennamen in deren Definition springenoder durch Doppelklick auf den Namen eines Unterprogramms sofort alleAufrufstellen anzeigen. Der Produktivitätsgewinn ist dadurch enorm, ins-besondere bei der Fehlersuche, ganz zu schweigen davon, dass man Fehlerwie inkompatible oder fehlende Parameter schon im Vorfeld erkennt.
8.2.2 Die Compile-on-Demand-Runtime
ABAP und Turbo-Pascal haben etwas Entscheidendes gemeinsam. Beidehaben bewiesen, dass die theoretischen Ansätze im Compilerbau wenigpraxistauglich sind. Borlands Philipp Kahn gelang der Beweis, dass nichtPascal als Sprache langsam ist, sondern nur die Compiler schlecht. ABAPbringt den Beweis, dass nicht Runtime-Umgebungen langsam sind, son-dern nur deren Implementierungen. Die Performance von SAP R/3 wirdnicht durch die Runtime-Umgebung ausgebremst.
Runtimegarantiert
Unabhängigkeitvon der Plattform
Dafür garantiert die Runtime-Umgebung, dass SAP R/3 unabhängig vonder Hardware-Plattform und dem Betriebssystem bleibt und dass Pro-gramme sofort produktiv zur Verfügung stehen, wenn sich der Source-code oder eines von dessen Elementen ändert. Dies nennt man heuteCompile-on-Demand, auch wenn es den Begriff noch gar nicht gab, alsABAP dies schon konnte.
8.2.3 Der Debugger
Debugger sindSchlüssel zum
Erfolg
Ein hervorragender Debugger ist ein wichtiger Teil einer Entwicklungsum-gebung. Er dient vornehmlich der Fehlersuche, aber auch der Qualitäts-kontrolle. Das Nachvollziehen jedes einzelnen Programmschrittes unterBeobachtung ausgewählter Variablen (Watches) erlaubt Einsichten in denProgrammablauf, die im bildlich analogen Sinne den Unterschied zwischenTag und Nacht machen: Ohne Debugger läuft Ihr Programm im Dunkelnab, während mit Debugger Sie das Programm beobachten können.
Kap08.fm Seite 152 Dienstag, 22. April 2003 2:32 14
Programmiersprachen und Entwicklungsumgebung 153
8.2.4 Einrichten einer Entwicklungsumgebung
Bevor Sie anfangen zu entwickeln, sollten Sie sich zunächst eine einiger-maßen stabile Entwicklungsumgebung installieren. Vor allem sollten Siesich das SAP GUI komplett auf Ihrer Arbeitsstation einrichten, da diesesfast alle RFC-relevanten Tools enthält.
Komplette SAP GUI-Installation
Es ist für einen Entwickler grundsätzlich empfehlenwert, das SAP GUIkomplett mit allen Zusätzen zu installieren. Es kann auch nicht schaden,sich die neueste Version des SAP GUI noch einmal über einen bestehen-den SAP GUI zu installieren, da dann sichergestellt ist, dass auch keineder SAP GUI-Komponenten von anderen Installern zwischenzeitlichüberschrieben wurde. Wenn Sie bisher noch nicht mit RFC von Fremd-systemen gearbeitet haben, ist es auf alle Fälle empfehlenswert, die ers-ten und auch zweiten Schritte mit einem Windows-System zu machen.Zwar geht auch fast alles von UNIX aus, aber dort sind Sie weitgehend aufJava beschränkt und viele Dinge sind deutlich schwieriger zu realisieren.
Installation eines Webservers
Sie müssen einen Webserver installiert haben, der Ihre Testbeispiele auchverwalten und ausführen kann. Dabei haben Sie die Wahl zwischen Mi-crosoft Internet Information Server, der Bestandteil jedes Windows 2000Professional-Systems ist. Für ältere NT-Systeme gibt es eine Version vonIIS im NT-Options-Pack.
Für Entwicklungen in Java können Sie entweder auf Apache Jakarta Tom-cat (www.apache.org, Projekt Jakarta) oder auf einen anderen der kom-merziellen Webserver, zum Beispiel IBM WebSphere, zurückgreifen.Tomact 4.0 basiert übrigens auf der Version von IBM WebSphere 4.0.
IDE installierenWenn Sie ASP-Seiten für den IIS entwickeln wollen, müssen Sie sicher-stellen, dass Sie eine aktuelle Version des Windows Scripting Host (WSH)zum Ausführen der Visual-Basic-Script-Befehle (VBS) verwenden. AlleScripting-Befehle für VBS und Jscript innerhalb einer Active Server Pagewerden an den WSH weitergereicht. WSH wiederum kann dann einebeliebige Windows-Applikation oder ein DCOM/ActiveX-Objekt aufru-fen.
Microsoft.NET Um richtige, transaktionsfähige Applikationen zu entwickeln, bietet sichdann das Microsoft.NET-Framework an. Dieses ist die Zusammenführungder alten COM-Technologie (auch OLE/ActiveX genannt) und des Micro-soft Transaction Server, MTS, mit der Common Language Runtime, CLR.
Kap08.fm Seite 153 Dienstag, 22. April 2003 2:32 14
154 Programmieren mit mehreren Programmiersprachen
8.2.5 Plattformentscheidung: UNIX versus Windows NT
Wie bereits erwähnt, ist die Entscheidung für eine Plattform eine Ent-scheidung für ein Jahrzehnt. Einmal getroffen, werden Sie die nächstenzehn Jahre damit leben müssen. Dennoch ist die Entscheidung für dieeine oder andere Umgebung weniger dramatisch, als es gerne dargestelltwird. Sie sollten sich zur Entscheidungsfindung folgende Fragen stellen:
� Passt der neue Rechner in die alte Landschaft?Die Frage ist von hoher finanzieller Bedeutung. Wenn Ihr Unterneh-men zum Beispiel nur UNIX-Rechner in Betrieb hat, erfordert bereitsdas Hinzufügen eines einzigen Windows-Rechners, dass Sie Ihr Perso-nal für die Hardware und die Applikationen schulen. Auch müssen dieVerbindungen zwischen den Systemen funktionieren und Massen-Lizenzen werden oft getrennt nach Betriebssystem berechnet.
� Wird es in Zukunft genug ausgebildetes Personal geben?Je mehr Fachleute es für eine bestimmte Technik auf dem Markt gibt,desto schneller können Sie Personalengpässe ausgleichen und destoleichter finden Sie einen Spezialisten für gezielte Maßnahmen. Hierhaben Microsoft und Linux ganz deutlich die Nase vorn, denn allenanderen Betriebssystemen, auch dem klassischen UNIX, laufen dieguten Leute weg. Derzeit finden sich deutlich mehr Spezialisten, diedetailliert die Microsoft-Palette beherrschen, als für Linux.
� Wie sind die Unterhaltskosten im Vergleich?Auch hier gibt es kaum einen Unterschied zwischen NT und UNIX.Durch die Annäherungen von PC und Mainframe und den Trend, liebermehrere kleine als einen ganz großen Computer einzusetzen, ist dieHardware-Plattform weitgehend identisch, wenn auch Microsoft aufIntel-Systeme begrenzt ist.
� Für welche Plattform gibt es die meisten Utilities?Hier gibt es klare Vorteile für Windows. Da die meisten brauchbarenTools nicht explizit für eine Server-Umgebung, sondern für die breiteMasse der Desktop-Nutzer entwickelt wurde, ist das Angebot für Win-dows-Utilities riesenhaft im Vergleich zu UNIX.
8.2.6 Framework: Web AS/ABAP, Microsoft.NET oder J2EE
Bei der Entscheidung für das Framework erweist sich derzeit der SAPWeb AS mit der ABAP Personality als der Favorit. Das kann sich nochändern, wenn Microsoft seine Microsoft.NET-Plattform auch auf Linux-Systemen herausbringt und somit die Begrenzung auf Intel-Rechnerbeziehungsweise auf Macintosh überwindet.
Kap08.fm Seite 154 Dienstag, 22. April 2003 2:32 14
Programmiersprachen und Entwicklungsumgebung 155
Jede Menge Tool für Microsoft
Microsoft.NET hat eine hohe Flexibilität bei der Auswahl der Program-miersprache und die bei weitem größte Palette an Hilfsmitteln und Appli-kationen, die durch COM benutzt werden können. Für Textformatierun-gen verwendet man die Controls aus Microsoft Word, für komplexeBerechnungen greift man auf Excel zurück, und das Erzeugen von PDFsüberlässt man den Destiller-Tools von Adobe oder dem Fineprint PDFma-ker. Im Grunde lässt sich jedes moderne Windows-Programm von einemanderen Programm steuern und somit durch Microsoft.NET unmittelbarnutzen.
J2EE ist unab-hängig von der Plattform
J2EE läuft auf fast allen Betriebsystemen, nicht nur auf Windows undUNIX, sondern auch auf Großrechnern. Außerdem wird J2EE von WebS-phere und Tomcat unterstützt, nicht aber von IIS. Allerdings ist dieserhohe Grad an Portabilität nur nachrangig für ein einzelnes Unternehmen,das sich für eine Plattform bereits entschieden hat. Das hohe Maß anUnterstützung von Open-Source-Projekten spricht für J2EE.
WebAS hat höchste Flexi-bilität und Portabilität
Der SAP Web AS ist das Framework mit dem höchsten Grad an Flexibili-tät, da es auf dem bewährten SAP R/3-Kernel aufbaut und in ABAP ent-wickelt ist. Die BSP stellen den vollen Funktionsumfang von Server Pageszur Verfügung, bieten demnach die Möglichkeit, Webentwicklungen ausJava direkt zu übernehmen.1 Gleichzeitig steht das SAP R/3-Transaktions-management in vollem Umfang zur Verfügung.
Web AS nutzt das Transaktions-Management
Damit ist der WebAS das einzige Framework, das ein in der Praxis erprob-tes und auf die realen Bedürfnisse zugeschnittenes Transaktionsmanage-ment und Applikationsserver in den Webserver integriert. Zwar bietenauch J2EE und Microsoft.NET diese Möglichkeiten, aber es gibt bis heutekeine Business-Applikationen, die eine solche Verbreitung haben, dass siein der Lage wären, einen Standard zu etablieren.
Anwendungen treiben einen Standard voran
Es darf nämlich niemals vergessen werden, dass alle Frameworks nur dasVehikel für eine Applikation bereitstellen. Um diesen zum Erfolg zu ver-helfen, muss das Vehikel auch einen praktischen Nutzen haben. DerErfolg von SAP R/3 gründet darauf, dass es nicht leere Datenbanken undEntwicklungsumgebungen ausliefert, sondern dazu auch funktionierendeAnwendungen. Es müssen also Anwendungen auf den Frameworks ent-stehen, die eine Verbreitung in der Praxis finden. In diesem Punkt ist derSAP Web AS klar im Vorteil.
1 Mit dem Realese 6.30 wird auch die Implementierung der J2EE-Laufzeit- und Ent-wicklungsumgebung vollständig abgeschlossen sein, so dass auch auf dem SAPWeb AS direkt in Java programmiert werden kann.
Kap08.fm Seite 155 Dienstag, 22. April 2003 2:32 14
156 Programmieren mit mehreren Programmiersprachen
8.2.7 Windows Scripting Host versus Visual Basic
Der Windows Scripting Host (WSH) ist eine Klassenbibliothek und bein-haltet auch den VBScript-Interpreter. Der WSH ist ein Add-On zu Win-dows und findet sich in dem EXE-File WSCRIPT.EXE. Es gibt auch eineVersion für DOS mit dem Namen CSCRIPT.EXE.
Sie sollten sich vergewissern, dass Sie jeweils die neueste Version von VBShaben. Sie können Versionen bei Microsoft herunterladen unter http://msdn.microsoft.com/scripting.
VBS sindTextdateien
Alle Eingaben für VBS sind einfacher ASCII-Text, das heißt, die Programmekönnen mit einem beliebigen Texteditor erfasst werden. VBS-Programmewerden an der Datei-Erweiterung .vbs von Windows erkannt und durchWSCRIPT ausgeführt. Andere Betriebssysteme wie UNIX haben ähnlicheScript-Prozessoren, für UNIX gibt es zum Beispiel RSH und Apachebenutzt die Scriptsprache Perl.
Folgendes charakterisiert die Sprachen Visual Basic, Visual Basic Scriptund Visual Basic for Applications:
� Visual BasicVisual Basic als Compiler-Variante ist Bestandteil von Microsoft VisualStudio, der IDE von Microsoft. Mit VB können Sie eigene COM- undEXE-Objekte erzeugen.
� Visual Basic ScriptVBS ist eine eingeschränkte Interpreter-Version von Visual Basic. DieSprachelemente sind auf dem Niveau von Visual Basic 3 und erlaubenkeine typisierten Variablen. Zum Ausführen von VBS-Scripts benötigtWindows den Windows Scripting Host, der in den EXE-DateienCscript.exe (für DOS) und Wscript.exe (für Windows) implementiert ist.
� Visual Basic for ApplicationsVollständige Interpreterversion von VB als Bestandteil von MicrosoftOffice. Mit VBA ist fast alles möglich, was mit VB möglich ist, außerdem Erzeugen von kompiliertem Code.
8.2.8 Windows Classic versus Microsoft.NET
Microsoft Profes-sional Office Suite
Vielleicht stellen Sie sich die Frage, warum sich jemand noch mit klassi-schem Visual Basic und insbesondere dem Windows Scripting Host befas-sen soll, nachdem doch Microsoft.NET der neue Standard für alle Ent-wicklungen ist. Leider laufen noch lange nicht alle Applikationen unter
Kap08.fm Seite 156 Dienstag, 22. April 2003 2:32 14
Die Wahl der richtigen Programmiersprache 157
Microsoft.NET. Insbesondere hat Microsoft Office eine Variante vonVisual Basic, das Visual Basic for Applications (VBA) als festen Bestandteileingebaut.
VBA eignet sich für Rapid Proto-typing
Die Entwicklungsumgebung von VBA ist sehr an die von Visual Studioangelehnt und durch die jeweiligen Kernfunktionen der Office Suite, wieTextverarbeitung und Tabellenkalkulation, eignet sich VBA hervorragendals Tool für Rapid Development. Auch lassen sich damit fast alle ASP-Ent-wicklungen elegant und einfach durchführen. Dies ist besonders interes-sant, wenn Sie von ASP aus nur auf vorgefertigte OLE-Komponentenzugreifen wollen, was zum Beispiel der Fall ist, wenn Sie mit SAP-BAPIsprogrammieren wollen, kurz gesagt, wenn Sie schnell etwas entwickelnwollen. Der Debugger hat die gleiche volle Funktionalität wie auch VisualStudio. Der einzige Nachteil ist, dass VBA keine kompilierten COM-Objekte erzeugen kann. Hierfür müssen Sie dann doch Visual Studio oderBorland Delphi heranziehen. Für komplexe Neuentwicklungen empfeh-len wir Delphi oder Microsoft.NET.
8.3 Die Wahl der richtigen Programmiersprache
Für Webentwicklungen kommen eine ganze Reihe von Programmierspra-chen in Frage. In einer modernen Client-Server-Umgebung geht es dabeinicht darum, sich für eine Sprache für die komplette Architektur zu ent-scheiden, sondern die Sprache für den jeweiligen Zweck auszuwählen.
8.3.1 Sprache für den Webserver
Die Programmiersprache zum Entwickeln von dynamischen Webseitenwird in der Regel durch den Webserver bestimmt. Für den IIS ist dasVisual Basic Script (VBS), die auf WebSphere basierenden Server (Web-Sphere und Tomcat) unterstützen zunächst nur Java. Zwar sind Plug-Insfür weitere Programmiersprachen bei allen Webservern vorgesehen, aberdies ist in der Praxis unrealistisch, denn damit würde man in den Kern desWebservers eingreifen und genau das ist ein Tabu.
ASP.NET unter-stützt alle .NET-Sprachen
Mit ASP.NET ist die neue Vielfalt für Sprachen eingezogen, denn der .NET-IIS unterstützt zunächst die Common Language Runtime (CLR) und damitalle Microsoft.NET-Sprachen die den Zwischencode kompatibel zur CLRerzeugen. Damit haben Sie zunächst einmal die Wahl zwischen C#, J#und VB.NET, demnächst wohl auch noch X#, einer LISP-ähnlichen Spra-che zum Programmieren in XML-Dokumenten.
Kap08.fm Seite 157 Dienstag, 22. April 2003 2:32 14
158 Programmieren mit mehreren Programmiersprachen
8.3.2 Java
Java an sich dürfte mittlerweile in der Entwicklergemeinde hinreichendbekannt sein. Die Sprache wurde vom kalifornischen Hardware-HerstellerSUN als plattformunabhängige Sprache entwickelt. Über den schon vomamerikanischen Verteidigungsministerium bei der Sprache ADA ange-wandten Trick, die Sprachdefinition und Sprachbezeichnung einem Copy-right zu unterwerfen, versucht SUN, die Kontrolle über die Evolution vonJava zu behalten.
8.3.3 J#
J# ist die Java-Implementierung von Microsoft und ein Dialekt des Origi-nals. Wegen des erwähnten Copyrights auf Java und der damit verbunde-nen Dauerfehde zwischen Microsoft und SUN entstand der neue Name.
8.3.4 Visual Basic (VB) und Visual Basic for Applications (VBA)
Visual Basic basiert auf der alten Basic-Programmiersprache, ist aber mitt-lerweile zu einer mächtigen, prozeduralen Programmiersprache gereift.VB ab dem Release 6 unterstützt viele Ansätze der Objekt-Programmie-rung, allerdings nicht den Polymorphismus und das Overloading. Für Ent-wicklungen, die gezielt für Windows-Plattformen gemacht werden, ist VBdie Programmiersprache der Wahl. Man muss aber dabei eingestehen,dass die Objektansätze vor allem in der COM-Struktur liegen.
Visual Basic forApplications
Visual Basic for Applications (VBA) ist eine fast vollständige Interpreterva-riante von VB und Bestandteil aller Microsoft-Office-Anwendungen, zumBeispiel von Microsoft Word, Excel, Access 2000 oder Visio. Es beweistsich, dass man mit VBA und Excel sehr effiziente Prototypen für Windowsentwickeln kann. Wenn sich die Anwendung stabilisiert hat, kann man siedann mit VB in eine Windows-DLL kompilieren.
8.3.5 Visual Basic Script (VBS) und ASP
Visual Basic Script ist eine Untermenge von VB. Es ist eine reine Interpre-ter-Sprache und unterscheidet sich vor allem dadurch von VB, dass eskeine typisierten Variablen unterstützt. Der Typ der Variablen wird erstzur Laufzeit bestimmt und die passende Datenstruktur auf dem Stackangelegt. Folgende Deklaration geht also nicht in VBS:
Dim LogonControl As SAPLogonCtrl.SAPLogonControlDim Functions As SAPFunctionsOCX.SAPFunctionsDim TableFactory As SAPTableFactoryCtrl.SAPTableFactory
Kap08.fm Seite 158 Dienstag, 22. April 2003 2:32 14
Die Wahl der richtigen Programmiersprache 159
Stattdessen können wir nur deklarieren:
Dim LogonControl Dim FunctionsDim TableFactory
Entsprechend geht auch die Instanzziierung eines Objekts nur über dieexplizite Angabe des Verweises auf die Windows-Registry. Es geht alsonicht:
Set LogonControl = New SAPLogonCtrl.SAPLogonControlSet Functions = New SAPFunctionsOCX.SAPFunctionsSet TableFactory = New SAPTableFactoryCtrl.SAPTableFac-tory
Stattdessen müssen wir die Objekte entsprechend den folgenden Bei-spielen erzeugen.
Set LogonControl = CreateObject("SAP.LogonControl.1") Set Functions = CreateObject("SAP.Functions") Set TableFactory = CreateObject("SAP.TableFactory.1")
8.3.6 C#
C# ist Microsofts Zugpferd, um die Java-Fangemeinde auch für Windows-Plattformen zu gewinnen, ohne sich dabei zu sehr von SUN abhängigmachen zu müssen. Offiziell ist C# trotz der auffallenden Ähnlichkeit mitJava als Nachfolger von C++ positioniert, was aber vor allem den Sinn hat,den rechtlichen Problemen mit dem Copyright auf Java aus dem Weg zugehen.
8.3.7 X#
X# existierte nur als Konzept, als dieses Buch in Druck ging, weshalb Bei-spiele hier nur von begrenzter Haltbarkeit sind. X# basiert auf XML undist ein Ansatz, XML-Dokumente als Teil eines Programms zu sehen undnicht als manipulierbares Objekt, wie es die anderen Programmierspra-chen wie Java oder VB tun. Das wird dann etwa wie folgt aussehen:
Gehen wir von dem simplen Animal-Farm-Beispiel aus:
<FARM></FARM>
Kap08.fm Seite 159 Dienstag, 22. April 2003 2:32 14
160 Programmieren mit mehreren Programmiersprachen
Mit einer X#-Sprache könnte das Programm dann etwa so aussehen:
Set XMLDocument = new MSXML.Document()For each ANIMAL in XMLDocumentFor each NAME in ANIMAL Write NAME.textNextNext
Wie gesagt, so könnte X# einmal aussehen, veröffentlichte Prototypengibt es bislang nicht.
8.3.8 Delphi
Reiches Erbe Delphi ist von allen Programmiersprachen die bei weitem mächtigste.Entstanden aus dem Klassiker Turbo-Pascal, war Delphi zu jeder Zeit dieBest-of-Breed-Sprache, die die jeweiligen Konzepte zuverlässig und sau-ber implementiert hat. Delphi erbt also von
� Pascal und VBDelphi ist durch die Pascal-Syntax einfach lesbar.
� JavaDelphi hatte alle OOP-Konzepte schon frühzeitig implementiert, ins-besondere
� Vererbung
� Polymorphismus
� Overloading
� Interfaces
� C und PascalDelphi ist aber auch prozedural, erlaubt also auch prozedurale Pro-grammierung, falls nötig.
Für die Entwicklung komplexer Applikationen ist Delphi zu jeder Zeit dieerste Wahl.
8.3.9 ADA
Produkt desVerteidigungs-
ministeriums
Vielleicht wäre ADA groß herausgekommen, wenn nicht ausgerechnetdas US-Verteidigungsministerium der geistige Vater wäre. ADA wurde1979 in dessen Auftrag von dem französischen Software-GigantenHoneywell-Bull entwickelt und hatte bereits bei seinem Entstehen 1979sämtliche Konzepte des OOP realisiert. Gleichzeitig hatte man sich aber
Kap08.fm Seite 160 Dienstag, 22. April 2003 2:32 14
Die Wahl der richtigen Programmiersprache 161
von den kryptischen Ansätzen anderer Sprachen, allen voran C, gelöstund entscheidenden Wert auf Lesbarkeit gelegt. Auch die Idee, dass maneine Programmiersprache mit einem Copyright belegen könnte, um dieEvolution in den Griff zu bekommen, stammte aus dem ADA-Projekt.
ADA fand jedoch niemals große Verbreitung in der Industrie, was vermut-lich weniger dem Misstrauen dem Verteidigungsministerium gegenüberzu verdanken ist als der Tatsache, dass sich kaum ein einziger brauchbarerund gleichzeitig günstiger ADA-Compiler auf dem Markt wiederfand.Dadurch blieb ADA trotz seiner Vorzüge immer eine Sprache für eine Eliteund finanzstarke Software-Schmieden, während sich die Heerscharen vonjungen, kreativen und privaten Software-Entwicklern zunächst mit Turbo-Pascal zufrieden gaben und dann an dem kostenlos vertriebenen JavaGefallen fanden.
8.3.10 SmallTalk
SmallTalk ist der Urvater der OOP und realisiert den Objekt-Ansatz inradikaler Form. Die legendäre Apple Lisa besaß damals ein Betriebssys-tem, das vollkommen in SmallTalk geschrieben war. Dem Lisa-Anwenderwar das aber egal, der merkte nur, dass das Betriebssystem ziemlich lang-sam war.
8.3.11 LISP
LISP war eigentlich schon fast vergessen, aber die Ankündigung von X#brachte es wieder auf den Tisch. LISP ist eine Sprache, die ein Programmals hierarchisches Dokument ansieht und zwischen Daten und Programmkeinerlei Unterscheidung trifft. Ursprünglich wurde LISP ausschließlich inder Künstlichen-Intelligenz-Forschung verwendet, vor allem zur Manipu-lation von neuronalen Netzen. Mit der zunehmenden Verbreitung vonXML wird das Konzept LISP wieder für die breite Masse interessant.
Ein XML-Dokument ist eine Liste. Verbindet man dieses mit einem XSL-Stylesheet, wird in Wirklichkeit ein Programm auf diesem Dokument aus-geführt mit dem Ziel, das Dokument in eine andere Gestalt zu überfüh-ren. Genau das ist auch der Ansatz von LISP. Sobald man erlaubt, dasssich das XSLT-Stylesheet auch selbst manipuliert, hat man die Grenze zwi-schen Programm und Daten durchlässig gemacht.
Kap08.fm Seite 161 Dienstag, 22. April 2003 2:32 14
162 Programmieren mit mehreren Programmiersprachen
8.4 Synopsis der Objektprogrammierung mit Java, VB und ABAP
8.4.1 Grundbegriffe
Programmieren mit Objekten
Objektorientie-rung ist Formdes Denkens
Objektorientierung ist eine Form des Denkens. Ihr Grundgedanke ist dieharmonische und gleichberechtigte Zusammenarbeit einzelner Pro-grammteile auf der Basis von Nachrichten und Ereignissen. Im strengenSinne werden Objekte und ihre Methoden nicht mehr aufgerufen, wiedies bei imperativen Programmiersprachen der Fall ist, sondern sie reagie-ren auf Ereignisse.
Sich selbst organi-sierende Einheiten
Das Denken in selbst organisierenden Einheiten stellt die Grundlage derobjektorientierten Programmierung (OOP) dar. Das Wesen der OOP istnicht gekennzeichnet durch Interfaces, Methoden, Properties, Instanzen,Lebenszeit, Procedure Overloading, Polymorphismus oder Datenkapse-lung. All diese schönen Dinge sind nichts weiter als »Features« und stel-len Leistungen der verwendeten Entwicklungsumgebung und des zuGrunde liegenden Entwicklungssystems dar. Als solche waren diese Fea-tures schon immer in der einen oder anderen Form auch in den prozedu-ralen Sprachen vorhanden und spiegeln damit nur die Fortschritte aufdem Niveau der Entwicklungsumgebungen wider.
Messages sinddas Herz der OOP
Damit kehrt die objektorientierte Programmierung auch den traditionel-len Ansatz um: Anstatt eine Applikation in einem großen Programmhyb-rid zu erstellen, existieren nun unzählige kleine Objekte, die eineGemeinschaft bilden und miteinander kommunizieren. OOP ist gekenn-zeichnet durch die Koexistenz von spezialisierten Objekten und derenFähigkeit, auf Messages zu reagieren und selbst Aufgaben (Tasks) durchAustausch von Messages zu delegieren.
Interfaces
Das Interface eines Objekts ist eine Anzahl von Methoden, die zum Aus-tausch von Informationen mit fremden, nicht vertrauenswürdigen (nottrusted) Objekten dienen.
Interfaces bestim-men die Identität
des Objekts
Eine wesentliche Forderung an ein Objekt-Interface ist es, dass das Inter-face die Objektklasse auch hinreichend charakterisieren sollte. Dasbedeutet vor allem, dass das Objekt-Interface sich nicht mehr änderndarf, wenn die Klasse bereits von dritter Seite verwendet wird. Andersausgedrückt: Ändert sich das Interface einer einmal veröffentlichten
Kap08.fm Seite 162 Dienstag, 22. April 2003 2:32 14
Synopsis der Objektprogrammierung mit Java, VB und ABAP 163
Klasse, ist es nicht mehr dieselbe Klasse, auch wenn sie den gleichenNamen trägt. Die meisten Entwicklungsumgebungen tragen dem auchRechnung, indem sie automatisch Versionen ziehen und die jeder Klasseeindeutig zugewiesenen GUID (Global Universal Identifier) neu vergeben.
Methode
Eine Methode ist die Korrespondenz zu einer Prozedur oder einer Funk-tion in klassischen Programmiersprachen.
Property
Eine Property oder Eigenschaft ist eine Sonderform einer Methode einerKlasse.
Instanz
Bevor wir ein Objekt verwenden können, muss es anhand einer Vorlageerzeugt werden. Die Vorlage eines Objekts heißt Klasse und das erzeugteObjekt ist eine Instanz der Klasse (Instanz: zeitweilige Existenz, englisch:instance). Das Erzeugen der Instanz nennt man Instanziierung und dieDauer der Existenz der Instanz ist ihre Lebenszeit.
Lebenszeit
Die Dauer der Existenz einer Instanz, das heißt die Zeit zwischen derErzeugung und der Zerstörung der Objektinstanz, nennt man derenLebenszeit (life time).
Overloading
Als Overloading bezeichnet man die Möglichkeit, eine beliebige Methodeeiner Klasse zu überschreiben, ohne die Klasse ändern zu müssen.
Polymorphismus
Unter Polymorphismus versteht man die Fähigkeit einer Laufzeitumge-bung, die Identität eines Objekts nicht nur direkt durch dessen Namen,sondern auch durch eine eindeutige Zusammenstellung seiner Eigen-schaften zu bestimmen.
Polymorphismus berücksichtigt Eigenschaften
Polymorphismus ist eine Dienstleistung des Compilers, die mit dem Auf-kommen der objektorientierten Sprachen populär geworden ist. In dentraditionellen formalen Programmiersprachen wie Pascal, C oder Basic
Kap08.fm Seite 163 Dienstag, 22. April 2003 2:32 14
164 Programmieren mit mehreren Programmiersprachen
konnte man zwar problemlos eigene Unterprogramme und Funktionendeklarieren, aber wenn ein Name bereits einmal für eine Funktion verge-ben war, konnte er an anderer Stelle nicht noch mal eingesetzt werden.
Nehmen wir als Beispiel eine typische polymorphe Prozedur, wie sie infast allen Programmiersprachen existiert, etwa die write-Funktion zumAusgeben von Variablen. Gewöhnlich kann eine solche write-Prozedurlediglich Zeichenfolgen ausgeben, andere Datentypen müssen zuvor ineine solche Zeichenfolge umgewandelt werden. Je nachdem, welchenDatentyp die auszugebende Variable besitzt, muss eine ganz andere Auf-bereitungsroutine aufgerufen werden.
Welche Aufbereitungsroutine dann aufgerufen wird, entscheidet derCompiler oder die Laufzeitumgebung selbstständig. Sie müssen also nie-mals selbst unterscheiden, indem Sie etwa verschiedene Prozeduren wiewriteNum oder writeString gezielt aufrufen.
Wie bereits gesagt, gab es solche Funktionen schon in vielen Program-miersprachen. Neu ist jetzt, dass man auch eigene polymorphe Objektedefinieren kann. Es ist aber noch einmal festzuhalten, dass zwar der Poly-morphismus von allen objektorientierten Sprachen verlangt wird, jedochkeine charakteristische Eigenschaft ist. Zum ersten Mal propagiert wurdeder Polymorphismus in der 1970 vorgestellten ProgrammierspracheMODULA-2.
Beispiel Schauen wir uns noch einmal ein weiteres Beispiel an und nehmen fol-gende sinnlose Klasse .
public class test{private String myName; public test(String initString) {myName = initString;}
Auffallend daran ist, dass der Constructor der Klasse parametrisiert ist.
public test(String initString)
Wenn wir nun eine Instanz dieser Klasse anlegen wollen und wir verges-sen, den Parameter zu übergeben,
myTest = new test()
meldet uns der Java-Compiler korrekterweise:
The constructor test is undefined
Kap08.fm Seite 164 Dienstag, 22. April 2003 2:32 14
Synopsis der Objektprogrammierung mit Java, VB und ABAP 165
In der Regel führt er uns im ersten Moment in die Irre, denn derConstructor test existiert doch! Der Irrtum liegt darin, dass eineMethode in Java immer eindeutig durch den Namen, die Parameter unddie Parametertypisierung bestimmt wird.
Datenkapselung
Mit der Datenkapselung gibt man dem Entwickler eines Objekts die Mög-lichkeit, die innerhalb der Prozeduren deklarierten Variablen und Metho-den in öffentliche und private Objekte zu klassifizieren. Private Objektekönnen fortan nicht mehr von externen Programmen zugegriffen werden.Praktisch versteckt sich dahinter meistens der Zusatz public oder pri-vate in der Deklaration eines Objekts oder einer Variablen.
Klassen
Klassen sind Vorlagen für Objektinstanzen
Klassen sind Muster für die Anlage von Objekten. Jedes Mal, wenn einObjekt erstellt wird, wird nach Vorlage der Klasse ein Speicherbereichreserviert. Dadurch können Objekte im Gegensatz zu klassischen Proze-duren und Funktionen in beliebig vielen Instanzen existieren. Ein Pro-gramm kann also mehrere Instanzen eines Objekts erzeugen undbekommt jedes Mal einen sauberen initialen Zustand des Objekts.
Klassen in Visual Basic
Jede COM-Bibliothek wird von Visual Basic automatisch als Klasse ange-sehen. Zusätzlich können Klassen jederzeit als Teil des aktuellen Projektslokal deklariert werden.
Listing 8.1 Sample-Code einer Klasse
Public counter as Integer
Public Sub inc() counter = counter + 1End Sub
Public Sub clear() counter = 0End Sub
Kap08.fm Seite 165 Dienstag, 22. April 2003 2:32 14
166 Programmieren mit mehreren Programmiersprachen
Klassen in ABAP
Klassen werden in ABAP mit dem Class Builder (SE24) angelegt und auchverwaltet. Einmal angelegt, sind die Klassen über das Repository für alleanderen ABAP-Programme sichtbar.
Klassen in Java
Jedes Java-Programm ist per Definition eine Klasse. Damit geht Java einenumgekehrten Weg wie andere Sprachen: Anstatt Klassen mit traditionel-len Sprachmitteln zu emulieren (wie es auch C++ oder ABAP/IV mit Hilfeeiner Makrobibliothek tun), erzwingt Java das Anlegen von Klassen. Klas-sische Konstrukte wie Unterprogramme oder Funktionen müssen alsKlasseninstanz angesprochen werden.
Java gehört leider zu den Programmiersprachen, deren Programmaufbaualles andere als intuitiv ist. Das liegt daran, dass Java zum einen die kryp-tische C-Syntax übernommen hat und zum anderen die Sprache selbst aufeiner Reihe von Konventionen aufbaut. Deshalb wollen wir uns das Anle-gen einer Klasse etwas genauer ansehen, sozusagen als kurze Einführungin Java und als Erinnerungshilfe für die Gelegenheitsprogrammierer.
Java speichertjede Klasse ineiner eigenen
Datei
Das Konzept von Java sieht vor, dass jede öffentliche Klasse (public class)in einer eigenen Datei des Dateisystems abgespeichert wird. MehrereKlassen lassen sich dann zu einem Package zusammenfassen. Die Dateieneines Packages können auch in einer komprimierten Archivdatei mit der
Abbildung 8.1 ABAP Class Builder
Kap08.fm Seite 166 Dienstag, 22. April 2003 2:32 14
Synopsis der Objektprogrammierung mit Java, VB und ABAP 167
Endung .jar zusammengefasst abgespeichert werden. Grundsätzlich gehtJava von der Annahme aus, dass die Verwaltung von Klassen die Sachedes Betriebssystems sein muss, was eine sehr gute Auffassung ist.
»Hello World«Als Beispiel wollen wir eine neue Klasse HelloWorldClass erzeugen. Zudieser Klasse gehört eine Datei mit dem Namen HelloWorldClass.java,eine Textdatei, die den Code der Datei enthält. Da wir die Klasse wie einHauptprogramm direkt aufrufen wollen, implementieren wir eineMethode mit dem fest vorgegeben Namen main.
Listing 8.2 Java-Class HelloWorld
public class HelloWorldClass { public HelloWorldClass () {} /* Constructor */ public static void main(String[] args) { System.out.println("Welcome to Java Hello World"); }}
public static void main(String[] args) {
Das Beispiel wird beim Aufruf aus der Kommandozeile den String Wel-come to Java Hello World ausgeben. Die einzelnen Elemente desBeispiels lassen sich wie folgt sezieren:
� Aufbau einer KlasseDas Keyword class beginnt eine neue Klasse. Der Code der Klassefolgt dann in geschweiften Klammern ({}) dahinter.
� Standard-Methode mainDie Klasse definiert eine einzige Methode mit dem Namen main. DerName main ist ausschließlich reserviert für einen so genannten MainThread, demnach ein Hauptprogramm. main ist der Name der Default-Methode, die die JVM versucht aufzurufen, wenn keine andereMethode explizit angegeben wurde.
� VoidDas Keyword void zeigt an, dass die definierte Prozedur keine Wertezurückgibt. Demnach ist eine Prozedur mit void ein echtes Unterpro-gramm, während alle anderen einer Funktion entsprechen.
� Kommandozeilen-ArgumenteIm Beispiel besitzt die Methode main noch einen Parameter String[]args. In dieses Array von dynamischer Länge werden alle Parameter
Kap08.fm Seite 167 Dienstag, 22. April 2003 2:32 14
168 Programmieren mit mehreren Programmiersprachen
übergeben, die beim Aufruf der Methode vom Aufrufer angegebenwurden. Die Anzahl der Parameter entspricht der Länge des Arrays undkann mit args.length ermittelt werden.
� Java-CompilerBevor die Klasse ausgeführt werden kann, muss sie erst mit dem Java-Compiler javac übersetzt werden. Wenn die Klasse erfolgreich gene-riert wurde, kann man sie mit dem Java-Runtime-Utility java voneiner Kommandozeile aus testen. java ruft dazu die JVM auf, erzeugteine Instanz der Klasse und führt die Start-Methode aus. Mit demjavap-Utility erhält man Informationen über die Klasse.
Listing 8.3 Kompilieren der HelloWorld-Class mit der Java Command Line Utility
java –verbose HelloWorldClass [parsing started HelloWorldClass.java][parsing completed 130ms][loading F:\jbuilder5\jdk1.3\jre\lib\rt.jar(java/lang/Object.class)][loading F:\jbuilder5\jdk1.3\jre\lib\rt.jar(java/lang/String.class)][checking HelloWorldClass][loading F:\jbuilder5\jdk1.3\jre\lib\rt.jar(java/lang/System.class)][loading F:\jbuilder5\jdk1.3\jre\lib\rt.jar(java/io/PrintStream.class)][loading F:\jbuilder5\jdk1.3\jre\lib\rt.jar(java/io/Fil-terOutputStream.class)][loading F:\jbuilder5\jdk1.3\jre\lib\rt.jar(java/io/Out-putStream.class)][wrote HelloWorldClass.class][total 561ms]
Nach dem Kompilieren hat der Java-Compiler die Runtimeversion mit derEndung .class erzeugt.
Listing 8.4 Files, die der Compiler von Java erzeugt hat
07.10.2001 19:33 451 HelloWorld-Class.class07.10.2001 19:31 302 HelloWorld-Class.java 2 File(s) 753 Bytes
Kap08.fm Seite 168 Dienstag, 22. April 2003 2:32 14
Synopsis der Objektprogrammierung mit Java, VB und ABAP 169
Mit der Java-Utility kann eine Klasse direkt von der Kommandozeile aus-geführt werden, vorausgesetzt eine Methode mit dem Namen main()wurde implementiert.
Listing 8.5 Ausführen der Klasse mit der Java Runtime
D:\JDK> java HelloWorldClass Welcome to Java hello World
8.4.2 Constructor
Ein Constructor ist eine Methode, die immer dann ausgeführt wird, wenneine Klasse oder eine Instanz zum ersten Mal angesprochen wird. Sie eig-net sich besonders zum Initialisieren von Werten innerhalb der Klasse,und zwar just-in-time, nämlich dann, wenn die Daten das erste Malgebraucht werden.
Constructor in Java
Ein Constructor in Java ist eine Methode mit den folgenden Charakteris-tika:
� Ein Constructor hat immer den gleichen Namen wie seine Klasse.
� Ein Constructor hat keinen Ergebnistyp, also auch nicht die Kennzeich-nung VOID.
So sieht ein Constructor in Java aus:
public class Test {
Folgendes ist der Constructor der Klasse Test:
public Test() { }
Erzeugung der Klasse, bei der der Constructor ausgeführt wird:
public static void main(String[] args) { Test test1 = new Test(); }}
Kap08.fm Seite 169 Dienstag, 22. April 2003 2:32 14
170 Programmieren mit mehreren Programmiersprachen
Constructor in ABAP Objects
Ein Constructor in ABAP Objects ist eine Methode, mit dem NamenCLASS_CONSTRUCTOR oder CONSTRUCTOR. Es gibt zwei Ebenen vonConstructoren, einmal beim erstmaligen Initialisieren der Klasse und ein-mal bei jedem Anlegen einer Instanz.
Constructor fürdie ganze Klasse
So sieht ein Constructorfür eine Klasse in ABAP aus:
method CLASS_CONSTRUCTOR .endmethod.
Constructor füreine Instanz
Das Folgende ist ein Constructor für eine Instanz:
method CONSTRUCTOR .endmethod.
Constructor in VB
Ein Constructor in Visual Basic ist eine spezielle Methode mit demNamen Class_Initialize und mit folgendem Aussehen.
VERSION 1.0 CLASSAttribute VB_Name = "TEST"Private Sub Class_Initialize() End Sub
8.4.3 Destructor
Ein Destructor ist eine spezielle Methode, die immer dann aufgerufenwird, wenn die Klasse oder eine Instanz der Klasse zerstört wird. Damit istder Aufruf des Destructors die definitiv letzte Aktion während derLebenszeit einer Instanz.
Destructor in Java
Java kennt keinenDestructor
Das Konzept von Java sieht wie eine ständige und versteckte Garbage-Collection von nicht mehr benötigtem Speicherplatz aus. Ausgehend vonder irrigen Annahme, dass der Destructor einer Objekt-Klasse nur dasFreigeben von Speicherplatz und andere Aufräumarbeiten vornehmensollte, verzichteten die Designer von SUN auf die Destructor-Methode.Das ist jedoch eher ärgerlich, da der Destructor oft auch zum Anstoßenanderer Tasks verwendet wird, und wenn es nur das Aussenden eines glo-balen Goodbye an den Rest der Welt ist.
Kap08.fm Seite 170 Dienstag, 22. April 2003 2:32 14
Synopsis der Objektprogrammierung mit Java, VB und ABAP 171
Destructor in ABAP Objects
Auch in ABAP gibt es keine Destructoren.
Destructor in VB
Ein Destructor in Visual Basic ist eine spezielle Methode mit dem NamenClass_Terminate. Folgendermaßen sieht er aus:
VERSION 1.0 CLASS
Constructor für die Klasse Test
Private Sub Class_Initialize() End Sub
Destructor für die Klasse Test
Private Sub Class_Terminate() End Sub
8.4.4 Property-Deklarationen
Properties sind öffentliche Variablen
Eine Property in einer Klasse entspricht in etwa einer öffentlich zugreifba-ren Variablen. Tatsächlich werden in VB alle Public-Variablen automatischals Properties behandelt. Das Kennzeichen einer Property ist, dass sieeinen Wert hat. Dieser Wert lässt sich im Normalfall lesen und setzen wiebei einer Variablen.
Properties in Java
Properties werden durch Namens-konventionen bestimmt
Properties in Java werden durch eine bestimmte Namenskonventionangelegt. Diese Namenskonvention wird in der Sprachbeschreibung alsDesign Pattern ausgelegt, was aber etwas hoch gegriffen ist, nur um zurechtfertigen, warum man semantische Inhalte an den Aufbau einesBezeichners hängt.2
Eine Property in Java besteht aus drei Elementen
� eine innerhalb der Klasse deklarierte Variable xxx, wobei das erste Zei-chen der Variablen ein kleiner Buchstabe sein muss
� eine Methode zum Setzen des Wertes der Variablen xxx mit demNamen setXxx, wobei das erste Zeichen des Namens der Property einGroßbuchstabe sein muss
2 Mehr zu diesem Problem: Thinking in Patterns With Java auf www.BruceEckel.com.
Kap08.fm Seite 171 Dienstag, 22. April 2003 2:32 14
172 Programmieren mit mehreren Programmiersprachen
� eine Methode zum Auslesen des Wertes der Variablen xxx mit demNamen getXxx, wobei das erste Zeichen des Namens der Property einGroßbuchstabe sein muss
Die Syntax sieht folgendermaßen aus:
Get Propertiesin Java
private int temperature;public int getTemperature() { return temperature; };
Set Propertiesin Java
public void setTemperature(int newTemperature){ temperature = newTemperature; };
Properties in VB
Properties in VB werden durch das Keyword property eingeleitet undansonsten wie Unterprogramme behandelt.
Get Propertiesin VB
Private myTemperature as Integerpublic property Get Temperature() Temperature = myTemperature;End Property
Set Propertiesin VB
Private myTemperature as Integerpublic property Get Temperature(newTemperature as Inte-ger) myTemperature = Temperature;End Property
Properties in ABAP
ABAP Objects vermeidet den direkten Umgang mit Properties. Es gibt dasKonstrukt der Attribute, das alle global definierten Variablen innerhalbeiner Klasse bezeichnet. Properties im Sinne von VB oder Java müssen alsMethoden realisiert werden.
8.4.5 Methoden
Methoden in Java
Methoden in Java werden durch das Keyword proc definiert. Falls dieproc mit dem Vorsatz void angelegt wird, handelt es sich um eine echteProzedur, die keinen Wert zurückgibt, während eine Methode, die einenWert zurückgibt, einer Funktion entspricht.
Kap08.fm Seite 172 Dienstag, 22. April 2003 2:32 14
Synopsis der Objektprogrammierung mit Java, VB und ABAP 173
Methoden in VB
Eine Methode in VB ist identisch mit einer Sub oder einer Function:
Function AddInt(a as Integer, b as Integer) As Integer AddInt = a + bEnd Function
Methoden in ABAP Objects
Folgendermaßen sieht eine Methode in ABAP aus:
method FIND_BY_KEY .RESULT = IMPL_AGENT->FIND_BY_KEY(KEYATT_4 = KEYATT_4KEYATT_5 = KEYATT_5FLDATE = FLDATECONNID = CONNIDCARRID = CARRID ).endmethod.
8.4.6 String-Deklarationen
Strings in Java
Strings in Java werden durch den eigenen Datentyp String angelegt.Dieser unterscheidet sich von einem Array of Char dadurch, dassStrings eine dynamische Länge haben können.
String aText[100];
Die Länge des Strings wird durch die Methode Length bestimmt:
System.out.println(aText.length());
Verkettung von Strings in Java kann wie folgt aussehen:
String first = new String("sure"); String second = "plea"; String combined = second + first; System.out.println(combined); System.out.println(combined.length());
Kap08.fm Seite 173 Dienstag, 22. April 2003 2:32 14
174 Programmieren mit mehreren Programmiersprachen
Strings in VB
Strings in VB werden durch den eigenen Datentyp String angelegt. Diemaximale Länge eines Strings kann in Klammern angegeben werden,muss aber nicht.
Dim aText As StringDim aText80 As String[80]
Die Länge des Strings wird durch die Funktion Len bestimmt.
Debug.Print len(aText)
Strings in ABAP Objects
Strings im Sinne von variablen Zeichenfolgen existieren in ABAP nicht.Zum Arbeiten mit Strings muss immer eine Variable mit einer fest vorge-gebenen Länge deklariert werden:
DATA: mystring(80) TYPE C. "String der Länge 80
Zur Manipulation von Strings in ABAP existieren ein paar wenige Funkti-onen.
8.4.7 Array-Deklarationen
Arrays in Java
Arrays in Java werden durch das Klammernpaar [] deklariert. Sie könneneine feste Länge haben. Wird keine Länge angegeben, wird die Länge desArrays während der Laufzeit bestimmt.
String args[];
ABAP Bedeutung
Strlen( mystring ) Bestimmt die Länge des Strings, nachdem die Leerzeichen am Ende abgeschnitten wurden
CONCATENATE astr bstr INTO cstr Zusammenführen zweier Zeichenfolgen
SPLIT Teilen eines Strings an einer bestimmten Stelle
Mystring+10(25) Eine Art Substring-Bildung in ABAP, ab Stelle 10, 25 Zeichen; für variable Substrings benötigen Sie ABAP-FILED_SYMBOLS und den Befehl ASSIGN.
Tabelle 8.1 String-Manipulation in ABAP
Kap08.fm Seite 174 Dienstag, 22. April 2003 2:32 14
Synopsis der Objektprogrammierung mit Java, VB und ABAP 175
Arrays in VB
Arrays in VB werden durch das Klammernpaar [] deklariert. Sie könneneine feste Länge haben. Wird keine Länge angegeben, wird die Länge desArrays während der Laufzeit bestimmt. Durch die Funktion Redim()kann ein Array jederzeit umdimensioniert werden.
DIM: anArray[10] Of Integer
Arrays in ABAP Objects
ABAP kennt keine Arrays, sondern nur so genannte Interne Tabellen, diein etwa den Recordsets von Visual Basic entsprechen.
DATA: itab TYPE Standard Table Of Integer.
Kap08.fm Seite 175 Dienstag, 22. April 2003 2:32 14
Kap08.fm Seite 176 Dienstag, 22. April 2003 2:32 14
Teil 3 Programmieren in verteilten Systemen
Das Programmieren in einem Netzwerk von miteinander kooperierenden Computern und Computerdiensten erfordert auch eine besondere Ausbildung der Entwickler. Anstatt sich auf ein Betriebssystem, eine Programmiersprache und eine Ober-flächengestaltung zu konzentrieren, werden heutzutage Leute gebraucht, die ausdrücklich mehrere Systeme und Sprachen beherrschen. Die Frage ist demnach nicht mehr, ob SAP, UNIX oder Microsoft, sondern ob SAP, UNIX und Microsoft. Zwingend sind fortan Kenntnisse in Frontend-Entwicklung, Workflow und Middleware sowie Programmierung in mehreren Sprachen nach Bedarf.
Kap08.fm Seite 177 Dienstag, 22. April 2003 2:32 14
Kap08.fm Seite 178 Dienstag, 22. April 2003 2:32 14
Webservice als Standard-Nachrichtenformat 179
9 Webservice als Standard-Nachrichtenformat
Webservices sind Programme, die mit Hilfe von standardisier-ten Internetprotokollen, z.B. HTTP, SMTP oder SOAP, von anderen Computern über ein Netzwerk zugreifbar sind.
La Grandeur d’un métier est avant tous d’unir les hommes.Die Größe eines Berufs ist vor allem, die Menschen zu einen.
Antoine de Saint Exupéry, Terre des Hommes (II-2)
Entscheidung für ein Protokoll
In ungezählten Schnittstellenszenarien, zum Beispiel bei EDI-Übertragun-gen, standen die beteiligten Partner wie der Esel vor dem Heuhaufen undbefassten sich mit unerheblichen Details der Übertragung, zum Beispiel,ob etwa ein bestimmtes Feld übertragen werden soll, ob die Kunden-nummer mit neun oder achtzehn Stellen gesendet wird oder ob Zahlenmit führenden Nullen oder linksbündig gesendet werden.
Universelles Schnittstellen-format
Webservices legen aufbauend auf XML und dem bereits für das WWW alsStandard etablierten HTTP-Protokoll ein universelles Schnittstellenformatfest, das sowohl vom Sender als auch vom Empfänger der Schnittstellen-nachrichten verstanden wird. Daraufhin sendet der Requestor eineAnfrage via Internet an den Service, der wiederum verarbeitet die Nach-richt und sendet eine Antwort zurück an den Requestor.
Webservices sind RPC-Aufrufe via HTTP
Das wesentlich Neue an Webservices ist die Standardisierung, denn nichtdie Technologie ist neu, sondern die Tatsache, dass man sich auf ein ein-heitliches Übertragungsprotokoll geeinigt hat. Dieses Protokoll ist auchnicht verordnet, sondern entstand durch Übernahme einer nahe liegen-den Konvention. In der einfachsten Interpretation sind Webservices RPC-Aufrufe über das HTTP-Protokoll.
Abbildung 9.1 Interaktion mit Back-Office-Applikation via Webservices
WebService
Request
BackOffice
Requestor
Response
Kap09.fm Seite 179 Dienstag, 22. April 2003 2:32 14
180 Webservice als Standard-Nachrichtenformat
ApplicationProgramming
Interface
Stellt ein Software-Service eine Schnittstelle zur Verfügung, über die eineandere Software Anfragen an den Service stellen und Antworten entge-gennehmen kann, so nennen wir das ein Application Programming Inter-face – API.
»WebAPI« Im engeren Sinne ist ein Webservice eine Schnittstelle zu einem überTCP/IP aufrufbaren Programm, weshalb auch gelegentlich der BegriffWebAPI zu finden ist. In anderen Worten: Ist die API eines Software-Ser-vice durch eine Internetverbindung aufrufbar, so sprechen wir von einemWebservice.
9.1 Beispiel für Webservices mit Amazon.com
Seattle, Bundesstaat Washington, USA. Wir schreiben das Jahr 1994. Esist das Gründungsjahr von Amazon.com, Inc. Amazon.com ist eines derersten Unternehmen, die ausschließlich über das neue Medium WorldWide Web einen Handel aufbauen.
Nur neun Jahre später – wir schreiben das Jahr 2003 – ist Amazon.comweltweit der größte Anbieter von Büchern, Musik und Videos im Inter-net. Die inzwischen mehr als acht Millionen Kunden in 160 Ländern kön-nen per Internet ihre Bestellungen aufgeben und sie sich bequem nachHause bringen lassen.
Wenn heute jemand auf das Thema Internet stößt, dann assoziiert erdamit fast automatisch diesen Pionier des eCommerce, Amazon.com.Kaum ein anderer individueller Webshop wurde so zur Legende unddamit auch zum Synonym für eCommerce. In vorbildlicher Weise gelanges Amazon.com, Vertrauen und Akzeptanz zu schaffen für das neueMedium World Wide Web.
Amazon.com-Katalog alsWebservice
Nun ist Amazon.com vor kurzer Zeit wieder einen Schritt weiter gegan-gen und bietet seine Dienste in vollautomatisierter Form an. Währendman zwar auch schon bisher auf Amazon.com-Seiten durch Links auf dereigenen Homepage verweisen konnte, hat Amazon.com mittlerweile sei-nen Shop so standardisiert, dass Kataloganfragen, Katalogauskünfte undEinkäufe auch durch einfache, webfähige Computerprogramme möglichwerden. Wir nennen so was gemäß unserer Definition einen Webservice.
9.1.1 Einfache Beispiele für Webservices
Bevor wir uns dem detaillierten Beispiel von Webservices mit Ama-zon.com widmen, wollen wir mit ein paar einfachen Beispielen beginnen,um ein Gefühl für Webservices im Allgemeinen zu bekommen.
Kap09.fm Seite 180 Dienstag, 22. April 2003 2:32 14
Beispiel für Webservices mit Amazon.com 181
Einfachste Form sind statische Webseiten
Die einfachste Form eines Webservices ist das Aufrufen einer Internet-seite über einen Browser. Das Prinzip, das dahinter steckt, ist zunächstsehr, sehr einfach:
Der anfragende Requester sendet seinen Wunsch über ein TCP/IP-Netz-werk zu einem namentlich bekannten Server. Der Server sucht diegewünschte Datei und sendet das gefundene Dokument an den Reques-ter zurück. Als Protokolle für diese Kommunikation werden heute fastausschließlich HTTP und FTP verwendet.
Dynamische Webseiten mit Forms oder CGI-Parametern
Nachdem Sie sich Tausende von Webseiten angesehen haben, kommt dienächste Begehrlichkeit fast zwangsläufig: Die Seiten sollten dynamischauf die Eingaben des Benutzers reagieren. Dazu muss normalerweise derURL ein Parameter mitgegeben werden, der vom Server dynamisch inter-pretiert werden kann. Das folgende Beispiel bestimmt die aktuelle UTC-Zeit (Greenwich Mean Time):
http://www.nanonull.com/TimeService/TimeService.asmx/getUTCTime?
CGI-Standard hat sich durchgesetzt
Als Syntax zur Übermittlung von Parametern über eine URL hat sich derCGI-Standard durchgesetzt. Ursprünglich wurde CGI so verwendet, dassman den Namen eines physisch existierenden Programms angegebenhatte und die Parameter mit Fragezeichen (»?«) und Ampersand (»&«)getrennt an die URL anfügte.
9.1.2 Ein Beispiel mit einem winzigkleinen Fehler
Webservices am Beispiel von Amazon.com
Webservices mit Amazon.com eignen sich gut zum Lernen der Technolo-gien, da der Service öffentlich zugänglich ist und die Inhalte allgemeinverständlich sind. Das folgende Szenario kommuniziert mit http://xml.Amazon.com. Alle Bücher werden weltweit durch den eindeutigenProduktcode ISBN (International Standard Book Number) identifiziert.Amazon hat für seine internen Dienste die Bezeichnung ASIN (AmazonStandard Item Number) eingebaut, die neben Büchern auch die restlichenArtikel des Sortiments identifiziert. Für Bücher ist die ASIN identisch mitder ISBN. Ausgehend von einer bekannten ISBN, wollen wir die Webser-vices von Amazon.com nutzen, um die Katalogdaten des passendenBuchs zu ermitteln.
Im Folgenden sehen Sie, wie die Kommunikation aufgebaut ist. Dabei hatsich in dieses Beispiel ein kleiner syntaktischer Fehler eingeschlichen, derdazu führt, dass Amazon.com statt der gewünschten Katalogdaten nureine Fehlermeldung zurücksendet. So eine Situation führt in einer klassi-
Kap09.fm Seite 181 Dienstag, 22. April 2003 2:32 14
182 Webservice als Standard-Nachrichtenformat
schen Schnittstellenentwicklung zu aufwändigen Nachfragen beim Kom-munikationspartner oder zum Nachsuchen in Dokumentationen. Früherhätten wir also zum Telefon gegriffen, versucht, bei Amazon.com einenAnsprechpartner zu finden, der auf gut Glück den Grund des Fehlers ana-lysiert. Das Beispiel wird zeigen, wie es uns gelingt, anhand der WSDL(Web Service Description Language) des Webservices den Fehler selbst zufinden.
ISBN-Abfrage beiAmazon.com via
SOAP
Hinter dem folgenden XML-Dokument versteckt sich eine Suche nacheinem Buch im Katalog von Amazon.com. Diese Anfrage wird durch SOAP(Simple Object Access Protocol) übermittelt. Um den Blick auf das Wesent-liche zu lenken, schauen wir uns das Dokument zunächst in etwas berei-nigter Form an, befreit von administrativen Informationen.
Listing 9.1 SOAP-Anfrage an Amazon.com
<SOAP-ENV:Envelope> <SOAP-ENV:Body> <AsinSearchRequest> <AsinSearchRequest> <asin>3528057297</asin> <tag>logosworldcom</tag> <type>lite</type> <dev-tag>12345678901234</dev-tag> </AsinSearchRequest> </typens:AsinSearchRequest> </SOAP-ENV:Body></SOAP-ENV:Envelope>
Listing 9.2 XML-Dokument in Baumdarstellung
AsinSearchRequest �� asin � �� 3528057297 �� tag � �� logosworldcom �� type � �� lite �� dev-tag �� 00000000000000
Kap09.fm Seite 182 Dienstag, 22. April 2003 2:32 14
Beispiel für Webservices mit Amazon.com 183
Wenn alles gut geht, wird dieser SOAP-Request von dem empfangendenWebservice bei Amazon.com verarbeitet und das Ergebnis wieder in einSOAP-Dokument, diesmal als SOAP-Response, verpackt und an denRequester zurückgeschickt.
Listing 9.3 SOAP-Response von Amazon.com
<SOAP-ENV:Envelope> <SOAP-ENV:Body> <AsinSearchRequestResponse> <return> <Details> <Url>http://www.Amazon.com/ exec/obidos/3528057297</Url> <Asin>3528057297</Asin> <ProductName>The SAP R/3 Guide to EDI and Interfaces</ProductName> <Authors> <Author>Axel Angeli</Author> <Author>Ulrich Streit</Author> <Author>Robi Gonfalonieri</Author> </Authors> <ListPrice>$50.95</ListPrice> </Details> </return> </AsinSearchRequestResponse> </SOAP-ENV:Body></SOAP-ENV:Envelope>
Listing 9.4 SOAP-Response in Baumdarstellung
AsinSearchRequestResponse �� asin � �� 3528057297 �� Url � �� http://www.Amazon.com/ exec/obidos/3528057297 �� ProductName � �� The SAP R/3 Guide to EDI and Interfaces
Kap09.fm Seite 183 Dienstag, 22. April 2003 2:32 14
184 Webservice als Standard-Nachrichtenformat
�� Authors � �� Author � � �� Axel Angeli � �� Author � �� Robi Gonfalonieri �� ListPrice �� $50.95
Der abgesandte SOAP-Request hat in dem Beispiel leider einen winzigkleinen Fehler, weshalb uns Amazon.com nur eine als SOAP-Responseverpackte Fehlermeldung zurücksendet, die uns zunächst auch nicht wei-terhilft.
Listing 9.5 SOAP-Error von Amazon.com
<SOAP-ENV:Envelope> <SOAP-ENV:Body> <SOAP-ENV:Fault> <faultcode>SOAP-ENV:Client</faultcode> <faultstring>Bad Request</faultstring> <detail>AsinSearchRequest: There must be a keys named 'type' and 'asin' and 'devtag'in the input </detail> </SOAP-ENV:Fault> </SOAP-ENV:Body></SOAP-ENV:Envelope>
Listing 9.6 SOAP-Error als Baum
SOAP-ENV:Fault �� faultcode � �� 3528057297 �� detail � �� AsinSearchRequest: There must be a keys named � 'type' and 'asin' and 'devtag'in the input ¦ �� faultstring �� detail �� Robi Gonfalonieri
Kap09.fm Seite 184 Dienstag, 22. April 2003 2:32 14
Beispiel für Webservices mit Amazon.com 185
Dies ist die Hölle für jeden Schnittstellenprogrammierer: Der Kommuni-kationspartner am anderen Ende versteht meine Anfrage nicht und diegesendete Antwort gibt uns leider nicht den entscheidenden Hinweis.Denn im Beispiel hier haben wir die geforderten Parameter type, asinund devtag korrekt angegeben. Oder doch nicht?
Was war geschehen? Die Anfrage haben wir der Dokumentation vonAmazon.com zu den Webservices entnommen. Um es schon vorwegzu-nehmen: In dem Beispiel befand sich ein winzig kleiner Fehler, der mitbloßem Auge kaum erkennbar ist. Da wir uns auf die sekundäre Doku-mentation verlassen hatten, waren wir letztlich Opfer von Übertragungs-fehlern oder mangelnder Aktualität.
Geht es so nicht den meisten Schnittstellenentwicklern? Eigentlich wohldefinierte – weil in einer Programmiersprache festgelegte – Dateiformatewerden einem EDI-Partner als Excel-Sheet, Word-Datei, gefaxte Textdateioder auch gar nicht übermittelt. Fast immer endet es damit, dass dieBedeutung und Struktur einer Übertragungsdatei aus den übermitteltenDaten heraus geraten wird.
WSDL gibt formale Beschrei-bung der Syntax
Da Amazon.com aber seine Dienste als vollständigen Webservice zur Ver-fügung stellt, haben wir Zugriff auf die Originalquelle in Form deszugrunde liegenden WSDL-Dokuments.
9.1.3 Die WSDL zum Amazon.com-Service
WSDL – Web-services Descrip-tion Language
Die WSDL (Web Services Description Language) ist eine Sprache, die mitHilfe von XML-Dokumenten die Struktur der Requests und Responseseines Webservices beschreibt. Die Beschreibung ist so ausführlich, dassman mit ihrer Hilfe die Struktur des erforderlichen SOAP-Request-Doku-ments bestimmen kann.
WSDL muss öffentlich zugänglich sein
Das WSDL-Dokument wird an einer Stelle im Internet abgelegt, so dassdie aktuelle Version jederzeit sowohl vom Sender als auch vom Empfän-ger des Dokuments zugreifbar ist. Außerdem verprobt der Empfängereines SOAP-Dokuments dieses gegen das WSDL-Dokument, bevor esweiterverarbeitet wird. Das folgende Listing zeigt die WSDL-Beschrei-bung einer Amazon.com-Suche.
Listing 9.7 WSDL-Definition einer Suche nach ISBN bei Amazon.com
<definitions targetNamespace="urn:PI/DevCentral/SoapService" name="AmazonSearch"> <types> <xsd:schema>
Kap09.fm Seite 185 Dienstag, 22. April 2003 2:32 14
186 Webservice als Standard-Nachrichtenformat
<xsd:complexType name="AsinRequest"> <xsd:all> <xsd:element name="asin" /> <xsd:element name="tag" /> <xsd:element name="type" /> <xsd:element name="devtag" /> <xsd:element name="offer" /> <xsd:element name="offerpage" minOccurs="0"/> </xsd:all> </xsd:complexType> </xsd:schema> </types> <message name="AsinSearchRequest"> <part name="AsinSearchRequest" type="typens:AsinRequest"/> </message> <message name="AsinSearchResponse"> <part name="return" type="typens:ProductInfo"/> </message></definitions>
Namen dererlaubten
Bezeichner
Dem WSDL-Dokument kann man entnehmen, dass ein AsinRequest,das ist die Anfrage nach einer ISBN, die wir in dem SOAP-Dokumentübermittelt haben, die Elemente asin, tag, type, devtag, offer,offerpage enthalten darf. Wir können damit das SOAP-DokumentSchritt für Schritt aufbauen.
Die Anfrage darf eine Message mit dem Namen AsinSearchRequestenthalten:
<message name="AsinSearchRequest"> <part name="AsinSearchRequest" type="typens:AsinRequest"/></message>
Das SOAP-Dokument würde also schon wie folgt aussehen:
<SOAP-ENV:Envelope> <SOAP-ENV:Body> <AsinSearchRequest> <AsinSearchRequest> . . .
Kap09.fm Seite 186 Dienstag, 22. April 2003 2:32 14
Beispiel für Webservices mit Amazon.com 187
</AsinSearchRequest> </typens:AsinSearchRequest> </SOAP-ENV:Body></SOAP-ENV:Envelope>
Beispiel einer Typisierung einer Variablen
In der WSDL wurde die Message mit name="AsinSearchRequest" alsvom type="typens:AsinRequest" festgelegt. Die Typdefinition wurdeweiter vorne in der WSDL vorgenommen:
<xsd:complexType name="AsinRequest"> <xsd:all> <xsd:element name="asin" /> <xsd:element name="tag" /> <xsd:element name="type" /> <xsd:element name="devtag" /> <xsd:element name="offer" /> <xsd:element name="offerpage" minOccurs="0"/> </xsd:all></xsd:complexType>
Also lassen wir das SOAP-Dokument wachsen:
<SOAP-ENV:Envelope> <SOAP-ENV:Body> <AsinSearchRequest> <AsinSearchRequest> <asin>3528057297</asin> <tag>logosworldcom</tag> <type>lite</type> <devtag>12345678901234</devtag> </AsinSearchRequest> </typens:AsinSearchRequest> </SOAP-ENV:Body></SOAP-ENV:Envelope>
SOAP lässt sich aus WSDL gene-rieren
Somit haben wir den SOAP-Request aus der WSDL abgeleitet. Selbstver-ständlich kann und soll im Normalfall sogar die Transformation von WSDLin ein SOAP-Dokument durch ein Programm erfolgen. Hierzu stehen mit-tlerweile eine Vielzahl von SOAP-Prozessoren zur Verfügung, die allemehr oder weniger das Gleiche tun:
Kap09.fm Seite 187 Dienstag, 22. April 2003 2:32 14
188 Webservice als Standard-Nachrichtenformat
� beim Senden eines SOAP-Dokuments
� Generieren einer SOAP-Template aus einer WSDL
� alternativ das Generieren von Programmcode aus einer WSDL
� Abmischen von Anwendungsdaten mit dem SOAP-Template
� beim Empfangen eines SOAP-Dokuments
� Verifizierung des SOAP-Dokuments anhand der WSDL
� Extraktion der Programmparameter aus dem Dokument
� Aufruf des Programms zur Ausführung des gewünschten Services
� Entgegennehmen der Programmergebnisse und Rücksendung anden Requester, wieder als eigenständiges SOAP-Dokument
Und warum hat unsere Anfrage eine Fehlermeldung zurückgegeben? Ver-gleichen wir dazu das ursprüngliche SOAP-Dokument und die konstru-ierte Anfrage. Das hatten wir ursprünglich gesendet:
<dev-tag>12345678901234</dev-tag>
Und das hätte dort stehen müssen:
<devtag>12345678901234</devtag>
9.1.4 Webservice als HTTP GET-Anfrage
Im Übrigen hätten wir die Anfrage an Amazon.com auch als HTTP GET-Statement ausführen können. Das hätte dann so ausgesehen:
Listing 9.8 Amazon-Webservice als Canonical URL
http://xml.Amazon.com/onca/xml2?t=webservices-20&tag=logosworldcom&dev-t=D2H3YO46KJJ615&AsinSearch=3528057297&type=lite&f=xml
9.1.5 Verwendung eines XSLT-Stylesheets
Wenn Sie das Ergebnis lieber nach eigenen Wünschen formatiert zurück-haben wollen, können Sie anstatt des Parameters f=XML auch die URLeines XSLT-Stylesheets angeben. In diesem Fall wird dieses XSLT auf dasXML-Dokument angewendet und Sie erhalten den transformierten Aus-gabestrom zurück. Das XSLT-Stylesheet muss von Ihnen im Internetbereitgestellt werden und sowohl vom rufenden Browser als auch vomAmazon-Webservice zugänglich sein.
Kap09.fm Seite 188 Dienstag, 22. April 2003 2:32 14
Beispiel für Webservices mit Amazon.com 189
Listing 9.9 Anwendung eines XSLT-Stylesheets auf Amazon-XML
http://xml.Amazon.com/onca/xml2?t=webservices-20&tag=logosworldcom&dev-t=D2H3YO46KJJ615&AsinSearch=3528057297&type=lite&f=http://logosworld.com/bookshop/amazon.xsl
9.1.6 Type- und Namespace-Referenz
Was in den Abbildungen weiter oben fehlte, waren die Referenzen aufNamespace und die Angabe der Datentypen. Mit den Datentypen verhältes sich wie in jeder anderen Programmiersprache auch. Die Namespacessind komplizierter zu erfassen. Grob gesagt bedeutet es, dass jedes XML-Dokument zu einem Namespace gehören muss. Dieser Namespace istselbst ein XML-Dokument, das die zulässigen Namen der XML-Tags be-schreibt. Damit der Empfänger des XML-Dokuments die Gültigkeit desDokuments prüfen kann, muss die URI des Namespace mit jedem XML-Dokument gesendet werden. Ob der Empfänger das Dokument tatsäch-lich gegen den Namespace verprobt, ist zunächst einmal dessen Sache.
Kap09.fm Seite 189 Dienstag, 22. April 2003 2:32 14
Kap09.fm Seite 190 Dienstag, 22. April 2003 2:32 14
HTTP- und TCP/IP-Protokolle 191
10 HTTP- und TCP/IP-Protokolle
HTTP ist der Standard zur Übertragung von Nachrichten über ein TCP/IP-Netzwerk. XML ist ein Standard zur Codierung von Daten in einen ASCII-Text mit dem Ziel, diese Daten über ein Netzwerk zu übertragen. SOAP wiederum sind in XML codierte Aufrufe von Methoden eines Objekts beziehungs-weise von Funktionen auf einem entfernten Rechner über das Netzwerk.
10.1 TCP/IP und UDP/IP Network Protocol
Das TCP/IP-Protokoll (korrekt ausgesprochen: TCP-over-IP-Protokoll)und das verwandte UDP/IP-Protokoll sind die einzigen überlebendenStandards im Client-Server-Computing, die noch von nennenswerterBedeutung sind.
TCP/IP ist der Standard
TCP/IP ist somit der De-facto-Standard für Computernetzwerke. Zwargibt es sehr viele andere Level-4-Protokolle, zum Beispiel Microsofts NET-BIOS, IBMs NETBEUI oder Novells IPX, jedoch haben diese fast keineBedeutung mehr und existieren allenfalls aus Gründen der Kompatibilitätmit bestehenden Anwendungen, wenn diese noch kein TCP/IP unterstüt-zen. In der Regel wird dieses Protokoll nur noch emuliert, indem dieDaten des gewünschten Protokolls auf einem TCP/IP-Protokoll »Hucke-pack« genommen werden.
Applikation Protokoll Session Trans-port
Netz-werk
Data Link
Physika-lisch
E-Mail SMTP/POP
Port 25 TCP IP SLIP ISDN
Webapplication HTTP Port 80 PPP ADSL
File-Transfer FTP Port 21
SAP RFC RFC Port 1080
Host-Sessions TELNET Port 23 802.2 Wireless
Directory Ser-vice
DNS Port 53 UDP FDDI
File-Service NFS RPC-Map-ping
Ether-net II
Coax
Tabelle 10.1 Open-Systems-Interconnection-(OSI)-Seven-Layer-Modell
Kap10.fm Seite 191 Dienstag, 22. April 2003 2:33 14
192 HTTP- und TCP/IP-Protokolle
IP, InternetProtocol
IP bedeutet ganz einfach Internet Protocol. Es wurde ursprünglich als aus-fallsichere Transportschicht für die Implementierungen des Internetgeschaffen. IP ist ein Level-3-Protokoll und bestimmt, wie die Bytes desDatenstroms zu Paketen zusammengefasst werden und auf welchem Wegein Paket zum Empfänger übertragen wird. Ohne ins Detail zu gehen,kann man sagen, dass IP für die Zustellung der Datenpakete verantwort-lich ist.
EindeutigeNummer für jeden
Knoten
Das typische Kennzeichen des IP-Netzwerks sind seine Adressen, diejedem Knoten innerhalb eines Netzwerks zugeordnet sind. Diese Adres-sen sind 4-Tupel von Zahlen im Bereich 0–255, zum Beispiel 192.168.1.1.Eine solche Adresse ist immer eindeutig innerhalb eines Netzwerks. Diekleinste IP-Adresse ist demnach 0.0.0.1 und die größte 255.255.255.254.Es ist technisch nicht möglich, alle Bits auf 0 oder alle auf 1 zu setzen.
TCP, TransmissionControl Protocol
Das TCP-Protokoll liegt eine Stufe höher auf der vierten Ebene des OSI-Modells (Transport Layer). Es legt die logischen Einheiten fest, in denenDaten vom Sender zum Empfänger übertragen werden. Dabei spielt einewesentliche Rolle, dass IP zum Senden keine feste Verbindungsstreckezwischen Sender und Empfänger aufbaut, sondern die einzelnen Daten-pakete grundsätzlich über verschiedene Strecken anliefern kann. TCP istdann dafür verantwortlich, die Pakete auf Senderseite zu zerlegen undbeim Empfänger wieder in der richtigen Reihenfolge zusammenzubauen.
UDP, User Data-gram Protocol
Das Senden von Datenpaketen in beliebiger Reihenfolge garantiert ausvielerlei Gründen eine hohe Zuverlässigkeit vor allem bei langen Verbin-dungsstrecken mit vielen Hops. Wenn die Datenmengen allerdings kleinsind und die Verbindung zwischen benachbarten Rechnern erfolgen soll,ist der zusätzliche Aufwand oft störend oder im Falle von sicheren Über-tragungen auch unerwünscht. Deshalb existiert parallel noch UDP (UserDatagram Protocol). Hierbei handelt es sich um ein abgespecktes TCP-Protokoll, das Daten in einem Stück überträgt.
IP-Adresse identi-fiziert Computer
Jeder Computer in einem Netzwerk hat seine eindeutige IP-Adresse, zumBeispiel 127.0.0.1 oder 169.128.1.1. Genau genommen muss man sagen,mindestens eine Adresse, denn ein Rechner kann auch mehrere IP-Adres-sen gleichzeitig haben, zum Beispiel kann er zur selben Zeit über eineNetzwerkkarte und über ein Modem mit dem Internet verbunden sein.Mit dieser Adresse identifizieren wir die Hardware, über die die Kommu-nikation abläuft.
Kap10.fm Seite 192 Dienstag, 22. April 2003 2:33 14
Client-Server-Protokolle 193
Wenn die Daten über das Netzwerk angeliefert werden, müssen sie aberauch innerhalb des Rechners verarbeitet werden. Dies geschieht durchdie Zuweisung von Ports zu den Applikationen. Das IP-Protokoll kenntpro IP-Adresse 256×256 = 65.235 IP-Ports. Jedem Port kann eine eigeneAnwendung zugewiesen werden, die den Datenstrom entgegennimmtund verarbeitet.
ListenerEin solches Programm, das an einem Port einer IP-Strecke auf Daten war-tet, nennt man Listener, denn diese Programme »horchen« an den Portsund hören die Nachrichten ab. In Tabelle 1.2 sind eine Reihe bekannterListener-Dienste aufgeführt.
10.2 Client-Server-Protokolle
Ein TCP/IP-Netzwerk ist ein vielseitiges Transportprotokoll, über das sehrverschiedene Arten von Webdiensten ausgetauscht werden. An den bei-den Enden einer IP-Kommunikationsstrecke – den Ports – können sich dieunterschiedlichsten Programme befinden, die auf ankommende Nach-richten und Anfragen warten.
10.2.1 Clientseite
Beispiele für Programme auf der Clientseite, also dem Ende einer TCP/IP-Strecke, das eine Anfrage initiiert, sind:
� Webbrowser, z.B. Internet Explorer, Netscape oder Opera
� Microsoft-Office-Komponenten, etwa MS Excel, MS Word oder MSProject
� SAP R/3 via RFC und HTTP oder direkt über den Web Application Server
� jede andere Software, die HTTP-Requests absetzen kann
Protocol Port
FTP 21
TELNET 23
HTTP 80
POP 110
HTTPS 443
SAP R/3 1023
LPD or SAPLPD 515
Tabelle 10.2 Typische Port-Zuweisungen in einer IP-Umgebung
Kap10.fm Seite 193 Dienstag, 22. April 2003 2:33 14
194 HTTP- und TCP/IP-Protokolle
10.2.2 Serverseite
Auf der Serverseite sieht es noch etwas komplizierter aus. Dort werdenRessourcen verwaltet, die dem anfragenden Client zur Verfügung gestelltwerden können. Eine solche Ressource kann im Grunde ein beliebigesProgramm sein, das eine API zur Verfügung stellt, die vom Webserver auf-gerufen werden kann.
Limitierungen beiWebservern
Die Einschränkungen liegen dabei vor allem in den Möglichkeiten desWebservers. Zum Beispiel kann ein Microsoft Internet Information Servereine Java-Applikation zunächst nur eingeschränkt ausführen. Andererseitstun sich die Open-Source-Webserver wie Tomcat noch schwer, eine Mi-crosoft.NET-Anwendung auszuführen oder in einfacher Weise mit einemMicrosoft-Office-Produkt zu kommunizieren.
10.2.3 URN, URI und URL – Resource Locator
Adressen im Webwerden durch eine
URN angegeben
Um eine Kommunikation zwischen einem Requester und einem Server zugewährleisten, müssen Nachrichten zuverlässig von einem Ende derKommunikationsstrecke zum anderen Ende übermittelt werden. Dazuwird jede Nachricht in einen formalen Umschlag gepackt und dieser mitder Bestimmungsadresse versehen. Diese Adresse nennt man ResourceLocator.
URL – Uniform Resource Locator
URL bezeichnenDateien
Eine URL ist die häufigste Form einer Ressourcenangabe in Webdiensten.Damit gibt der Client genau den Namen und den Typ der gewünschtenRessource an. Diese Ressourcen können selbst wieder sehr vielfältig sein,in der Regel unterscheidet man aber durch die Angabe, in welchem Pro-tokoll die Ressource die Information übermittelt.
URI-Präfix
Beispiel Ressource
HTTP http://logosworld.com/index.htm HyperText Transfer Protocol, Verweis auf eine Website
FTP ftp://ftp.microsoft.com/ File Transfer Protocol, Verweis auf einen FTP-Server
File file://C:/autoexec.bat Verweis auf eine Datei in der Syntax des Betriebssystems des Servers
Urn urn:sap-com:document:sap: business:rfc
Referenz auf den SAP Business Connector
Tabelle 10.3 Beispiele für Präfixe einer URI
Kap10.fm Seite 194 Dienstag, 22. April 2003 2:33 14
Client-Server-Protokolle 195
URI – Uniform Resource Identifier
URI = URL mit Parametern
Eine URI ist eine um zusätzliche Informationen an den HTTP-Servererweiterte URL. Dabei handelt es sich in der Regel um Parameter, die vonder gerufenen Ressource zur weiteren Verarbeitung verwendet werden.Das weiter unten beschrieben CGI-Interface basiert vollständig auf denparametrisierten URIs. Eine typische URI kann wie folgt aussehen:
http://www.logosworld.de/asp/testdrive.htm?user=micky&pass=mausi
Diese URL besteht aus mehreren Teilen:
� Ressource Type http://Dieser teilt dem Server mit, welches Protokoll für die Kommunikationverwendet werden soll.
� Resource Address www.logosworld.de/asp/testdrive.htmDies ist der eindeutige Name der Ressource. Normalerweise handelt essich dabei einfach um den Netzwerkdateinamen des angefordertenDokuments. Allerdings kann es sich dabei um einen beliebigen Stringhandeln, der vom server verstanden wird. Gewöhnlich bestimmt derServer aus dem Suffix (z.B. .htm, .txt, .asp, .php .cgi etc) die Art derangeforderten Ressource.
� Resource parameters ?user=micky&pass=mausiIn diesem Fall sind das Username und Passwort.
URN – Uniform Resource Name
URN verweist auf eine ständig verfügbare oder virtuelle Ressource
Eine URN verweist auf eine ständige Verbindung innerhalb eines Netzes.Wir sprechen von einer URN, wenn die angegebene Ressource durcheinen logischen Namen spezifiziert wird, während im Unterschied dazueine URL immer angibt, wo die Ressource innerhalb des Web zu findenist. Eine solche typische URN ist z.B. der Verweis auf den SAP BusinessConnector:
urn:sap-com:document:sap:business:rfc
Das Arbeiten mit URNs setzt voraus, dass die Kommunikation vom Clientüber ein intelligentes Gateway abgewickelt wird, das erkennen kann, anwelche IP-Adresse die Anfrage physikalisch geleitet werden kann.
URNs können sich selbst am Gate-way registrieren
Ein typisches Verfahren, um dies zu gewährleisten, ist der passive Gate-way-Modus. Dabei meldet sich die Ressource an dem interessiertenGateway an und registriert sich dort. In diesem Fall wird die Verbindung
Kap10.fm Seite 195 Dienstag, 22. April 2003 2:33 14
196 HTTP- und TCP/IP-Protokolle
also nicht durch das Gateway initiiert, sondern durch die Ressource selbstaufgebaut. Dabei wird ein permanenter Kanal geöffnet, über den dasGateway alle Anfragen an die Ressource leitet.
SAP Gateway-Modus
Ein solches URN-Verfahren wendet auch SAP R/3 an, wenn es eine RFC-Verbindung im Gateway-Modus aufbaut. Näheres finden Sie hierzu ananderer Stelle in diesem Buch (siehe Abschnitt 3.6) und unter den Trans-aktionen SMGW und SM59.
10.2.4 CGI – Common Gateway Interface
CGI ist üblicheForm der Parame-
terangabe
Eine verbreitete Form der URI-Angabe wird durch das Common GatewayInterface (CGI) spezifiziert. Die Idee hinter CGI ist der Wunsch, mit einerHTTP-Zieladresse ein Programm aufzurufen, das dann eine HTTP-Response dynamisch erstellt. Der Aufruf des Programms erfolgt dabeieinfach durch Angabe des Programmnamens. Falls das Programm Para-meter erwartet, werden diese als String durch ein Fragezeichen getrenntan die URL angehängt. Das folgende Beispiel ruft das SAP Interface Repo-sitory auf und gibt an, dass die gewünschte Anzeigesprache DE, alsodeutsch sein soll:
http://ifr.sap.com/catalog/query.asp?language=DE
Die Parameter werden immer in der folgenden Form angegeben:
Parametername=parameterwert
Falls mehrere Parameter spezifiziert werden sollen, werden sie durch einAmpersand (&) voneinander getrennt. Ein Beispiel sieht so aus:
http://ifr.sap.com/catalog/query.asp?namespace=urn:sap-com:ifr:LO:46C&type=bapi&name=SalesOrder.GetList&xml=schema
10.3 HTTP-Kommunikation mit einem Webserver
Direkt über dem TCP/IP_Protokoll hat sich das HTTP-Protokoll als derbedeutendste Standard etabliert. Er verdrängt bisher konkurrierende Pro-tokolle wie GOPHER entweder ganz oder aber auf Nischenplätze wie z.B.SMTP für Mailanwendungen. Auf HTTP setzen dann höhere Protokolleauf, die in erster Linie dazu dienen, Daten eine Semantik zu geben, zumBeispiel durch HTML oder XML. Abbildung 10.1 zeigt, wie die Protokollesich übereinander »zwiebeln«.
Kap10.fm Seite 196 Dienstag, 22. April 2003 2:33 14
HTTP-Kommunikation mit einem Webserver 197
Ein HTTP-Service und ein Webbrowser sind typische Client-Server-Anwendungen, wobei im Normalfall (aber nicht immer) der Browser dieRolle des Clients und der HTTP-Service die des Servers übernimmt. Beide,Client und Server, bauen eine bidirektionale Verbindung miteinander aufund benutzen dazu ein der Aufgabe angemessenes Protokoll, das überTCP/IP ausgeführt wird.
ASCII-Klartext HTTP ist ein reines ASCII-Protokoll, wobei jedes übertragene Byte alsalphanumerisches ASCII-Zeichen interpretiert wird. Dadurch wird dasProtokoll von Menschen in Klartext lesbar, ist aber gleichzeitig auf einfa-che Weise von jedem beliebigen Computer, von Palm oder PC bis Main-frame, zu verarbeiten.
Frage-&-Antwort-Protokoll
HTTP ist gewöhnlich ein Dialog zwischen einem Browser-Client undeinem Webserver. Dabei sendet der Client Anfragen an den Server, derdarauf antwortet. Eine Anfrage im Sinne eines Fire-and-Forget ist in HTTPnicht vorgesehen, das heißt, es muss immer eine Antwort auf die Anfragekommen, um zumindest den Erhalt der Nachricht zu quittieren. DieseQuittierung, englisch acknowledgement, ist erforderlich, da die Reisezei-ten einer Datenübertragung im Internet nicht vorhersehbar sind.
Abbildung 10.1 Hierarchie der Protokoll-Layer
SOAP
XML [dialect: HTML]
HTTP
TCP
IPEthernetISDNASDLHDLC
PhysicalLayer
An Example HTTP SessionGET www.logosworld.com/welcome.htm HTTP/1.0
HTTP/1.0 200 OKHello World
POST www.logosworld.com/shoppingcart.asp HTTP/1.0Some dataSome data
HTTP/1.0 200 OKYour shopping cart has been updated
Request
Response
Kap10.fm Seite 197 Dienstag, 22. April 2003 2:33 14
198 HTTP- und TCP/IP-Protokolle
HTTP-Requests:GET und POST
HTTP unterscheidet zwischen einer Reihe von Request-Typen, wobei diewichtigsten HTTP GET und HTTP POST sind.
Listing 10.1 Einfaches Beispiel für HTTP GET
GET /TimeService/TimeService.asmx/getUTCTime? HTTP/1.1Host: www.nanonull.com
HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: length
<?xml version="1.0" encoding="utf-8"?><string xmlns="http://www.Nanonull.com/TimeService/"> string</string>
Listing 10.2 Einfaches Beispiel für HTTP POST
POST /TimeService/TimeService.asmx/getUTCTime HTTP/1.1Host: www.nanonull.comContent-Type: application/x-www-form-urlencodedContent-Length: length
HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: length
<?xml version="1.0" encoding="utf-8"?><string xmlns="http://www.Nanonull.com/TimeService/"> string</string>
Die folgende Tabelle erläutert die Bedeutung grundlegender HTTP-Befehle.
HTTP-Kommando
Beschreibung
HTTP GET Sendet die Adresse einer gewünschten Ressource (URI) als String zum Server.
HTTP POST Sendet zusätzlich zur Adresse einer gewünschten Ressource (URI) auch noch weitere Daten im Body der Anfrage mit. Somit besteht ein HTTP POST aus zwei Teilen: aus einem Data-Header und dem Data-Body.
Tabelle 10.4 HTTP-Kommandos
Kap10.fm Seite 198 Dienstag, 22. April 2003 2:33 14
HTTP-Kommunikation mit einem Webserver 199
HTTP-Forms werden im Body versendet
Typische Daten im Body einer HTTP-Anfrage sind die Daten einer HTML-Form, das heißt die Inhalte der Eingabefelder innerhalb eines HTML-Dokuments, die unter anderem zwischen den Tags <FORM>…<INPUT>…</INPUT>…</FORM> zu finden sind.
10.3.1 Beispiel einer HTTP-Session
Kommunikation wird immer vom Client aufgebaut
Die Kommunikation einer HTTP-Session wird immer vom Client initiiert,in unserem Fall dem Browser. Dieser Browser sendet eine Anfrage an denWebserver, der die Anfrage interpretiert und eine Antwort zurücksendet.Eine solche Anfrage ist ein simpler ASCII-String. Sie können diese Kom-
HTTP PUT Ersetzt die als URL angegebene Ressource (Datei) durch die im Rumpf des HTTP-Requests mitgesandten Daten. Dies entspricht einem Upload von Daten auf den Webserver und funktioniert natürlich nur, wenn der Client auch die notwendigen Schreibrechte auf dem Server besitzt.
HTTP HEAD Gibt den Header der als URN angegebenen Ressource zurück. Dies ist nützlich, um die Existenz einer Ressource vorab zu testen oder die Größe des zu erwartenden Datenstroms abzufragen.
HTTP-Kommando
Beschreibung
Tabelle 10.4 HTTP-Kommandos (Forts.)
Abbildung 10.2 Kommunikation zwischen einem HTTP-Browser und einem Webserver
<FORM><INPUT></INPUT></FORM>
RequesterBrowser Client
Web Server
Responder
HTTPPOST
HTTPGET
Kap10.fm Seite 199 Dienstag, 22. April 2003 2:33 14
200 HTTP- und TCP/IP-Protokolle
munikation jederzeit mit TELNET oder jedem anderen einfachen Termi-nal-Emulator testen. TELNET kann von der DOS-Kommando-Zeile gestar-tet werden:
telnet localhost 80
Potnummernkönnen beliebig
festgelegt werden
Dieser Aufruf geht davon aus, dass Ihr Webserver auf dem lokalen PCunter dem Port 80 installiert ist. Port 80 ist der Default für die meistenHTTP-Server, insbesondere für den mit Windows 2000 installierten Inter-net Information Server. In einer Produktivumgebung ändert sich die Port-Nummer meistens, üblicherweise nimmt man die Nummer 8080, aberauch das ist willkürlich.
Sobald Sie erfolgreich eine Verbindung zum Server aufgebaut haben, wirdder Screen von TELNET gelöscht und der HTTP-Server wartet auf weitereEingaben. Sie können nun eine gültige HTTP-Anfrage eingeben, entwedermit oder ohne absoluter Pfadangabe:
GET default.htm HTTP/1.0{ eine Zeile freilassen}GET /asp/helloworld.htm HTTP/1.0{ eine Zeile freilassen}
HTTP-Requestswerden durch
Leerzeileangezeigt
Das Ende eines Requests wird durch eine Leerzeile angezeigt. Der Serverwartet so lange, bis er eine Leerzeile im Datenstrom, also zwei aufeinan-der folgende <CR><LF>-Sequenzen (Carriage Return/Linefeed), erhält,und beginnt dann, die Anfrage zu bearbeiten. Kommt die Leerzeile nicht,wartet der Server unter Umständen ewig.
Antwort beginntmit HTTP-
Statuscode
Wenn die Antwort zurückkommt, zeigt TELNET den erhaltenen Daten-strom an. In dem gezeigten Beispiel handelt es sich dabei um die Verwal-tungsdaten der HTTP-Antwort und den Inhalt der gewünschten Datei.Dabei ist die erste Zeile der Antwort immer der Status-String von HTTP,der uns mitteilt, auf welche Weise der Server die Anfrage beantwortethat, insbesondere ob die Anfrage erfolgreich war oder nicht. Die folgendeZeile meldet eine erfolgreiche Verarbeitung mit Status 200:
HTTP/1.0 200 OK
So meldet HTTP einen Fehler mit Status von 400 und größer
HTTP/1.0 404 NOT FOUND
Kap10.fm Seite 200 Dienstag, 22. April 2003 2:33 14
HTTP-Kommunikation mit einem Webserver 201
10.3.2 Beispiel für einen HTTP POST-Request
HTTP POST sendet Daten im Body
Ein HTTP POST erlaubt es, im Rumpf der Anfrage beliebige Daten mitzu-senden. Die häufigste Verwendung ist es, die Eingaben in einem HTML-Formular an den Server zu übertragen. Praktisch sieht dies so aus, dassder CGI-String, der bei einem HTTP GET einfach an die URL angehängtwird, im Body der Anfrage übertragen wird.
Listing 10.3 Beispiel für ein HTML-Formular mit Feldern »ui«, »pw« und dem Push-button »OK«
<html> <head> <title>Login</title> <link rel="stylesheet" href="style.css" type="text/css"> </head>
<body> <IMG border=0 src="logo.gif" width="215" height="35"> <hr> <h3>Login</h3> <form method="POST" action="login.asp" class="shopform"> <font size="4" color=red> </font> <p>Please enter your User Data below to proceed: (Userid=logos Password=world)</p> <table border="0" cellpadding="0" cellspacing="0" width="300"> <tr> <td width="175">User Name</td> <td width="125"><input name="ui" size="20"> </td> </tr> <tr> <td width="175">Password</td> <td width="125"><input name="pw" size="20" type="password"></td> </tr> </table>
Kap10.fm Seite 201 Dienstag, 22. April 2003 2:33 14
202 HTTP- und TCP/IP-Protokolle
<hr> <p><input type="submit" value="OK" name="OK" tabindex="1" class="button"> <input type="reset" value="Cancel" name="Cancel" tabindex="2" class="button"></p> </form> <hr> </body></html>
Wenn das HTML-Formular abgesendet wird, erzeugt der Browser darauseinen HTTP-Post-Request, in dessen Bauch die Formulardaten übertragenwerden. Das nachstehende Listing zeigt ein Beispiel für eine HTTP-Anfrage mit typischen Header-Informationen und der Übergabe der For-mularvariablen ui, pw und OK.
Listing 10.4 Beispiel für einen HTTP POST-Request
POST http://localhost/asp/kiosk/login.asp HTTP/1.1Accept: */*Referer: http://localhost/asp/kiosk/login.htmAccept-Language: deContent-Type: application/x-www-form-urlencodedAccept-Encoding: gzip, deflateUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705)
Abbildung 10.3 HTML-Formular in der Browserdarstellung
Kap10.fm Seite 202 Dienstag, 22. April 2003 2:33 14
HTTP-Kommunikation mit einem Webserver 203
Host: localhostContent-Length: 23Proxy-Connection: Keep-AlivePragma: no-cacheCookie: ASPSESSIONIDQGGGQJEC=HGGLFPKDPIAMLFEGLDCFJGKEExtension: Security/Remote-Passphrase
ui=logos&pw=world&OK=OK
10.3.3 Anfragen direkt ins Internet
Zugriff über Proxy-Server
Wenn Sie noch keinen Webserver installiert haben, können Sie versu-chen, sich über TELNET mit dem Internet zu verbinden. Falls Ihr PC übereinen Proxy-Server auf das Internet zugreift, dann müssen Sie sich anstattmit dem Webserver mit dem Proxyserver verbinden, der die Kommunika-tion mit dem Webserver selbst herstellt und die Anfragen und Antwortenzwischen den Parteien vermittelt. Folgendes wäre die Anfrage über dasInternet:
telnet www.yahoo.com 80GET index.htm HTTP/1.0{eine Zeile frei lassen}
Und so sähe die Anfrage über den Proxy-Server aus:
telnet myproxy 80GET http://www.yahoo.com/index.htm HTTP/1.0{eine Zeile frei lassen}
Kap10.fm Seite 203 Dienstag, 22. April 2003 2:33 14
Kap10.fm Seite 204 Dienstag, 22. April 2003 2:33 14
XML – Extended Markup Language 205
11 XML – Extended Markup Language
XML sind einfache ASCII-Dokumente zum Austausch von Daten zwischen zwei Kommunikationspartnern. XML und die darauf aufbauenden Standards SOAP und WSDL haben sich mit rasanter Geschwindigkeit zum De-facto-Standard für ver-teilte Programmierung entwickelt.
11.1 XML als Lingua franca des Internet
XML wurde als die Lingua franca des Internet bekannt, also als eine Spra-che, die jeder spricht und jeder versteht, ohne dass die Verwendungdurch eine Organisation vorgeschrieben wurde. Damit ist XML zu etwadem geworden, was die englische Sprache für die Global Economy ist.
XML ist pures ASCII
XML ist eine einfache, gleichzeitig menschen- und maschinenlesbareSprache. Dokumente in XML haben einen hierarchischen Aufbau, beste-hen aber ausschließlich aus druckbaren Zeichen und verwenden ASCII-Code zur Übertragung. XML ist HTMLsehr ähnlich, wobei XML aberstrengere Anforderungen an die Struktur des Dokuments stellt.
Einfaches Parsing und Debugging
Während die strenge Strukturierung es einfach macht, Parser für dieDokumente zu schreiben, garantiert die Verwendung von ASCII, dass dieDokumente im Falle von Störungen, auch von einem Menschen ohneweitere Hilfsmittel gelesen und analysiert werden können.
Das nachfolgende Beispiel zeigt, wie eine gewöhnliche zwei-dimensio-nale Tabelle als XML-Dokument dargestellt werden kann. Die Kreuzta-belle in Tabelle 1.1 kann in einem XML-Dokument wie in Tabelle 1.1gezeigt repräsentiert werden.
Listing 11.1 Beispiel einer einfachen XML-Farm
<?xml version="1.0" encoding="UTF-8"?><Farm xmlns="x-schema:U:\examples\XML\farmschema.xml"> <Animal>
Name Weight Gender
Cow 420 F
Pig 120 M
Tabelle 11.1 Einfache Kreuztabelle einer Animal-Farm
Kap11.fm Seite 205 Dienstag, 22. April 2003 2:33 14
206 XML – Extended Markup Language
<Name>Cow</Name> <Weight>420</Weight> <Gender>F</Gender> </Animal> <Animal> <Name>Pig</Name> <Weight>120</Weight> <Gender>M</Gender> </Animal></Farm>
11.1.1 Kleine Anatomie eines XML-Dokuments
In einer traditionellen IT-Umgebung hätten wir wahrscheinlich ein Doku-ment ähnlich dem folgenden erzeugt:
Cow 000420FPig 000120M
Flachen Dateienfehlen Informatio-
nen über dieStruktur
Das Problem mit einer solchen Datei ist offensichtlich: Wenn Sie dieDatei bekommen, wissen Sie zunächst nichts oder nicht viel über derenStruktur, weshalb die Datei ohne zusätzliche Informationen weitgehendnutzlos bleibt. Wir wissen nicht, wo die Kolonnen beginnen und wo sieenden, und auch nicht, welche Bedeutung ihnen zukommt. Häufig fehltgenau diese Dokumentation aus vielerlei Gründen und wir müssen ausdem Inhalt raten, wie die Datei aufgebaut ist.
Strukturinforma-tionen werden
hinzugefügt
Aus diesem Grund packen wir die Daten in eine harmonische Struktur,indem wir um jedes Feld und jeden Satz jeweils ein öffnendes und einschließendes Tag packen. Im folgenden Beispiel sind die Felder jedesDatensatzes von den Feldnamen umrahmt.
<Name>Cow</Name><Weight>420</Weight><Gender>F</Gender><Name>Pig</Name><Weight>120</Weight><Gender>M</Gender>
Nur druckbareZeichen sind
erlaubt
Beim Senden von Daten durch ein elektronisches Medium bestehen eineReihe von Restriktionen. So ist es zum Beispiel nicht möglich, Steuerzei-chen wie Carriage-Return <CR> oder Line-Feed <LF> beliebig in denDatenstrom eines HTTP-Dokuments einzufügen, denn diese Zeichen wer-den bereits als Sonderzeichen für das Protokoll selbst verwendet. Zweiaufeinander folgende <CR><LF>, also zwei Zeilenschaltungen hinterein-ander, signalisieren das Ende eines Abschnitts, in der Regel das Ende des
Kap11.fm Seite 206 Dienstag, 22. April 2003 2:33 14
XML als Lingua franca des Internet 207
HTTP-Headers oder des ganzen Dokuments. Manche Protokolle erlaubenauch nur eine begrenzte Anzahl von Zeichen innerhalb einer Zeile, wasaber bei HTTP nicht zutrifft.
Zeilen werden durch ein Tag markiert
In einem XML-Dokument umgeht man dieses Problem von vornherein,indem man Zeilen auch wieder durch ein öffnendes und ein schließendesTag markiert. Im Beispiel stellt jede Zeile ein Tier da, also bekommt es alsKlammer das Tag <Animal>.
<Animal><Name>Cow</Name><Weight>420</Weight><Gender>F</Gender></Animal><Animal><Name>Pig</Name><Weight>120</Weight><Gender>M</Gender></Animal>
Um das Ende eines Dokuments sicher erkennen zu können, erfordertXML noch, dass das erste Tag als Envelope (Rahmen) für das ganze Doku-ment gewertet werden muss. Dieses Tag darf auch kein weiteres Mal imganzen Dokument vorkommen.
<Farm> <Animal><Name>Cow</Name><Weight>420</Weight> <Gender>F</Gender></Animal> <Animal><Name>Pig</Name><Weight>120</Weight> <Gender>M</Gender></Animal></Farm>
Metainformatio-nen für den XML-Parser
Zuletzt fügen wir dem XML-Dokument noch ein paar administrativeInformationen hinzu. In dem Tag <?xml> können Informationen als Attri-bute mitgegeben werden, die für den Parser des Dokuments gegebenen-falls von Interesse sein könnten. In unserem Beispiel wird die XML-Ver-sion mitgegeben, mit der das Dokument konform geht, und der Nameder Zeichensatzvariante, die in dem Dokument verwendet wird. Mögli-che Zeichensätze sind unter anderem UTF-8, ANSI oder WINDOWS.
<?xml version="1.0" encoding="UTF-8"?>
NamensraumDie Spezifikation von XML erfordert, dass die Struktur des Dokumentsverifizierbar ist. Dazu wird das erhaltene Dokument mit einem Schema-Dokument verglichen. Dieses Referenzdokument nennt man einenNamespace, deshalb auch der Name des Attributs xmlns für XML-Name-space.
<Farm xmlns="x-schema:U:\examples\XML\farmschema.xml">
Kap11.fm Seite 207 Dienstag, 22. April 2003 2:33 14
208 XML – Extended Markup Language
Das folgende Listing zeigt exemplarisch die Anatomie eines XML-Doku-ments farmschema.xml. In Abbildung 11.1 ist sie nochmals grafisch aufbe-reitet.
Listing 11.2 Anatomie eines XML-Dokuments
<?xml version="1.0" encoding="UTF-8"?>
<!--W3C Schema generated by XML Spy v3.0.7 NT (http://www.xmlspy.com)--><Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="Name" content="textOnly" dt:type="string"/> <ElementType name="Weight" content="textOnly" dt:type="int"/> <ElementType name="Gender" content="textOnly" dt:type="string"/> <ElementType name="Family" content="textOnly" dt:type="string"/>
<ElementType name="Animal" content="mixed"> <element type="Name" minOccurs="1" maxOccurs="*"/> <element type="Family" minOccurs="1" maxOccurs="*"/> <element type="Weight" minOccurs="1" maxOccurs="*"/> <element type="Gender" minOccurs="1" maxOccurs="*"/> </ElementType>
<ElementType name="Farm" content="mixed"> <element type="Animal" minOccurs="1" maxOccurs="*"/> </ElementType></Schema>
Kap11.fm Seite 208 Dienstag, 22. April 2003 2:33 14
XSD-Schema und DTD 209
11.2 XSD-Schema und DTDXSD, XML-Schema-Definition
XSDs – XML-Schema-Definition - sind XML-Dokumente, die den erlaub-ten Inhalt und die Syntax anderer XML-Dokumente formal beschreiben.Zwar sind XSDs nicht zwingend, aber sehr hilfreich bei der Bestimmungformaler Aspekte eines Dokuments, zum Beispiel einer Datenbankta-belle. Darüber hinaus helfen XML-Schemen bei geschickter Anwendungauch, die »Geschwätzigkeit« von XML-Dokumenten zu reduzieren.
ValidierungEin XML-Dokument, dem ein Schema zugeordnet ist, kann gegen diesesverprobt werden, man nennt dies eine Validierung.
Grob gesprochen, ist ein XML-Schema wie ein Eintrag in einem Data-Dic-tionary. Es legt fest, wie die Datentypen der Elemente und Attribute aus-sehen, wie die Namen der Tags lauten und welche Datentypen die Werteder Elemente annehmen dürfen.
Aufbau eines Schemas
Ein XML-Schema ist selbst ein gültiges XML-Dokument und verwendetdafür eine Reihe von vordefinierten Tags, die als Teil der XML-Sprachefestgelegt wurden. Da ein XML-Schema selbst ein XML-Dokument ist,
Abbildung 11.1 Anatomie eines XML-Dokuments
���������� �������� ���� �����������
�����
�� �����
�������� �!�����
�"���#$�%&��!"���#$�
�'� �����!'� ���
�!� �����
�� �����
������(���!�����
�"���#$��&��!"���#$�
�'� ���)�!'� ���
�!� �����
������ �����!�
�!����
����������������� �������
���������������
� ������������
��������
���� ������ �� ���
��� � ���
���� �
������ �� �
��� � ���
���� �������
��������������� ������������������� �
�������� ���
���������������
����������������
Kap11.fm Seite 209 Dienstag, 22. April 2003 2:33 14
210 XML – Extended Markup Language
kann es genau genommen wiederum gegen ein anderes Dokument vali-diert werden. Das Dokument, das die Validierungsinformation für einSchema enthält, beschreibt die erlaubten Tags des Schemas. Dies wird vorallem benutzt, um die Verprobung gegen eigene Datentypen oder Daten-strukturen zu ermöglichen, zum Beispiel kann bestimmt werden, ob dieDatenbank einen Type Float unterstützt.
Listing 11.3 XSD – XML-Schema zur Animal-Farm
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE xsd:schema PUBLIC "-//W3C//DTD XMLSCHEMA 19991216//EN" "" [ <!ENTITY % p 'xsd:'> <!ENTITY % s ':xsd'>]><xsd:schema xmlns:xsd="http://www.w3.org/1999/XML-Schema"> <xsd:complexType name="TyFamily" content="elementOnly"> <xsd:sequence> <xsd:element name="TyName"> <xsd:simpleType base="xsd:string"> <xsd:enumeration value="Cow"/> <xsd:enumeration value="Pig"/> </xsd:simpleType> </xsd:element> </xsd:sequence> </xsd:complexType>
<xsd:complexType name="TyGender" content="elementOnly"> <xsd:sequence> <xsd:element name="TyGender"> <xsd:simpleType base="xsd:string"> <xsd:enumeration value="F"/> <xsd:enumeration value="M"/> </xsd:simpleType> </xsd:element> </xsd:sequence> </xsd:complexType>
Kap11.fm Seite 210 Dienstag, 22. April 2003 2:33 14
XSD-Schema und DTD 211
<xsd:complexType name="AnimalType" content="elemen-tOnly"> <xsd:sequence> <xsd:element name="Family" type="TyFamily"/> <xsd:element name="Weight" type="xsd:short"/> <xsd:element name="Gender" type="TyGender"/> </xsd:sequence> </xsd:complexType>
<xsd:element name="Farm"> <xsd:complexType content="elementOnly"> <xsd:sequence> <xsd:element name="Animal" type="AnimalType" minOccurs="1" maxOccurs="unbounded"/> </xsd:sequence> <xsd:attribute name="xmlns:xsi" type="xsd:uriReference" use="default" value="http://www.w3.org/1999/XMLSchema- instance"/> <xsd:attribute name="xsi:noNamespaceSchemaLocation" type="xsd:string"/> <xsd:attribute name="xsi:schemaLocation" type="xsd:string"/> </xsd:complexType></xsd:element></xsd:schema>
DTD, Document Type Definition
Alternativ zu den XML-Schemen gibt es noch weitere Validierungs-mechanismen. Ebenfalls weit verbreitet sind DTDs (Document Type Defi-nition), die vor allem zur Beschreibung von Datenbanktabellen herange-zogen werden.
Listing 11.4 DTD zur Animal-Farm
<?xml version="1.0" encoding="UTF-8"?><Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="Name" content="textOnly" dt:type="string"/> <ElementType name="Family" content="textOnly" dt:type="string"/> <ElementType name="Weight" content="textOnly"
Kap11.fm Seite 211 Dienstag, 22. April 2003 2:33 14
212 XML – Extended Markup Language
dt:type="int"/> <ElementType name="Gender" content="textOnly" dt:type="string"/>
<ElementType name="Animal" content="mixed"> <element type="Name" minOccurs="1" maxOccurs="*"/> <element type="Family" minOccurs="1" maxOccurs="*"/> <element type="Weight" minOccurs="1" maxOccurs="*"/> <element type="Gender" minOccurs="1" maxOccurs="*"/> </ElementType>
<ElementType name="Farm" content="mixed"> <element type="Animal" minOccurs="1" maxOccurs="*"/> </ElementType></Schema>
Es mag hilfreich sein, dass ein Schema weitgehend analog zu einer Typde-klaration einer modernen Programmiersprache ist, wie Sie es in Tabelle1.2 sehen können. Allerdings kann man mit Schemen noch deutlich kom-plexere Definitionen bewerkstelligen.
ABAP IV Visual Basic XML-Schema
Types:TyFamily Type C(12)
Public Enum TyFamily Cow = 1 Pig = 2End Enum
<xsd:element name="TyName"> <xsd:simpleType base="xsd:string"> <xsd:enumeration value="Cow"/> <xsd:enumeration value="Pig"/> </xsd:simpleType></xsd:element>
Tabelle 11.2 Vergleich der Datenstrukturen in ABAP, VB und XML
Kap11.fm Seite 212 Dienstag, 22. April 2003 2:33 14
DOM – Document Object Model 213
Anzumerken bleibt noch, dass ein Schema sowohl in dem XML-Doku-ment mitgeführt als auch in einer separaten Datei abgespeichert werdenkann. Ansonsten ist das Erstellen eines XML-Schemas nicht sehr schwie-rig, lediglich die produzierten Ergebnisse sind manchmal etwas schwer zulesen.
11.3 DOM – Document Object Model
Reale Datenstruk-turen sind meis-tens hierarchisch
Zu den Kernkompetenzen der Webentwicklung gehört das Arbeiten mitDokumenten. Die Grundidee ist es, dass sich Datenströme in aller Regelin eine hierarchische Baumstruktur abbilden lassen. Auch wenn die Datendem Inhalt nach unterschiedlich sind, bleibt die Struktur von verwandtenDokumenten meistens gleich. Eine solche Struktur eines Dokumentsnennt man ein Document Object Model (DOM). In einer gewissen Weiseist dies auch eine Renaissance des hierarchischen Datenbankmodells.
Types:TyGender Type C(1)
Public Enum TyGender male = 1 female = 2End Enum
<xsd:element name="TyGender"> <xsd:simpleType base="xsd:string"> <xsd:enumeration value="F"/> <xsd:enumeration value="M"/> </xsd:simpleType></xsd:element>
Types: Begin Of AnimalName(32),Family Type TyFamily,Weight Type P,Gender Type TyGender,End Of Animal.
Public Type Animal Name As String Family As TyFamily Weight As Long Gender As TyGenderEnd Type
<ElementType name="Animal" content="mixed"> <element type="Name"/> <element type="Family"/> <element type="Weight"/> <element type="Gender"/></ElementType>
ABAP IV Visual Basic XML-Schema
Tabelle 11.2 Vergleich der Datenstrukturen in ABAP, VB und XML (Forts.)
Kap11.fm Seite 213 Dienstag, 22. April 2003 2:33 14
214 XML – Extended Markup Language
11.3.1 DOM-Beispiele
DOM ist ein ein-facher Datenbaum
Im Grunde genommen sind DOMs selbst erklärend. Es sind einfacheBäume mit wenigen Anmerkungen, die besagen, wie oft ein bestimmterAst vorkommen kann oder muss. Es folgen einige Beispiele für Doku-mente und möglicher DOMs.
Listing 11.5 Microsoft-Word-DOM
Document �� [1…*] Paragraphs �� [1…*] Words �� [1…*] Characters �� �� [1…*] Fields (Pictures, Formulae etc.)
Auch einfache Textdateien haben ein DOM, das natürlich auch entspre-chend einfach ist.
Listing 11.6 DOM einer einfachen Textdatei
Text Document �� [1…*] Characters
Ein DOM ist notwendigerweise eindeutig. Je nach Bedarf kann man auchKomplexität hinzufügen oder weglassen, wie am Beispiel einer Textdateizu erkennen ist.
Listing 11.7 Alternatives DOM einer Textdatei
Text Document �� [1…*] Paragraphs �� [1…*] Characters
Auch IDocs haben ein DOM.
Listing 11.8 SAP-IDoc-DOM
IDoc Document �� [1…1] Control record �� [1…*] Segments �� [1…1] Segment info �� [1…1] Data �� [1…*] Segment fields
Kap11.fm Seite 214 Dienstag, 22. April 2003 2:33 14
XML-Parser 215
Listing 11.9 Beispiel eines SAP-IDoc
EDI_DC40 043000000000001234540B 3012 MATMAS03 MATMAS DEVCLNT444 PROCLNT100 E2MARAM001 444Somedata E2MAKTM001
Ebenso SOAP-Dokumente:
Listing 11.10 SOAP-DOM
SOAP Document�� [1…1] SOAP Envelope
�� [0…1] SOAP Header� �� [0…*]Header Block¦�� [1…1] SOAP Body
�� [1…*]Message Body�� [1…*]Elements
Listing 11.11 Beispiel eines SOAP-Dokuments
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/ soap/envelope/"> <soap:Body>… </soap:Body></soap:Envelope>
11.4 XML-Parser
XML-Parser sind fertige Bibliotheken, die ein XML-Dokument lesen undes in eine leichter zu verarbeitende Baum- oder Matrixstruktur umwan-deln.
PerformanceEs ist bei weitem der mühsamste und auch langweiligste Teil, ein XML-Dokument von seinen Tags zu befreien und die Daten in geeigneteinterne Datenstrukturen umzuwandeln. Diese Arbeit nehmen Ihnen vor-gefertigte XML-Parser ab, von denen es mittlerweile jede Menge gibt. DieParser unterscheiden sich oft wesentlich in der Performance, denn mankann langsam oder auch schnell durch einen rekursiv strukturierten Baumwandern.
Kap11.fm Seite 215 Dienstag, 22. April 2003 2:33 14
216 XML – Extended Markup Language
Programmcodeaus Schemagenerieren
Viele Parser bieten auch noch zusätzlich die Möglichkeit, aus einemSchema oder einem WSDL-Dokument den Programmcode zu einer Pro-grammiersprache zu generieren. Die meisten Tools existieren für die Java-Welt, während Microsoft alles in seinem SOAP-Toolkit zusammenfasst.
11.4.1 DOM oder SAX
Es gibt grundsätzlich zwei verschiedene Vorgehensweisen beim Parsenvon XML-Dokumenten. Die einen bilden das Document Object Modeldes XML-Dokuments ab und heißen deshalb auch DOM-Parser, währenddie anderen das XML-Dokument Stück für Stück abarbeiten. Sie werdenSAX-Parser genannt. Der Unterschied liegt demnach in der Technik, wiedas Dokument verarbeitet wird.
DOM-Parser
DOM-Parserbilden das Doku-ment als Baum ab
Das Dokument wird vom Parser komplett analysiert und dann in ein hie-rarchisches Objekt umgewandelt. Dies ist vergleichbar einem Compilerbei den Programmiersprachen, die das Quellprogramm zunächst überset-zen, bevor sie es verarbeiten.
SAX-Parser
SAX-Parser arbei-ten Dokumente
Stück für Stück ab
Dieser Parser ist gedacht für sehr große XML-Dokumente. Er parst jeweilsnur das nächste Token des Dokuments und übergibt dann die Verarbei-tung an die rufende Applikation. Die Realisierung ist meistens eventge-steuert, das heißt, der Parser löst ein bestimmtes Event aus, wenn er einelogische Einheit des Dokuments erkannt hat, und überlässt dem Event-handler die Verarbeitung. Nach Abarbeiten des Events führt der Parserseine Arbeit bis zum nächsten Ereignis fort. Diese Vorgehensweise ist miteinem Interpreter zu vergleichen, der Statement für Statement liest undjeweils sofort ausführt.
11.4.2 Der Microsoft XML-Parser
Microsoft packt seinen Parser geschickterweise gleich in den InternetExplorer und schlägt damit zwei Fliegen mit einer Klappe. Zum einenwird der Internet Explorer voll XML-kompatibel und darüber hinaus hatjeder Windows-Anwender, und damit jeder, der einen Computer auf sei-nem Schreibtisch hat, auch die XML-Libraries von Microsoft. Da Stan-dards nicht verordnet werden, sondern entstehen, schafft Microsoftdamit die Basis, seine Vorstellungen als Standard durchzusetzen, dennwas jeder hat, hat die größten Chancen, zum Standard zu werden.
Kap11.fm Seite 216 Dienstag, 22. April 2003 2:33 14
XML-Parser 217
XML Document ActiveX – Micro-soft.XMLDOM
Dennoch ist die Microsoft XML-Klasse (msxml4.dll) eine sehr mächtigeBibliothek, die fast alle Funktionalitäten enthält, die man für die Entwick-lung von Webservices benötigt. Die MSXML-Klasse verfügt sowohl übereinen DOM-Parser als auch über einen SAX-Parser.
11.4.3 XML-Parser Libraries for Java
Es gibt eine ganze Reihe konkurrierender XML-Parser für Java, die meis-ten davon entstammen der Open Software Foundation wie zum BeispielApache XERXES.
jDOM
Als Beispiel für einen Java-Parser wurde hier jDOM ausgewählt. jDOM istein Projekt einer Gruppe von Open-Source-Entwicklern. Es ist ein fürEntwickler kostenlos vertriebener voll funktionsfähiger DOM-Parser undDOM-Treemanager, der von Konzept und Anwendung her sehr demMSXML von Microsoft ähnelt.
Listing 11.12 Darstellung der Animal-Farm mit jDOM für Java
package jdomtest;import org.jdom.*;import org.jdom.output.*;
public class simpledom { Document myDoc; Element root;
public simpledom() { } /* This is the constructor ! */
private void makedoc() { root = new Element("Shop"); myDoc = new Document(root); }/* Here we add a single Animal element to our document */ public void AddAnimal(String name, String family, int weight, String gender) { Element animal = new Element("Animal"); Attribute attName = new Attribute("Name", name);
Kap11.fm Seite 217 Dienstag, 22. April 2003 2:33 14
218 XML – Extended Markup Language
/* Set the name as attribute "<Animal Name="Elsa">" */ animal.setAttribute(attName); root.addContent(animal); /* Add the family element "<Family>Cow</Family>" */ Element elem = new Element("Family"); elem.addContent(family); animal.addContent(elem); /* Add the Weight element and convert int to String" */ elem = new Element("Weight"); elem.addContent(Integer.toString(weight)); animal.addContent(elem); /* Add the Gender element "<Gender>F</Gender>" */ elem = new Element("Gender"); elem.addContent(gender); animal.addContent(elem); }
public String XML() { String XMLstring; XMLOutputter xmlout = new XMLOutputter(" ",true); XMLstring = xmlout.outputString(myDoc); return XMLstring; }/* I think toSTring is the logical name for this */ public String toString() { return this.XML(); } public static void main(String[] args) { simpledom TestSimpledom = new simpledom(); System.out.println("Hello jDOM"); TestSimpledom.makedoc(); TestSimpledom.AddAnimal("Elsa", "Cow", 420, "F"); System.out.println("*** Result from Document.toString()"); System.out.println(TestSimpledom.myDoc.toString()); System.out.println("*** Result from this.XML()"); System.out.println(TestSimpledom.XML()); System.out.println("*** Result from
Kap11.fm Seite 218 Dienstag, 22. April 2003 2:33 14
XML-Parser 219
this.toString()"); System.out.println(TestSimpledom.toString() ); }
11.4.4 XML-Browser und Editoren
XMLSPYXML-Dokumente können Sie jederzeit mit dem Internet Explorer ab Ver-sion 5 oder mit Netscape ab Version 6 ansehen. Allerdings sind die For-matierungsmöglichkeiten der Browser doch sehr begrenzt. Als Notlösungmögen die Browser ihren Sinn haben, aber für komplexe Dokumenteoder gar zum Edieren von XML-Dokumenten eignen sie sich nicht.
Einer der leis-tungsstärksten XML-Editoren
Es gibt eine Vielzahl von XML-Editoren auf dem Markt, viele davon sindgratis in der Public Domain zu finden und auch günstige Shareware findetman zum Beispiel bei download.com. Ein solcher Editor, der auch alsShareware begonnen hat, ragt aber aus der Masse heraus, es ist XMLSPYder österreichischen Firma Altova (www.xmlspy.com). XMLSPY bietetvom Viewer bis zum Schema-Generator oder XSLT-Debugger fast alles,was man für das Arbeiten mit XML benötigt, und ist somit eine überra-gende XML-IDE.
11.4.5 Namespaces – Namensräume
Jeder XML-Webservice benötigt einen eindeutigen Namensraum, eng-lisch namespace, damit eine beliebige Client-Anwendung die verschiede-nen Webservices auseinander halten kann. Jeder Webservice sollte sei-nen eigenen Namespace festlegen und den Verweis auf den Namespaceals eindeutige URN im Internet veröffentlichen.
Für Entwicklungszwecke können Sie auch auf vordefinierte Namespacesdes W3C zurückgreifen oder auf Microsofts http://tempuri.org, der vonMicrosofts SOAP-Development-Toolkit als Default-Namespace verwen-det wird.
Namespace muss eindeutig sein
Der Namespace sollte so eindeutig sein, dass damit auch Ihr Webserviceeindeutig von anderen unterschieden werden kann, mit anderen Worten:Der Namespace soll identifizierend für einen Webservice sein. Daserreicht man am einfachsten durch Zufügen des eigenen Domain-Namens.
Namespace muss eine öffentliche URN sein
Der Verweis auf den Namespace ist eine URN, muss aber nicht immer aufeine URL im Web verweisen. Wichtig ist lediglich, dass der Nutzer desWebservices anhand der URN den Namespace eindeutig bestimmenkann. Häufig genügt es dem Parser, die URN zu erkennen, er hat aber
Kap11.fm Seite 219 Dienstag, 22. April 2003 2:33 14
220 XML – Extended Markup Language
ansonsten den Namespace bereits hart codiert eingebaut. Die folgendenBeispiele stammen aus Microsoft.NET und setzen die Namespace-Refe-renz in den verschiedenen Programmiersprachen jeweils auf »http://microsoft.com/webservices/«:
Listing 11.13 Beispiele für Namensraum-Referenzen Microsoft.NET
C# [WebService(Namespace="http://microsoft.com/webservices/")]public class MyWebService { // implementation}
Visual Basic.NET <WebService(Namespace:="http://microsoft.com/webser-vices/")> Public Class MyWebService ' implementationEnd Class
Visual J#.NET /**@attribute WebService(Namespace="http://micro-soft.com/webservices/")*/public class MyWebService { // implementation}
11.5 XSLT – eXtended Style Sheet Language Transformations
Auf XML basie-rende Skript-
sprache
Die eXtended Stylesheet Language ist eine auf XML basierende Skript-sprache, die verwendet wird, um XML-Dokumente in ein anderes Doku-ment zu transformieren. Die durch XSLT definierten Dokumente nenntman XSL-Stylesheets.
Formatierung imBrowser gedacht
XSL wurde ursprünglich entworfen, um Formatierungen auf die Darstel-lung von XML in einem Browser zu ermöglichen, ähnlich den CascadingStylesheets. XSL ist eine auf Templates (Mustervorlagen) basierende Pro-grammiersprache, die XML-Dokumente durchläuft und jedes Element ineinen beliebigen anderen String umsetzen kann. Dies bedeutet auch, dassdas Ergebnis einer Transformation kein XML-Dokument sein muss. XMLkann also auch zum Beispiel in HTML oder PDF transformiert werden.
Kap11.fm Seite 220 Dienstag, 22. April 2003 2:33 14
HTML-Seiten mit XSL-Stylesheets und XML 221
11.6 HTML-Seiten mit XSL-Stylesheets und XMLEs gibt Dutzende von Büchern über XML und XSL, vermutlich mittler-weile mehr als 100. Allen diesen Büchern ist gemeinsam, dass ihre Auto-ren ein sicher vorzügliches Wissen von XSL und XML haben und dement-sprechend all die schönen und fantastischen Möglichkeiten ausbreiten.
Allerdings vergessen sie hinter den dargestellten Möglichkeiten, dassXML und XSL vor allem eines sein sollen: nämlich einfach! Ich werde michdeshalb auf den häufigsten Anwendungsfall von XSL beschränken, derKonversion von XML-Dateien in ein darstellbares HTML-Format.
11.6.1 Inventurtabelle der Animal-Farm
Gehen wir wieder von der Animal-Farm aus, die wir schon bei der Dar-stellung von XML gesehen haben. Unser Ziel wird es sein, die Daten desXML-Dokuments als HTML-Tabelle darzustellen.
Das HTML zu dieser Tabelle sieht aus wie in dem nachstehenden Beispiel.
Listing 11.14 HTML zur Tabelle der Tiere
<html> <body> <table border="1"> <tr><th>Name</th><th>Family</th> <th>Gender</th><th>Weight</th></tr>
<tr><td>Elsa</td><td>Cow</td> <td>female</td><td>420</td></tr> <tr><td>Rosa</td><td>Pig</td> <td>male</td><td>120</td></tr> <tr><td>Lisa</td><td>Chicken</td> <td>male</td><td>3</td></tr> </table> </body></html>
Name Family Gender Weight
Elsa Cow female 420
Rosa Pig male 120
Lisa Chicken male 3
Tabelle 11.3 Tabelle der Tiere der Animal-Farm
Kap11.fm Seite 221 Dienstag, 22. April 2003 2:33 14
222 XML – Extended Markup Language
Header und Body Man kann erkennen, dass wir es mit zwei Blöcken zu tun haben, einemEnvelope mit den Tags <HTML> und <BODY> sowie der eigentlichenTabelle, die vom <TABLE>-Tag eingeschlossen ist. Innerhalb der Tabelle fin-den sich dann die Überschrift mit den <TD>-Tags und die Zeilen mit <TR>.
11.6.2 XSL – Step by step
Wir werden nun Schritt für Schritt ein XSL-Stylesheet aufbauen, das dieTransformation des XML-Dokuments vornimmt. Jedes XSL-Stylesheet istmit <xsl:stylesheet> eingerahmt, besitzt also ein Root-Element mitdem Namen xsl:stylesheet.
Listing 11.15 Ein minimales XSL-Stylesheet
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet></xsl:stylesheet>
XSLT hat einenNamensraum
Zunächst müssen wir dem Stylesheet einen Namensraum zuweisen. Wiebei jedem XML-Dokument definiert der Namespace bei XSL ebenfalls dieNamen der Tags und Attribute, die für das Stylesheet zugelassen sind. DerStandard-Namespace für W3C-kompatible Stylesheets ist:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
Listing 11.16 XSL-Stylesheet mit Namespace
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"></xsl:stylesheet>
Dummy-Namensraum
Die Standard-Referenz xmlns:xsl=http://www.w3.org/TR/WD-xslist lediglich eine Dummy-Referenz. Im Allgemeinen wird diese nicht jedesMal aus dem Internet geholt, sondern der Parser hat die darin enthaltenenDefinitionen fest eingebaut. Im Grunde gibt es viele solcher Dummy-Refe-renzen, die aus formalen Gründen mitgeführt werden, aber der Effizienzhalber fest eingebaut sind. Erkennt der Parser eine URN aber nicht, wird erdiese im Internet nachlesen, findet er die URN nicht, gibt es einen Fehler.
11.6.3 XSL-Templates
Template-Sprache Templates sind das Herz des XSL-Formattings. Ein solches Templatebestimmt eine Reihe von XSL-Definitionen in seinem Body, die dann aufjedes passende XML-Tag angewandt werden. Tatsächlich geht der Parser
Kap11.fm Seite 222 Dienstag, 22. April 2003 2:33 14
HTML-Seiten mit XSL-Stylesheets und XML 223
das XML-Dokument von oben nach unten durch und ersetzt das pas-sende Element des Templates mit dem Wert aus dem XML. Mit Hilfeeines match-Attributs kann man die richtigen Tags herausfiltern. DieAngabe von match="/" passt auf alle Elemente des XML-Dokuments.
Listing 11.17 XSL-Stylesheet, das alle XML-Tags wegfiltert
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> Hiding the root </xsl:template></xsl:stylesheet>
Das vorstehende Beispiel produziert als Ergebnis:
Hiding the root
11.6.4 XSL auf die Animal-Farm angewandt
Wir sind nun bereit, das Template auf das Animal-Farm-XML-Dokumentanzuwenden. In unserem Beispiel arbeiten wir mit einem einzigen Temp-late, das auf die Root des zu transformierenden Dokuments angewandtwird (match="/"). Dieses Template erzeugt den Body eines HTML-Doku-ments und loopt dann über die Elemente (<xsl:for-eachselect="Farm/Animal">) der Animal-Farm, um für jedes Tier eineHTML-Tabellenzeile (<tr><td>Cow</td></tr>) zu erzeugen.
Listing 11.18 Ein passendes XSL-Stylesheet
<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl"> <xsl:template match="/"> <html> <head/> <body> <table border="1"> <tr> <th>Name</th> <th>Family</th> <th>Gender</th> <th>Weight</th> </tr>
Kap11.fm Seite 223 Dienstag, 22. April 2003 2:33 14
224 XML – Extended Markup Language
<xsl:for-each select="Farm/Animal"> <tr> <td> <xsl:value-of select="@Name"/> </td> <td> <xsl:value-of select="Family"/> </td> <td> <xsl:choose> <xsl:when test=".[Gender='M']">male</xsl:when> <xsl:when test=".[Gender='F']">female</xsl:when> <xsl:otherwise>unknown</xsl:otherwise> </xsl:choose> </td> <td> <xsl:value-of select="Weight"/> </td> </tr> </xsl:for-each> </table> </body></html></xsl:template></xsl:stylesheet>
11.6.5 Anatomie des XSL-Stylesheets
Schauen wir uns das Stylesheet noch einmal näher an, um zu verstehen,wie die Transformationen vor sich gehen:
<?xml version="1.0" encoding="UTF-8"?>
Bezug auf den Standard-Namensraum:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
match="/" bedeutet das oberste Element des XML-Dokuments, dasheißt, das Stylesheet ist auf alle Elemente des Eingabedokuments anzu-wenden.
Kap11.fm Seite 224 Dienstag, 22. April 2003 2:33 14
HTML-Seiten mit XSL-Stylesheets und XML 225
<xsl:template match="/"> <html> <head/> <body> <table border="1"> <tr> <th>Name</th> <th>Family</th> <th>Gender</th> <th>Weight</th> </tr>
Bis an diese Stelle formen wir den statischen Block der HTML-Tabelle.
Ab jetzt gehen wir in einer Schleife über alle Tags <Animal>, die selbstTöchter des Tags <Farm> sind.
<xsl:for-each select="Farm/Animal"> <tr> <td>
Die folgenden Zeilen geben den Wert des Attributs Name aus, das den<Animal>-Attributen zugewiesen wurde. Attribute werden immer durchVoranstellen des at-Zeichens (@) referenziert. Im Unterschied dazu wirdeiner Variablen in XSL ein Dollar-Zeichen ($) vorangestellt.
<xsl:value-of select="@Name"/> </td> <td>
Als nächste erfolgt die Ausgabe des Wertes des Elements mit dem Tag<Family> unterhalb von <Animal>.
<xsl:value-of select="Family"/> </td> <td>
Auch Fallunterscheidungen sind in XSL durch das Statement<xsl:choose> möglich, das den Wert des Elements <Gender> auf ver-schiedene Werte prüft und diesen durch einen entsprechenden Textersetzt, also »M« durch »male« und »F« durch »female«. Der Punkt inner-halb des Vergleichs test=".[Gender='M']" referenziert den aktuellbearbeiteten Knoten.
Kap11.fm Seite 225 Dienstag, 22. April 2003 2:33 14
226 XML – Extended Markup Language
<xsl:choose> <xsl:when test=".[Gender='M']">male</xsl:when> <xsl:when test=".[Gender='F']">female</xsl:when> <xsl:otherwise>unknown</xsl:otherwise> </xsl:choose> </td> <td> <xsl:value-of select="Weight"/> </td> </tr> </xsl:for-each> </table> </body></html></xsl:template></xsl:stylesheet>
Das nachstehende Listing zeigt ein XML-Dokument, das sich mit obigemXSLT transformieren lässt. Ein Browser transformiert das XML automa-tisch, wenn der Verweis auf ein Stylesheet wie im nachstehenden Beispielbereits im Dokument steht.
Listing 11.19 Zu transformierendes XML-Dokument
<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="U:\examples\XML\Farm.xsl"?><!-- Reference to an existing XSL stylesheet "Farm.xsl" --><Farm> <Animal name="Elsa"><!-- One <Animal> tag for every animal --> <Family>Cow</Family> <Weight>420</Weight> <Gender>F</Gender><!-- One tag for each characteristic of the animal --> </Animal> <Animal name="Rosa"> <Family>Pig</Family> <Weight>120</Weight>
Kap11.fm Seite 226 Dienstag, 22. April 2003 2:33 14
HTML-Seiten mit XSL-Stylesheets und XML 227
<Gender>M</Gender> </Animal> <Animal name="Lisa"> <Family>Chicken</Family> <Weight>3</Weight> <Gender>M</Gender> </Animal></Farm>
Das nachfolgende Diagramm zeigt noch einmal in übersichtlicher Form,wie das Stylesheet in die tabellarische Ausgabe übergeht.
11.6.6 Parsing des XML und Anwendung des XSL
Die Transformation des XML-Dokuments in HTML durch ein Stylesheetbenötigt einen Parser, der dies leistet. Die meisten XML-Parser könnenauch Transformationen mittels XSL durchführen. In einer Microsoft-Umgebung können wir wieder auf MSXML und die darin implementier-ten Methoden transformNodeToObject und transformNode zurück-greifen.
Abbildung 11.2 Synoptische Sicht auf Stylesheet und transformierte Ausgabe
Kap11.fm Seite 227 Dienstag, 22. April 2003 2:33 14
228 XML – Extended Markup Language
Listing 11.20 VBA-Program zur Transformation von XML-Daten mit XSL-Stylesheet und msxml.dll
Dim xmlDoc As MSXML2.DOMDocumentDim xslDoc As MSXML2.DOMDocument
Sub Main() Set xmlDoc = New MSXML2.DOMDocument Set xslDoc = New MSXML2.DOMDocument
xmlDoc.Load ("U:\examples\XML\Farm.xml") xslDoc.Load ("U:\examples\XML\Farm.xsl") Debug.Print xmlDoc.transformNode(xslDoc)End Sub
Listing 11.21 ASP zur Transformation von XML-Daten mit XSL-Stylesheet und msxml.dll
<%Dim xmlDoc As MSXML2.DOMDocumentDim xslDoc As MSXML2.DOMDocumentSet xmlDoc = CreateObject("Microsoft.XMLDOM")Set xslDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.Load ("U:\examples\XML\Farm.xml")xslDoc.Load ("U:\examples\XML\Farm.xsl")Debug.Print xmlDoc.transformNodeToObject(xslDoc, response)%>
11.7 SOAPUniverselle
Aufrufmethodefür RPC
SOAP steht für Simple Object Access Protocol. Es ist ein einfaches Proto-koll, das durch Übertragen von XML-Dokumenten Programme auf einemRemote-Computer aufrufen kann. Dabei werden der Name der zu rufen-den Methode und die Parameter in einen XML-Tree codiert und dieAnfrage an den Server geschickt. Der packt den SOAP-Request aus undruft dann die gewünschte Methode in geeigneter Weise auf.
Listing 11.22 Aufruf einer Multiplikation via SOAP
POST /quickstart/aspplus/samples/services/MathService/VB/MathService.asmx HTTP/1.1Host: localhostContent-Type: text/xml; charset=utf-8
Kap11.fm Seite 228 Dienstag, 22. April 2003 2:33 14
SOAP 229
Content-Length: lengthSOAPAction: "http://tempuri.org/Multiply"
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XML-Schema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <Multiply xmlns="http://tempuri.org/"> <A>float</A> <B>float</B> </Multiply> </soap:Body></soap:Envelope>HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: length
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XML-Schema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <MultiplyResponse xmlns="http://tempuri.org/"> <MultiplyResult>float</MultiplyResult> </MultiplyResponse> </soap:Body></soap:Envelope>
Listing 11.23 Darstellung eines Arrays in SOAP
Array in Visual BasicDim someNumber[2] As IntegersomeNumber[0] = "3"someNumber[1] = "4"Array in SOAP<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:int[2]" name="someStrings"><SOAP-ENC:int>3</SOAP-ENC:int><SOAP-ENC:int>4</SOAP-ENC:int>
Kap11.fm Seite 229 Dienstag, 22. April 2003 2:33 14
230 XML – Extended Markup Language
</SOAP-ENC:Array> Mehrdimensionales Array in Visual BasicDim someStrings[2,2] As StringsomeString[0,0] = "AAA"someString[0,1] = "BBB"someString[1,0] = "CCC"someString[1,1] = "DDD"Mehrdimensionales Array in SOAP<SOAP-ENC:Array SOAP-ENC:arrayType="xsd:string[2,2]"><SOAP-ENC:string>AAA</SOAP-ENC:string><SOAP-ENC:string>BBB</SOAP-ENC:string><SOAP-ENC:string>CCC</SOAP-ENC:string><SOAP-ENC:string>DDD</SOAP-ENC:string></SOAP-ENC:Array>
getUTCTime Das folgende Beispiel stammt aus den Trainingsseiten vonwww.altova.com und bedient sich eines Webservices, um die universelleZeit zu bestimmen. Die Anfrage wird wieder als SOAP-Dokument formu-liert, und in SOAP kommt auch die Antwort vom Server nanonull.com.Das Beispiel stellt die einfachste Form einer SOAP-Abfrage dar und zeigtdeutlich die formale Dokumentstruktur. Die Abfrage hat keine Parameter,weshalb im Body des SOAP-Dokuments nur der Name des Webservices<getUTCTime> steht.
Listing 11.24 SOAP-Request zur Bestimmung der aktuellen UTC-Zeit
POST /TimeService/TimeService.asmx HTTP/1.1Host: www.nanonull.comContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "http://www.Nanonull.com/TimeService/getUTCTime"
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getUTCTime xmlns="http://www.Nanonull.com/TimeService/" />
Kap11.fm Seite 230 Dienstag, 22. April 2003 2:33 14
WSDL-Dokumente 231
</soap:Body></soap:Envelope>
Die Antwort ist wieder ein HTTP-Dokument, das ein XML-Dokument mitder gewünschten Antwort im Bauch trägt. Man beachte hier wieder, wiemit den Namen der XML-Tags gespielt wird. Der Service heißtgetUTCTime und das Envelope der Antwort wird aus diesem Namendurch Anhängen von Response gebildet, ergo heißt das Envelope-TaggetUTCTimeResponse.
Listing 11.25 SOAP-Response von nanonull.com
HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: length
<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getUTCTimeResponse xmlns="http://www.Nanonull.com/TimeService/"> <getUTCTimeResult>string</getUTCTimeResult> </getUTCTimeResponse> </soap:Body></soap:Envelope>
11.8 WSDL-Dokumente
WSDL (Webservices Description Language) ist eine Sprache, die mit Hilfevon XML-Dokumenten die Struktur der Requests und Responses einesWebservices beschreibt.
Beschreibt die Form eines RPC-Arufes
Ein WSDL-Dokument ist ein einfaches, fest strukturiertes XML-Doku-ment, das in formaler Weise beschreibt, wie ein Programm aufgerufenwird. Dahinter steckt die schlichte Idee, dass ein beliebiges rufendes Pro-gramm seine Anfrage als XML-Dokument verschickt, dieses von demempfangenden Server entgegengenommen wird und aus dem gesende-ten XML-Dokument automatisch einen korrekten Funktionsaufruf gene-riert.
Kap11.fm Seite 231 Dienstag, 22. April 2003 2:33 14
232 XML – Extended Markup Language
Für SOAPbeschreibt WSDL
die Tags
Gehen wir davon aus, dass die Anfragen an den Server in SOAP übermit-telt werden, beschreibt ein WSDL-Dokument, wie die Tags des SOAP-Dokuments auszusehen haben. Die Beschreibung ist so ausführlich, dassman mit ihrer Hilfe die Struktur des erforderlichen SOAP-Request-Doku-ments bestimmen kann.
11.8.1 WSDL-DOM
DOM einer WSDLhat eine feste
Struktur
Das DOM eines WSDL-Dokuments setzt sich aus einem Envelope mitdem festen Namen <definitions> und vier Teilbäumen zusammen, diedie Elemente eines Webservices im Detail beschreiben. Die Teilelementedes WSDL sind in Tabelle 1.4 aufgeführt.
Damit ergibt sich das im folgenden Listing dargestellte, einfache Doku-mentenmodell eines WSDL-Dokuments. Aus der Sicht des Protokolls istder Dokumentenbaum immer dreistufig.
Listing 11.26 Strukturbaum eines WSDL-Dokuments (WSDL-DOM)
WSDL Document �� [1…1] <definitions> �� [0…*] <types> � �� [0…*]type definitons ¦ �� [0…*] <messages> � �� [0…*]message definitons ¦ �� [0…*] <portType> � �� [0…*]port type definitons
Element Zweck
<portType> Beschreibt die Aktion (das auszuführende Programm) für den Web-service.
<message> Beinhaltet die Nachrichten, die vom Requester an den Server über-mittelt werden. Das sind insbesondere die Parameter des gewünsch-ten Funktionsaufrufs.
<types> Definiert die Datenstrukturen (Data Types), die innerhalb des WSDL-Dokuments verwendet werden.
<binding> Beschreibt das Protokoll, mit dem die Daten vom Requester an den Server und zurück übertragen werden.
Tabelle 11.4 Elemente eines WSDL-Dokuments
Kap11.fm Seite 232 Dienstag, 22. April 2003 2:33 14
WSDL-Dokumente 233
¦ �� [0…*] <binding> �� [0…*]binding definitons
Der Rumpf eines WSDL-Dokuments sieht folgendermaßen aus:
Listing 11.27 Grundstruktur eines WSDL-Dokuments
<definitions><types> Typdefinitionens........</types>
<message> Nachrichtendefinition....</message>
<portType> Portdefinition.......</portType>
<binding> Binding-Definition....</binding>
</definitions>
Ein WSDL-Dokument kann also so aussehen, wie im folgenden Listing:
Listing 11.28 WSDL-Definition einer Suche nach ISBN bei Amazon.com
<definitions targetNamespace="urn:PI/DevCentral/SoapService" name="AmazonSearch"> <types> <xsd:schema> <xsd:complexType name="AsinRequest"> <xsd:all> <xsd:element name="asin" /> <xsd:element name="tag" /> <xsd:element name="type" /> <xsd:element name="devtag" /> <xsd:element name="offer" /> <xsd:element name="offerpage" minOccurs="0"/>
Kap11.fm Seite 233 Dienstag, 22. April 2003 2:33 14
234 XML – Extended Markup Language
</xsd:all> </xsd:complexType> </xsd:schema> </types>
<message name="AsinSearchRequest"> <part name="AsinSearchRequest" type="typens:AsinRe-quest"/> </message>
<message name="AsinSearchResponse"> <part name="return" type="typens:ProductInfo"/> </message>
<operation name="AsinSearchRequest"> <input message="typens:AsinSearchRequest"/> <output message="typens:AsinSearchResponse"/> </operation>
<binding name="AmazonSearchBinding" type="typens:AmazonSearchPort"> <soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/HTTP"/> <!-- Binding for Amazon Web APIs - RPC, SOAP over HTTP --> <operation name="AsinSearchRequest"> <soap:operation soapAction="urn:PI/DevCentral/SoapService"/> <input> <soap:body use="encoded" encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" namespace="urn:PI/DevCentral/SoapService"/> </input> <output> <soap:body use="encoded" encodingStyle= "http://schemas.xmlsoap.org/soap/encoding/" namespace= "urn:PI/DevCentral/SoapService"/> </output>
Kap11.fm Seite 234 Dienstag, 22. April 2003 2:33 14
WSDL-Dokumente 235
</operation> </binding>
<service name="AmazonSearchService"> <!-- Endpoint for Amazon Web APIs --> <port name="AmazonSearchPort" binding="typens:AmazonSearchBinding"> <soap:address location= "http://soap.Amazon.com/onca/soap2"/> </port> </service>
</definitions>
11.8.2 Beispiel eines WSDL-Dokuments für eine BAPI-Funktion
Weder das SAP R/3 Interface-Repository (IFR) noch der SAP Web AS bie-ten derzeit WSDL für BAPIs oder IDocs an. Lediglich der SAP BusinessConnector unterstützt WSDL unmittelbar. Das ist nicht weiter tragisch,da die WSDL sich aus dem im IFR gefundenen Schema einfach transfor-mieren lässt.
Wir haben hier die RFC-Funktion RFC_CUSTOMER_UPDATE ausgewählt,mit der man die Daten eines Debitors in R/3 ändern kann. Das Beispiel(siehe Abbildung 11.19) zeigt in einem Ausschnitt aus dem ganzen WSDL-Dokument die Definition der Datentypen für die RFC-Parameter.
Kap11.fm Seite 235 Dienstag, 22. April 2003 2:33 14
236 XML – Extended Markup Language
Abbildung 11.3 DOM-Ansicht des WSDL-Dokuments für RFC_CUSTOMER_UPDATE
Abbildung 11.4 Beispiel eines WSDL-Dokuments für eine BAPI-Function
Kap11.fm Seite 236 Dienstag, 22. April 2003 2:33 14
WSDL-Dokumente 237
Abbildung 11.5 <messages>-Definitionen für RFC_CUSTOMER_UPDATE (XMLSPY™-Matrix-View)
Abbildung 11.6 <portTypes>-Definitionen für RFC_CUSTOMER_UPDATE (XMLSPY™-Matrix-View)
Kap11.fm Seite 237 Dienstag, 22. April 2003 2:33 14
Kap11.fm Seite 238 Dienstag, 22. April 2003 2:33 14
Entwicklung von dynamischen Webseiten 239
12 Entwicklung von dynamischen Webseiten
Der gängige Name für dynamische Webseiten ist Server Pages. Dabei handelt es sich um Webseiten, die an einigen Stellen Programmcode eingebaut haben, um den Inhalt der Seite zu bestimmen. Die wichtigsten Technologien sind dabei das traditionelle CGI, ASP für Microsofts IIS, JSP für die Java-Webserver wie WebSphere oder Apache Tomcat und BSP für den SAP Web AS.
12.1 Server Pages und ScriptingSchnittstellen zwischen Web-seiten und aus-führbaren Anwen-dungen
Server Pages sind Dateien auf einem Webserver, die sich mit einer URLansprechen lassen und ausführbaren Programmcode enthalten. DieserProgrammcode gibt gegebenenfalls einen Text zurück, der dann an dieStelle des Programmcodes in die Seite eingesetzt wird. Die so erzeugteSeite wird dann als Ergebnis der URL-Anfrage an den Requester zurück-gegeben.
Abbildung 12.1 Ein Browser ruft ein Skript und das Skript ruft eine Methode
Web Server
Browser
Component(DCOM+, .NET, Java-Class)
Application Programming Interface (API)(Also known as “Driver”)
(e.g.DCOM Controls, Remote Shell)
Application Database Engine
Application
RF
C
Front End(Client Tier)
Middle Tier(Server Tier)
Back Office(Application Tier)
Backend(Database Tier)
Redirect toother serverScript Processor
e.g. VB Script, JScript, or Plug-In
HT
TP
Kap12.fm Seite 239 Dienstag, 22. April 2003 2:33 14
240 Entwicklung von dynamischen Webseiten
Das Funktionsprinzip ist dabei bei allen Webservern ähnlich. Die ServerPage wird vom Webserver an einen Script-Prozessor übergeben, der denProgrammcode evaluiert, ausführt und den Ergebnisstring in die ServerPage einfügt.
12.1.1 Common Gateway Interface – CGI
Das Common Gateway Interface (CGI) ist die älteste Implementierung fürdynamische Webseiten. Dabei kann der Requester eine URI angeben, dieauf ein ausführbares Programm auf dem Webserver verweist. Zusätzlichkönnen Parameter an die URI übergeben werden. CGI prüft, ob derRequester berechtigt ist, das Programm auszuführen.
Folgendes ist ein Beispiel eines Aufrufs einer DLL via CGI:
HTTP.//www.logosworld.com/CGI/tes-tiis.dll?method="test"&myname="Goofy"
12.1.2 Active Server Pages – ASP und ASP.NET
Scripting wirdvon VBS oder
Microsoft.NETausgeführt
Active Server Pages (ASP) ist die Microsoft-Variante von Server Pages fürden Microsoft IIS. ASP.NET ist der Nachfolger von ASP und baut auf demMicrosoft.NET-Framework auf. Während ASP nur Visual Basic Script undJScript unterstützt, erlaubt ASP.NET alle Microsoft.NET-Programmierspra-chen. ASP-Seiten haben gewöhnlich die Dateierweiterung .asp undASP.NET erkennt man an der Extension .aspx. In der ASP-Variante wirdimmer der VBS-Script-Prozessor WScript aufgerufen. Dieser ist in derLage, jedes beliebige DCOM-Objekt anzusprechen, also auch ein beliebi-ges Windows-Programm auszuführen.
Im nächsten, einfachen Beispiel versuchen wir, Verbindung mit einemWebserver aufzunehmen. Die aufgerufene Seite meldet bei Erfolg dieVersionsnummer des Webservers zurück.
Listing 12.1 ASP-Script, das die Versionsnummer des Webservers ermittelt
<html><body>Server Side ASP Visual Basic Script<BR>Message: <% = "<b>Hello from <i>IIS Server</i> version "+ server.HTTPdjsVersion) % +"</b>"><BR>End of Message </body></html>
Kap12.fm Seite 240 Dienstag, 22. April 2003 2:33 14
Server Pages und Scripting 241
Listing 12.2 Ergebnis nach der Verarbeitung
<html><body>Server Side ASP Visual Basic Script<BR>Message: <b>Hello from <i>IIS Server</i> version 2.0</b><BR>End of Message </body></html>
Listing 12.3 Anzeige im Browser
Server Side ASP Visual Basic ScriptMessage: Hello from IIS Server Version=2.0End of Message
Durch die Verwendung von Microsoft.NET in ASP.NET ist ASP mittler-weile hinsichtlich Transaktionsfähigkeit, Stabilität und Sicherheit vollstän-dig auf dem Niveau von Java und JSP angelangt. JSP-Code lässt sich häufigohne Änderung unter ASP.NET ausführen, da der J#-Prozessor von Micro-soft.NET weitgehend kompatibel zu Java ist.
12.1.3 Java Server Pages – JSP
Dynamische Webseiten mit Java-Code
Java Server Pages (JSP) funktionieren fast identisch wie ASP, mit demUnterschied, dass die Programmbefehle in Java gehalten sind. Ergänzendzu ASP lassen sich die Befehle für JSP in zwei Syntax-Varianten angeben,einmal in klassischer Form, eingeschlossen in <% ... %>, und in XML-Syntax:
<%= Java Expression %>
oder
<jsp:expression> Java Expression</jsp:expression>
Das Ergebnis einer Expression kann genau wie bei ASP und, wie wir untensehen werden, BSP entweder direkt in den Output umgeleitet werdenoder durch Zugriff auf das entsprechende Objekt:
Current time: <%= new java.util.Date() %>
oder
<% out.response request.getRemoteHost() %>
Kap12.fm Seite 241 Dienstag, 22. April 2003 2:33 14
242 Entwicklung von dynamischen Webseiten
Listing 12.4 zeigt ein Beispiel einer kompletten JSP.
Listing 12.4 Beispiel einer Java Server Page
<!—Name of this page: login.jsp (= Target for Submit) --><html> <head> <title>JSP-Beispiel</title> </head>
<body>
<%@ page import = "java.util.*" %> <% if (request.getParameter("submit") != null) { out.println("Ihr Username: " + request.getParameter("ui") + "<BR>"); out.println("<hr>"); out.println("Aktuelles Systemdatum/Systemzeit: " + new Date()); } else { %>
<HR><h3>Login</h3><form method="POST" action="login.jsp" class="shopform"><font size="4" color=red></font>
<p>Please enter your User Data below to proceed: (Userid=logos Password=world)</p> <table border="0" cellpadding="0" cellspacing="0" width="300"> <tr><td width="175">User Name</td> <td width="125"><input name="ui" size="20"></td> </tr> <tr> <td width="175">Password</td> <td width="125"><input name="pw" size="20" type="password"></td>
Kap12.fm Seite 242 Dienstag, 22. April 2003 2:33 14
Server Pages und Scripting 243
</tr> </table><hr> <input type="submit" value="OK" name="OK" tabindex="1" class="button"> <input type="reset" value="Cancel" name="Cancel" tabindex="2" class="button"></form><hr>
<% } //end if %>
</body> </html>
Vordefinierte Objekte in Server Pages
Es gibt eine Anzahl von vordefinierte Objekten, die jeder JSP automatischzur Verfügung stehen. Die meisten dieser Objekte gibt es auch für ASPoder BSP. Tabelle 1.1 listet diese Objekte auf.
12.1.4 Java Servlets
Aufruf über feste Methoden
Alternativ zu JSP gibt es auch die Möglichkeit, Methoden von Java-Klas-sen direkt aufzurufen. Der Einstieg in die Klasse erfolgt aber immer überMethoden, deren Namen fest vorgegeben sind.
Objekt Beschreibung
request Zugriff auf das HTTP Request-Objekt
response Container für die Antwort an den Client
out Objekt zum formatierten Ausgeben von Daten auf die erzeugte JSP
session Informationen der HTTP-Session
application Globales Objekt zum persistenten Abspeichern von einfachen Daten
config Konfigurationsdaten für die aufgerufene Seite
pageContext Kontextinformationen für Java Beans (Transaktionen in Java)
page Leitet ein Pragma (Direktiven für den JSP-Interpreter) ein, welches Hinweise gibt, wie die Seite zu bearbeiten ist oder welche Meta-Kommandos ausgeführt werden sollen. Beispiel »page include« zum Bekanntmachen einer Java-Bibliothek.
Tabelle 12.1 Vordefinierte Objekte von Server Pages
Kap12.fm Seite 243 Dienstag, 22. April 2003 2:33 14
244 Entwicklung von dynamischen Webseiten
Java-Klassen, dieHTTP-Antwort
zurückgeben
Java ist eine Sprache, die einen großen Teil der Konventionen in dieBezeichner einzelner Objekte und Klassen hineinlegt. Dieses Prinzip wirdauch bei der Implementierung eines zu CGI kompatiblen Interfaces ange-wendet. Wenn ein für Java ausgelegter Webserver wie Tomcat oder Web-Sphere einen HTTP-Request für ein Servlet empfängt, ruft der Server diepassende Methode auf. Der Name der Methode wird dabei aus demHTTP-Kommando (GET, POST, PUT, HEADER, DELETE) gebildet, dem dasWort do vorangestellt wird:
� doGetdoGet() wird immer dann aufgerufen, wenn der Server einen HTTPGET-Request empfängt.
� doPostdoPost() wird immer dann aufgerufen, wenn der Server einen HTTPPOST-Request empfängt.
� doXxxdoXxx() wird immer dann aufgerufen, wenn der Server einen anderenHTTP xxx-Request empfängt, wobei für xxx der Name des HTTP-Kom-mandos gesetzt wird.
Es gibt eine Reihe solcher HTTP-Kommandos, zum Beispiel HEADER oderDELETE, die vom Servlet optional unterstützt werden können. Werdendie Methoden trotzdem aufgerufen, ohne dass sie existieren, wird eineentsprechende HTTP-Meldung zurückgesendet.
12.1.5 Business Server Pages (BSP)
Server Pagesmit ABAP
Business Server Pages (BSP) sind die Scripting-Seiten des SAP Web Appli-cation Servers (Web AS). Der SAP Web AS unterstützt zwei Personalities,die ABAP Personality und die Java Personality, Sie können also wahlweisein Java oder in ABAP programmieren. Daraus darf man aber allen Gerüch-ten zum Trotz nicht folgern, dass es Pläne gäbe, ABAP irgendwann zuGunsten von Java abzuschaffen. Business Server Pages werden in ABAPprogrammiert, ein Beispiel zeigt das folgende Listing:
Listing 12.5 Beispiel einer BSP »Hello World«
<%@page language="abap"%><html> <head> <link rel="stylesheet" href="../../sap/public/bc/bsp/styles/sapbsp.css"> <title> Hello World BSP Page </title>
Kap12.fm Seite 244 Dienstag, 22. April 2003 2:33 14
Web Pages mit Active Server Pages 245
</head>
<body class="bspBody1"> <H1>Hello World from Your BSP</H1> Show me current exchange rates with <a href="currencies.htm"> BAPI BAPI_EXCHRATE_GETCURRENTRATES</a> </body></html>
12.2 Web Pages mit Active Server Pages
Das Entwickeln von dynamischen Webseiten lässt sich am besten am Bei-spiel von Microsofts ASP oder ASP.NET erläutern. Zum einen liegt esdaran, dass VB-Programme sich auf jedem Windows-PC einfach entwi-ckeln lassen. Gut geeignet sind hierfür die VBA-Erweiterungen von Mi-crosoft Office, die die Möglichkeit bieten, gleichzeitig in Microsoft Wordzu entwickeln, zu testen und zu dokumentieren. Hinzu kommt die wenigintuitive Syntax von Java. Visual Basic, ABAP oder Delphi sind einfacherzu erlernen.
12.2.1 ASP »Hello World«
Sniplets sind kleine Code-sequenzen
Im Folgenden sehen Sie ein erstes Beispiel für ein Scriptlet in ASP, es heißtnatürlich HELLO WORLD. Die Begriffe Scriptlet und Sniplet sind gängigeBezeichnungen für kleine Scripts.
In dem Beispiel handelt es sich um ein einfaches HTML-Dokument, indem eine einzige Programmzeile eingefügt ist. Programmzeilen werdenzwischen öffnenden und schließenden Klammern der Form <% und %>eingefügt. Das Zeichen »=« innerhalb einer Programmsequenz ist iden-tisch mit der Methode response.write und bewirkt die Ausgabe desnachfolgenden Strings, der auch durch einen Ausdruck erzeugt werdenkann.
Listing 12.6 Hello World mit einem ASP-Sniplet
<html> <head> <title>Hello World ASP SCRIPT</title> </head> <body> <h1>Server Side ASP Visual Basic Script</h1>
Kap12.fm Seite 245 Dienstag, 22. April 2003 2:33 14
246 Entwicklung von dynamischen Webseiten
<p>Now there should be a message from the Server <BR>Message: <% = "<B><U>Hello from ASP Server</U></B>" %> <BR>The message should be one line above</p> <BR>The current time is:</p> <% = "<B><U>"+Str(Now())+"</U></B>" %> </body></html>
Das nachfolgende Beispiel greift auf die COM-Komponente Scrip-ting.FileSystemObject zu und demonstriert, wie beliebige COM-Objekte von ASP angesprochen werden können.
Listing 12.7 Script zur Anzeige der gefundenen Dateinamen
<%Set fs = CreateObject("Scripting.FileSystemObject")Set subdir = fs.GetFolder(".")ii = 0response.write subdir.pathFor Each xfile In subdir.Filesii = ii + 1response.write "<P>"response.write iiresponse.write ": " + xfile.Name + "</P>"Next%>
12.2.2 Senden von HTML
HTML-Doku-mente mit Pro-
grammstatements
An die Stelle des ASP-Codes kann mit der Methode response.write einbeliebiger Text, also auch HTML-Tags, eingefügt werden. Im nachstehen-den Beispiel erzeugen wir eine saubere HTML-Tabelle mit ASP. Das Ergeb-nis sehen Sie in Abbildung 12.2.
Listing 12.8 ASP, die eine HTML-Tabelle erzeugt
<body>Server Side ASP Sending an HTML table<table border="1"cellpadding="0" cellspacing="0"width="100%"><%response.write "<TR><TD>A table line</TD></TR>"
Kap12.fm Seite 246 Dienstag, 22. April 2003 2:33 14
Web Pages mit Active Server Pages 247
response.write "<TR><TD>A table line</TD></TR>"response.write "<TR><TD>A table line</TD></TR>"response.write "<TR><TD>A table line</TD></TR>"response.write "<TR><TD>A table line</TD></TR>"%></table></body>
12.2.3 Aufrufe beliebiger Windows-Objekte aus VBS
VB zu COM-Brücke
Es ist sinnvoll, komplexe Aufgaben als COM-Objekte zu realisieren. Dannspielt es auch keine große Rolle mehr, in welcher Programmiersprache dieAnwendung selbst realisiert ist. Die kompilierte Applikation steht alsCOM-Objekt zur Verfügung und kann dann mit dem Visual Basic-BefehlCreateObject angesprochen werden.
Ein Beispiel, wie eine komplette Shopping-Cart-Lösung in einer einzelnenDLL verpackt werden kann, um sie dann von ASP aus anzusprechen, zeigtIIScart2000 von IISCart (www.iiscart.com).
12.2.4 4.2.4BAPI-Aufruf von ASP
BAPIs werden wie alle RFC-Bausteine aufgerufen
Auch der Aufruf von SAP-BAPIs aus einer ASP-Seite heraus erfolgt durchdie COM-Brücke von Visual Basic Script. Das folgende Beispiel ruft denbekannten Funktionsbaustein BAPI_EXCHRATE_GETCURRENTRATES aufund gibt die komplette Tabelle als HTML-Tabelle aus.
Listing 12.9 ASP zum Aufruf eines BAPIs in SAP R/3
<html><head><title>Example calling BAPI
Abbildung 12.2 Ergebnis der Verarbeitung der ASP
Kap12.fm Seite 247 Dienstag, 22. April 2003 2:33 14
248 Entwicklung von dynamischen Webseiten
BAPI_EXCHRATE_GETCURRENTRATES</title><link rel="stylesheet" type="text/css" href="style.css"><%Private Functions 'As SAPFunctionsOCX.SAPFunctionsPrivate LogonControl 'As SAPLogonCtrl.SAPLogonControlPrivate R3Connection 'As SAPLogonCtrl.Connection
Dim Func 'As SAPFunctionsOCX.FunctionPrivate iDATE 'As SAPFunctionsOCX.ParameterPrivate tEXCH_RATE_LIST 'As SAPTableFactoryCtrl.Table
Public Sub Main() Dim ix 'As Integer Dim retcd 'As Boolean Dim SilentLogon 'As Boolean Set LogonControl = CreateObject("SAP.LogonControl.1") Set Functions = CreateObject("SAP.Functions") Set R3Connection = LogonControl.NewConnection R3Connection.Client = "000" R3Connection.ApplicationServer = "192.168.69.111" R3Connection.Language = "EN" R3Connection.User = "DEVELOPER" R3Connection.Password = "lagunas" R3Connection.System = "WAS" R3Connection.SystemID = "" R3Connection.SystemNumber = "18" R3Connection.UseSAPLogonIni = False SilentLogon = True retcd = R3Connection.Logon(0, SilentLogon) If retcd <> True Then MsgBox "Logon failed": Exit Sub Functions.Connection = R3Connection Set Func = Functions.Add("BAPI_EXCHRATE_GETCURRENTRATES") Set iDATE = Func.Exports("DATE") Set tEXCH_RATE_LIST = Func.Tables("EXCH_RATE_LIST") iDATE.Value = "20030101"
Kap12.fm Seite 248 Dienstag, 22. April 2003 2:33 14
Web Pages mit Active Server Pages 249
Func.Call Call BAPI_to_ASP(tEXCH_RATE_LIST) R3Connection.logoffEnd Sub
Private Sub BAPI_to_ASP(ByRef SAPtable) Dim iRow 'As Integer Dim iCol 'As Integer response.write"<TH>" For iCol = 1 To SAPtable.ColumnCount response.write "<TD>" response.write SAPtable.ColumnName(iCol) response.write "</TD>" Next response.write "</TH>" For iRow = 1 To SAPtable.RowCount response.write "<TR>" For iCol = 1 To SAPtable.ColumnCount response.write "<TD>" response.write SAPtable.Cell(iRow, iCol) response.write "</TD>" Next response.write "</TR>" NextEnd Sub%></head><body>Server Side ASP Sending an HTML table<table border="1" cellpadding="0" cellspacing="0" width="100%"><% Call Main%></table></body></html>
Kap12.fm Seite 249 Dienstag, 22. April 2003 2:33 14
250 Entwicklung von dynamischen Webseiten
12.2.5 Microsoft.NET Connector
.NET Connectorbasiert auch auf
librfc32.dll
Für die Entwicklung von Schnittstellen zwischen Microsoft.NET und SAPR/3 steht ein spezieller Connector zur Verfügung. Dieser Connectorbasiert aber genauso wie die ActiveX-Controls auf der librfc32.dllvon SAP. Vermutlich versucht man, den .NET-Connector etwas näher andie Aufrufkonventionen des Java-Connectors heranzuführen. Allerdingserledigt auch die COM-Brücke diese Aufgabe hervorragend, insbeson-dere wenn man bedenkt, dass auch der Java-Connector auf Windows-Systemen nur über das Java Native Interface (JNI) auf die librfc32.dllzugreift.
12.2.6 Parameter aus der URI abfragen
Mit jeder URI können Parameter mitgegeben werden. Bei einem HTTPGET-Request werden diese nach der Konvention von CGI an die URL,durch ein Fragezeichen (»?«) getrennt, angehängt. Den zusätzlichen Teilnach der URL nennt man auch einen Querystring. Bei einem HTTP POST-Request werden sie im Bauch des HTTP-Requests als Datencontainer mit-verschickt.
Das Folgende ist ein Beispiel eines Querystrings als Teil einer URI:
http://localhost/queryst-ring.asp?Name="Micky"&City="Duckburg"
Der Querystring ist Name="Micky"&City="Duckburg"
Für die Verwendung von Querystrings gelten folgende Regeln:
� Ein Querystring wird durch ein Fragezeichen (»?«) von der URLgetrennt.
� Mehrere Parameter werden durch ein Ampersand (»&«) voneinandergetrennt.
Das nachstehende Listing zeigt ein kleines ASP-Script, das den Queryst-ring auswertet und dessen Werte anzeigt.
Listing 12.10 ASP zur Anzeige der angegebenen Querystring-Parameter
<HTML><BODY><H3>Here are the parameters which have been passed.</H3><P><% = "Querystring="+Request.QueryString %></P>
Kap12.fm Seite 250 Dienstag, 22. April 2003 2:33 14
Web Pages mit Active Server Pages 251
<P><% = "Input field Name is="+Request.QuerySt-ring("NAME") %></P><P><% = "Input field City is="+Request.QuerySt-ring("CITY") %></P></BODY></HTML>
In einem HTTP POST-Request werden die Daten über das Protokoll mittransportiert. Auf einer HTML-Seite werden diese Werte durch ein HTML-<FORM> erfasst:
Listing 12.11 ASP zur Anzeige der Werte von HTML-<FORM>-Variablen
<HTML><BODY><H3>Here are the parameters which have been passed.</H3><P><% = "Querystring="+Request.QueryString %></P><P><% = "Input field Name is="+Request.QuerySt-ring("NAME") %></P><P><% = "Input field City is="+Request.QuerySt-ring("CITY") %></P><P>You can address the parameters with a numeric posi-tion index as well</P><P><% if Request.QueryString <> "" then _resstr = "FirstParam is="+Request.QueryString(1)" %><% response.write resstr %></P></BODY></HTML>
Werden die Daten eines <FORM> mit der HTTP GET-Methode versandt,erzeugt HTML einen Querystring, der aus den <FORM>-Daten gebildetwird. Im folgenden Listing sehen Sie einen HTTP GET-Request, der dieParameter als Teil der URI erhält.
Abbildung 12.3 HTML-Seite zum Eingeben der Werte in ein <FORM>-Element
Kap12.fm Seite 251 Dienstag, 22. April 2003 2:33 14
252 Entwicklung von dynamischen Webseiten
Listing 12.12 <FORM> für ein HTTP GET und der erzeugte Querystring
<FORM METHOD="GET" ACTION="querystring.asp"> <H1>Sending form data as query string to an ASP</H1> <P>Name: <INPUT TYPE="TEXT" NAME="NAME"></P> <P>City: <INPUT TYPE="TEXT" NAME="CITY"></P> <P><INPUT TYPE="SUBMIT" NAME="Submit" VALUE="Submit"></P></FORM>
Die Browser bauen die URI selbst nach CGI-Konvention zusammen,indem die Werte der <FORM>-Felder an die URL angehängt werden:
HTTP.//querystring.asp?NAME="Micky"&CITY="Duckburg"
Als nächstes folgt noch ein Beispiel für ein HTML-Formular, das beimAbsenden die <FORM>-Daten in den Body des HTTP-Requests verpackt,anstatt sie an die URI anzuhängen.
Listing 12.13 <FORM> für METHOD=POST, das die Daten im Bauch des HTTP-Requests versendet
<FORM METHOD="POST" ACTION="querystring.asp"> <H1>Sending form data as query string to an ASP</H1> <P>Name: <INPUT TYPE="TEXT" NAME="NAME"></P> <P>City: <INPUT TYPE="TEXT" NAME="CITY"></P> <P><INPUT TYPE="SUBMIT" NAME="Submit" VALUE="Submit"></P></FORM>
Nachstehend sehen Sie eine ASP-Seite, die die Werte eines HTTP-Postauswertet und in der Ausgabe widerspiegelt.
Listing 12.14 ASP zur Anzeige der Werte eines FORM aus einem POST-Request
<HTML><BODY><% response.write("<H3>Form Content</H3>")for each formfield in Request.Formresponse.write(formfield&"="&Request.Form(form-field)&" ")next%></BODY></HTML>
Kap12.fm Seite 252 Dienstag, 22. April 2003 2:33 14
Web Pages mit Active Server Pages 253
12.2.7 ASP Application Variables
ASP erlaubt es, globale Variablen zu definieren, die entweder pro Sessionoder systemweit gültig sind. Damit können Sie Werte über mehrere Auf-rufe hinweg persistent halten. Globale Variablen können nur einfacheTypen sein, keine Verweise auf COM-Objekte.
ZähleranwendungListing 12.15 Beispiel zum Setzen einer globalen Variablen
<html><body><H3>Here is the value of the counter.</H3><P><% Application.Lock %><% Counter = Application("AccessCounter") %><% Counter = Counter + 1 %><% Application("AccessCounter") = Counter %><% Application.Unlock %><% = "<P>The value of the counter is " %><% = Counter %><% = "</P>" %><% = "<P>Connection String" %><% = Application("ConnectionString") %><% = "</P>" %><% %><% Application.UnLock %></P></body></html>
Das gezeigte Beispiel in Abbildung 12.5 müssen Sie in zwei Browser-Fenstern gleichzeitig aufrufen und beobachten, wie die Zählerwerte sichverändern.
Abbildung 12.4 Beispiel zur Verwendung einer globalen ASP-Variable
Kap12.fm Seite 253 Dienstag, 22. April 2003 2:33 14
254 Entwicklung von dynamischen Webseiten
12.2.8 Global.asa – Die ASP-Autoexec-Datei
Zur Initialisierung von global gültigen Variablen steht die Datei GLO-BAL.ASA zur Verfügung. Dies ist ein besonderes ASP-Script, das beimNeustart des IIS automatisch gefunden und ausgeführt wird. Das fol-gende Listing zeigt ein initiales GLOBAL.ASA, das Eventhandler fürbestimmte IIS-Systemereignisse setzt. Die Eventhandler werden dannaufgerufen, wenn das entsprechende Ereignis eintritt.
Listing 12.16 Initiale GLOBAL.ASA mit Dummy-Eventhandlern
<script language=vbscript runat=server>SUB Application_OnStartEND SUB
SUB Application_OnEndEND SUB
SUB Session_OnStartEND SUB
Sub Session_OnEndEND SUB</script>
Falls in dieser Datei ein Fehler auftritt, erhält der erste Aufrufer einer ASP-Seite folgende Fehlermeldung:
Listing 12.17 Beispiel einer Fehlermeldung in GLOBAL.ASA
Script blocks must be one of the allowed Global.asa pro-cedures. Script directives within <% ... %> are not allowed within the global.asa file. The procedure names allowed are Application_OnStart, Application_OnEnd, Session_OnStart, or Session_OnEnd.
Falls Sie GLOBAL.ASA geändert haben, müssen Sie den IIS neu booten,um die Änderung wirksam werden zu lassen.
Kap12.fm Seite 254 Dienstag, 22. April 2003 2:33 14
Web Pages mit Active Server Pages 255
12.2.9 Extra-Beispiel: File-Liste mit ASP
Das folgende Beispiel verwendet das FilesystemObject von Microsoft,um die Dateien, die sich im aktuellen Verzeichnis auf dem Server befin-den, aufzulisten.
Listing 12.18 Anzeige der gefunden Verzeichnisse auf dem Server mit ASP
<%Set fs = CreateObject("Scripting.FileSystemObject")Set subdir = fs.GetFolder(".")ii = 0response.write subdir.pathFor Each xfile In subdir.Files
Abbildung 12.5 Neustarten von IIS
Abbildung 12.6 Dateiliste eines Verzeichnisses auf dem Server mit ASP
Kap12.fm Seite 255 Dienstag, 22. April 2003 2:33 14
256 Entwicklung von dynamischen Webseiten
ii = ii + 1response.write "<P>"response.write iiresponse.write ": " + xfile.Name + "</P>"Next%>
12.3 Entwicklung von Business Server Pages für den SAP Web AS
Server Pagesmit ABAP
Business Server Pages (BSP) sind SAPs Implementierungen von dynami-schen Webseiten. BSP sind weitgehend identisch mit Microsofts ActiveServer Pages und Java Server Pages. BSP werden im Repository des WebAS gespeichert und unterstützen als Programmiersprache für die einge-streuten Scripts ABAP. Der folgende Text wird nur noch die Unterschiedeund Ergänzungen zu ASP erwähnen und setzt voraus, dass Sie das imGrundlagenkapitel über ASP Beschriebene bereits kennen.
12.3.1 »Hello World« für BSP
Bearbeiten vonBSP mit SE80
BSP werden wie andere Entwicklungen auch mit der Transaktion SE80 imObject Navigator bearbeitet. Zu der vertrauten Umgebung ist eine neueOption BSP Application hinzugekommen. (Nebenbei bemerkt: Entwick-lungsklassen wurden in Packages umbenannt).
Das »Hello-World«-Beispiel aus Abbildung 12.11 hat bereits einen Linkauf eine weitere BSP mit dem Namen currencies.htm, das das nächste Bei-spiel werden wird.
Abbildung 12.7 BSP-Editor in Transaktion SE80
Kap12.fm Seite 256 Dienstag, 22. April 2003 2:33 14
Entwicklung von Business Server Pages für den SAP Web AS 257
12.3.2 BAPI-Aufruf aus einer BSP
Ausführung von ABAP Objects-Statements
Innerhalb einer BSP können beliebige ABAP Objects-Statements folgen.Dabei ist diesmal wirklich ABAP Objects gemeint und nicht das umfassen-dere ABAP IV. Alle Restriktionen der Objektumgebung gelten auch fürBSP, zum Beispiel sind keine Kopfzeilen (WITH HEADER LINE) für interneTabellen zulässig. Das nun folgende Beispiel ruft den BAPI-Baustein BAPI_EXCHRATE_GETCURRENTRATES auf, um die aktuellen Währungskurseaus SAP R/3 zu lesen und in HTML aufzulisten. Das Ergebnis sehen Sie inTabelle 1.2.
Listing 12.19 BSP-Code zum Aufruf von BAPI_EXCHRATE_GETCURRENTRATES
<%@page language="abap"%><html> <head> <link rel="stylesheet" href="../../sap/public/bc/bsp/styles/sapbsp.css"> <title> Hello World BSP Page </title><%DATA: exch_rate_list type bapi1093_0.DATA: tfrom_curr_range TYPE STANDARD TABLE OF bapi1093_3.DATA: tto_currncy_range TYPE STANDARD TABLE OF bapi1093_4.DATA: texch_rate_list TYPE STANDARD TABLE OF bapi1093_0.DATA: treturn TYPE STANDARD TABLE OF bapiret1.
CALL FUNCTION 'BAPI_EXCHRATE_GETCURRENTRATES' DESTINATION 'NONE' EXPORTING date = sy-datum TABLES from_curr_range = tfrom_curr_range to_currncy_range = tto_currncy_range exch_rate_list = texch_rate_list return = treturn.%> </head>
<body class="bspBody1">
Kap12.fm Seite 257 Dienstag, 22. April 2003 2:33 14
258 Entwicklung von dynamischen Webseiten
<H1><otr>Listing of exchange rates from BAPI_EXCHRATE_GETCURRENTRATES through BSP</otr></H1> <table border="1" width = "100%"> <tr> <th width="20%">From Currency</td> <th width="20%">To Currency</td> <th width="60%">Exchange Rate</td> </tr> <% LOOP AT texch_rate_list into exch_rate_list. %> <tr> <td > <%= exch_rate_list-from_curr %> </td> <td > <%= exch_rate_list-to_currncy %> </td> <td > <%= exch_rate_list-exch_rate %> </td> </tr> <% ENDLOOP. %> </table> </body></html>
From Currency To Currency Exchange Rate
AED JPY 30.55026
AED USD 0.27241
ARS BRL 1.20900
ARS CAD 1.52630
ARS CLP 471.66000
ARS COP 1548.00000
ARS JPY 112.15000
ARS MXN 9.82810
ARS PEN 3.16130
ARS USD 1.00000
ARS VEB 564.88000
AUD JPY 69.36541
Tabelle 12.2 Mögliches Ergebnis des Aufrufs von BAPI_EXCHRATE_GETCURRENTRATES
Kap12.fm Seite 258 Dienstag, 22. April 2003 2:33 14
Entwicklung von Business Server Pages für den SAP Web AS 259
Anzeige der BSP-Seite
Auf die neue BSP-Seite kann nun von jedem Webbrowser, der ausrei-chend Zugriffsrechte auf den Web AS hat, zugegriffen werden. Die kor-rekte URL wird in den Eigenschaften der BSP-Seite (siehe Abbildung12.12) angezeigt. Beachten Sie, dass der dort angezeigte Domain-Namegegebenenfalls durch die IP des Web AS ersetzt werden muss, bezie-hungsweise Sie den Domain-Namen im DNS-Server oder die lokalehosts.-Datei eintragen müssen.
Folgendes ist eine Beispiel-URI zum Aufruf der BSP-Seite:
http://192.168.69.111:8080/sap/bc/bsp/sap/ZAXX_HELLO_WORLD/currencies.htm
12.3.3 Online Text Repository
BSP unterstützt automatische Fremdsprachen
Ein besonderes Feature bietet BSP aber doch in Bezug im Vergleich zuASP oder JSP. BSP ist in der Lage, alle Texte, die potenziell übersetzt wer-den müssen, in einem Online Text Repository mitzuführen. Die Texte darinkönnen dann mit den bekannten R/3-Übersetzungstools in eine andereSprache gebracht werden. Beim Aufruf der BSP aus einer anderen Sprach-umgebung heraus werden dann automatisch die richtigen Übersetzungeneingefügt.
ZAR JPY 19.06762
ZAR USD 0.17002
From Currency To Currency Exchange Rate
Tabelle 12.2 Mögliches Ergebnis des Aufrufs von BAPI_EXCHRATE_GETCURRENTRA-TES (Forts.)
Abbildung 12.8 Eigenschaften der BSP-Seite currencies.htm
Kap12.fm Seite 259 Dienstag, 22. April 2003 2:33 14
260 Entwicklung von dynamischen Webseiten
Zum Schluss dieses Kapitels erhalten Sie noch eine Übersicht, die diewichtigsten Direktiven für eine BSP zeigt.
Abbildung 12.9 Übersetzung von OTR-Texten mit SE63
Direktive Bedeutung
<%@ page language=("ABAP") %> Legt fest, dass die Script-Befehle auf der Seite in ABAP codiert sind.
<%-- auskommentierter Code oder Text --%>
Kommentarblock: Der zwischen den Klammern angegebene Text wird weder in die Ausgabe-HTML-Seite übernommen noch als Programm-code interpretiert.
<% inline code %> Alle ausführbaren Statements müs-sen zwischen <% und %> stehen.
<%@ include file="URL"%> Der Inhalt der angegebenen Datei wird an der Stelle eingefügt.
<otr> beliebiger HTML-Text, kann auch Skripting-Code enthalten </otr>
Ein Text zwischen <otr> </otr> wird automatisch in das Online Text Repository (OTR) eingefügt. Die Texte im OTR können mit Transaktion SE63 übersetzt werden. Wird die BSP dann
mit einer anderen Sprachanmeldung aufgerufen, wird der übersetzte Text an Stelle des ursprünglich erfassten Textes ausgegeben.
Tabelle 12.3 Direktiven in BSP
Kap12.fm Seite 260 Dienstag, 22. April 2003 2:33 14
Webseiten von anderen Programmen abrufen 261
13 Webseiten von anderen Program-men abrufen
Es gehört zu den wesentlichen Funktionen für das Program-mieren von Webservices, dass man eine bestimmte URL durch ein Programm abfragen kann. Dazu muss die URL an den Ser-ver gesendet und der zurückkommende Datenstrom entspre-chend im Programm abgefangen werden, ohne dass sich etwa ein Browserfenster öffnet.
13.1 Abfragen einer URI mit Visual BasicCOM-Objekte für HTTP-Dienste
Windows stellt mehrere COM-Objekte zur Verfügung, um auf HTTP-Dienste zuzugreifen. Die beiden bedeutendsten sind WINHTTP, das aus-schließlich für die NT-Technologie zur Verfügung steht, und die HTTP-Engine des Internet Explorers, die sich in der COM-Bibliothekshdocvw.dll versteckt.
13.1.1 Das Windows-Webbrowser-Control
Im folgenden Beispiel werden wir auf das Browser-Control des InternetExplorers zurückgreifen. Dabei nutzen wir aus, dass der Internet Explorerbeim Aufruf einer URI den HTTP-Response-Block zunächst ordentlich ineinem Objekt ablegt und dann den Browser aufruft, um die Seite zu ren-dern und darzustellen. Genau dieses Objekt werden wir auch aufrufenund dann die Antwort des Services aus dem Container des Objekts abho-len.
Das nachstehende Beispiel zeigt die Wiederverwendung des Webbrow-ser-Controls. Der Aufruf eines HTTP GET ist ganz einfach, hierzu wirdlediglich die URL der Navigate-Methode übergeben. Der HTTP POSTfunktioniert genauso, allerdings müssen vorher die HTTP-Header-Datensinnvoll gesetzt und die Daten des HTTP-Bodys gefüllt werden. Die Wertefür den Header hängen von der Applikation ab, die auf dem Webserverdie Anfrage entgegennimmt. Die Daten für den Body müssen als Byte-Array übergeben werden, das von der Funktion StrConv erledigt wird.
Sehr wichtig ist in diesem Zusammenhang, dass man explizit auf dieBeendigung des asynchronen Requests warten muss. Dies machen wirhier in einer Schleife, es könnte aber auch in einem Eventhandler stattfin-den, der auf das Ende der Abfrage reagiert. Der VB-Befehl DoEvents ist
Kap13.fm Seite 261 Dienstag, 22. April 2003 2:33 14
262 Webseiten von anderen Programmen abrufen
wichtig bei Schleifen, deren Ende unbestimmt ist und die daher gegebe-nenfalls ewig laufen. Der Befehl gibt die Kontrolle an den Eventhandlervon Windows zurück, um diesem die Möglichkeit zu geben, einen anste-henden Event auszuführen, zum Beispiel das Drücken der Abbruch-TasteCtrl-C.
Listing 13.1 Beispiel zur Verwendung des Webbrowser-Controls
Public Page As WebBrowser
Public Sub do_post(URL As String, body As Variant) Dim PostData() As Byte 'a local array with dynamic length PostData = StrConv(body, vbFromUnicode) Page.navigate URL, , , PostData, HTTP_Header While Page.Busy: DoEvents: WendEnd Sub
Public Sub do_get(URL As String) Page.navigate URL While Page.Busy: DoEvents: WendEnd Sub
13.1.2 Anwendungsbeispiel für das Browser-Control
Die Schwierigkeit beim Absetzen von HTTP-Kommandos ist meist dasFinden der richtigen Werte für den Header. Das nachstehende Listingzeigt ein funktionierendes Beispiel, das den Request korrekt aufbaut unddas Ergebnis in einer lokalen Datei abspeichert. Dieses Beispiel ist typischund eignet sich deshalb gut als Vorlage für eigene Entwicklungen.
Listing 13.2 Vollständiges Listing eines VBA-Programms, das das IE-Webbrowser-Control wiederverwendet
Class ZZReuseIEPublic Page As WebBrowserPublic Document As MSHTML.HTMLDocument
Public User_Agent As StringPublic Content_Type As StringPublic Content_Length As IntegerPublic Accept As StringPublic Proxy_Connection As String
Kap13.fm Seite 262 Dienstag, 22. April 2003 2:33 14
Abfragen einer URI mit Visual Basic 263
Public Referer As StringPublic Host As StringPublic Pragma1 As StringPublic Accept_language As StringPublic Accept_Encoding As StringPublic Extension As String
Public Sub do_post(URL As String, body As Variant)' Data to send to the server during the HTTP POST ' transaction. ' For example, the POST transaction is' used to send data gathered by an HTML form.' If this parameter does not specify any post data, the' Navigate method issues an HTTP GET transaction. ' This parameter is ignored if URL is not an HTTP URL.' NOTE: The post data specified by PostData is passed' as a SAFEARRAY structure. The variant should' be of type VT_ARRAY and point to a SAFEARRAY. ' The SAFEARRAY should be of element type' VT_UI1, dimension one, and have an element count ' equal to the' number of bytes of post data.Dim PostData() As Byte 'a local array with dynamic lengthbody = body + vbCrLfPostData = StrConv(body, vbFromUnicode)' Content_Length = Len(PostData) - 1Page.navigate URL, , , PostData, HTTP_Header' Page.navigate URL, , , bodyWhile Page.Busy: DoEvents: WendSet Document = Page.DocumentEnd Sub
Public Sub do_get(URL As String)Page.navigate URLWhile Page.Busy: DoEvents: WendSet Document = Page.Document' do_post URL, ""End Sub
Kap13.fm Seite 263 Dienstag, 22. April 2003 2:33 14
264 Webseiten von anderen Programmen abrufen
Public Sub do_save(logtxt As String, Optional filename As String)Dim fs As Scripting.FileSystemObjectDim logfile As Scripting.TextStreamIf filename = "" Then filename = "U:\asplog.txt"Set fs = CreateObject("Scripting.FileSystemObject")Set logfile = fs.CreateTextFile(filename, True)logfile.Write logtxtlogfile.CloseSet fs = NothingEnd Sub
Public Property Get HTTP_Header() As StringDim Headers As StringHeaders = ""' HTTP_Header = "Content-Length: " + ' CStr(Content_Length) + vbCrLfAdd_Header_Line Headers, "Content-Type", Content_TypeAdd_Header_Line Headers, "Extension", ExtensionAdd_Header_Line Headers, "User-Agent", User - AgentAdd_Header_Line Headers, "Host", HostAdd_Header_Line Headers, "Pragma", Pragma1Add_Header_Line Headers, "Accept", AcceptAdd_Header_Line Headers, "Proxy -Connection", Proxy_Con-nectionAdd_Header_Line Headers, "Referer", RefererAdd_Header_Line Headers, "Accept -Language", Accept_lan-guageAdd_Header_Line Headers, "Accept -Encoding", Accept_EncodingHTTP_Header = HeadersEnd Property
Private Sub Add_Header_Line _ (Header As String, tag As String, value As String)If value <> "" ThenHeader = Header + tag + ": " + value + vbCrLfEnd IfEnd Sub
Kap13.fm Seite 264 Dienstag, 22. April 2003 2:33 14
Abfragen einer URI mit Visual Basic 265
Private Sub Class_Initialize()' Set Page = New WebBrowserSet Page = CreateObject("InternetExplorer.Application")Page.Visible = False
Referer = "VBA_app"Accept_language = "*"' Content type carries the MEDIA TYPE as defined in the' Multipurpose Internet Mail Extension (MIME) specs' Others may be: text/plain; charset=US-ASCII' text/XMLContent_Type = "application/x-www-form-urlencoded"Pragma1 = "no -cache"Extension = "Security/Remote-Passphrase"End Sub
Private Sub Class_Terminate()Set Document = NothingSet Page = NothingEnd Sub
Nachdem wir die Klasse definiert haben, müssen wir sie nur noch mitgeeigneten Mitteln aufrufen. Hier rufen wir eine URL als HTTP GET aufund speichern das Resultat in einer lokalen Datei.
Listing 13.3 Ein Hauptprogramm zur Klasse in Listing 13.2
Dim Request As New ZZReuseIEDim strHeader As StringDim strForm As StringConst BaseURL = "http://logosworld.com/samples/nusskna-cker.htm"
Sub Main()Set Request = New HTTPRequest.do_get BaseURLDebug.Print Request.Document.body.innerHTMLRequest.do_save Request.Document.body.innerHTML,"nuss-knackers.html"End Sub
Kap13.fm Seite 265 Dienstag, 22. April 2003 2:33 14
266 Webseiten von anderen Programmen abrufen
13.1.3 Das WINHTTP-Control
Sehr ähnlich dem Internet-Explorer-Control, allerdings in den meistenFällen etwas einfacher zu bedienen, ist die WINHTTP-Library. Im Übrigenfavorisiert Microsoft die Verwendung von WINHTTP in neuen Applikatio-nen. Im folgenden Beispiel ist das WINHTTP-Objekt ein Element desMSXML-Objekts. Da Sie in den meisten Fällen ohnehin den HTTP-Dienstzusammen mit einem XML-Parser verwenden, ist die Verwendung desMSXML4-Objekts ganz praktisch.
Der Microsoft XML-Parser MSXML hat die volle Funktionalität des WIN-HTTP bereits eingebaut. Damit ist es besonders einfach, Webdienste überHTTP aufzurufen.
Falls Sie mit WINHTTP über einen Proxy-Server auf das Internet zugreifenwollen, müssen Sie die Benutzung des Proxys konfigurieren. Hierfür stelltMicrosoft ein Tool Proxycfg zur Verfügung, das die notwendigen Einstel-lungen in der Windows-Registry vornimmt. Sie können dieses Tool gege-benenfalls von Microsoft MSDN herunterladen. Aufgerufen wird das Toolmit dem Befehl Proxycfg –d.
Das nachstehende Beispiel erzeugt zunächst eine Instanz des MSXML-Objekts und setzt die entsprechenden Parameter. Als URL wird eineAbfrage nach einem Artikel bei Amazon.com abgesetzt. Anders als beimWebbrowser-Control muss hier nicht explizit geprüft werden, ob derHTTP-Request schon abgeschlossen ist, vielmehr kommt die Abfrage mitTrue oder False zurück.
Listing 13.4 Request für ein XML-Dokument mit MSXML
Function AmazonASINsearch(ASIN As String) As MSXML2.DOM-Document Dim SelectedText As String Dim MSXML As MSXML2.DOMDocument Dim XMLURL As String Dim Loaded As Boolean Set MSXML = CreateObject("MSXML.DOMDocument") MSXML.Async = False MSXML.preserveWhiteSpace = False MSXML.validateOnParse = True MSXML.resolveExternals = False XMLURL = "http://xml.amazon.com/onca/xml2" + _ "?t=logosworldcom" + _
Kap13.fm Seite 266 Dienstag, 22. April 2003 2:33 14
Abfragen einer URI mit Visual Basic 267
"&dev-t=D2H301234JJ987" + _ "&page=1" + _ "&f=xml" + _ "&mode=books" + _ "&type=heavy" + _ "&AsinSearch=" + ASIN
Loaded = MSXML.Load(XMLURL)
If (Loaded) Then' ProcessResults MSXML Else MsgBox "The service is not available." End If Set AmazonASINsearch = MSXMLEnd Function
13.1.4 Anwendungsbeispiel für das WINHTTP-Control
Das nachstehende Beispiel liest eine XML-Datei ISBNSOAP.XML vonDatei und sendet diese als HTTP POST-Request via WINHTTP zum Servervon Amazon.com. Auch hier handelt es sich um ein typisches Beispiel,das sich gut als Vorlage für eigene Abwandlungen eignet.
Listing 13.5 Vollständiges Listing eines VBA-Programms, das WINHTTP verwendet
Class ZZWinHTTPPublic Page As MSXML2.XMLHTTPPublic Document As MSHTML.HTMLDocumentPublic User_Agent As StringPublic Content_Type As StringPublic Content_Length As IntegerPublic Accept As StringPublic Proxy_Connection As StringPublic Referer As StringPublic Host As StringPublic Pragma1 As StringPublic Accept_language As StringPublic Accept_Encoding As StringPublic Extension As StringPublic SOAPAction As String
Kap13.fm Seite 267 Dienstag, 22. April 2003 2:33 14
268 Webseiten von anderen Programmen abrufen
Public Sub do_post(URL As String, body As Variant)' Data to send to the server during the HTTP POST trans-action. For example, the POST transaction is' used to send data gathered by an HTML form. If this parameter does not specify any post data, the' Navigate method issues an HTTP GET transaction. This parameter is ignored if URL is not an HTTP' URL.' NOTE: The post data specified by PostData is passed as a SAFEARRAY structure. The variant should' be of type VT_ARRAY and point to a SAFEARRAY. The SAF-EARRAY should be of element type' VT_UI1, dimension one, and have an element count equal to the number of bytes of post data. Dim PostData() As Byte 'a local array with dynamic length Dim Flags As Long Dim TargetFrame As String
Flags = 0 TargetFrame = ""
Page.Open "POST", URL, False SOAPAction = "urn:PI/DevCentral/SoapService" + vbCrLf PostData = StrConv(body, vbFromUnicode) Content_Length = UBound(PostData) - 1 Content_Type = "text/xml; charset=""utf-8""" Me.HTTP_Header Page.send body' Page.navigate URL, , , body' While Page.Busy: DoEvents: Wend Do While Page.readyState < READYSTATE_INTERACTIVE: DoEvents: LoopEnd Sub
Kap13.fm Seite 268 Dienstag, 22. April 2003 2:33 14
Abfragen einer URI mit Visual Basic 269
Public Sub do_save(logtxt As String, Optional filename As String) Dim fs As Scripting.FileSystemObject Dim logfile As Scripting.TextStream If filename = "" Then filename = "asplog.txt" Set fs = CreateObject("Scripting.FileSystemObject") Set logfile = fs.CreateTextFile(filename, True) logfile.Write logtxt logfile.Close Set fs = NothingEnd Sub
Public Sub HTTP_Header()' HTTP_Header = "Content-Length: " + CStr(Content_Length) + vbCrLf Add_Header_Line "Content-Type", Content_Type Add_Header_Line "Extension", Extension Add_Header_Line "User-Agent", User - Agent Add_Header_Line "Host", Host Add_Header_Line "Pragma", Pragma1 Add_Header_Line "Accept", Accept Add_Header_Line "Proxy -Connection", Proxy_Connection Add_Header_Line "Referer", Referer Add_Header_Line "Accept -Language", Accept_language Add_Header_Line "Accept -Encoding", Accept_Encoding Add_Header_Line "SOAPAction", SOAPActionEnd Sub
Private Sub Add_Header_Line(tag As String, value As String) If value <> "" Then Page.setRequestHeader tag, value End IfEnd Sub
Private Sub Class_Initialize()' Set Page = New WebBrowser' Set Page = CreateObject("InternetExplorer.Application")
Kap13.fm Seite 269 Dienstag, 22. April 2003 2:33 14
270 Webseiten von anderen Programmen abrufen
Set Page = CreateObject("MSXML2.XMLHTTP") Referer = "VBA_app" Accept_language = "*" Content_Type = "application/x-www-form-urlencoded"' Content type carries the MEDIA TYPE as defined in the' Multipurpose Internet Mail Extension (MIME) specs' Others may be: text/plain; charset=US-ASCII' text/XML Pragma1 = "no -cache" Extension = "Security/Remote-Passphrase"End Sub
Private Sub Class_Terminate() Set Document = Nothing Set Page = NothingEnd Sub
Jetzt fehlt nur noch ein Hauptprogramm, das unsere Klasse geeignet tes-tet. Unser Beispiel liest nun eine vorbereitete SOAP-Abfrage aus einerDatei und sendet diese als HTTP POST an Amazon.com.
Listing 13.6 Ein Hauptprogramm zur Klasse ZZwinHTTP
Sub Main() Dim Request As New ZZWinHTTP Dim strHeader As String Dim strForm As String Dim myXML As New MSXML2.DOMDocument Request.do_save "Hello World" myXML.Load "ISBNSOAP.xml" Request.do_post BaseURL, myXML.XML Debug.Print Request.Page.responseText Request.do_save Request.Page.responseXML.XML, "ama-zonresponse.xml"End Sub
Zum besseren Verständnis hier noch einmal ein Beispiel für einen geeig-neten SOAP-Request zur Abfrage der ISBN.
Listing 13.7 SOAP-Request zur Abfrage einer ISBN im Amazon-Katalog
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope
Kap13.fm Seite 270 Dienstag, 22. April 2003 2:33 14
Webentwicklung mit SAP R/3 271
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"xmlns:si="http://soapinterop.org/xsd"xmlns:typens="urn:PI/DevCentral/SoapService"> <SOAP-ENV:Body> <typens:AsinSearchRequest> <AsinSearchRequest xsi:type="typens:AsinRequest"> <asin xsi:type="xsd:string"> 3528057297</asin> <tag xsi:type="xsd:string"> logosworldcom</tag> <type xsi:type="xsd:string"> lite</type> <dev-tag xsi:type="xsd:string"> D2H3Y00012KJJ615</dev-tag> </AsinSearchRequest> </typens:AsinSearchRequest> </SOAP-ENV:Body></SOAP-ENV:Envelope>
13.2 Webentwicklung mit SAP R/3Webentwicklung ist ab R/3 3.0E möglich
Ab Release 6.10 hat die SAP-Basis eine zusätzliche Personality als Webser-ver bekommen. Dadurch verhält sich das SAP-Basissystem innerhalb einesNetzwerks wie ein HTTP-Server, akzeptiert also Anfragen via HTTP undkann Anfragen in HTTP aussenden. Damit bietet SAP eine ganze Reihe vonalternativen Methoden, Entwicklungen für und um das Internet zusam-men mit SAP R/3 zu realisieren. Sie können die SAP-Basis als Webservereinsetzen, von einem Webserver via RFC auf SAP R/3 zugreifen und vonSAP R/3 via RFC externe Dienste nutzen. Allerdings stehen auch den älte-ren SAP R/3-Versionen die Webdienste über RFC zur Verfügung.
Web AS ist deutli-cher erweiterter SAP-Kernel
Um ein Missverständnis auszuräumen: Der SAP Web Application Serverist weiterhin der bewährte stabile Kernel von SAP R/3, mit all den Funk-tionalitäten, mit denen das System so erfolgreich wurde. SAP Web AS ist
Kap13.fm Seite 271 Dienstag, 22. April 2003 2:33 14
272 Webseiten von anderen Programmen abrufen
demnach das SAP Basissystem, erweitert um die Funktionalität einesWebservers, dessen herausragende Bedeutung durch den Namen zumAusdruck gebracht wird.
Die Kommunikation zwischen einem rufenden HTTP-Client und demWen AS erfolgt über Business Server Pages.
13.2.1 SAP Function HTTP_GET
HTTP ist auchohne Web AS via
RFC möglich
Das Abfragen eines Webservice aus einer R/3-Instanz heraus ist auchproblemlos via RFC möglich, was besonders wichtig ist, wenn Sie nocheine ältere Version von SAP R/3 einsetzen. Dazu verwenden wir denFunktionsbaustein HTTP_GET, der über eine RFC-Destination die URI aneinen Webserver sendet und die HTTP-Response entgegennimmt.
RFC-DestinationSAPHTTPA musskorrekt definiert
sein
Die verwendete RFC-Destination verweist dabei auf ein Utility SAPHTTPAbeziehungsweise SAPHTTP, die als RFC-Server definiert sind und als HTTP-Proxy funktionieren. SAPHTTPA ist dabei ein UNIX-Utility, das gewöhnlichauf dem R/3-Applikationsserver läuft, während SAPHTTP die gleicheFunktion erfüllt, aber über SAP GUI auf der Workstation eines interakti-ven Users ausgeführt wird.
Abbildung 13.1 Definition der RFC-Destination SAPHTTPA in SM59 (Web AS)
Kap13.fm Seite 272 Dienstag, 22. April 2003 2:33 14
Webentwicklung mit SAP R/3 273
Wenn wir sicher sind, dass die RFC-Destination SAPHHTP korrekt defi-niert ist, können wir darüber die URL von ABAP aufrufen. Dies ist mitjedem R/3-Release seit 3.1 möglich. Die URL zum Aufruf eines Ama-zon.com-Webservices kann wie folgt aussehen:
Listing 13.8 URI zum Finden einer ISBN (ASIN) bei Amazon.com
'http://xml.Amazon.com/onca/xml2?t=webservices-20' &'&tag=logosworldcom&dev-t=D2H3YO46KJJ615' &'&AsinS-earch=3528057297&type=lite&f=xml'
Das nachstehende Beispiel führt den Aufruf durch und gibt das Ergebnisals ABAP-Liste aus.
Listing 13.9 Abruf einer URL mit ABAP
DATA: ABSOLUTE_URI(128) type c.
DATA: response_headers(80) occurs 0 with header line.
Abbildung 13.2 Definition der RFC-Destination SAPHTTP mit Aufruf via Frontend (Release 4.6C)
Kap13.fm Seite 273 Dienstag, 22. April 2003 2:33 14
274 Webseiten von anderen Programmen abrufen
DATA: RESPONSE_ENTITY_BODY(120) occurs 0 with header line.
ABSOLUTE_URI ='http://xml.Amazon.com/onca/xml2?t=webservices-20' &'&tag=logosworldcom&dev-t=D2H3YO46KJJ615' &'&AsinSearch=3528057297&type=lite&f=xml'.
CALL FUNCTION 'HTTP_GET'EXPORTING
ABSOLUTE_URI = ABSOLUTE_URIRFC_DESTINATION = 'SAPHTTPA'PROXY ='192.168.69.64:8080'
* IMPORTING* STATUS_CODE =* STATUS_TEXT =* RESPONSE_ENTITY_BODY_LENGTH =TABLES
* REQUEST_ENTITY_BODY =RESPONSE_ENTITY_BODY =RESPONSE_ENTITY_BODYRESPONSE_HEADERS =RESPONSE_HEADERS
* REQUEST_HEADERS =EXCEPTIONS
CONNECT_FAILED = 1TIMEOUT = 2INTERNAL_ERROR = 3TCPIP_ERROR = 4DATA_ERROR = 5SYSTEM_FAILURE = 6COMMUNICATION_FAILURE = 7OTHERS = 8 .
IF SY-SUBRC <> 0.write: / sy-subrc.
ENDIF.
loop at response_entity_body.write: / response_entity_body.
endloop.
Kap13.fm Seite 274 Dienstag, 22. April 2003 2:33 14
Webentwicklung mit SAP R/3 275
13.2.2 Proxy-Settings in ABAP
Falls ABAP die HTTP-Aufrufe über einen HTTP-Proxy ausführen muss,kann der Proxy für den ganzen Mandanten in der Tabelle THTTP vordefi-niert werden. Dabei geht SAP davon aus, dass der erste Eintrag in THTTPdie Angaben des Systemproxy darstellen.
Listing 13.10 Standardcoding zum Bestimmen des Proxy für ABAP HTTP-Requests
form set_HTTP_proxy using uri proxy proxy_user proxy_password. data: proxyflag type c. if proxy ne space. exit. endif. select single * from tHTTP. if tHTTP-exitfunc ne space. call function tHTTP-exitfunc exporting absolute_uri = uri importing proxy = proxyflag. if proxyflag eq 'X'. proxy = tHTTP-proxy. proxy_user = tHTTP-puser. proxy_password = tHTTP-ppassword. endif. endif.endform.
Nachstehend sehen Sie zur besseren Orientierung die Struktur der TabelleTHTTP, in der die Proxy-Angaben hinterlegt sind. Meistens hat die Tabellenur einen einzigen Eintrag.
MANDT MANDT CLNT Client
PROXY PROXY CHAR HTTP proxy host name
PUSER PROXY_USER CHAR User name for HTTP proxy
PPASSWORD PROXY_PWD CHAR Password for HTTP proxy
EXITFUNC RS38L_FNAM CHAR Name of function module
Tabelle 13.1 Struktur der Tabelle THTTP
Kap13.fm Seite 275 Dienstag, 22. April 2003 2:33 14
276 Webseiten von anderen Programmen abrufen
13.2.3 SAP und SOAP: Webservice Choreography Interface (WSCI)
SAP hat sich bisher noch nicht definitiv entschieden, WSDL vollständig zuunterstützen. Statt dessen ist SAP bemüht, zusammen mit BEA und SUNden neuen Interface-Standard WSCI populär zu machen. Zur Zeit derDrucklegung dieses Buches gibt es zwar eine vollständige Spezifikationvon WSCI, aber noch keinerlei Marktakzeptanz, daher gehen wir hiernicht weiter darauf ein.
13.3 SAP Internet Transaction Server
Der Internet Transaction Server (ITS) war SAPs erster ernsthafter Versuch,die R/3-Technologie durch das Internet beziehungsweise Intranet zugäng-lich zu machen. Dabei handelt es sich um einen intelligenten Proxy-Ser-ver, der Daten aus den Dynpros einer Transaktionen extrahiert und sie inein vordefiniertes HTML-Template einmischt.
Keine Program-miersequenzen
Im Grunde genommen funktioniert der ITS genauso wie ASP, JSP oderBSP. Allerdings kann man in den ITS-Seiten keine Programmiersequenzeneinfügen, sondern nur Platzhalter für Variablen setzen, die später vom ITSersetzt werden, bevor die so abgemischte Seite an den rufenden Browserweitergesandt wird.
Um das zu besser verstehen, rufen wir uns noch einmal in Erinnerung,wie R/3 mit dem SAP GUI kommuniziert. Ausgehend von einer bestehen-den R/3-Sitzung, ist der Ablauf etwa wie folgt:
1. Das SAP GUI sendet die Daten eines Dynpros zu R/3
2. R/3 bestimmt das Folgedynpro und sendet
� die Koordinaten der Dynproelemente zu SAP GUI
� die Daten der Dynprofelder
ITS an Stelle desSAP GUI
Der ITS springt nun an Stelle des SAP GUI ein. Er filtert die Felddaten her-aus und mischt sie in eine vordefinierte HTML-Seite ein. Diese HTML-Sei-ten sind im ITS-Repository abgespeichert und enthalten Platzhalter anden Stellen, wo R/3 Dynprodaten einfügen soll. Die so aufbereiteteHTML-Seite wird dann durch den Internetbrowser aufgerufen.
Dieses Prinzip wurde in den Frühzeiten des World Wide Web von vielenWebservern angewandt, zum Beispiel auch von Microsofts Visual Studio.Dieses Abmischen von Daten mit Schablonen genügt heutigen Anforde-rungen bei weitem nicht mehr. Moderne Webserver übernehmen einengroßen Teil der Aufbereitungslogik und lassen sich flexibel programmie-
Kap13.fm Seite 276 Dienstag, 22. April 2003 2:33 14
SAP Internet Transaction Server 277
ren, also mit IF-Bedingungen und Schleifen (LOOP, WHILE, FOR … NEXT).Somit ist der ITS bei weitem nicht mehr zeitgemäß. SAP hat deshalb dieWeiterentwicklung von ITS schon seit Jahren aufgegeben und ersetzt ihndurch modernere Technologien, namentlich durch Business Server Pagesund durch Web Dynpro.
Dank der RFC-Technologie kann man aber auch problemlos die Websei-tengestaltung ganz aus SAP heraus verlagern. Im einfachsten Fall kannman auf ASP oder JSP zurückgreifen oder aber Messaging-Middleware fürkomplexe Sachverhalte zwischenschalten und die GUI-Funktionalität aufeinen dedizierten Server – zum Beispiel CASABAC – auslagern.
Kap13.fm Seite 277 Dienstag, 22. April 2003 2:33 14
Kap13.fm Seite 278 Dienstag, 22. April 2003 2:33 14
Anhang 279
A Anhang
A.1 MIME-Typen
Die Multipurpose Internet Mail Extensions sind Spezifikationen zum Über-tragen von Nachrichten durch das Internet. Die MIME-Spezifikationendes W3C listen in ihren Standards eine ganze Reihe etablierter Dateifor-mate auf und geben an, wie diese über HTTP übertragen werden müssen.Der HTTP-Header enthält normalerweise einen Hinweis auf den MIME-Type des Dokuments, so dass der Empfänger weiß, wie die Datei zu inter-pretieren und gegebenenfalls zu dekodieren ist.
MIME-Typ/Subtyp Typische Extensions Beschreibung
text/html html, htm HTML-Text
text/plain txt, c, c++, pl, cc, h, prn Klartext (Dokumente und Programme)
text/richtext Richtext (obsolet, ersetzt durch text/enriched)
text/x-settext Structure enhanced text
text/enriched Enriched text markup (W3C: RFC 1896)
text/tab-separated-values Komma-getrennte Liste
text/sgml SGML-Dokument (W3C: RFC 1874)
text/x-speech talk Sprache (Voice-over-IP-Solutions)
text/css css Cascading Stylesheet
application/x-latex latex LaTeX-Dokument
application/x-tex tex Tex/LaTeX-Dokument
application/msword doc, rtf MS Word-Dokument
application/sgml SGML-Applikation (RFC 1874)
application/oda oda Office Document Architec-ture
Tabelle A.1 MIME-Typen für textbasierte Dokumente
AnhangA.fm Seite 279 Dienstag, 22. April 2003 2:33 14
280 Anhang
application/dca-rft IBM Document Content Architecture (IBM)
application/vnd.framema-ker
doc, fm, frm, frame FrameMaker-Dokument (Frame)
MIME-Typ/Subtyp Typische Extensions Beschreibung
image/gif gif Graphics Interchange Format
image/x-xbitmap xbm X-Windows-Bitmap (s/w)
image/x-xpixmap xpm X-Windows-Pixelmap (8 Bit)
image/x-png png Portable Networks Graphic
image/ief ief Image Exchange Format
image/jpeg jpeg, jpg, jpe JPEG
image/tiff tiff, tif TIFF
image/rgb rgb RGB
image/g3fax g3f Group III Fax (RFC 1494)
image/x-pict pict Macintosh PICT Format
image/x-portable-pixmap ppm PPM (UNIX PPM Package)
image/x-portable-graymap pgm PGM (UNIX PPM Package)
image/x-portable-bitmap pbm PBM (UNIX PPM Package)
image/x-portable-anymap pnm PNM (UNIX PPM Package)
image/x-ms-bmp bmp Windows-Bitmap
image/x-cmu-raster ras CMU-Raster
image/x-photo-cd pcd Kodak Photo-CD
image/vnd.dwg dwg AutoCad-Zeichnung
image/vnd.dxf dxf AutoCad-DXF-Datei
Tabelle A.2 MIME-Typen für Images
MIME-Typ/Subtyp Typische Extensions Beschreibung
Tabelle A.1 MIME-Typen für textbasierte Dokumente (Forts.)
AnhangA.fm Seite 280 Dienstag, 22. April 2003 2:33 14
MIME-Typen 281
MIME-Typ/Subtyp Typische Extensions Beschreibung
audio/basic au, snd »Basic« Audio – 8-bit u-law PCM
audio/x-aiff aif, aiff, aifc Macintosh Audio Format (Apple)
audio/x-wav wav Microsoft Audio
audio/x-mpeg mpa, abs, mpega MPEG Audio
audio/x-mpeg-2 mp2a, mpa2 MPEG-2 Audio
audio/echospeech es Compressed Speech (Echo Speech Corp.)
audio/voxware vox Toolvox Speech Audio (Voxware)
application/x-pn-realaudio ra, ram Realaudio (Progressive Networks)
x-music/x-midi mmid MIDI Music Data
text/x-speech talk Speech Synthesis Data (MVP Solutions)
video/mpeg mpeg, mpq, mpe MPEG Video
video/mpeg-2 mpv2, mp2v MPEG-2 Video
video/quicktime qt, mov Macintosh Quicktime Movie
video/x-msvideo avi Microsoft Video
video/x-sqi-movie movie SGI Movie Format
Tabelle A.3 MIME-Typen für Multimedia
MIME-Typ/Subtyp Beschreibung
message/rfc822 MIME-Message
message/partial Teil einer Nachricht
message/external-body Nachricht mit externen Verweisen
message/news Message mit Usenet-News
message/http HTTP-Message
multipart/mixed mehrere Nachrichtenteile
Tabelle A.4 MIME-Typen für Messaging und E-Mail
AnhangA.fm Seite 281 Dienstag, 22. April 2003 2:33 14
282 Anhang
A.2 Beispiel für HTTP GET und HTTP POST
Die folgende Sequenz fordert über den Internet Explorer eine XML-Seiteaquarium.xml von einem Internet Information Server an, im darauf fol-genden Listing sehen Sie die Antwort.
Listing 1.1 HTTP GET zur Anforderung des XML-Dokuments aquarium.xml
GET /mySap/XML/farm/aquarium.xml HTTP/1.0Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Accept-Language: deExtension: Security/Remote-PassphraseUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)Host: localhostProxy-Connection: Keep-Alive
Listing 1.2 HTTP-Antwort mit dem XML-Dokument aquarium.xml
HTTP/1.1 200 OKServer: Microsoft-IIS/5.0Cache-Control: no-cacheExpires: Mon, 01 Jul 2002 14:01:46 GMTDate: Mon, 01 Jul 2002 14:01:46 GMT
multipart/alternative mehrere Nachrichtenteile, die alternativ zueinander sind
multipart/related mehrere Nachrichtenteile, die in Bezug zueinander stehen
multipart/digest Nachrichten, Zusammenfassung
multipart/report E-Mail-Status
multipart/parallel mehrere Teile, deren Reihenfolge unbedeutend ist
multipart/appledouble Macintosh File Data
multipart/header-set Kopfnachricht, die als Header anderer Nach-richten dient
multipart/voice-message Container für Voice-Mail
MIME-Typ/Subtyp Beschreibung
Tabelle A.4 MIME-Typen für Messaging und E-Mail (Forts.)
AnhangA.fm Seite 282 Dienstag, 22. April 2003 2:33 14
HTTP-Statuscodes 283
Content-Type: text/xmlAccept-Ranges: bytesLast-Modified: Sun, 17 Jun 2001 17:43:26 GMTETag: "0747f355f7c01:888"Content-Length: 371
<!-- edited with XML Spy v3.0.7 NT (http://www.xmlspy.com) by Axel Angeli (Logos! Informatik GmbH) --><Schema xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="fish" content="textOnly" dt:type="string"/> <ElementType name="Aquarium" content="mixed"> <element type="fish"/> </ElementType></Schema>
A.3 HTTP-Statuscodes
HTTP-Statuscodes sind die Statuscodes, die ein HTTP-Server mit der Ant-wort zurückgibt. Bei einer gelungenen Kommunikation ist es der Code200.
Listing 1.3 HTTP 1.1: Rückmeldung nach erfolgreichem Request
HTTP/1.1 200 OKDate: Fri, 27 Dec 2002 21:59:39 GMTServer: Stronghold/2.4.2 Apache/1.3.6 C2NetEU/2412 (Unix) mod_fastcgi/2.2.10Content-Type: text/xmlConnection: closeProxy-Connection: close
Die folgende Tabelle listet die HTTP-Statuscodes und ihre Bedeutung auf.
Informational 1xx
100 Continue
101 Switching Protocols
Tabelle A.5 HTTP 1.1-Statuscodes
AnhangA.fm Seite 283 Dienstag, 22. April 2003 2:33 14
284 Anhang
Successful 2xx
200 OK
201 Created
202 Accepted
203 Non-Authoritative Information
204 No Content
205 Reset Content
206 Partial Content
Redirection 3xx
300 Multiple Choices
301 Moved Permanently
302 Found
303 See Other
304 Not Modified
305 Use Proxy
306 (Unused)
307 Temporary Redirect
Client Error 4xx
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
405 Method Not Allowed
406 Not Acceptable
407 Proxy Authentication Required
408 Request Timeout
409 Conflict
410 Gone
411 Length Required
Tabelle A.5 HTTP 1.1-Statuscodes (Forts.)
AnhangA.fm Seite 284 Dienstag, 22. April 2003 2:33 14
HTTP-Statuscodes 285
Die meisten Server lassen sich so konfigurieren, dass abhängig vom Sta-tuscode eine bestimmte Aktion ausgeführt oder zusätzliche Informationmitgesendet wird. Abbildung A.1 zeigt diese Konfigurationsmöglichkeitenfür den Microsoft IIS.
412 Precondition Failed
413 Request Entity Too
414 Request-URI Too Long
415 Unsupported Media Type
416 Requested Range Not
417 Expectation Failed
Server Error 5xx
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported
Abbildung A.1 Konfiguration der HTTP-Statuscodes im IIS
Tabelle A.5 HTTP 1.1-Statuscodes (Forts.)
AnhangA.fm Seite 285 Dienstag, 22. April 2003 2:33 14
286 Anhang
A.4 HTTP- und FTP-Kommandos
FTP-Befehl Beschreibung
CD dir Wechselt das aktuelle Verzeichnis auf dem Remote-Computer.
CDUP Wechselt in das Mutterverzeichnis des aktuellen Verzeichnisses auf dem Remote-Computer.
CLOSE Schließt die Verbindung.
DELETE file Löscht die angegeben Datei auf dem Remote-Computer.
DIR [dir] Inhaltsverzeichnis des gewünschten Verzeichnisses auf dem Remote-Computer.
GET remote-file localfile
Hole die Datei remotefile auf dem Remote Computer und spei-chere sie lokal als localfile.
LS [dir] Alias zu DIR.
MKDIR dir Anlegen des angegeben Verzeichnisses auf dem Remote-Com-puter.
PUT localfile remotefile
Sende die lokale Datei und speichere sie auf dem Remote-Com-puter.
PWD Gibt das aktuelle Verzeichnis auf dem Remote-Computer zurück.
QUIT Beendet die aktuelle Session auf dem Remote-Computer.
RECV remote-file localfile
Alias zu GET.
RENAME file1 file2
Umbenennen einer Datei auf dem Remote-Computer.
RMDIR dir Löschen eines ganzen Verzeichnisses auf dem Remote-Compu-ter.
SEND local-file remote-file
Alias zu PUT.
SIZE dir Größe des angegebenen Verzeichnis auf dem Remote-Compu-ter.
Tabelle A.6 FTP-Befehle für das Microsoft Internet Control (© Microsoft)
AnhangA.fm Seite 286 Dienstag, 22. April 2003 2:33 14
Java-Utilities 287
A.5 Java-Utilities
Das Java Software Development Kit (JDK) kann kostenlos von der Web-seite von SUN Microsystems (www.sun.com) heruntergeladen werden.
Die folgende Tabelle zeigt die Aufruf-Optionen des javac-Utility mit derSyntax
javac <options> <source files>
HTTP-Befehl
Beschreibung
GET uri Holt das als URI spezifizierte Dokument vom Server. Mit GetHeader kann nur der Header der Antwort abgeholt werden, GetChunk gibt den Rest der Antwort zurück.
HEAD uri Abfragen der Header-Information, ohne dass die Seite übertragen wird.
POST uri Sendet Daten an die angegebene URI.
PUT uri Ersetzen einer Seite an der angegeben URI (falls der Client die nötigen Rechte hat).
Tabelle A.7 HTTP-Kommandos für das Microsoft Internet Control (© Microsoft)
Option Bedeutung
-g Erzeuge vollständige Debuginfo
-g:none Erzeuge keine Debuginfo
-g:{lines,vars,source}
Erzeuge ausgewählte Info für das Debugging
-O Optimize; kann Probleme beim Debuggen bereiten und Klassen-datei vergrößern
-nowarn Warnungen unterdrücken
-verbose Während des KOmpilieren Nachrichten ausgeben, was der Compiler gerade tut
-deprecation Hinweise über die Quelle von obsoleten APIs
-classpath <path>
Pfad zu den Class-Dateien
-sourcepath <path>
Pfad zu den Quelldateien
Tabelle A.8 Aufruf-Optionen des javac-Utility
AnhangA.fm Seite 287 Dienstag, 22. April 2003 2:33 14
288 Anhang
Listing 1.4 Ausführen einer Klasse mit Java-Runtime
D:\JDK> java HelloWorldClass
Welcome to Java hello World
Die folgende Tabelle zeigt die Aufruf-Optionen des java-Utility, verwend-bar in folgender Syntax:
java [-options] class [args...]
(zum Ausführen einer Klasse)
java -jar [-options] jarfile [args...]
(zum Ausführen eines .jar-Files)
-bootclass-path <path>
Bootstrap-Classpfad explizit angeben
-extdirs <dirs>
Pfad zu installierten Erweiterungen (der Java Runtime)
-d <directory> Pfad zur Ausgabe der kompilierten Dateien
-encoding <encoding>
Explizite Angabe des verwendeten Zeichensatzcodes
-target <release>
Class-File für bestimmte VM Version erstellen
Option Bedeutung
-cp -classpath <directories andzip/jar files separated by ;>
Suchpfad für Klassen und Ressourcen
-D<name>=<value> Systemproperty setzen
-verbose[:class|gc|jni] Loginfo interaktiv ausgeben
-version Produktversion zeigen und beenden
-showversion Produktversion zeigen und weitermachen
-? -help Hilfe
-X Hilfe für Erweiterungen
Tabelle A.9 Aufruf-Optionen des java-Utility
Option Bedeutung
Tabelle A.8 Aufruf-Optionen des javac-Utility (Forts.)
AnhangA.fm Seite 288 Dienstag, 22. April 2003 2:33 14
Java-Utilities 289
Listing 1.5 Ausführung des javap-Analyzer für die Hello World Class
D:\JDK> javap HelloWorldClass
Compiled from HelloWorldClass.javapublic class HelloWorldClass extends java.lang.Object { public HelloWorldClass(); public static void main(java.lang.String[]);}
Die folgende Tabelle zeigt die Aufruf-Optionen des javap-Utility mit fol-gender Syntax:
javap <options> <classes>...
Option Bedeutung
-b Rückwärtskompatibiltät zu javap in JDK 1.1
-c Disassemble Code
-classpath <path> Pfad zu den Class-Dateien
-extdirs <dirs> Pfad zu installierten Erweiterungen (der Java Runtime)
-help Hilfe
-J<flag> Übergebe <flag> direkt an die Runtime
-l Zeilennummer und lokale Variablen ausgeben
-public nur Public Classes anzeigen
-protected Protected Classes anzeigen
-package Package/protected/public Classes und Members anzeigen
-private alle Klassen und Members anzeigen
-s interne Signatur ausgeben
-bootclasspath<pathlist>
Pfad zu den Class-Files, die vom Bootstrap Class Loader geladen werden
-verbose Stack size, Hinweise zu den Methodenparametern und ggf. Grund eines Fehlers ausgeben
Tabelle A.10 Aufruf-Optionen des javap-Utility
AnhangA.fm Seite 289 Dienstag, 22. April 2003 2:33 14
290 Anhang
A.6 SAPLPD-Befehlszeilenparameter
SAPLPD ist ein TCP/IP-Listener, der auf dem Standard UNIX Line PrintingDevice (LPD) aufsetzt. SAPLPD kann LPD vollständig ersetzen. Zusätzlichkann SAPLPD aber den mit dem SAP-Druckertreiber SAPWIN erzeugtenMetacode abfangen und diesen an einen installierten Windows-Druckerüber die Windows-Printer-API weiterleiten. Dadurch braucht man nureinen Druckertreiber für alle Drucker in SAP und kann ansonsten dieWindowstreiber verwenden. SAPLPD läuft nur unter Windows. Die Syn-tax lautet:
SAPLPD [parameter]
Befehl Beschreibung
-l <File> Protokoliere den Netzwerkverkehr in eine Datei.
Zusätzlich zur Option –l gibt es noch folgende Log-Optionen. Existiert die Datei SAPLPD.DBG, wird der ganze Log in diese Datei geschrieben, genauso wie bei Debugging-Level 9. Vor-sicht! Diese Datei kann sehr schnell sehr groß werden. (Ab Ver-sion 2.53/3.04 wird die Datei automatisch erzeugt, wenn die Option –d angegeben wurde.)
-d <No.> Debug-Level
-t <No.> Trace-Level für Netzwerke
-g <No.> Setze Logging-Level (wie Debug-Level ab 3.00)
-r <No.> Receiver-Port-Nummer, an der SAPLPD hört
-p <Name> Setze Default-Printer
-f <File> Drucke die angegebene Datei
-b Multi-threading-Modus (ab SAPLPD 3.00 und nur auf NT)
-k Spooldateien nicht löschen (Keep all files, ab 2.43)
-c Anzahl Kopien beim Drucken aus Befehlszeile (ab 3.00)
-m <font_name> Erzeuge Metrik (saplpd.met) für den angegeben Font. Diese Option muss die letzte Angabe der Befehlszeile sein und ein Drucker muss angegeben werden.
-w <No.> Setze WinCharSet zur Font-Selektion.
-i ib mit i, b = 0/1 i = kursiv, b = fett.
Tabelle A.11 SAPLPD-Befehlszeilenparameter
AnhangA.fm Seite 290 Dienstag, 22. April 2003 2:33 14
Setzen des Suchpfads für SAPLOGON.INI 291
A.7 Setzen des Suchpfads für SAPLOGON.INI
Die Position der Datei SAPLOGON.INI mit den Logon- und Systempara-metern kann durch das Setzen einer Umgebungsvariablen SAPLOGON_INI_FILE kontrolliert werden. Dies erfolgt entweder auf Kommandozei-lenebene oder über das Windows-Controlpanel system.cpl:
SET SAPLOGON_INI_FILE = "C:\WINNT\SAPLOGON.INI"
-I Minimiere SAPLPD nach dem Start (ab 4.04)
-s Sucht nach verlorenen Print-Requests (Dateien mit Endung .slp). Falls das passende Datenfile (ohne endung .slp) zu dem Request noch existiert, wird der Job noch einmal gedruckt. (ab 4.30)
Abbildung A.2 Umgebungsvariable SAPLOGON_INI_FILE
Befehl Beschreibung
Tabelle A.11 SAPLPD-Befehlszeilenparameter
AnhangA.fm Seite 291 Dienstag, 22. April 2003 2:33 14
292 Anhang
A.8
RFC-C
onn
ect
ors
Kla
ssen
nam
eR
egis
try
Dat
eina
me
Bes
chre
ibun
g
SAPL
ogon
Cont
rol
SAP.Lo
gonC
ontr
ol.1
wdt
log.
ocx
Her
stel
len
eine
r V
erbi
ndun
g zu
R/3
SAPF
unct
ions
OCX
SAP.Fu
ncti
ons
wdt
func
s.oc
xB
ehan
dlun
g vo
n R
FC-A
ufru
fen
SAPB
APIC
ontr
olLi
bSA
P.Ba
pi.1
wdo
bapi
.ocx
Beh
andl
ung
von
BA
PI-A
ufru
fen
TRAN
SACT
IONO
CXLi
bSA
P.Tr
ansa
ctio
ns.1
wdt
x.oc
xB
ehan
dlun
g vo
n Tr
ansa
ktio
nsau
fruf
en
Tabe
lle A
.12 S
AP
DC
OM
-Lib
rari
es f
ür W
indo
ws
Libr
ary-
Nam
eD
atei
nam
eK
lass
enna
me
Kla
ssen
-ID
in d
er W
indo
ws
Reg
istr
yO
bjek
tePf
ad
Logo
n C
ontr
olw
dtlo
g.oc
xSA
PLog
onCtrl
{B
2494
4D6-
1501
-11C
F-89
81-0
000E
8A49
FA0}
Con
nect
ion
\sap
gui\
saps
hare
\sy
stem
\wdt
log.
ocx
Set
oLog
onC
ontr
ol =
Cre
ateO
bje
ct (
»SA
P.Lo
gon-
Con
trol
.1«)
SAPL
ogon
Con
trol
Func
tion
Con
tro
lw
dtfu
ncs.
ocx
SAPF
unct
ions
OCX
{5B
076C
03-2
F26-
11C
F-9A
E5-0
8000
96E1
9F4}
Expo
rts
\sap
gui\
saps
hare
\sy
stem
\wdt
func
s.oc
x
Set
oFun
ctio
ns =
Cre
ateO
bjec
t (»
SAP.
Func
-ti
ons«
)Fu
ncti
on
Tabe
lle A
.13 I
nhal
te d
er D
CO
M-L
ibra
ries
AnhangA.fm Seite 292 Dienstag, 22. April 2003 2:33 14
RFC-Connectors 293
Impo
rts
Para
met
er
SAPF
unct
ions
Stru
ctur
e
Tabl
e Fa
ctor
yw
dtao
cx.o
cxSA
PTab
leFact
ory-
Ctrl
{8
7D28
50E-
6B43
-101
C-9
2CE-
1000
5AF5
DF4
D}
SAPT
able
Fact
ory
\sap
gui\
saps
hare
\sy
stem
\wdt
aocx
.ocx
Set
oTab
leFa
ctor
y =
Cre
ateO
bjec
t (»
SAP.T
able
-Fa
ctor
y.1«)
Mat
rix
Rfc
Tabl
ePar
amet
er
Stru
ctur
e
Row
Tabl
e
Row
s
Col
umns
Libr
ary-
Nam
eD
atei
nam
eK
lass
enna
me
Kla
ssen
-ID
in d
er W
indo
ws
Reg
istr
yO
bjek
tePf
ad
Tabe
lle A
.13 I
nhal
te d
er D
CO
M-L
ibra
ries
(Fo
rts.
)
AnhangA.fm Seite 293 Dienstag, 22. April 2003 2:33 14
294 Anhang
Col
umn
Vie
ws
Tabl
es
Ran
ges
Ran
ge
Fiel
ds
Fiel
d
Tran
sact
ion
Con
trol
wdt
x.oc
xTR
ANSA
CTIONO
CX-
Lib
{87D
2851
1-6B
43-1
01C
-92C
E-10
005A
F5D
F4D
}Tr
ansa
ctio
nOC
X\s
apgu
i\sa
psha
re\
syst
em\w
dtx.
ocx
Set
oTra
nsac
tion
s =
Cre
ateO
bjec
t(SA
P.Tra
nsac
-ti
ons.1
)TR
AN
SAC
TIO
N
SCR
EEN
S
SCR
EEN
FIEL
DS
Libr
ary-
Nam
eD
atei
nam
eK
lass
enna
me
Kla
ssen
-ID
in d
er W
indo
ws
Reg
istr
yO
bjek
tePf
ad
Tabe
lle A
.13 I
nhal
te d
er D
CO
M-L
ibra
ries
(Fo
rts.
)
AnhangA.fm Seite 294 Dienstag, 22. April 2003 2:33 14
RFC-Connectors 295
Im F
olge
nden
seh
en S
ie e
ine
List
e de
r K
lass
en d
es J
ava
Con
nect
ors.
FIEL
D
BA
PI C
ontr
olw
doba
pi.o
cxSA
PBAP
IContr
ol-
Lib
{2E9
A46
9B-F
0EE-
11C
F-A
C55
-080
009D
213D
2}SA
PBA
PIC
ontr
ol\s
apgu
i\sa
psha
re\
syst
em\w
doba
pi.o
cx
Set
oBA
PI =
Cre
ateO
bjec
t(SA
P.B
API
.1)
SAPB
usin
ess-
Obj
ect
Libr
ary-
Nam
eD
atei
nam
eK
lass
enna
me
Kla
ssen
-ID
in d
er W
indo
ws
Reg
istr
yO
bjek
tePf
ad
Tabe
lle A
.13 I
nhal
te d
er D
CO
M-L
ibra
ries
(Fo
rts.
)
jCO
jCO.
Abap
Exce
ptio
n jC
O.At
trib
utes
jCO.
Basi
cRep
osit
ory
jCO.
Clie
nt
jCO.
Conn
ecti
on
jCO.
Conv
ersi
onEx
cept
ion
jCO.
Exce
ptio
n jC
O.Fi
eld
jCO.
Fiel
dIte
rato
r jCO.
Func
tion
jC
O.Fu
ncti
onTe
mpla
te
jCO.
Meta
Data
jCO.
Para
mete
rLis
t jC
O.Po
ol
jCO.
Pool
Chan
gedL
iste
ner
jCO.
Pool
Mana
ger
jCO.
Reco
rd
jCO.
Repo
sito
ry
jCO.
Serv
er
jCO.
Serv
erEr
rorL
iste
ner
Tabe
lle A
.14 A
uflis
tung
der
Kla
ssen
des
Jav
a C
onn
ecto
rs
AnhangA.fm Seite 295 Dienstag, 22. April 2003 2:33 14
296 Anhang
A.9
Bei
spie
le a
us
dem
SA
P I
nte
rfac
e R
eposi
tory
jCO.
Serv
erEx
cept
ionL
iste
ner
jCO.
Serv
erSt
ateC
hang
edLi
sten
er
jCO.
Serv
erTh
read
jCO.
Stru
ctur
e jCO.
Tabl
e jC
O.Th
roug
hput
jCO.
Trac
eLis
tene
r
Tabe
lle A
.14 A
uflis
tung
der
Kla
ssen
des
Jav
a C
onn
ecto
rs (
Fort
s.)
Can
onic
al U
RLs
Bed
eutu
ng
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
type
=bob
j&na
me=
Sale
sOrd
erG
rund
ansi
cht
zu B
usin
ess-
Obj
ekt Sa
lesO
rder
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
type
=bob
j&na
me=
Sale
sOrd
er&
key=
Sale
sDoc
umen
tD
okum
enta
tion
des
Sch
lüss
elfe
lds
(Pro
per
ty)
Sale
sDoc
umen
t zu
dem
B
usin
ess-
Obj
ekt Sa
lesO
rder
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
type
=bap
i&na
me=
Sale
sOrd
er.G
etLi
stG
rund
ansi
cht
zu B
API
Get
List
des
Bus
ines
s-O
bjek
ts Sal
esOr
der
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
type
=bap
i&na
me=
Sale
sOrd
er.G
etLi
st&
para
m=C
usto
mer
Num
ber
Info
rmat
ion
zu P
aram
eter
Cus
tome
rNum
ber
des
BA
PI Get
List
des
B
usin
ess-
Obj
ekts
Sal
esOrde
r
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
type
=bap
i&na
me=
Sale
sOrd
er.G
etLi
st&
xml=
sche
ma
Abf
rage
des
XM
L Sc
hem
a zu
BA
PI Get
List
in d
er n
eues
ten
XM
L-V
er-
sio
n (m
anch
e Sy
stem
ver
steh
en n
ur b
esti
mm
te X
ML-
Dia
lekt
e, d
ie
eine
r äl
tere
n X
ML
Sche
ma-
Spez
ifika
tio
n de
s W
3C e
ntsp
rech
en)
Tabe
lle A
.15 B
eisp
iele
für
Can
oni
cal U
RLs
AnhangA.fm Seite 296 Dienstag, 22. April 2003 2:33 14
Beispiele aus dem SAP Interface Repository 297
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
type
=bap
i&na
me=
Sale
sOrd
er.G
etLi
st&
xml=
sche
ma.
w3c
-200
0-04
&xd
ir=r
espo
nse
Abf
rage
des
XM
L Sc
hem
a zu
BA
PI Get
List
der
Ver
sion
von
Apr
il 20
00 (
w3c
-200
0-04
)
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
type
=rfc
&na
me=
QIR
F_G
ET_A
LL_D
ATA
_VA
LUES
2G
rund
ansi
cht
eine
s R
emot
e Fu
ncti
on C
all
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
type
=rfc
&na
me=
QIR
F_G
ET_A
LL_D
ATA
_VA
LUES
2&pa
ram
=T_Q
AIM
R-
TAB
Para
met
er-D
oku
men
tati
on e
ines
Rem
ote
Func
tion
Cal
l
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
type
=rfc
&na
me=
QIR
F_G
ET_A
LL_D
ATA
_VA
LUES
2&xm
l=sc
hem
aA
bfra
ge d
es X
ML
Sche
ma
eine
s R
emo
te F
unct
ion
Cal
l in
der
neue
sten
V
ersi
on
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:B
ASI
S:46
C&
type
=im
sg&
nam
e=A
CC
ON
FG
rund
ansi
cht
für
Mes
sage
-Typ
AC
CO
NF
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:B
ASI
S:46
C&
type
=ido
c&na
me=
AC
CO
NF0
1G
rund
ansi
cht
für
IDoc
-Typ
AC
CO
NF0
1
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:B
ASI
S:46
C&
type
=ido
c&na
me=
AC
CO
NF0
1&xm
l=sc
hem
aX
ML
Sche
ma
für
IDoc
-Typ
AC
CO
NF0
1 in
der
neu
este
n X
ML-
Ver
sion
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:B
ASI
S:46
C&
type
=ise
g&na
me=
E1A
CC
ON
Dok
umen
tati
on f
ür S
egm
ent
E1A
CC
ON
Can
onic
al U
RLs
Bed
eutu
ng
Tabe
lle A
.15 B
eisp
iele
für
Can
oni
cal U
RLs
(Fo
rts.
)
AnhangA.fm Seite 297 Dienstag, 22. April 2003 2:33 14
298 Anhang
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
lang
uage
=EN
&ty
pe=
docu
&na
me=
GL.
sale
s_d
ocum
ent.
ESA
P-Sy
stem
doku
men
tati
on d
es O
bjek
tes sa
les_
docu
ment
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr:L
O:4
6C&
type
=are
a&na
me=
HLA
0006
433
AK
H K
note
n H
LA00
0643
3, z
eigt
alle
Obj
ekte
und
Unt
erkn
oten
des
O
bjek
ts
http
://i
fr.sa
p.c
om/c
atal
og/q
uery
.asp
?nam
espa
ce=u
rn:s
ap-c
om:
ifr&
type
=bob
j&na
me=
Add
ress
Con
tPar
tLi
ste
alle
r B
usin
ess-
Obj
ekte
, die
das
Obj
ekt Ad
dres
sCon
tPar
t en
t-ha
lten
Can
onic
al U
RLs
Bed
eutu
ng
Tabe
lle A
.15 B
eisp
iele
für
Can
oni
cal U
RLs
(Fo
rts.
)
AnhangA.fm Seite 298 Dienstag, 22. April 2003 2:33 14
Synopsis der Programmiersprachen ABAP, VB und Java 299
BSy
nop
sis
der
Pro
gra
mm
iers
pra
chen
AB
AP,
VB
und
Jav
a
Die
folg
ende
n Ta
belle
n si
nd e
ine
verg
leic
hend
e Ü
bers
icht
aus
gew
ählt
er S
prac
hele
men
te d
er d
rei w
icht
igen
Spr
ache
n A
BA
P, Ja
va u
ndV
isua
l Bas
ic.
Sinn
ist
es,
dass
Sie
ras
ch d
en e
ntsp
rech
ende
n B
efeh
l in
der
jew
eils
and
eren
Pro
gram
mie
rspr
ache
fin
den
könn
en u
ndei
nen
Eind
ruck
bek
omm
en, w
ie d
iese
r ve
rwen
det
wer
den
kann
.
ABA
PB
eisp
iel
Vis
ual B
asic
Bei
spie
lJa
vaB
eisp
iel
Def
init
ion
von
Kon
stan
ten
CONS
TANT
SCO
NST:
cTr
ue TYP
E C(
1) V
ALUE
'1'
.Co
nst constnam
e =
expression
Cons
t cT
rue
= Tr
ueCo
nst constnam
e = expression
Cons
t cT
rue
= Tr
ue
Erze
ugen
ein
er
Inst
anz
eine
s ex
ter-
nen
Obj
ekts
CREA
TE O
BJEC
T O
bj-K
lass
eCR
EATE
OBJ
ECT
Dat
enst
rukt
uren
DATA
DATA
: do
cnum
TYP
E C(
10).
DATA
: do
cnum
LIK
E VB
AK-V
BELN
.
DIM
DIM
docn
um AS
stri
ngDI
MDI
M do
cnum
AS
stri
ng
Poin
ter
FIEL
D-SY
MBOL
SFI
ELD-
SYMB
OLS:
<p
tr>.
DIM
(Hin
wei
s: a
lle
Var
iabl
en in
VB
si
nd a
utom
atis
ch
poin
ter
( =va
ri-
ant)
typ
es)
DIM
ptr
DIM
DIM
ptr
Tabe
lle B
.1 D
ekla
rati
onen
AnhangB.fm Seite 299 Dienstag, 22. April 2003 2:33 14
300 Synopsis der Programmiersprachen ABAP, VB und Java
Inkl
udie
ren
von
Stru
ktur
en o
der
Ty
pen
INCL
UDE includ
efile-
name
INCL
UDE
zzmy
in-
clud
e.ni
cht
unte
rstü
tzt
Ben
utze
rein
gabe
n,
inte
rakt
ivPA
RAME
TERS
PARA
METE
RS:
doc-
num
LIKE
vba
k-do
cnum
DE
FAUL
T '1
23'.
INPUT
INPUT
Dat
enb
ankt
abel
-le
n de
klar
iere
nTA
BLES
TABL
ES:
VBAK
, LI
KP.
Wir
d au
tom
atis
ch e
rzeu
gt, w
enn
eine
O
DB
C o
der
SQL-
Sour
ce g
eöff
net
wir
dW
ird
auto
mat
isch
erz
eugt
, wen
n ei
ne
OD
BC
ode
r SQ
L-So
urce
geö
ffne
t w
ird
Tabe
lle B
.1 D
ekla
rati
onen
(Fo
rts.
)
ABA
PB
eisp
iel
Vis
ual B
asic
Bei
spie
lJa
vaB
eisp
iel
Funk
tion
au
fruf
enCA
LL
FUNC
-TI
ON
func
name
CALL
FUN
CTION
'RFC
_PIN
G'CALL
fun
cnam
e
Fallu
nter
-sc
heid
ung
CASE
...
WH
EN ...
EN
DCAS
E
CASE
myV
ar.
WHE
N '1
'. FOR
-MA
T CO
LOR
COL_
NEGA
TIVE
.
Sele
ct C
ase
Test
expr
es-
sion
[Cas
e Expr
essi
on-
list
e-n
Sele
ct C
ase
MyVa
r C
ase
"red"
docu
-me
nt.b
gColor
= "
red"
Cas
e "g
reen
" do
cu-
ment
.bgC
olor
= "
gree
n"
Sele
ct C
ase
Test
expr
essi
on[C
ase
Expr
essi
onli
st-n
Sele
ct C
ase
MyVa
r C
ase
"red"
docu
-me
nt.b
gColor
= "
red"
Cas
e "g
reen
" do
cu-
ment
.bgC
olor
= "
gree
n"
Tabe
lle B
.2 P
rogr
amm
abla
uf
AnhangB.fm Seite 300 Dienstag, 22. April 2003 2:33 14
Synopsis der Programmiersprachen ABAP, VB und Java 301
WHEN
'2'
. FOR-
MAT
COLO
R COL_
POSI
TIVE
. W
HEN
OTHE
RS.
FORM
AT R
ESET.
ENDC
ASE.
[Sta
temen
ts-n
]] .
. .
[Cas
e Else
Exp
res-
sion
list
e-n
[els
e-Sta
teme
nts-
n]]
End
Sele
ct
Cas
e "b
lue"
doc
u-me
nt.b
gColor
= "
blue
" Cas
e Else
Msg
Box "p
ick
anot
her
colo
r"En
d Se
lect
[sta
teme
nts-
n]]
. .
.[C
ase
Else
Expr
essi
onli
st-n
[els
esta
teme
nts-
n]]
End
Sele
ct
Cas
e "b
lue"
doc
u-me
nt.b
gColor
= "
blue
" Cas
e El
se MsgBo
x "p
ick
anot
her
colo
r"En
d Se
lect
Lauf
zeit
feh-
ler
abfa
ngen
CATC
HON E
RROR
ON E
RROR
Ab
brec
hen
von
Schl
ei-
fen
und
Blö
-ck
en
CHEC
KIF B
edin
gung
THEN
EXI
T FOR¦
SUB¦
FUNC
-TION
IF B
edin
gung
THEN
EXI
T FOR¦
SUB¦
FUNC
TION
Schl
eife
mit
nä
chst
em
Dur
chla
uf
fort
setz
en
CONT
INUE
Tabe
lle B
.2 P
rogr
amm
abla
uf (
Fort
s.)
AnhangB.fm Seite 301 Dienstag, 22. April 2003 2:33 14
302 Synopsis der Programmiersprachen ABAP, VB und Java
Schl
eife
nDO
...
EN
DDO
DO 1
0 TI
MES.
[St
atem
ents]
ENDD
O.
For co
unte
r =
star
t To
end
[Ste
p st
ep]
[st
atem
ents
] [Ex
it F
or]
[st
atem
ents
]Next
FOR
ix =
1 T
O 10
[
stat
ements
]NE
XT i
x
For
coun
ter
= star
t To
end
[Ste
p st
ep]
[St
atem
ents
] [Ex
it F
or]
[St
atem
ents
]Next
FOR
ix =
1 T
O 10
[
Stat
ements
]NE
XT i
x
Ab
brec
hen
von
Schl
ei-
fen
und
Blö
-ck
en
EXIT
IF .
..
ELSE
...
EN
DIF
Cond
iti-
onal
pr
oces
-si
ng
IF x
date
> "20
0012
31".
WRI
TE:
/ xDat
e. E
LSEI
F xd
ate
= "2
0001
231"
. W
RITE
: /
"Hap
py M
ille
nium
". E
LSE.
WRI
TE:
/ "Too
lat
e!".
ENDI
F.
If x
date
> "
2000
1231
" Th
en D
ebug
.WRITE
xDa
te E
lsei
f xdat
e =
"200
0123
1" D
ebug
.WRITE
"Ha
ppy
Mill
eniu
m" E
lse
Deb
ug.W
RITE
"To
o la
te!"
End
If
If x
date
> "
2000
1231
" Th
en D
ebug
.WRITE
xDa
te E
lsei
f xdat
e =
"200
0123
1" D
ebug
.WRITE
"Ha
ppy
Mill
eniu
m" E
lse
Deb
ug.W
RITE
"To
o la
te!"
End
If
Prog
ram
m
been
den
LEAV
ELE
AVE
END
Tabe
lle B
.2 P
rogr
amm
abla
uf (
Fort
s.)
AnhangB.fm Seite 302 Dienstag, 22. April 2003 2:33 14
Synopsis der Programmiersprachen ABAP, VB und Java 303
Inte
rne
Tabe
llen
(Col
lect
ion)
ab
arbe
iten
LOOP
...
EN
DLOO
PFor
Each
ele
-ment
In
reco
rdse
t [st
atem
ents
] [Ex
it F
or]
[st
atem
ents
]Next
Dim
xDat
a As
Rec
ords
etDi
m re
c As O
bjec
tFO
R Ea
ch rec
IN
xdat
a [
Stat
ements
]NE
XT r
ec
For
Each
ele
-ment
In
reco
rd-
set
[St
atem
ents
] [Ex
it F
or]
[St
atem
ents
]Next
Dim
xDat
a As
Rec
ords
etDi
m re
c As O
bjec
tFO
R Ea
ch rec
IN
xdat
a [
Stat
ements
]NE
XT r
ec
Def
init
ion
eine
r Su
b-ro
utin
e
FORM
Su
brou
-ti
nen-
name
TAB
LES
...
USI
NG
...
CHA
N-GI
NG …
.[S
tate
-me
nts]
ENDF
ORM.
FORM
ate
st
TAB
LES
itab
USI
NG n
ame
gend
er.
CHA
NGIN
G xre-
sult
.[S
tate
ment
s]EN
DFOR
M.
Sub
subr
outi
-nena
me(p
aram
1, para
m2,.
...)
[st
atem
ents
]End
Sub
Sub
aTes
t(na
me,
gend
er)
[St
atem
ents
]En
d Su
b
Sub
aTes
t(na
me,
gend
er)
[St
atem
ents
]En
d Su
b
Tabe
lle B
.2 P
rogr
amm
abla
uf (
Fort
s.)
AnhangB.fm Seite 303 Dienstag, 22. April 2003 2:33 14
304 Synopsis der Programmiersprachen ABAP, VB und Java
Auf
ruf e
iner
Su
brou
tine
PERF
ORM
Subr
ou-
tine
n-na
me T
ABLE
S ..
. U
SING
..
. C
HAN-
GING
… .
PERF
ORM
atest
TAB
LES
itab
USI
NG "
Micky"
"F
". C
HANG
ING
resu
lt.
Call
Sub
rou-
tine
nnam
eCa
ll a
test("
Mick
y",
"mal
e")
Dim
xDat
a As
Rec
ords
etDi
m re
sult
ates
t(xD
ata,
"M
icky
","M",
res
ult)
Schl
eife
nWH
ILE
...
END-
WHIL
E.
WHIL
E va
l > 0.
….
val
= v
al – 1
.EN
DWHI
LE.
Whil
e Be
din-
gung
[Sta
teme
nts]
Wend
.
DIM
xDat
a AS
Rec
ordS
etxD
ata.
Open "
Sele
ct *
fr
om O
rders
Wher
e Or
de-
rId
= 12
", c
onne
ctio
nWh
ile
Not xD
ata.
EOF
[sta
teme
nts]
xDa
ta.M
oveN
ext
Wend
Whil
e Be
ding
ung
[Sta
teme
nts]
Wend
DIM
xDat
a AS
Rec
ordS
etxD
ata.
Open "
Sele
ct *
fr
om O
rders
Wher
e Or
de-
rId
= 12
", c
onne
ctio
nWh
ile
Not xD
ata.
EOF
[Sta
teme
nts]
xDa
ta.M
oveN
ext
S
Tabe
lle B
.2 P
rogr
amm
abla
uf (
Fort
s.)
AnhangB.fm Seite 304 Dienstag, 22. April 2003 2:33 14
Synopsis der Programmiersprachen ABAP, VB und Java 305
ABA
PB
eisp
iel
Vis
ual B
asic
Bei
spie
lJa
vaB
eisp
iel
Equa
l=,
EQ
NO
T Eq
ual
<>, ><
, NE
Grö
ßer
als
>, GT
Kle
iner
als
<, LT
Grö
ßer a
ls o
der
gl
eich
>=, =>
, GE
Kle
iner
als
od
er g
leic
h<=
, =<
, LE
Con
tain
s on
ly
(Str
ing
enth
ält
nur
die
Zei-
chen
)
CO'Hel
lo W
orld
' CN
'Hel
owrd
'
Con
tain
s no
t on
ly (
Stri
ng
enth
ält
auch
an
dere
als
die
an
gege
bene
n Ze
iche
n)
CN'Hel
lo W
orld
' CN
'Ear
th'
Tabe
lle B
.3 O
pera
tore
n
AnhangB.fm Seite 305 Dienstag, 22. April 2003 2:33 14
306 Synopsis der Programmiersprachen ABAP, VB und Java
Con
tain
s an
y (S
trin
g en
thäl
t ei
nes
der
Zei-
chen
)
CA'Hel
lo W
orld
' CA
'HW'
Con
tain
s no
t an
y (S
trin
g en
t-hä
lt k
eine
s de
r Ze
iche
n)
NA'Hel
lo W
orld
' NA
'AB'
Con
tain
s st
ring
(S
trin
g en
thäl
t di
e Ze
chen
-fo
lge)
CS
'Hel
lo W
orld
' CS
'Wor
ld'
Con
tain
s N
OT
stri
ng (
Stri
ng
enth
ält
nich
t di
e Ze
iche
n-fo
lge)
NS'Hel
lo W
orld
' NS
'Wor
ld'
Con
tain
s pa
t-te
rn (
Stri
ng
enth
ält
die
Folg
e, e
in-
schl
ießl
ich
Wild
card
)
CP'Hel
lo W
orld
' CP
'W*'
Tabe
lle B
.3 O
pera
tore
n (F
orts
.)
AnhangB.fm Seite 306 Dienstag, 22. April 2003 2:33 14
Synopsis der Programmiersprachen ABAP, VB und Java 307
Wer
t is
t zw
i-sc
hen
zwei
W
erte
n
BET-
WEEN..
.AND
IF n
umbe
r BE
TWEE
N 1 AN
D 10
THE
N ..
.
IS I
NIT
IAL
(Wer
t is
t in
itia
l)IS
INI
TIAL
IS
NOTHI
NG (
for
obje
cts)
IS N
ULL
(for
var
iabl
es)
AB
AP:
EInt
rag
an d
ie
inte
rne
Tabe
lle
anfü
gen;
VB
, Ein
trag
in
den
Rec
ord
set
einf
ügen
APPEND
ita
b.re
cord-
set.
Add
DIM
xDat
a AS
Rec
ord-
Set
xDat
a.Ad
d
reco
rdse
t.Ad
dDI
M xD
ata
AS R
ecor
dSet
xDat
a.Ad
d
Sort
iere
n ei
ner
inte
rnen
Ta
belle
SORT ita
b BY
fe
ld1
feld
2 ..
...
reco
rd-
set.
SOR
T
Poin
ter
zuw
ei-
sen
ASSIGN
ASSI
GN m
yvar
TO
<poi
nter
>.SE
TSE
T
Tabe
lle B
.3 O
pera
tore
n (F
orts
.)
AnhangB.fm Seite 307 Dienstag, 22. April 2003 2:33 14
AnhangB.fm Seite 308 Dienstag, 22. April 2003 2:33 14
Index 309
Index
Symbols'XSL,match=/' 223.NET, Microsoft.NET- Framework 1492-Tier, Unterlegenheit zu 3-Tier 313-Tier, Überlegenheit gegenüber 2-Tier
31
AABAP, ABAP IV Runtime Engine 150ABAP Personality 244Acknowledgement 197Active Server Pages, ASP 240Advanced Planner and Optimizer, APO
22All-in-one-Software 23Amazon.com, Pionier der Webservices
180Apache Jakarta Tomcat 153API, Application Programming
Interface 180APO, Advanced Planner and Optimizer
22Application Programming Interface,
API 180ASIN, Amazon Standard Item Number
181ASP
Active Server Pages 240response.write 246Shopping Cart mit ASP, IISCART 247
Auslieferung in SD 100Auslieferungsaufträge, engl. Delivery
orderAufträge die automatisch eine Aus-
lieferung erzeugen 100
BBAPI
BAPI_SALESORDER_CHANGE 101BAPI_SALESORDER_CREATEFROMDAT2 101BAPI_SALESORDER_GETLIST 100BAPI_TRANSACTION_COMMIT 99BAPI_TRANSACTION_ROLLBACK 99
Best-of-Breed 23BIZTALK™ ( Microsoft BIZTALK 129Broadcast and Subscribe, Message
handling 126BSP
Business Server Pages 244Online Text Repository 259
Business Information Warehouse, BW 22
Business Object Builder 97Transaktion SWO1 97
Business Object Repository (BOR) 97Business Server Pages und Web Dynpro
123Business Server Pages, BSP 244Business View 97Business-Objekt 95Business-Objekte 95BW, Business Information Warehouse
22
CCanonical URL, XML-Suche für
Amazon.com 188Canonical URLs 111CASABAC, Entwicklungs und Runtime-
Umgebung für Thin Browser Clients 117
Cascading Style Sheets, CSS 115Cerberus 29CGI, Common Gateway Interface 196CGI, Common Gateway Interface,
description 240Challenge Authenticate 29Chaostheorie 44Class R3Credentials 67CLR, Common Language Runtime 149,
153Collaboration 19Common Gateway Interface ( CGI 240Common Gateway Interface, CGI 196Common Language Runtime, CLR 153
Verwendung im Microsoft.NET- Framework 149
Connection pooling 127
316SIX.fm Seite 309 Dienstag, 22. April 2003 2:33 14
Connection-Pooling 58Content Driven Delivery 126CRM, Customer Relationship Mana-
gement 22Customer Relationship Management,
CRM 22
DDatenkapselung, Datenverkapselung
165Demon, Hintergrundprozess 130Destructor 170Document Object Model, DOM 213Document Type Definition, DTD 211doGet(), JSP-Standardmethode 244DOM
Beispiele 214Document Object Model 213WSDL 232
DOM-Parser 216doPost(), JSP-Standardmethode 244dotNET 149doXxx(), andere JSP-Standardme-
thoden 244DTD 209
Document Type Definition 211
EEAI, Enterprise Application Integration
17Eigenschaft 163EJB, Enterprise Java Beans 123Encapsulation 165Enterprise Application Integration, EAI
17Enterprise Java Beans, EJB 123Enterprise-Server 18Event
Event feuern 138Event verbrennen, ignorieren 138fire an Event 138
Event, der (das) Event, Ereignis 138eXtended Stylesheet Language, XSL
220Extreme Programming, extreme.logos-
world.com 115
FFaktura SD, Anlegen mit BAPI 100Fire and Subscribe, Message handling
126Firewall 27Function RFC_READ_TABLE, call from
VB 56
GGateway 73Geschäftsprozessmodellierung 95Gewicht der Verbindung, weight of
client 31Guaranteed Delivery, Sicherstellung der
Zustellung einer Nachricht 126GUID, Global Universal Identifier 163
Hheavy client 31Holistic Development, holistic.logos-
world.com 115HTML, Generierung aus ASP 246HTTP GET 198
für Amazon.com 188HTTP POST 198
IIBM
CrossWorlds™ 128Lotus Notes™ 128MQ Series™ ( WebSphere/MQ™ 128WebSphere/Integrator™ 128WebSphere/MQ 128
IFR, Canonical URLs 111IISCART, ASP shopping cart 247Instanz 163Interface 162Interface Repository IFR 111IONA, XMLBUS™ 129IP, Listener 193ISDN, Internal Standard Book Number
181
316SIX.fm Seite 310 Dienstag, 22. April 2003 2:33 14
Index 311
JJava
HelloWorld 167package 166Servlets 243Virtual Machine, JVM 150
Java Applets 150Java Connector, JCo 70
einfaches Beispiel 70Java Personality 244Java RFC Library, jRFC 70Java Server Pages, JSP 241Java Software Development Kit, JDK
287Java Virtual Machine, JVM 150Java™ 150JCo ( Java Connector 70JDK, Java Software Development Kit,
ww.sun.com 287jDOM, Java XML-DOM Parser 217JNI
Aufruf der RFC-Bibliothek 250Java Native Interface 250
jRFC, obsolete Java RFC-Bibliothek 70JSP
doGet() 244doPost() 244Java Server Pages 241
JVM, Java Virtual Machine 150
LLebenszeit 163Lieferung SD, ab 4.5 Auslieferung 100Links
ww.sun.com 287www.arasoft.de 70www.iiscart.com, ASP shopping cart 247
Listener, IP-Protokoll 193Load balancing 127, 131load balancing 131Logical Unit of Work, LUW 52Logon zu R/3, mit Visual Basic 66Lotus Notes™ 128LUW, Logical Unit of Work 52
MMercator™ 129Messages
Broadcast and Subscribe 126Directory service 125Fire and Subscribe 126Mail-out 126
Methode 163Microsoft
BIZTALK™ 129Message-Queue 129MSMQ 129
Microsoft Transaction Server, MTS 153Microsoft.NET
CLR, Common Language Runtime 149Virtual Machine 149Zukunftsaussichten 36
Microsoft.NET- Framework 149Middleware 18
IBM CrossWorlds™ 128IBM Lotus Notes™ 128IBM WebSphere™/MQ 128IONA 129Mercator™ 129Microsoft BIZTALK™ 129Microsoft MSMQ 129Tibco™ 130
Model View Controller, MVC (Web Dynpro 123
Modellsichten 95Anwendungsfall 96Business View 96Component View 96Logische Sicht 96Technische Sicht 96Use Case 96
MSMQ (Microsoft Message-Queue 129MSMQ Trigger 131MTS, Microsoft Transaction Server 153
NNachrichtensteuerung, RSNAST00 134Nachrichtensteuerung in SAP R/3 134Namensraum ( XML-Namespace 219Namespace ( XML-Namespace 219Namespace, XSL 222
316SIX.fm Seite 311 Dienstag, 22. April 2003 2:33 14
312 Index
NAST ( Nachrichtensteuerung 134NETBEUI 191NETBIOS 191Netweaver 19Netzwerkprotokolle
IPX 191NETBEUI 191NETBIOS 191TCP/IP 191
New Dimension ProductsAPO 22BW 22CRM 22Netweaver 19
NONE, vordefinerte RFC-Destination 52
OObjekt
Datenkapselung (Encapsulation) 165Instanz 163Interface 162Lebenszeit 163Method 163Overloading 163Polymorphismus (polymorphism) 163Property 163
Objekt, Eigenschaft 163One-face-to-the-application 19Online Text Repository, OTR 259Orchestrierung 131OTR, Online Text Repository 259Overloading 163
PPayload, die transportierte Last 31Polymorphismus 163Potemkinsches Dorf 29Property 163, 171Protocol
heavy weighted protocol 31light weighted protocol 31
Proxy, Proxy-Server 27Proxycfg 266Proxy-Server 18
Qquerystring 250
RR/3-Tabellen auslesen 56RAD, Rapid Application Development
149Rapid Application Development, RAD
149Remote Function Call, RFC 49Remote Method Invokation, RMI 49Remote Program Call, RPC 49Resource Locator ( URL 194RFC, Function
BAPI_TRANSACTION_COMMIT99
BAPI_TRANSACTION_ROLLBACK99
RFC_REMOTE_EXEC 81RFC_REMOTE_FILE 82RFC_REMOTE_PIPE 82
Gateway-Server 73Listener, Registrierung eines Gateway 73LOCAL_EXEC, Aufruf rfcexec.exe 81Remote Function Call 49rfcexec.exe, RFC-Server für Windows 81Server 73via Remote Shell 78via SAPGUI 81via Web server 79
RFC listener, eigene Listener erstellen 74
RFC-Destination, NONE=eigenes System 52
rfcexec.c, source 74RMI, Java Remote Method Invokation
49RPC
Remote Program Call 49support on UNIX 78
RSH, UNIX remote shell service 78RSHELL ( RSH 78
316SIX.fm Seite 312 Dienstag, 22. April 2003 2:33 14
Index 313
SSAP, SAP/XI, SAP Exchange 130SAP Exchange Infrastructure, SAP/XI 20SAP Internet Transaction Server 276SAP R/3 Enterprise 21SAP R/3-Logon mit Java 70SAP/XI, SAP Exchange Infrastructure 20SAP-Gateway 73SAP-Gateway instance number 73SAPGWxx 73saprfc.ini 73SAX-Parser 216SCR, Secure Remote Password 28Scriptlet 245Secure Remote Password ( SCR 28Shoppingcart-Applikation, shop-
pingcart.logosworld.com 97Sicherheit
Cerberus 29Challenge Authenticate 29Potemkinsches Dorf 29Secure Remote Password 28Single Sing On 28SSL-Verbindungen 29
Simple Object Access Protocol, Beispiel für Amazon.com 182
Simple Object Access Protocol, SOAP 228
Single Sing On ( SSO 28Sniplet 245SOAP
Beispiel für Amazon.com 182Simple Object Access Protocol 228
SOP, Standard Operation Procedure 126
srfcserv.c, source 74SRFCTEST, Test RFC outbound calls 77SSL-Verbindungen, https, //-
Verbindung 29SSO, Single Sing On 28Standard Operation Procedure, SOP
126SUN® Microsystems 151
TTCP/IP 191Theorie der komplexen Systeme (
Chaostheorie 44thin client (or slim client) 31Tibco™ 130Tomcat, Programmiersprachen 157Tomcat Webserver, Apache Jakarta
Project 153Transaktion, BAPI
Business Object Repository 97SWO1
Business Object Builder 97Trigger für Applikationen in MSMQ 131
UUDP, User Datagram Protocol 192URI, Uniform Resource Identifier 195URL, Uniform Resource Locator 194URN, Uniform Resource Name 195User Datagram Protocol( UDP 192
VValidierung mit XSD-Schema 209VB Script, Hello World 245Verbindungsgewicht, weight of client
31Virtual Machine
Java JVM 150Microsoft.NET 149
WWeb Application-Server alias SAP R/3
Release 6.x 20Web Dynpro 123
Model View Controller, MVC 123WebAPI, alternative Bezeichnung für
Webservices 180Webservice
API via TCP/IP 180UTC 181
Webservice Choreography Interface, WSCI 276
Webservices Description Language ( WSDL 231
WebSphere, Programmiersprachen 157WebSphere ( IBM WebSphere 128
316SIX.fm Seite 313 Dienstag, 22. April 2003 2:33 14
314 Index
Windows Scripting Host, WSH, WScript.exe 153
Workflow 131WSCI, Webservice Choreography
Interface 276WSDL 231
Beispiel für Amazon.com-Service 185DOM 232für Amazon.com 182Webservices Description Language 231
WYSIWYG, What You See Is What You Get 115
XXML
Apache XERXES Parser für Java 217DOM-Parser 216jDOM, Java-DOM-Parser 217
SAX-Parser 216XMLSPY
Editor von Altova (www.xmls-py.com) 219
XML-Namespace 219xmlns, Namensraum 207
xmlns ( XML-Namespace 207XML-Parser, Microsoft XMLDOM 216XML-Schema 209
Validierung 209XML-Schema-Definition 209XML-Suche für Amazon.com 188XSL, <xsl
value-of select='@Name'/> 225Referenz auf Attribute mit @ 225
XSL eXtended Stylesheet Language 220XSL namespace 222XSLT
XSL Transformations 220
316SIX.fm Seite 314 Dienstag, 22. April 2003 2:33 14