Leseprobe - Store & Retrieve Data Anywhere · Wenn Sie Ihre IDoc-Segmente später in einem...

36
Leseprobe Was ist »Application Link Enabling«, und wie funktioniert es? In dieser Leseprobe zeigen Ihnen Michael Wegelin und Michael Englbrecht, was hinter der Integrationstechnologie steckt und wie die beteiligten Anwendungen ihre Daten mittels IDocs aus- tauschen. Michael Wegelin, Michael Englbrecht SAP-Schnittstellenprogrammierung 548 Seiten, gebunden, 3. Auflage 2014 69,90 €, ISBN 978-3-8362-2675-2 www.sap-press.de/3496 Kapitel 6: »IDocs und Application Link Enabling« Inhalt Index Die Autoren Wissen aus erster Hand.

Transcript of Leseprobe - Store & Retrieve Data Anywhere · Wenn Sie Ihre IDoc-Segmente später in einem...

LeseprobeWas ist »Application Link Enabling«, und wie funktioniert es?In dieser Leseprobe zeigen Ihnen Michael Wegelin und Michael Englbrecht, was hinter der Integrationstechnologie steckt undwie die beteiligten Anwendungen ihre Daten mittels IDocs aus-tauschen.

Michael Wegelin, Michael Englbrecht

SAP-Schnittstellenprogrammierung548 Seiten, gebunden, 3. Auflage 2014 69,90 €, ISBN 978-3-8362-2675-2

www.sap-press.de/3496

Kapitel6:»IDocsundApplicationLinkEnabling«

Inhalt

Index

DieAutoren

Wissen aus erster Hand.

361

In diesem Kapitel stellen wir Ihnen die Werkzeuge vor, die zur Entwicklung von ALE-Szenarien, in denen Anwendungen ihre Daten in Form von IDocs austauschen, notwendig sind. Sie lernen, wie Sie IDocs definieren, die ALE-Schicht kon- figurieren und ALE-Szenarien in ABAP, C/C++, Java und C# implementieren.

6 IDocs und Application Link Enabling

In diesem Kapitel beschreiben wir das Application Link Enabling(ALE). Bei dieser Integrationstechnologie tauschen die beteiligten Anwendungen ihre Daten in Form von Intermediate Documents(IDocs) aus. Die Kommunikation erfolgt asynchron, das heißt, der Sender einer Nachricht wartet nicht auf eine direkte Antwort des Empfängers, sondern fährt nach dem Senden des Dokuments mit sei-ner Arbeit fort.

Wir werden ALE-Szenarien in den Programmiersprachen ABAP (in den Abschnitten 6.1, »IDocs«, und 6.2, »Application Link Enabling«), C/C++ (in Abschnitt 6.3, »IDoc-Programmierung mit dem SAP Net-Weaver RFC SDK«), Java (Abschnitt 6.4, »IDoc-Programmierung mit Java und dem Java Connector«) und C# (Abschnitt 6.5, »IDoc-Pro-grammierung mit dem SAP .NET-Connector«) entwickeln.

6.1 IDocs

In diesem Abschnitt lernen Sie anhand eines Beispiels, wie Sie die notwendigen Definitionen, Reports und Funktionsbausteine für die IDoc-Kommunikation in SAP NetWeaver erstellen können. In dem gewählten Szenario sollen Bestelldaten vom Mandanten 001 in den Mandanten 002 desselben SAP-Systems geschickt werden. In weite-ren Abschnitten werden wir dieses Szenario für externe Systeme erweitern.

362

IDocs und Application Link Enabling6

Vier Realisierungs-schritte

Um das Szenario zu realisieren, sind die folgenden Schritte erforder-lich:

1. Definition des IDoc-Typs Zunächst wird in Abschnitt 6.1.1, »Entwicklung von IDocs«, ein IDoc-Typ definiert. Dieser Typ legt die Struktur des IDocs fest, das versendet wird.

2. Entwicklung eines Reports für den Versand Dieser Report wird in Abschnitt 6.1.2, »Erzeugung von IDocs«, entwickelt und holt die Daten aus den Anwendungstabellen ein, baut das IDoc auf und übergibt es an das ALE-Subsystem zum Ver-sand.

3. Entwicklung eines Funktionsbausteins für den Empfang Der Funktionsbaustein, den wir in Abschnitt 6.1.3, »Eingangsver-arbeitung von IDocs«, entwickeln, nimmt das empfangene IDoc vom ALE-Subsystem entgegen und schreibt die Daten in die An-wendungstabellen.

4. Customizing des ALE-Subsystems Das ALE-Subsystem muss so eingerichtet werden, dass das ausge-hende IDoc über einen transaktionalen RFC an das Empfangssys-tem weitergeleitet und das eingehende IDoc an den richtigen Funktionsbaustein übergeben wird. Dies zeigen wir in Abschnitt 6.2, »Application Link Enabling«.

In den genannten Abschnitten werden diese vier Schritte detailliert beschrieben, bevor in den darauffolgenden Abschnitten die Realisie-rung in C/C++, Java und C# erfolgt.

6.1.1 Entwicklung von IDocs

Segmente IDocs sind Dokumente, die aus einzelnen Zeilen bestehen, die Seg-mente heißen. Der Aufbau eines Segments wird durch seinen Seg-menttyp festgelegt. Segmenttypen werden mit Transaktion WE31definiert. SAP spricht in dieser Transaktion allerdings nicht von Seg-menttypen, sondern von Segmenten.

IDoc-Segmente

Für das angesprochene Szenario müssen Sie zwei Segmente definie-ren: eines für die Kopfdaten und eines für die Positionsdaten einer Bestellung. Um ein Segment zu definieren, das die Kopfdaten für eine

363

IDocs 6.1

Bestellung aufnehmen kann, starten Sie Transaktion WE31 und geben als Namen für den Segmenttyp Z1ORDHD an. Die Namen von SAP-Segmenten beginnen mit dem Kürzel E1, kundendefinierte Seg-mente dagegen beginnen mit Z1.

DatenelementeÜber den Menüpfad Bearbeiten � Anlegen können Sie die einzelnen Feldnamen in der Segmentdefinition definieren. Dazu nehmen Sie in den Spalten Feldname und Datenelement die notwendigen Anga-ben vor (siehe Abbildung 6.1). Das System vergibt automatisch einen Namen für die Segmentdefinition, in diesem Fall Z2ORDHD000. Der Name für die Definition beginnt mit dem Namen für das Segment und endet mit einer dreistelligen Versionsnummer. Speichern Sie diese Segmentdefinition, und ordnen Sie sie dabei einem Entwick-lungspaket zu. Sobald Sie die Definition abgeschlossen haben, kön-nen Sie sie über den Menüpfad Bearbeiten � Freigabe freigeben.

Abbildung 6.1 Version 000 des Segments Z1ORDHD

Um Daten für die Positionsdaten in IDocs versenden zu können, müssen Sie zusätzlich das Segment Z1ORDPS definieren (siehe Abbil-dung 6.2).

364

IDocs und Application Link Enabling6

Abbildung 6.2 Version 000 des Segments Z1ORDPS

IDoc-Typen

Nach der Definition der Segmente können Sie mit Transaktion WE30den IDoc-Typ ZORDER01 definieren. Mit IDocs dieses Typs werden Bestellungen transportiert.

IDoc-Typ definieren

Geben Sie im Feld Objektname den Namen für den IDoc-Typ ein, belassen Sie die Selektion des Optionsfeldes bei Basistyp, und folgen

Versionierung von Segmenten

Noch ein Wort zu den Namenskonventionen, die die Entwicklungsumge-bung hier erzwingt: Die Namen von Segmenttypen beginnen immer mit Z1(für kundendefinierte Segmente) bzw. E1 (für SAP-definierte Segmente). Die Namen von Segmentdefinitionen beginnen immer mit Z2 bzw. E2.

Wenn Sie Ihre IDoc-Segmente später in einem SAP-System mit höherer Versionsnummer weiterentwickeln möchten, können Sie dem Segmenttyp eine weitere Version mit einer erweiterten Segmentdefinition hinzufügen. Diese erweiterte Segmentdefinition enthält zusätzliche Felder. Beste-hende Felder können nicht entfernt oder geändert werden. Segmenttyp und Version der SAP-Basis legen demnach eindeutig die zugehörige Seg-mentdefinition fest.

365

IDocs 6.1

Sie dem Pfad Entwicklungsobjekt � Anlegen ((F5)). Im folgenden Dialog belassen Sie die Selektion des Optionsfeldes bei Neu anlegen

und geben dann eine Beschreibung für den IDoc-Typ an. Danach kön-nen Sie den Basistyp ZORDER01 anlegen. Wählen Sie Bearbeiten � Seg-

ment Anlegen... ((ª)+(F6)). Geben Sie an, dass es sich um ein Muss-Segment handelt, und bestimmen Sie die minimale und die maximale Anzahl für das Vorkommen dieses Segments im IDoc (siehe Abbil-dung 6.3).

Abbildung 6.3 Attribute des Segments Z1ORDHD im IDoc ZORDER01

Hierarchische IDoc-Struktur

Wählen Sie dann mit einem Mausklick das soeben eingefügte Seg-ment aus, und fügen Sie das Segment Z1ORDPS als Kind des Segments Z1ORDHD hinzu. Der IDoc-Typ ZORDER01 sieht dann aus wie in Abbil-dung 6.4.

Abbildung 6.4 IDoc-Typ ZORDER01

Nach der Definition geben Sie den IDoc-Typ im Einstiegsbild von Transaktion WE31 über Bearbeiten � Freigabe setzen frei.

366

IDocs und Application Link Enabling6

Nachrichtentyp

Der nächste Schritt besteht aus der Definition eines Nachrichtentypsmit Transaktion WE81. Nachrichtentypen legen die Bedeutung einer Nachricht fest, deren Inhalt durch ein IDoc transportiert wird. Dabei können verschiedene Nachrichtentypen durchaus mithilfe desselben IDoc-Typs transportiert werden. Zum Beispiel entsprechen Anfragen nach Stammdaten an verschiedene SAP-Anwendungen unterschiedli-chen Nachrichtentypen. Sie werden aber meistens durch den IDoc-Typ ALEREQ01 transportiert. Für die Zwecke der Bestellanwendung legen Sie den Nachrichtentyp ZORDER mit der Kurzbeschreibung Bestellung an.

IDoc-Typ für einen Nachrichtentyp

Als letzter Entwicklungsschritt muss diesem Nachrichtentyp ein IDoc-Typ zugeordnet werden. Dies geschieht mittels Transaktion WE82. Ordnen Sie dort dem Nachrichtentyp ZORDER den Basistyp ZORDER01 für Ihr aktuelles SAP-Basis-Release zu. Auch hier können Sie in einem späteren Release eine Zuordnung für einen neuen IDoc-Typ anlegen, der dieselbe Nachricht transportiert. Dieser IDoc-Typ sollte dann natürlich eine Erweiterung des bisherigen Typs sein.

6.1.2 Erzeugung von IDocs

Report zur Datenselektion

Für das Anlegen von IDocs und deren Übergabe an die ALE-Schicht ist die Anwendung verantwortlich. Im einfachsten Fall stellt sie dazu einen Report zur Verfügung, in dem Sie als Anwender die zu versen-denden Daten selektieren. Listing 6.1 zeigt einen solchen Report für das Anwendungsbeispiel.

REPORT zifp_send_idoc. DATA: wa_hdr TYPE zifporder, " Bestellkopf wa_pos TYPE zifporderpos, " Bestellposition rec_control TYPE edidc, " Control-Record it_control TYPE TABLE OF edidc, " Control-Records it_data TYPE TABLE OF edidd, " IDoc-Zeilen wa_data TYPE edidd, " IDoc-Zeile wa_idoc_hdr TYPE z1ordhd, " IDoc-Daten Kopf wa_idoc_pos TYPE z1ordps, " IDoc-Daten Position segnum TYPE i, " Segmentnummer psgnum TYPE i. " Eltern- Segmentnummer

367

IDocs 6.1

PARAMETERS: pa_ord TYPE zifporderid. START-OF-SELECTION. * Prüfen, ob überhaupt Empfänger existieren CALL FUNCTION 'ALE_MODEL_INFO_GET' EXPORTING message_type = 'ZORDER' EXCEPTIONS no_model_info_found = 1 own_system_not_defined = 2 OTHERS = 3. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. * Kontrollsatz erzeugen rec_control-mestyp = 'ZORDER'. rec_control-idoctp = 'ZORDER01'. * IDoc aufbauen segnum = 1. SELECT SINGLE * FROM zifporder INTO wa_hdr WHERE orderid = pa_ord AND type = 'PO'. MOVE-CORRESPONDING wa_hdr TO wa_idoc_hdr. CLEAR wa_data. wa_data-segnum = segnum. wa_data-psgnum = 0. wa_data-segnam = 'Z1ORDHD'. wa_data-mandt = sy-mandt. wa_data-sdata = wa_idoc_hdr. APPEND wa_data TO it_data. ADD 1 TO segnum. psgnum = wa_data-segnum. SELECT * FROM zifporderpos INTO wa_pos WHERE orderid = wa_hdr-orderid. MOVE-CORRESPONDING wa_pos TO wa_idoc_pos. wa_data-segnum = segnum. wa_data-psgnum = psgnum. wa_data-segnam = 'Z1ORDPS'. wa_data-mandt = sy-mandt. wa_data-sdata = wa_idoc_pos. APPEND wa_data TO it_data. ADD 1 TO segnum. ENDSELECT. * IDoc verschicken

368

IDocs und Application Link Enabling6

CALL FUNCTION 'MASTER_IDOC_DISTRIBUTE' EXPORTING master_idoc_control = rec_control TABLES communication_idoc_control = it_control master_idoc_data = it_data EXCEPTIONS error_in_idoc_control = 1 error_writing_idoc_status = 2 error_in_idoc_data = 3 sending_logical_system_unknown = 4 OTHERS = 5. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. COMMIT WORK. WRITE:/ 'IDoc verschickt.'.

Listing 6.1 Programm ZEAI_SEND_IDOC

Funktionsbaustein ALE_MODEL_

INFO_GET

Der Report überprüft zunächst, ob überhaupt ein Empfangssystem existiert, das sich für die Nachricht ZORDER interessiert. Dazu verwen-det er den Funktionsbaustein ALE_MODEL_INFO_GET und übergibt dem Importparameter message_type den Wert ZORDER.

Im Erfolgsfall füllt der Report zuerst einmal die Felder mestyp und idoctp des Kontrollsatzes rec_control mit den Werten ZORDER bzw. ZORDER01. Anhand dieses Kontrollsatzes ermittelt das ALE-Subsystem die Empfänger aus dem Verteilungsmodell, das im ALE-Customizing angelegt wird. Tabelle 6.1 zeigt einige Felder des Kontrollsatzes. Die Applikation muss dabei nur wenige Felder füllen, der Rest wird vom ALE-Subsystem erledigt.

Feld Inhalt

MANDT Mandant

DOCNUM Nummer des IDocs

DOCREL SAP-Release des IDocs

STATUS Status des IDocs

Tabelle 6.1 Komponenten des IDoc-Kontrollsatzes EDIDC

369

IDocs 6.1

KontrollsegmentDanach baut der Report das IDoc auf. Für jeden selektierten Satz der Tabelle ZIFPORDERHEADER schreibt er eine Zeile in die interne Tabelle it_data. Diese Zeile ist vom Typ EDIDD und enthält Informationen über das Segment sowie die eigentlichen Anwendungsdaten (siehe Tabelle 6.2). Das Feld SEGNAM wird dabei auf Z1ORDHD gesetzt, und in das Feld SDATA werden die Daten des Bestellkopfes kopiert.

DatensegmenteFür jede Bestellung liest der Report alle Positionen dieser Bestellung und schreibt für jede Position eine Zeile in das IDoc. Das Feld SEGNAMwird dabei natürlich auf Z1ORDPS gesetzt, und in das Feld SDATA wer-den die Positionsdaten kopiert. Schließlich übergibt der Report das aufgebaute IDoc an das ALE-Subsystem, indem er den Funktionsbau-stein MASTER_IDOC_DISTRIBUTE aufruft.

DOCTYP IDoc-Typ

DIRECT Richtung der Übertragung (1 = Ausgang, 2 = Eingang)

RCVPOR Empfängerport

RCVPRT Partnerart Empfänger

RCVPRN Partnernummer des Empfängers

SNDPOR Senderport

SNDPRT Partnerart Sender

SNDPRN Partnernummer des Senders

Feld Inhalt

Tabelle 6.1 Komponenten des IDoc-Kontrollsatzes EDIDC (Forts.)

Feld Inhalt

MANDT Mandant

DOCNUM Nummer des IDocs

SEGNUM Segmentnummer innerhalb des Dokuments

SEGNAM Segmentname

PSGNUM Nummer des Elternsegments

HLEVEL Hierarchieebene

SDATA Anwendungsdaten

Tabelle 6.2 Komponenten eines IDoc-Datensatzes EDIDD

370

IDocs und Application Link Enabling6

6.1.3 Eingangsverarbeitung von IDocs

Funktionsbaustein zum Empfang des

IDocs

Auf Empfängerseite nimmt ein Funktionsbaustein das IDoc vom ALE-Subsystem entgegen. Der Name dieses Funktionsbausteins sollteZ_IDOC_INPUT_ZORDER sein. Zum Anlegen kopieren Sie am einfachs-ten den Funktionsbaustein ALE_INPUT_ALEAUD, da er dann sofort die richtige Schnittstelle hat (siehe Listing 6.2).

FUNCTION z_idoc_input_zorder. *"---------------------------------------------------------- *"*"Lokale Schnittstelle: *" IMPORTING *" VALUE(INPUT_METHOD) LIKE BDWFAP_PAR-INPUTMETHD *" VALUE(MASS_PROCESSING) LIKE BDWFAP_PAR-MASS_PROC *" EXPORTING *" VALUE(WORKFLOW_RESULT) LIKE BDWF_PARAM-RESULT *" VALUE(APPLICATION_VARIABLE) LIKE BDWF_PARAM-APPL_VAR *" VALUE(IN_UPDATE_TASK) LIKE BDWFAP_PAR-UPDATETASK *" VALUE(CALL_TRANSACTION_DONE) LIKE BDWFAP_PAR- *" CALLTRANS *" TABLES *" IDOC_CONTRL STRUCTURE EDIDC *" IDOC_DATA STRUCTURE EDIDD *" IDOC_STATUS STRUCTURE BDIDOCSTAT *" RETURN_VARIABLES STRUCTURE BDWFRETVAR *" SERIALIZATION_INFO STRUCTURE BDI_SER *" EXCEPTIONS *" WRONG_FUNCTION_CALLED *"---------------------------------------------------------- INCLUDE mbdconwf. " Konstanten des ALE-Subsystems DATA: wa_data TYPE edidd, " IDoc-Datenzeile wa_control TYPE edidc, " Kontrolldatensatz wa_idoc_hdr TYPE z1ordhd, " Kopfdaten aus IDoc wa_idoc_pos TYPE z1ordps, " Positionsdaten aus IDoc wa_hdr TYPE zifporder, " Kopfdaten für DB wa_hdr_old TYPE zifporder, " Alte Kopfdaten wa_pos TYPE zifporderpos. " Positionsdaten für DB * Kontrolldatensatz lesen READ TABLE idoc_contrl INTO wa_control INDEX 1. LOOP AT idoc_data INTO wa_data WHERE docnum = wa_control-docnum. IF wa_data-segnam ='Z1ORDHD'. * Bestelldatensatz einfügen oder modifizieren wa_idoc_hdr = wa_data-sdata. MOVE-CORRESPONDING wa_idoc_hdr TO wa_hdr. wa_hdr-refid = wa_hdr-orderid.

371

IDocs 6.1

wa_hdr-type = 'SO'. * Neuanlage oder Update? SELECT SINGLE * FROM zifporder INTO wa_hdr_old WHERE refid = wa_hdr-orderid. IF sy-subrc EQ 0. wa_hdr-orderid = wa_hdr_old-orderid. ELSE. CALL FUNCTION 'NUMBER_GET_NEXT' EXPORTING nr_range_nr = '01' object = 'ZIFPORDER' IMPORTING number = wa_hdr-orderid EXCEPTIONS OTHERS = 1. ENDIF. MODIFY zifporder FROM wa_hdr. IF sy-subrc NE 0. EXIT. ENDIF. ELSEIF wa_data-segnam = 'Z1ORDPS'. * Positionsdatensatz einfügen oder aktualisieren wa_idoc_pos = wa_data-sdata. MOVE-CORRESPONDING wa_idoc_pos TO wa_pos. wa_idoc_pos = wa_data-sdata. MODIFY zifporderpos FROM wa_pos. IF sy-subrc NE 0. EXIT. ENDIF. ENDIF. ENDLOOP. * Rückmeldung schreiben IF sy-subrc NE 0. idoc_status-status = c_idoc_status_error. idoc_status-msgty = sy-msgty. idoc_status-msgid = sy-msgid. idoc_status-msgno = sy-msgno. idoc_status-msgv1 = sy-msgv1. idoc_status-msgv2 = sy-msgv2. idoc_status-msgv3 = sy-msgv3. idoc_status-msgv4 = sy-msgv4. workflow_result = c_wf_result_error. return_variables-wf_param = c_wf_par_error_idocs. ELSE. idoc_status-status = c_idoc_status_ok. idoc_status-msgty = 'S'. idoc_status-msgid = 'ZIFP'.

372

IDocs und Application Link Enabling6

idoc_status-msgno = 150. workflow_result = c_wf_result_ok. return_variables-wf_param = c_wf_par_processed_idocs. ENDIF. idoc_status-docnum = wa_control-docnum. idoc_status-repid = sy-repid. APPEND idoc_status. return_variables-doc_number = wa_control-docnum. APPEND return_variables. ENDFUNCTION.

Listing 6.2 Funktionsbaustein Z_IDOC_INPUT_ZORDER

Parameter der Schnittstelle

Die Schnittstelle des Funktionsbausteins hat elf Parameter. Diese Parameter haben folgende Bedeutung:

� IDOC_CONTRL

Diese Tabelle enthält einen Kontrolldatensatz für jedes übergebene IDoc. Von ihr benötigt der Funktionsbaustein die Spalten Docnumund Idoctp, die die Nummern und IDoc-Typen der übergebenen IDocs enthalten.

� IDOC_DATA

Diese Tabelle enthält die Segmente der IDocs, die an den Funkti-onsbaustein übergeben wurden. Aus dieser Tabelle sind die Spal-ten Docnum, Segnam und Sdata relevant, die die IDoc-Nummer, den Segmentnamen und die Anwendungsdaten enthalten.

� INPUT_METHOD

Soll der Funktionsbaustein im Hintergrund ablaufen, ist dieser Parameter initial. Falls der Funktionsbaustein als dialogfähig mar-kiert wurde, das heißt, wenn er Eingabebildschirme anzeigt, kann er die Werte 'A' oder 'E' annehmen. Im ersten Fall soll er alle Ein-gabebildschirme anzeigen, im zweiten nur dann, wenn ein Fehler auftritt.

� MASS_PROCESSING

Dieser Parameter wird nicht mehr verwendet. Er wurde aus Grün-den der Rückwärtskompatibilität mit alten Clients nicht entfernt.

� IN_UPDATE_TASK

Der Funktionsbaustein bewertet diesen Exportparameter mit 'X', wenn er die Verbuchung über Verbuchungsbausteine mit dem Zusatz IN UPDATE TASK vornimmt.

373

IDocs 6.1

� CALL_TRANSACTION_DONE

Der Funktionsbaustein füllt diesen Exportparameter mit 'X', wenn er CALL TRANSACTION verwendet, um den IDoc-Status zu schreiben.

� WORKFLOW_RESULT

Über diesen Exportparameter steuert der Funktionsbaustein, ob Ereignisse ausgelöst werden sollen.

� APPLICATION_VARIABLE

Dies ist ein optionaler Parameter, der dem Workflow übergeben werden kann.

� IDOC_STATUS Diese Tabelle enthält für jedes IDoc, das der Funktionsbaustein verarbeitet hat, einen Eintrag. Das Feld Status kann dabei die Werte 53 im Erfolgs- und 51 im Fehlerfall annehmen.

� RETURN_VARIABLES

Diese Tabelle enthält die IDoc-Nummern und die zugehörigen Nummern der verarbeiteten Anwendungsobjekte. Diese Informa-tionen werden dazu verwendet, das IDoc mit dem entsprechenden Anwendungsobjekt zu verknüpfen.

� SERIALIZATION_INFO

Dieser Parameter wird nicht mehr verwendet.

Der Funktionsbaustein Z_IDOC_INPUT_ZORDER geht davon aus, dass ihm nur ein IDoc übergeben wird. Dessen Nummer ermittelt er über READ TABLE aus der Tabelle IDOC_CONTRL. Danach macht er eine Schleife über alle Segmente des IDocs in der Tabelle IDOC_DATA. Je nachdem, ob es sich um ein Segment Z1ORDHD oder Z1ORDPS handelt, nimmt er Änderungen an den Daten der Datenbanktabelle ZIFPORDERoder ZIFPORDERPOS vor. Bei einem Fehler bricht der Funktionsbau-stein die Verarbeitung des IDocs ab. Sowohl im Fehler- als auch im Erfolgsfall füllt er zum Schluss die Parameter IDOC_STATUS, RETURN_VARIABLES und WORKFLOW_RESULT.

RegistrierungNach der Entwicklung müssen Sie den Funktionsbaustein mit Trans-aktion BD51 als Eingangsbaustein für die ALE-Verarbeitung registrie-ren. Da er nur ein IDoc verarbeiten kann, setzen Sie dabei den Input-Typ auf 1. Mit Transaktion WE57 legen Sie dann noch fest, dass der Funktionsbaustein dem Nachrichtentyp ZORDER und dem IDoc-Basis-

typ ZORDER01 für die Eingangsverarbeitung zugeordnet ist (siehe Abbildung 6.5).

374

IDocs und Application Link Enabling6

Abbildung 6.5 Transaktion WE57

Vorgangscodes Damit der Funktionsbaustein tatsächlich für die Eingangsverarbei-tung verwendet wird, müssen Sie im empfangenden System noch einen Vorgangscode ZORDER für den Eingang mittels Transaktion WE42 hinzufügen. Wie in Abbildung 6.6 zu sehen ist, wird in diesem Vorgangscode hinterlegt, wie das eingehende IDoc zu verarbeiten ist. Der Vorgangscode wird später im ALE-Customizing bei der Festle-gung der Eingangsparameter für den Nachrichtentyp ZORDER verwen-det (siehe Abschnitt 6.2.1, »Konfiguration von ALE«).

Abbildung 6.6 Transaktion WE42 zur Pflege von Vorgangscodes

375

Application Link Enabling 6.2

6.2 Application Link Enabling

Application Link Enabling (ALE) ist ein Basisdienst innerhalb des SAP NetWeaver Application Servers ABAP, mit dem Anwendungen IDocs versenden und empfangen können. In diesem Abschnitt erläutern wir Ihnen die Konfiguration dieses Subsystems. Wir werden ALE so konfigurieren, dass wir ein IDoc vom Typ ZORDER01 vom Mandanten 001 zum Mandanten 002 senden können.

6.2.1 Konfiguration von ALE

Transaktion SALEDamit IDocs versendet und empfangen werden können, muss das ALE-Subsystem entsprechend eingerichtet werden. Dazu können Sie Transaktion SALE verwenden, die die notwendigen Schritte in der richtigen Reihenfolge auflistet, dokumentiert und Verknüpfungen zu den benötigten Transaktionen bereitstellt. Abbildung 6.7 zeigt einen Ausschnitt aus der von Transaktion SALE angezeigten Liste.

Abbildung 6.7 Transaktion SALE

376

IDocs und Application Link Enabling6

Schritte der Konfiguration

Folgende Schritte sind erforderlich:

� Logische Systeme benennen Jedes an ALE teilnehmende System wird durch einen logischen Namen identifiziert. Diese Namen werden in die Datenbanktabelle TBDLS eingetragen.

� Mandanten die logischen Systeme zuordnen Jedem Mandanten in einem SAP-System wird ein logisches System zugeordnet. Dies geschieht bei der Pflege der Stammdaten des Mandanten.

� Zielsysteme für RFC-Aufrufe definieren Im sendenden System müssen Sie mit Transaktion SM59 tRFC-Destinationen für die Zielsysteme anlegen. Hat die tRFC-Destina-tion den gleichen Namen wie das Zielsystem, können im letzten Schritt einige Definitionen automatisch generiert werden.

� Verteilungsmodell pflegen Hier wird festgelegt, welche Nachrichten vom sendenden System an welche Empfangssysteme verschickt werden. Dieser Schritt wird im sendenden System durchgeführt.

� Partnervereinbarungen pflegen Schließlich wird festgelegt, wie ausgehende IDocs an die Emp-fangssysteme geschickt und eingehende IDocs im Empfangssystem verarbeitet werden.

Logische Systeme benennen

Um die Namen der logischen Systeme in die Datenbanktabelle TBDLSeinzutragen, klicken Sie in Transaktion SALE auf den Knoten Logi-

sches System benennen. Dies führt Sie in die Tabellenpflege der Tabelle TBDLS. Für jeden der am Szenario beteiligten Mandanten tra-gen Sie ein logisches System mit einer Bezeichnung ein. Typischer-weise wird das logische System des Mandanten <xxx> mit der Sys-tem-ID <SID> im SAP-System <SID>CLNT<xxx> benannt. Für das vorliegende Szenario benötigen Sie die beiden logischen Systeme AOUCLNT001 und AOUCLNT002.

Logisches System eines Mandanten

Um das logische System einem Mandanten zuzuordnen, klicken Sie in Transaktion SALE auf den Knoten Logisches System einem Man-

danten zuordnen. Wählen Sie den Mandanten aus, und navigieren Sie in die Detailansicht, um zur Stammdatenpflege zu gelangen. Dort tragen Sie das logische System für den ausgewählten Mandanten ein, wie es Abbildung 6.8 zeigt. Diese Zuordnung eines logischen Systems

377

Application Link Enabling 6.2

zum Mandanten müssen Sie sowohl für den sendenden als auch für den empfangenden Mandanten vornehmen.

Abbildung 6.8 Logisches System eines SAP-Mandanten

RFC-Destination für den Empfänger

Im dritten Schritt pflegen Sie eine tRFC-Destination für das Emp-fangssystem. Dazu führen Sie in Transaktion SALE den Knoten RFC-

Verbindungen anlegen aus. Dies führt Sie in Transaktion SM59, mit der Sie eine neue RFC-Destination für das Zielsystem anlegen kön-nen (siehe Abbildung 6.9). Die RFC-Destination sollten Sie genauso benennen wie das logische System des Empfängers, damit im nächs-ten Schritt die Partnervereinbarungen automatisch generiert werden können.

Abbildung 6.9 RFC-Destination für ein logisches System

378

IDocs und Application Link Enabling6

Stellen Sie sicher, dass Sie auf der Registerkarte Anmeldung &

Sicherheit ein Konto angeben, mit dem eine Anmeldung am Zielsys-tem möglich ist. Außerdem sollten Sie die tRFC-Optionen unter dem Menüpunkt Bearbeiten � tRFC-Optionen pflegen. Wenn es bei der Übertragung des IDocs zum Empfangssystem einen Kommunikati-onsfehler gibt, plant ALE automatisch einen Hintergrundjob ein, der den Versand des IDocs erneut vornimmt. Bei den tRFC-Optionen können Sie angeben, wie viele Verbindungsversuche das System maximal vornehmen und wie lange zwischen zwei Verbindungsver-suchen gewartet werden soll. Sie können die Einplanung dieses Hin-tergrundjobs aber auch ganz unterdrücken.

Verteilungsmodell pflegen

Um das Verteilungsmodell zu pflegen, müssen Sie am Mandanten für das sendende logische System angemeldet sein. Wählen Sie in Trans-aktion SALE den Knoten Verteilungsmodell pflegen und Sichten

verteilen. Legen Sie eine neue Modellsicht mit dem Kurztext »Bestel-lungen« und dem technischen Namen ZORDER an. Fügen Sie in diese Modellsicht einen Nachrichtentyp ein. Legen Sie dabei fest, dass der Sender AOUCLNT001 an den Empfänger AOUCLNT002 den Nachrichten-typ ZORDER schickt. Abbildung 6.10 zeigt das fertige Verteilungsmo-dell.

Abbildung 6.10 Verteilungsmodell

Partnerverein-barungen

generieren

Vom Verteilungsmodell aus können Sie anschließend über den Menüpfad Umfeld � Partnervereinbarung generieren die Partner-vereinbarungen erzeugen. Dabei legt das System Partnervereinbarun-gen für das sendende und empfangende System, einen Port mit der

379

Application Link Enabling 6.2

vorher angelegten tRFC-Destination sowie Ausgangsparameter zum Nachrichtentyp ZORDER an.

Partnerverein-barungen prüfen

Sie können den Anlegevorgang kontrollieren, indem Sie im Vertei-lungsmodell den Menüpunkt Umfeld � Partnervereinbarung

ändern wählen. Dies führt Sie zur Transaktion WE20 (siehe Abbil-dung 6.11). Dort sehen Sie, dass unter der Partnerart Logisches Sys-

tem (LS) sowohl das Sende- als auch das Empfangssystem eingetragen worden sind. Für das Empfangssystem wurden außerdem Ausgangs-parameter für den Nachrichtentyp ZORDER angelegt.

Abbildung 6.11 Partnervereinbarungen

Ausgangs-parameter pflegen

Abbildung 6.12 zeigt die Ausgangsparameter für den Nachrichtentyp ZORDER. Dort ist als Empfängerport der generierte Port eingetragen, der seinerseits auf die zuvor angelegte tRFC-Destination verweist. Als Ausgabemodus wurde auf der Registerkarte Ausgangsoptionen das Kennzeichen für IDoc sofort übergeben gesetzt. Alternativ könnten die IDocs vor dem Übergeben zunächst gesammelt und dann als Paket übergeben werden. Im Eingabefeld Paketgröße kann die Anzahl der zu sammelnden IDocs festgelegt werden. Schließlich ist im Feld Basistyp auch noch der IDoc-Typ angegeben.

380

IDocs und Application Link Enabling6

Abbildung 6.12 Ausgangsparameter

Eingangs- parameter

pflegen

Um die Eingangsparameter zu pflegen, müssen Sie sich am empfan-genden System anmelden. Zuerst müssen Sie mit Transaktion WE42den Vorgangscode ZORDER für den Eingang hinzufügen. Wie bereits beschrieben, wird im Vorgangscode hinterlegt, wie das eingehende IDoc zu verarbeiten ist (siehe Abbildung 6.6). Danach rufen Sie Trans-aktion WE20 zur manuellen Pflege der Eingangsparameter auf. Legen Sie zunächst unter dem Knoten Partnerart LS einen Eintrag für das logische System des Senders an.

Fügen Sie dann bei den Eingangsparametern einen Eintrag für den Nachrichtentyp ZORDER hinzu. Durch einen Doppelklick auf diesen Eintrag gelangen Sie zur Pflege der Eingangsparameter. Tragen Sie als Vorgangscode ZORDER ein, das heißt den Vorgangscode, den Sie zuvor mit der Transaktion angelegt haben. Abbildung 6.13 zeigt die konfi-gurierten Eingangsparameter. Durch einen Doppelklick auf den Vor-gangscode sehen Sie, dass er mit dem Funktionsbaustein Z_IDOC_INPUT_ZORDER verknüpft ist, der zur individuellen Verarbeitung von eingehenden IDocs dient.

381

Application Link Enabling 6.2

Abbildung 6.13 Eingangsparameter

6.2.2 Test und Monitoring

Szenario testenNachdem dieses Szenario fertiggestellt ist, können Sie es testen. Mel-den Sie sich dazu an dem Mandanten an, der dem sendenden System zugeordnet ist. Führen Sie dann den Report ZIFP_SEND_IDOC aus, um Bestellungen an das empfangende System zu verschicken. Sollte der Report einen Fehler melden, können Sie sich mit dem Statusmonitorfür ALE-Nachrichten (Transaktion BD87) eine Liste der IDocs anzei-gen lassen (siehe Abbildung 6.14). Diese Liste ist nach dem Status der IDocs sortiert. Durch einen Doppelklick auf einen Eintrag zeigt die Transaktion die Liste der zugehörigen IDocs an. Durch einen Dop-pelklick auf ein IDoc können Sie sich die Details des IDocs anzeigen lassen (siehe Abbildung 6.15).

Abbildung 6.14 Statusmonitor für ALE-Nachrichten (Transaktion BD87)

382

IDocs und Application Link Enabling6

Abbildung 6.15 IDoc im Statusmonitor für ALE-Nachrichten

Nachverarbeitung bei Fehlern

Mit Transaktion BD87 können Sie IDocs auch erneut verarbeiten, nachdem Fehler beseitigt wurden. Wenn Sie sich am Mandanten des empfangenden Systems anmelden, sollten Sie dort bei einer fehler-freien Verarbeitung die übertragenen Daten vorfinden. Auch hier können Sie sich wieder mit Transaktion BD87 eine Liste der empfan-genen IDocs anzeigen lassen, Fehler finden und IDocs nach der Feh-lerbeseitigung nochmals verarbeiten.

6.2.3 ALE-Schnittstelle für BAPIs

Damit beim Aufruf von BAPIs in einem anderen System auch die ALE-Infrastruktur genutzt werden kann, bietet Transaktion BDBG die Möglichkeit, eine ALE-Schnittstelle für ein BAPI zu generieren und zu pflegen. Im Eingangsbild von Transaktion BDBG geben Sie den Objekttyp und die Methode an, für die Sie eine ALE-Schnittstelle erzeugen lassen möchten.

Schnittstellen-objekte generieren

Die Transaktion erzeugt dann folgende Objekte, die auch in Abbil-dung 6.16 dargestellt sind:

� Nachrichtentyp Diesen Nachrichtentyp können Sie in ALE-Szenarien verwenden, um den Aufruf des entsprechenden BAPIs im Zielsystem zu veran-lassen.

383

Application Link Enabling 6.2

� IDoc-Typ IDocs dieses Typs können die Export- und Tabellenparameter des BAPIs aufnehmen und diese zum Zielsystem transportieren. Für den IDoc-Typ werden die zugehörigen Segmenttypen automatisch generiert. Nach der Erzeugung müssen Sie sie lediglich freigeben. Der IDoc-Typ wird auch mit dem generierten Nachrichtentyp ver-knüpft.

� Funktionsbaustein für den ALE-Ausgang Dieser Funktionsbaustein wird von der sendenden Anwendung aufgerufen. Seine Schnittstelle entspricht der des BAPIs, das heißt, die sendende Anwendung ruft diesen Funktionsbaustein fast genauso auf wie das BAPI. Es werden lediglich noch ALE-spezifi-sche Parameter zum Objekttyp und zu den Empfängern mitgege-ben. Nach einem erfolgreichen Aufruf gibt der Funktionsbaustein eine Tabelle der Nummern der erzeugten IDocs zurück.

� Funktionsbaustein für den ALE-Eingang Dieser Funktionsbaustein dient im empfangenden System zur Ver-arbeitung des eingehenden IDocs. Er extrahiert die Daten aus dem IDoc und ruft das BAPI mit diesen Daten im empfangenden System auf.

Abbildung 6.16 Erzeugung einer ALE-Schnittstelle für das BAPI CreateFromData

Mit dieser ALE-Schnittstelle für BAPIs können Sie die Funktionen nutzen, die ALE für verteilte Prozesse bietet. Allerdings erhalten Sie

384

IDocs und Application Link Enabling6

nicht die Rückgabeparameter des so gerufenen BAPIs, da die Kommu-nikation asynchron verläuft.

Verteilungsmodell mit BAPI

Um die generierte ALE-Schnittstelle zu verwenden, müssen Sie wie zuvor ein ALE-Verteilungsmodell pflegen. In dieses ALE-Verteilungs-modell fügen Sie nun aber keinen Nachrichtentyp, sondern ein BAPI ein (siehe Abbildung 6.17). Nachdem Sie das Verteilungsmodell gesi-chert haben, können Sie wie üblich die Partnervereinbarungen gene-rieren lassen. Für das Zielsystem wird ein neuer Ausgangsparameter zum generierten Nachrichtentyp erzeugt.

Abbildung 6.17 ALE-Verteilungsmodell für ein BAPI

Eingangsparameter Im empfangenden System müssen Sie erneut Eingangsparameter für das sendende System zum generierten Nachrichtentyp hinzufügen.In den Eingangsoptionen verknüpfen Sie den Nachrichtentyp mit dem Vorgangscode BAPI, wie es in Abbildung 6.18 dargestellt ist. Dieser Vorgangscode verweist auf den Funktionsbaustein BAPI_IDOC_INPUT1.

Empfänger-ermittlung

Das IDoc wird beim Eingang vom ALE-Subsystem an diesen Funkti-onsbaustein übergeben. Er schlägt in der Tabelle TBDE den Namen des generierten Funktionsbausteins nach. Als Selektionskriterium dient der Nachrichtentyp. Bei der Generierung der ALE-Schnittstelle hat Transaktion BDBG eine entsprechende Zeile in die Tabelle TBDE ein-getragen. An den so ermittelten Funktionsbaustein wird nun das IDoc übergeben, und er ruft, wie schon beschrieben, das BAPI mit den übergebenen Daten auf.

Zielsysteme ermitteln

Listing 6.3 zeigt einen Report, der den generierten Funktionsbaustein verwendet, um Bestellungen in den Zielsystemen zu erzeugen. Um die Zielsysteme zu ermitteln, ruft der Report zunächst den Funktions-baustein ALE_BAPI_GET_MODEL_DATA auf.

385

Application Link Enabling 6.2

Abbildung 6.18 Eingangsparameter für ein BAPI

In dem zurückgegebenen Tabellenparameter bapi_model_data sind in der Spalte rcvsystem die Empfangssysteme aufgelistet, die sich auf-grund der Verteilungsmodelle für diese Daten aus dem sendenden System interessieren. Mit diesen Informationen baut der Report die interne Tabelle it_receivers auf, die er im anschließenden Aufruf des generierten Ausgangsbausteins übergibt.

REPORT zifp_send_bapi_idoc. DATA: it_model_data TYPE STANDARD TABLE OF bdi_bmodel, wa_model_data TYPE bdi_bmodel, it_log_system TYPE STANDARD TABLE OF bdi_logsys, it_receivers TYPE STANDARD TABLE OF bdi_logsys, wa_receivers TYPE bdi_logsys, orderheader TYPE zifporder, it_orderpos TYPE STANDARD TABLE OF zifporderpos, msg_text(80) TYPE c. PARAMETERS: pa_id TYPE zifporder-orderid. AT SELECTION-SCREEN. SELECT SINGLE * FROM zifporder INTO orderheader WHERE

386

IDocs und Application Link Enabling6

orderid = pa_id AND type = 'PO'. IF sy-subrc <> 0. MESSAGE e001(zifp). ELSE. orderheader-refid = pa_id. orderheader-type = 'SO'. ENDIF. START-OF-SELECTION. SELECT * FROM zifporderpos INTO TABLE it_orderpos WHERE orderid = pa_id. CALL FUNCTION 'ALE_BAPI_GET_MODEL_DATA' EXPORTING object = 'Z_BUS4500' method = 'CREATEFROMDATA' TABLES log_system = it_log_system bapi_model_data = it_model_data EXCEPTIONS own_logical_system_not_defined = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. LOOP AT it_model_data INTO wa_model_data. APPEND wa_model_data-rcvsystem TO it_receivers. ENDLOOP. CALL FUNCTION 'ZZ_ALE_ORDER_CREATEFROMDATA' EXPORTING imorderheader = orderheader TABLES taorderpos = it_orderpos receivers = it_receivers EXCEPTIONS error_creating_idocs = 1 OTHERS = 2. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. COMMIT WORK.

Listing 6.3 Report zum Testen der ALE-Schnittstelle für ein BAPI

387

IDoc-Programmierung mit dem SAP NetWeaver RFC SDK 6.3

6.3 IDoc-Programmierung mit dem SAP NetWeaver RFC SDK

IDoc-Sender und -Empfänger

Um mit C/C++-Programmen ALE-Szenarien realisieren zu können, müssen Sie einen tRFC-Server und einen tRFC-Client schreiben. Der tRFC-Server hat die Aufgabe, den Funktionsbaustein IDOC_INBOUND_ASYNCHRONOUS zur Verfügung zu stellen. Dieser Funktionsbaustein empfängt ein IDoc als interne Tabelle. Dieses IDoc kann von der im-plementierenden C-Funktion bzw. C++-Methode in eine Datei oder in eine Datenbank geschrieben werden. Der tRFC-Client muss aus einer Datei oder aus den Daten einer Datenbank ein IDoc als interne Tabelle erzeugen und per tRFC an den Funktionsbaustein IDOC_INBOUND_ASYNCHRONOUS schicken.

In diesem Abschnitt zeigen wir Ihnen die IDoc-Programmierung mit dem SAP NetWeaver RFC SDK. Die Arbeit mit diesem SDK haben Sie bereits in den Abschnitten 3.2, »Einfache SAP-NetWeaver-RFC-Clients«, bis 3.4, »SAP-NetWeaver-RFC-Server«, kennengelernt.

6.3.1 IDoc-Empfänger

tRFC-ServerDer IDoc-Empfänger ist ein tRFC-Server, der den Funktionsbaustein IDOC_INBOUND_ASYNCHRONOUS als C-Funktion bzw. als C++-Methode implementiert. Listing 6.4 zeigt diese Funktion. Sie schreibt die emp-fangenen IDoc-Zeilen aus dem Tabellenparameter IDOC_DATA_REC_40in eine Datei.

/* IDOC_INBOUND_ASYNCHRONOUS */ RFC_RC SAP_API idoc_inbound_asynchronous( RFC_CONNECTION_HANDLE rfcConn, RFC_FUNCTION_HANDLE rfcFunc, RFC_ERROR_INFO* errInf) { RFC_RC rc = RFC_OK; RFC_TABLE_HANDLE rfcTabData; RFC_STRUCTURE_HANDLE rfcStruct; SAP_UC tbuf[MAXBUFF+1]; FILE *fp; unsigned int count; unsigned int i; RfcGetTable(rfcFunc, cU("IDOC_DATA_REC_40"), &rfcTabData, errInf);

388

IDocs und Application Link Enabling6

fp = fopenU (data_file, cU("a")); rc = RfcGetRowCount(rfcTabData, &count, errInf); rc = RfcMoveToFirstRow(rfcTabData, errInf); for(i=0; i < count; i++) { memsetU(tbuf, cU(' '), 1064); rfcStruct = RfcGetCurrentRow(rfcTabData, errInf); RfcGetChars(rfcStruct,cU("SEGNAM"), tbuf, 30, errInf); RfcGetChars(rfcStruct,cU("MANDT"), tbuf+30, 3, errInf); RfcGetChars(rfcStruct, cU("DOCNUM"), tbuf+33, 16, errInf); RfcGetChars(rfcStruct, cU("SEGNUM"), tbuf+49, 6, errInf); RfcGetChars(rfcStruct, cU("PSGNUM"), tbuf+55, 6, errInf); RfcGetChars(rfcStruct, cU("HLEVEL"), tbuf+61, 2, errInf); RfcGetChars(rfcStruct, cU("SDATA"), tbuf+63, 1000, errInf); tbuf[1063] = cU('\n'); if (fwriteU (tbuf, 1, 1064, fp) < 1064) rc = RFC_ABAP_EXCEPTION; if(i < count – 1) rc = RfcMoveToNextRow(rfcTabData, errInf); } fclose(fp); return rc; } /* idoc_inbound_asynchronous */

Listing 6.4 Funktion idoc_inbound_asynchronous

ALE-Customizing Um den Empfänger zu testen, müssen Sie mithilfe von Transaktion SALE das entsprechende Customizing im ALE-Subsystem vorneh-men. Zunächst definieren Sie ein logisches System für das externe C/C++-Programm, zum Beispiel CTSERV. Dann pflegen Sie eine tRFC-Destination für dieses System. Damit Sie es nachher bei der Generie-rung der Partnervereinbarungen einfacher haben, sollten Sie die Des-tination genauso nennen wie das logische System.

Schließlich erstellen oder erweitern Sie in Transaktion BD64 ein ALE-Verteilungsmodell so, dass ZORDER-Nachrichten von einem SAP-Man-danten an Ihr externes C/C++-Programm geschickt werden (siehe

389

IDoc-Programmierung mit dem SAP NetWeaver RFC SDK 6.3

Abbildung 6.19). Aus dieser Transaktion heraus können Sie auch die Partnervereinbarungen generieren.

Abbildung 6.19 Erweiterung des ALE-Verteilungsmodells

Mit dem ABAP-Programm ZIFP_SEND_IDOC können Sie nun Ihren IDoc-Empfänger testen. Wenn alles richtig funktioniert, schreibt der Empfänger das von dieser Transaktion gesendete IDoc in eine Datei mit dem Namen <TID>.dat.

6.3.2 IDoc-Sender

Der IDoc-Sender sieht genauso aus wie der tRFC-Client, den Sie in Abschnitt 3.3.2, »Transaktionaler RFC-Client«, kennengelernt haben.

IDoc lesenDie Funktion read_idoc in Listing 6.5 liest das IDoc aus einer Datei, deren Name dem Sender als Kommandozeilenargument übergeben wird. Die Funktion liest die Zeilen der Datei und hängt sie an die interne Tabelle IDOC_DATA_REC_40 an. Danach baut sie den Kontroll-datensatz auf und hängt ihn an die interne Tabelle IDOC_CONTROL_REC_40 an.

/* IDoc in Tabelle IDOC_DATA_REC_40 schreiben */ RFC_RC read_idoc(FILE *fp, RFC_FUNCTION_HANDLE rfcFunc) { RFC_RC rc = RFC_OK; RFC_TABLE_HANDLE rfcTabData; RFC_STRUCTURE_HANDLE rfcStruct; SAP_UC tbuf[IDOCBUFF+1]; SAP_UC docnum[16]; RFC_ERROR_INFO errInf;

390

IDocs und Application Link Enabling6

/* IDoc in Tabelle IDOC_DATA_REC_40 schreiben */ rc = RfcGetTable(rfcFunc, cU("IDOC_DATA_REC_40"), &rfcTabData, &errInf); while (fgetsU (tbuf, 1065, fp) != NULL) { rfcStruct = RfcAppendNewRow(rfcTabData, &errInf); RfcSetChars(rfcStruct, cU("SEGNAM"), tbuf, 30, &errInf); RfcSetChars(rfcStruct, cU("MANDT"), tbuf+30, 3, &errInf); RfcSetChars(rfcStruct, cU("DOCNUM"), tbuf+33, 16, &errInf); memcpyU(docnum, tbuf+33, 16); RfcSetChars(rfcStruct, cU("DOCNUM"), tbuf+33, 16, &errInf); RfcSetChars(rfcStruct, cU("SEGNUM"), tbuf+49, 6, &errInf); RfcSetChars(rfcStruct, cU("PSGNUM"), tbuf+55, 6, &errInf); RfcSetChars(rfcStruct, cU("HLEVEL"), tbuf+61, 2, &errInf); RfcSetChars(rfcStruct, cU("SDATA"), tbuf+63, 1000, &errInf); } /* IDOC_CONTROL_REC_40 schreiben */ RfcGetTable(rfcFunc, cU("IDOC_CONTROL_REC_40"), &rfcTabData, &errInf); rfcStruct = RfcAppendNewRow(rfcTabData, &errInf); RfcSetChars(rfcStruct, cU("DOCNUM"), docnum, 16, &errInf); RfcSetChars(rfcStruct, cU("DOCREL"), cU("701"), 3, &errInf); RfcSetChars(rfcStruct, cU("IDOCTYP"), cU("ZORDER01"), 8, &errInf); RfcSetChars(rfcStruct, cU("MESTYP"), cU("ZORDER"), 6, &errInf); RfcSetChars(rfcStruct, cU("SNDPRT"), cU("LS"), 2, &errInf); RfcSetChars(rfcStruct, cU("SNDPRN"), cU("CTSERV"), 2, &errInf); return rc; }

Listing 6.5 Funktion read_idoc

391

IDoc-Programmierung mit Java und dem Java Connector 6.4

Damit das IDoc, das von Ihrem IDoc-Sender verschickt wird, im SAP-System auch richtig verarbeitet wird, müssen Sie mit Transaktion WE20 eine Partnervereinbarung für Ihr sendendes System pflegen (siehe Abbildung 6.13).

6.4 IDoc-Programmierung mit Java und dem Java Connector

In diesem Abschnitt wenden wir uns der Programmierung mit der Java-IDoc-Bibliothek zu. Nachdem wir Ihnen die IDoc-Client-Pro-grammierung vorgestellt haben, beleuchten wir nun die Implemen-tierungsschritte, die nötig sind, um IDocs an ein empfangendes Java-System zu senden.

6.4.1 Vorbereitung zur Verwendung der IDoc-Bibliotheken

Für die Programmierung von Java-basierten, IDocs nutzenden Anwendungen ist es zunächst erforderlich, die SAP-IDoc-Bibliothekvom SAP Service Marketplace herunterzuladen. Dabei gehen Sie so vor, wie in Abschnitt 4.1.1, »Installation«, beschrieben: Nachdem Sie sich unter http://service.sap.com/connectors mit Ihrem SAP-Service-Marketplace-Benutzer angemeldet haben, navigieren Sie über das Menü zu SAP Java Connector/Tools & Services und wählen den Link Download SAP Java IDoc Class Library 3.0.<Version>. Die in diesem Buch verwendete Bibliothek entspricht der Version 3.0 und ist zu diesem Zeitpunkt die aktuellste Version, die mit dem Java Con-nector 3.0 und nachfolgenden Implementierungen des Connectors zusammenarbeitet. Die Datei trägt für die Windows-Plattform den Namen sapidoc-3.0.<Version>.zip.

Aufsetzen der Programmier-umgebung

Die Bibliothek ist sowohl für Windows als auch für zahlreiche andere Umgebungen wie Unix oder HP-UX vorhanden. Nach dem Herunter-laden und Entpacken der ZIP-Datei befindet sich ein neuer Ordner auf der Festplatte, der die Java-Dokumentation, Beispiele für die Pro-grammierung von IDoc-Client und IDoc-Server sowie ein Java-Archiv mit dem Namen sapidoc3.jar beinhaltet. Wenn Sie bereits mit Java-basierten IDoc-Anwendungen gearbeitet haben, werden Sie feststel-len, dass es im Gegensatz zu älteren Versionen nur noch eine Biblio-thek gibt (statt zwei). Neben dieser Neuerung ist auch eine Vielzahl von Klassen umbenannt und restrukturiert worden. Darüber hinaus

392

IDocs und Application Link Enabling6

haben auch Java-5-Sprachkonstrukte Eingang in die neue IDoc-Bibli-othek gefunden.

Wie bereits angedeutet, ist es für die Nutzung der IDoc-Bibliothek notwendig, die Java-Connector-Bibliothek zu verwenden. Die JCo-Bibliothek übernimmt dabei die Kommunikation mit dem Backend, während die IDoc-Bibliothek die Klassen für den Aufbau und die Ver-arbeitung von IDocs beisteuert. Für die Programmierung setzen Sie daher neben der möglicherweise bereits vorhandenen JCo-Bibliothek zusätzlich das eben angesprochene Java-Archiv sapidoc3.jar in den Klassenpfad Ihrer Entwicklungsumgebung.

6.4.2 Client-Anwendung für IDocs

Nachdem Sie Ihr Java-Projekt in Ihrer Entwicklungsumgebung aufge-setzt haben, können Sie mit der Programmierung der ersten IDoc-Anwendung beginnen. Die Anwendung sendet dem Mandanten 002 ein IDoc vom Typ ZORDER zu.

Verbindung aufbauen

Zunächst muss wie bei der herkömmlichen Java-Client-Programmie-rung eine Verbindung zum SAP-System aufgebaut werden. Der Verbindungsaufbau ist dabei analog zur reinen Java-Connector-Pro-grammierung, die Sie in Abschnitt 4.1, »SAP Java Connector«, ken-nengelernt haben. Das heißt, Sie erzeugen ein neues JCoDestination-Objekt über die Factory-Klasse JCoDestinationManager. Wie aus dem Sequenzdiagramm aus Abbildung 6.20 ersichtlich ist, wird im nächs-ten Schritt der Zugriff auf die Metadaten der IDocs instanziiert. Meta-daten werden dabei über eine Instanz vom Typ IDocRepositorybeschrieben. Da es sich um ein Interface handelt, muss das Objekt über eine Factory erzeugt werden. Die zentrale Klasse für die Erzeugung aller relevanten Typen ist die Klasse JCoIDoc.

Zugriff über Repository-Objekt

Wie aus dem vereinfachten Klassenbild der Klasse JCoIDoc in Abbil-dung 6.20 ersichtlich ist, implementiert die Klasse für die Arbeit mit Repositorys die Methode getIDocRepository. Über das Repository-Objekt kann auf die gesamte Metadatenstruktur der IDocs zugegrif-fen werden. Wie bei der reinen JCo-Programmierung ist auch bei der IDoc-Programmierung das Repository der Ausgangspunkt für die Validierung der angegebenen Ist-Werte gegen die im ABAP-Stack definierten Metadaten. Die Metadaten müssen deshalb auch Aus-gangspunkt für die Erzeugung des IDocs sein. IDocs werden in der Java-IDoc-Bibliothek über das Interface IDocDocument repräsentiert.

393

IDoc-Programmierung mit Java und dem Java Connector 6.4

Abbildung 6.20 Kommunikationsabhängigkeiten für die Erzeugung eines Objekts vom Typ IDocDocument

Die Erzeugung eines solchen Objekts wird über zwei Schritte ermög-licht. Im ersten Schritt ist es nötig, eine Ausprägung des Interfaces IDocFactory zu erzeugen. Dazu rufen Sie die Methode getIDoc-Factory auf der zentralen Factory-Klasse JCoIDoc auf. Die erzeugte Factory-Instanz ist Dreh- und Angelpunkt für die Bereitstellung eines IDoc-Objekts. Das IDoc-Objekt wird repräsentiert durch das InterfaceIDocDocument. Um eine Instanz dieser Klasse zu erzeugen, rufen Sie die Methode createIDocDocument auf. Die Methode erhält zwei Para-meter: Der erste Parameter ist das bereits erzeugte Repository-Objekt, der zweite Parameter gibt den Namen des IDocs an, für das eine Proxy-Repräsentation benötigt wird.

Verarbeiten der Segmente

Nachdem das Proxy-Objekt erzeugt wurde, können Sie mit der eigentlichen Verarbeitung der IDoc-relevanten Informationen begin-nen. Verwenden Sie hier das IDoc mit dem Namen ZOrder, das in Abschnitt 6.1.1, »Entwicklung von IDocs«, eingeführt und diskutiert wurde. Das IDoc besteht aus zwei Segmenten, Z1ORDHD und Z1ORDPS. Segmente werden in der Java-IDoc-Bibliothek als ISegment verarbei-tet. Um die einzelnen Segmenttypen mit Daten zu füllen, muss eine Referenz auf das Wurzelsegment der IDoc-Proxy-Repräsentation bezogen werden.

394

IDocs und Application Link Enabling6

Das Wurzelsegment wird dabei über die Methode getRootDocumentbesorgt. Da aus der Sicht der Wurzel die Bestellkopfinformationen als Kindelemente zu sehen sind, wird die Methode addChild auf dem Wurzelsegment aufgerufen. Die Methode erhält den Namen des Seg-ments und liefert ein neues ISegment-Objekt zurück. Dieses Objekt kann nun über die Methode setValue mit den entsprechenden Wer-ten gefüllt werden. Die Methode folgt dem Java-Standard und erhält als ersten Parameter den Feldbezeichner und als zweiten Parameter den zu setzenden Wert. Nachdem der Bestellkopf mit Daten versorgt ist, können die Bestellpositionen gesetzt werden. Dazu wird auf dem ISegment-Objekt der Kopfdaten die Methode addChild aufgerufen, und die jeweiligen Werte für die Bestellpositionen werden über-geben.

Senden des IDocs an das

ABAP-System

Den Abschluss bildet das Versenden des IDocs. Für das Versenden bietet die zentrale IDoc-Klasse JCoIDoc die Methode send. Die Methode wird in vier verschiedenen Ausprägungen zur Verfügung gestellt. Die Methodenausprägungen können dabei grob in zwei Typen eingeteilt werden: Eine Ausprägung wird verwendet, wenn lediglich ein einziges IDoc an das ABAP-System gesendet werden soll. Die zweite Ausprägung der Methode wird mit einer Liste von IDocs (vom Typ IDocDocumentList) aufgerufen. Allen Methoden ist ge-meinsam, dass sie neben den IDoc-Objekten auch die IDoc-Version, ein Objekt vom Typ JCoDestination und die Transaktionsnummerentgegennehmen, mit der das IDoc verarbeitet werden soll. Die Transaktionsnummer wird analog zur JCo-Programmierung über die Methode createTID auf der Klasse JCoDestination aufgerufen.

Nachdem auf dem IDoc-Proxy-Objekt die nötigen Informationen des sendenden und des empfangenen Systems gesetzt wurden, kann mit-tels der Methode send das IDoc an das ABAP-System übergeben wer-den (siehe Listing 6.6).

public static void main(String[] args) { try { JCoDestination lcoDestination = ConnectionMan-ager.getJCoDestination("MYDESTINATION"); IDocRepository repository = JCoIDoc.getIDocRepository(lcoDestination); IDocFactory idocFactory = JCoIDoc.getIDocFactory(); IDocDocument iDocument = idocFactory.createIDocDocument(repository,IDOCNAME); //Hinzufügen des root-Segments

395

IDoc-Programmierung mit Java und dem Java Connector 6.4

IDocSegment rootSegement = iDocument.getRootSegment(); //Erzeugen des Bestellkopfsegments IDocSegment orderheader = rootSegement.addChild(IDOC_ORDER_HEADER); orderheader.setValue(ORDER_HEADER_ORDERID , 122); orderheader.setValue(ORDER_HEADER_BUYER, "Michael Wegelin"); orderheader.setValue(ORDER_HEADER_TYPE, "A0"); orderheader.setValue(ORDER_HEADER_REFID, "2"); //Hinzufügen eines Bestellungssegments IDocSegment orderpos = orderheader.addChild(IDOC_ORDER_POS); orderpos.setValue(ORDER_POS_ORDERID,"122"); orderpos.setValue(ORDER_POS_ORDERPOS,1); orderpos.setValue(ORDER_POS_MATID, "M1"); orderpos.setValue(ORDER_POS_MATTEXT, "Schrauben und Dübel"); orderpos.setValue(ORDER_POS_ORDERCOUNT, "23"); orderpos.setValue(ORDER_POS_PRICE, 12.30); orderpos.setValue(ORDER_POS_CURRENCY, "EUR"); String tid = lcoDestination.createTID(); iDocument.setMessageType("ZORDER"); iDocument.setRecipientPartnerNumber("AOUCLNT002"); iDocument.setRecipientPartnerType("LS"); iDocument.setSenderPort("SAPBSP"); iDocument.setSenderPartnerType("LS"); iDocument.setSenderPartnerNumber("AOUCLNT001"); JCoIDoc.send(iDocument,IDocFactory.IDOC_VERSION_DEFAULT, lcoDestination , tid); lcoDestination.confirmTID(tid); } catch (JCoException e) { e.printStackTrace(); } catch (IDocMetaDataUnavailableException e) { e.printStackTrace(); } catch(IDocIllegalTypeException e) { e.printStackTrace(); } catch (IDocSyntaxException e) { e.printStackTrace(); } catch (IDocConversionException e) { e.printStackTrace(); } catch(IDocFieldNotFoundException e) { e.printStackTrace(); } }

Listing 6.6 Versenden eines IDocs mit Java

396

IDocs und Application Link Enabling6

Prüfen der IDoc-Konsistenz

Um die Konsistenz und Syntax des IDocument-Objekts zu prüfen, können Sie die Methode checkSyntax aufrufen. Falls die Syntax beschädigt bzw. fehlerhaft ist, wird eine Ausnahme vom Typ IDocSyntaxException ausgelöst. Daher müssen Sie den Methoden-aufruf in einem try-catch-Block platzieren. Falls keinerlei Fehler in der Syntax vorhanden sind, kann das IDoc an das SAP-System gesen-det werden.

Verarbeitung von IDocument-

Objekten

Für sendende wie auch für empfangende Java-Systeme ist die Verar-beitung der reinen IDocument-Objekte oft nicht ausreichend. In vie-len Fällen ist es zum Beispiel notwendig, das empfangene Dokument in ein anderes Format zu überführen und entsprechend weiterzuver-arbeiten. Genauso kann es gerade in Infrastrukturen, in denen Nach-richten ausgetauscht werden, vorkommen, dass aus einem Zwischen-format ein IDocument-Objekt initialisiert und an das SAP-System übermittelt wird. Die Vergangenheit hat gezeigt, dass besonders hier das XML-Format (Extensible Markup Language) seine Vorteile hat, obgleich andere Formate ähnlich komfortabel sind. Ein möglicher Vorteil der Nutzung von XML ist die einfachere Konvertierung mit-tels Extensible Stylesheet Language for Transformations (XSLT) in unter-schiedliche Formate. In heterogenen Landschaften ist dadurch eine komfortable Kommunikation möglich.

XML-basierte Verarbeitung

Für die XML-basierte Verarbeitung bietet die Java-IDoc-Bibliothek als Ausgangspunkt das Interface IDocXMLProcessor. Es bietet eine Viel-zahl von Methodenausprägungen mit der Bezeichnung parse und render. Die parse-Methoden dienen der Erzeugung von IDocument-Objekten bzw. einer Liste von IDocument-Objekten (als IDocument-List-Implementierung); analog verhalten sich die render-Methoden. Sie ermöglichen es, IDocument-Objekte als XML-Darstellungen zu erzeugen.

Sie erhalten die Instanz einer SAP-Implementierung für diese Schnitt-stelle über die zentrale IDoc-Factory-Klasse IDocFactory. Die benö-tigte Methode trägt den Namen getIDocXMLProcessor. Das Program-mierbeispiel in Listing 6.7 zeigt die Möglichkeit der Speicherung eines IDocs als XML-Dokument.

private void processIDoc(IDocDocument document) { try { IDocFactory idocFactory = JCoI-Doc.getIDocFactory(); IDocXMLProcessor xmlProcessor = idocFactory.getIDocXMLProcessor();

397

IDoc-Programmierung mit Java und dem Java Connector 6.4

FileWriter fileWriter = new FileWriter("c:\\temp\\bestellung.xml"); xmlProcessor.render(document, fileWriter); } catch (IOException e) { e.printStackTrace(); } }

Listing 6.7 XML-Verarbeitung eines IDocument-Objekts

6.4.3 IDoc-Server

Nachdem Sie ein IDoc versendet haben, stellen wir Ihnen in diesem Abschnitt das Empfangen eines IDocs vor. In unserem Beispiel schrei-ben Sie das empfangene IDoc als XML-Datei auf die Festplatte. Die Projektkonfiguration in der Entwicklungsumgebung ist ähnlich wie bei der Programmierung eines IDoc-Senders. Im Klassenpfad befin-den sich die Bibliotheken des Java Connectors sowie die Java-IDoc-Bibliothek.

Implementierung eines IDoc-Servers

Für die Implementierung des IDoc-Servers erstellen Sie eine Klasse mit dem Namen EAIIDocServer. Sie finden diese Klasse bei den Pro-grammierbeispielen zum Buch im Eclipse-Projekt JCoServerProgram-mierung im Paket de.eai.javaserverprg.idoc. Ausgangspunkt ist das Interface JCoIDocServer. Das Interface erbt dabei vom Interface JCoServer. Das bedeutet, dass es möglich ist, eine Java-basierte Infra-struktur aufzubauen, die sowohl eine reine RFC-Kommunikation als auch eine IDoc-basierte Kommunikation mit dem SAP-System ermög-licht. Das Interface JCoIDocServer führt vier neue Methoden in die Java-Connector-Programmierung ein. Es handelt sich dabei um die Methoden getIDocHandlerFactory, getIDocRepository, setIDoc-HandlerFactory und setIDocRepository.

Zu Beginn der Implementierung wird ein neues JCoIDocServer-Objekt erzeugt. Das Objekt wird mit den Kommunikationsparame-tern für das SAP-System initialisiert. Wie Sie im Programmierbeispiel in Listing 6.8 sehen können, wird dies über die Factory-Methode getServer auf der Klasse JCoIDoc ermöglicht. Darüber hinaus ist es notwendig, dem Java-Server mitzuteilen, wer welche eingehenden IDocs verarbeiten soll. Dies geschieht über die Registrierung einer Implementierung der Schnittstelle JCoIDocHandlerFactory. In dem hier vorgestellten Beispiel übernimmt dies die Klasse EAIIDoc-HandlerFactory.

398

IDocs und Application Link Enabling6

public class EAIIDocServer { public static void main(String[] args) { try { JCoIDocServer eaiServer = JCoIDoc.getServer("EAIIDocSample"); eaiServer.setIDocHandlerFactory( new EAIIDocHandlerFactory()); eaiServer.setTIDHandler(new EAITIDHandler()); EAIIDocErrorListener listener = new EAIIDocErrorListener(); eaiServer.addServerErrorListener(listener); eaiServer.addServerExceptionListener(listener); eaiServer.setConnectionCount(1); eaiServer.start(); } catch (JCoException e) { System.out.println( "Problems while starting the IDoc-Server " + e.getMessage()); } } }

Listing 6.8 Implementierung eines IDoc-Empfängers in Java

Wie Sie bereits gesehen haben, werden IDocs per tRFC übermittelt. Daher müssen Sie dem Serverobjekt mitteilen, wer im Java-System die Verwaltung von Transaktionsnummern übernimmt. Sie registrie-ren eine Implementierung des Interfaces JCoServerTIDHandler. Die Implementierung dieses Interfaces ist dabei identisch mit der reinen JCo-Serverprogrammierung.

Verarbeitung von eingehenden IDocs

Wie bereits angedeutet, ist ein Java-IDoc-Server in der Lage, unter-schiedliche Verarbeiter für eingehende IDoc-Objekte zu implemen-tieren. Die entscheidende Komponente ist dabei eine Implementie-rung der Schnittstelle JCoIDocHandlerFactory. Die Schnittstelle bietet eine Methode mit dem Namen getIDocHandler. Sie erhält als Aufrufparameter ein Objekt vom Typ JCoIDocServerContext. Der Kontext kann dazu verwendet werden, zu entscheiden, wer die eigentliche Verarbeitung eines IDocs übernimmt. Zum Beispiel kann als Entscheidungskriterium die IDoc-Version aus dem Kontext bezo-gen werden. Die Methode getIDocHandler liefert Implementierun-gen der Schnittstelle JCoIDocHandler zurück. Das Interface selbst

399

IDoc-Programmierung mit Java und dem Java Connector 6.4

stellt letztlich die Grundlage für die eigentliche Verarbeitung von IDocs dar und bietet dafür die Methode handleRequest an.

Die Methode erhält zwei Parameter: Der erste Parameter ist vom Typ JCoServerContext, der zweite ist vom Typ IDocDocumentList und stellt eine Liste eingegangener IDocs dar. Das Programmierbeispiel in Listing 6.9 zeigt, wie empfangene IDocs über IDocXMLProcessor als XML-Dokumente gespeichert werden können.

public void handleRequest(JCoServerContext serverCtx, IDoc-DocumentList idocList) { String filepath = "c:\\idocoutput\\"; FileOutputStream fileOS = null; OutputStreamWriter objectOS = null; try { IDocXMLProcessor xmlProcessor = JCoIDoc.getIDocFactory().getIDocXMLProcessor(); fileOS = new FileOutputStream(filepath + serverCtx.getTID()+ "Document.xml"); objectOS=new OutputStreamWriter(fileOS, "UTF8"); xmlProcessor.render(idocList, objectOS, IDocXMLProcessor.RENDER_WITH_TABS_AND_CRLF); objectOS.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }

Listing 6.9 Implementierung der Methode handleRequest

6.4.4 Konfiguration für den Versand von IDocs

Im Anschluss an die Implementierung des externen Java-IDoc-Ser-vers muss das SAP-System entsprechend konfiguriert werden. Dazu melden Sie sich an Ihrem SAP-System an und rufen dort Transaktion SALE auf. Zunächst definieren Sie ein logisches System für den eben vorgestellten Java-Server. Dazu folgen Sie dem Menüpfad Grundein-

stellungen � Logische Systeme einrichten � Logisches System

benennen.

400

IDocs und Application Link Enabling6

Logisches System und tRFC-

Destination

Fügen Sie nun einen neuen Eintrag hinzu. Konfigurieren Sie dann über Transaktion WE20 Ihr gerade eingeführtes logisches System. Im Anschluss starten Sie Transaktion SM59 und pflegen eine tRFC-Des-tination für den empfangenden Java-Server, wie wir es bei der her-kömmlichen JCo-Serverprogrammierung in Abschnitt 4.1, »SAP Java Connector«, gezeigt haben. Benennen Sie auch hier die Destination genauso wie das logische System, damit Sie es bei der Generierung der Partnervereinbarungen einfacher haben.

Verteilungsmodell erweitern

Nachdem Sie die Destination erfolgreich angelegt haben, ändern Sie das Verteilungsmodell, sodass ZORDER-Nachrichten von einem SAP-Mandanten an Ihr externes Java-Programm geschickt werden (siehe Abbildung 6.21). Aus dieser Transaktion heraus können Sie auch die Partnervereinbarung erzeugen.

Abbildung 6.21 Erweiterung des ALE-Verteilungsmodells

Abschließend starten Sie Ihren Java-IDoc-Server. Mit dem ABAP-Pro-gramm ZIFP_SEND_IDOC können Sie nun Ihren IDoc-Empfänger tes-ten. Wenn alles richtig funktioniert, schreibt der Empfänger das von dieser Transaktion gesendete IDoc in das von Ihnen bei der Program-mierung angegebene Verzeichnis.

6.5 IDoc-Programmierung mit dem SAP .NET Connector

In diesem Abschnitt lernen Sie die IDoc-Programmierung mit dem SAP .NET Connector kennen. Dazu müssen Sie einen tRFC-Serverund einen tRFC-Client schreiben, wie Sie es in Kapitel 5, »Remote Function Call mit C#«, gelernt haben.

401

IDoc-Programmierung mit dem SAP .NET Connector 6.5

tRFC-Server und -Client

Der tRFC-Server muss den Funktionsbaustein IDOC_INBOUND_

ASYNCHRONOUS implementieren. Dieser Funktionsbaustein empfängt ein IDoc als interne Tabelle, die dann in eine Datei oder Datenbank geschrieben werden muss. Umgekehrt muss der tRFC-Client aus einer Datei oder aus Daten in einer Datenbank ein IDoc als interne Tabelle erzeugen und per tRFC an den Funktionsbaustein IDOC_INBOUND_ASYNCHRONOUS schicken.

6.5.1 IDoc-Empfänger

Funktionsbaustein IDOC_INBOUND_ASYNCHRONOUS

Listing 6.10 zeigt die Implementierung des Funktionsbausteins IDOC_INBOUND_ASYNCHRONOUS als Methode IdocInboundAsynchronous einer C#-Klasse RfcFunctionImpl. Diese Methode schreibt die empfange-nen IDoc-Zeilen aus dem Tabellenparameter IDOC_DATA_REC_40 in eine Datei mit dem Namen <tid>.dat, wobei <tid> die Transaktions-ID ist.

class RfcFunctionImpl { [RfcServerFunction(Name = "IDOC_INBOUND_ASYNCHRONOUS")] public static void IdocInboundAsynchronous( RfcServerContext serverContext, IRfcFunction function) { Console.WriteLine( "Führe IDOC_INBOUND_ASYNCHRONOUS aus."); // Datei TID.dat zum Schreiben öffnen string dataFileName = string.Format( "{0}.dat", serverContext.TransactionID); FileStream dataFile = new FileStream( dataFileName, FileMode.OpenOrCreate, FileAccess.Write); StreamWriter writer = new StreamWriter(dataFile); // IDoc lesen und in Datei schreiben IRfcTable idoc = function.GetTable("IDOC_DATA_REC_40"); foreach (IRfcStructure record in idoc) { for (int i = 0; i < record.Count; i++) { if (i == record.Count – 1) writer.WriteLine(record.GetString(i)); else

402

IDocs und Application Link Enabling6

writer.Write("{0};", record.GetString(i)); } } writer.Flush(); dataFile.Close(); } }

Listing 6.10 C#-Methode IdocInboundAsynchronous

ALE konfigurieren Um den Empfänger zu testen, müssen Sie, wie in Abschnitt 6.2.1, »Konfiguration von ALE«, beschrieben, das entsprechende Customi-zing im ALE-Subsystem vornehmen: Sie definieren ein logisches Sys-tem für das externe C#-Programm, pflegen eine tRFC-Destination für dieses System und erstellen oder erweitern ein ALE-Verteilungsmo-dell so, dass ZORDER-Nachrichten von einem SAP-Mandanten an Ihr externes C#-Programm geschickt werden. Danach generieren Sie aus dem Verteilungsmodell heraus die Partnervereinbarungen und testen anschließend Ihren IDoc-Empfänger mit dem ABAP-Programm ZIFP_SEND_IDOC.

6.5.2 IDoc-Sender

IDoc lesen Der IDoc-Sender sieht genauso aus wie der tRFC-Client, den wir in Abschnitt 5.3.2, »Transaktionaler RFC«, implementiert haben. Die Methode PrepareFunction in Listing 6.11 liest das IDoc aus einer Datei, deren Name als Parameter übergeben wird. Die Methode liest die Zeilen der Datei und hängt sie an die interne Tabelle IDOC_DATA_REC_40 an. Danach baut sie den Kontrolldatensatz auf und hängt ihn an die interne Tabelle IDOC_CONTROL_REC_40 an.

static IRfcFunction PrepareFunction(string dataFileName) { RfcDestination dest = RfcDestinationManager. GetDestination("NCO_ASHOST"); IRfcFunction function = dest.Repository.CreateFunction( "IDOC_INBOUND_ASYNCHRONOUS"); FileStream dataFile = new FileStream( dataFileName, FileMode.Open, FileAccess.Read); StreamReader reader = new StreamReader(dataFile); // IDoc lesen und in Tabelle füllen IRfcTable records = function.GetTable("IDOC_DATA_REC_40");

403

IDoc-Programmierung mit dem SAP .NET Connector 6.5

while (!reader.EndOfStream) { string line = reader.ReadLine(); records.Append(); string[] fields = line.Split(new char[] { ';' }); for (int i = 0; i < fields.Count(); i++) records.SetValue(i, fields[i]); } // Kontrolldatensatz aufbauen string docnum = records.GetString("DOCNUM"); IRfcTable control = function.GetTable( "IDOC_CONTROL_REC_40"); control.Append(); control.SetValue("DOCNUM", docnum); control.SetValue("DOCREL", "702"); control.SetValue("IDOCTYP", "ZORDER01"); control.SetValue("MESTYP", "ZORDER"); control.SetValue("SNDPRT", "LS"); control.SetValue("SNDPRN", "CSTSERV"); dataFile.Close(); return function; }

Listing 6.11 Die Methode PrepareFunction

Damit das IDoc, das von Ihrem IDoc-Sender verschickt wird, im SAP-System auch richtig verarbeitet wird, müssen Sie mit Transaktion WE20 eine Partnervereinbarung für Ihr sendendes System pflegen, wie in Abschnitt 6.2.1, »Konfiguration von ALE«, beschrieben (siehe Abbildung 6.13).

Inhalt

7

Inhalt

Einleitung ..................................................................................... 13

1 Grundlagen der SAP-Schnittstellenprogrammierung ................................ 17

1.1 SAP NetWeaver Application Server ............................. 171.1.1 SAP-Lösungen und SAP NetWeaver ............... 181.1.2 SAP NetWeaver Application Server ABAP ...... 201.1.3 SAP NetWeaver Application Server Java ......... 34

1.2 Sicherheit ................................................................... 391.2.1 Sicherheit in heterogenen Landschaften ......... 391.2.2 User Management Engine .............................. 441.2.3 KeyStores: Authentifizierung, Signierung,

Verschlüsselung ............................................. 461.3 Authentifizierung und Autorisierung ........................... 50

1.3.1 Single Sign-on mit dem SAP NetWeaver Portal ............................................................. 51

1.3.2 Sichere Integration externer Systeme ............. 561.4 Programmierung des SAP NetWeaver Application

Servers ABAP .............................................................. 681.4.1 ABAP Dictionary ............................................ 691.4.2 Authentifizierung und Autorisierung .............. 741.4.3 Nummernkreise ............................................. 751.4.4 Funktionsbausteine ........................................ 761.4.5 Verbuchungsbausteine ................................... 781.4.6 Anwendungsfunktionalität und

Benutzeroberflächen ...................................... 801.5 Überblick über die Schnittstellen

technologien von SAP ................................................. 811.5.1 Dateischnittstelle ........................................... 821.5.2 Remote Function Call (RFC) ........................... 841.5.3 Business Application Programming Interface

(BAPI) ............................................................ 951.5.4 Application Link Enabling (ALE) ..................... 981.5.5 SOAP ............................................................. 1041.5.6 OData ............................................................ 105

Inhalt

8

2 Remote Function Call mit ABAP .............................. 107

2.1 RFC-Funktionsbausteine in ABAP ............................... 1072.1.1 Funktionsbausteine zum Lesen ...................... 1072.1.2 Aufruf per sRFC ............................................. 1102.1.3 Funktionsbausteine zum Löschen und

Ändern .......................................................... 1132.2 Transaktionaler RFC ................................................... 1192.3 Queued RFC .............................................................. 125

2.3.1 qRFC mit Ausgangswarteschlange .................. 1272.3.2 qRFC mit Ausgangs- und

Eingangswarteschlange .................................. 1292.4 Background-RFC ........................................................ 1332.5 Business-Objekte und BAPIs ...................................... 137

2.5.1 Entwicklung von Business-Objekten .............. 1372.5.2 Entwicklung von BAPIs .................................. 1392.5.3 Business-Objekt »Helpvalues« ........................ 161

3 Remote Function Call mit C/C++ ............................. 167

3.1 SAP NetWeaver RFC Software Development Kit ........ 1673.1.1 Inhalte des SAP NetWeaver RFC Software

Development Kits ......................................... 1673.1.2 Kompilieren und Linken von C- und

C++-Programmen .......................................... 1693.2 Einfache SAP-NetWeaver-RFC-Clients ........................ 174

3.2.1 Aufbau eines SAP-NetWeaver-RFC-Clients .... 1753.2.2 Einfache Parameter ....................................... 1823.2.3 Strukturierte Parameter ................................. 1843.2.4 Tabellenparameter ........................................ 186

3.3 Komplexe SAP-NetWeaver-RFC-Clients ..................... 1893.3.1 Aufruf von BAPIs ........................................... 1893.3.2 Transaktionaler RFC-Client ............................ 1913.3.3 Queued RFC-Server ....................................... 203

3.4 SAP-NetWeaver-RFC-Server ....................................... 2043.4.1 Einfacher RFC-Server ..................................... 2053.4.2 Implementierung der Funktionen .................. 2093.4.3 Transaktionaler RFC-Server ............................ 213

4 Remote Function Call mit Java ................................ 223

4.1 SAP Java Connector ................................................... 2234.1.1 Installation .................................................... 224

Inhalt

9

4.1.2 Architektur des SAP Java Connectors .............. 2254.1.3 Programmierung mit dem

SAP Java Connector ....................................... 2274.1.4 Verarbeitung von Tabellen und Strukturen ..... 2374.1.5 Transaktionaler RFC ....................................... 2404.1.6 Queued RFC .................................................. 2414.1.7 Metadatenverarbeitung .................................. 244

4.2 SAP Enterprise Connector ........................................... 2454.2.1 Erzeugen von Proxy-Klassen ........................... 2464.2.2 Programmierung des Clients ........................... 251

4.3 Nutzung generischer Backend-Modelle ....................... 2534.3.1 Generische Proxy-Klassen ............................... 2534.3.2 Klassenabhängigkeiten ................................... 2554.3.3 Konfiguration der Destinationen .................... 2574.3.4 Implementierung ........................................... 260

4.4 RFC-Server .................................................................. 2694.4.1 Serverseitiges und clientseitiges

Repository ..................................................... 2694.4.2 Programmierung eines einfachen

JCo-Servers .................................................... 2724.4.3 Registrieren eines Funktionshandlers .............. 2744.4.4 Verwaltung von Transaktionen ....................... 276

4.5 SAP NetWeaver Portal Connector Framework ............. 2784.5.1 Java Connector Architecture ........................... 2784.5.2 System Landscape des Portals ........................ 2794.5.3 Einführung in die Portalprogrammierung ........ 2814.5.4 Anwendungsbeispiel des Connector

Frameworks ................................................... 285

5 Remote Function Call mit C# ................................... 293

5.1 SAP .NET Connector ................................................... 2935.1.1 Installation des SAP .NET Connectors ............. 2945.1.2 Verwendung des SAP .NET Connectors in

Visual-Studio-Projekten ................................. 2965.2 Einfache RFC-Clients ................................................... 299

5.2.1 Aufbau eines einfachen RFC-Clients ............... 2995.2.2 Destination-Management .............................. 3015.2.3 Repository und Metadaten ............................. 3085.2.4 Einfache Parameter ........................................ 3105.2.5 Strukturierte Parameter .................................. 3115.2.6 Tabellenparameter ......................................... 314

Inhalt

10

5.2.7 Ausnahmebehandlung ................................... 3165.3 Komplexe RFC-Clients ................................................ 320

5.3.1 Aufruf von BAPIs und Session-Management ................................................. 320

5.3.2 Transaktionaler RFC ....................................... 3235.3.3 Queued RFC .................................................. 3385.3.4 Background RFC ............................................ 338

5.4 RFC-Server ................................................................. 3415.4.1 Serverkonfiguration und Implementierung ..... 3425.4.2 Repository-Management ............................... 3495.4.3 Sicherheitsmanagement ................................. 3495.4.4 Session-Management .................................... 3515.4.5 Transaktionaler RFC ....................................... 3535.4.6 Queued RFC .................................................. 3565.4.7 Background RFC ............................................ 3575.4.8 Zustand des Servers überwachen ................... 358

6 IDocs und Application Link Enabling ....................... 361

6.1 IDocs ......................................................................... 3616.1.1 Entwicklung von IDocs .................................. 3626.1.2 Erzeugung von IDocs ..................................... 3666.1.3 Eingangsverarbeitung von IDocs .................... 370

6.2 Application Link Enabling .......................................... 3756.2.1 Konfiguration von ALE .................................. 3756.2.2 Test und Monitoring ..................................... 3816.2.3 ALE-Schnittstelle für BAPIs ............................ 382

6.3 IDoc-Programmierung mit dem SAP NetWeaver RFC SDK .................................................................... 3876.3.1 IDoc-Empfänger ............................................ 3876.3.2 IDoc-Sender .................................................. 389

6.4 IDoc-Programmierung mit Java und dem Java Connector .......................................................... 3916.4.1 Vorbereitung zur Verwendung der

IDoc-Bibliotheken ......................................... 3916.4.2 Client-Anwendung für IDocs ......................... 3926.4.3 IDoc-Server ................................................... 3976.4.4 Konfiguration für den Versand von IDocs ...... 399

6.5 IDoc-Programmierung mit dem SAP .NET Connector .................................................. 4006.5.1 IDoc-Empfänger ............................................ 4016.5.2 IDoc-Sender .................................................. 402

Inhalt

11

7 SOAP ........................................................................ 405

7.1 Inside-Out-Webservices und -Webclients mit dem AS ABAP ..................................................................... 4057.1.1 ABAP-SOAP-Webservice ................................ 4067.1.2 ABAP-SOAP-Webclient .................................. 415

7.2 Outside-In-Webservices und -Webclients mit dem AS ABAP ..................................................................... 4207.2.1 System Landscape Directory ........................... 4207.2.2 Service-Interfaces ........................................... 4217.2.3 ABAP-SOAP-Proxys ........................................ 425

7.3 Webservices und Webclients mit dem AS Java ............ 4297.3.1 Webservice-Infrastruktur im AS Java .............. 4307.3.2 Webservice-Provider mit J2EE ........................ 4347.3.3 Webservice-Clients ........................................ 4417.3.4 Adaptiver Webservice mit Web Dynpro ......... 4467.3.5 Webservice-Programmierung mit SAP JEE ...... 447

7.4 SOAP-Programmierung mit Java ................................. 4687.4.1 Java API for XML Web Services ...................... 4687.4.2 Implementierung eines Webservice-

Clients ........................................................... 4707.4.3 Implementierung eines Webservice-

Providers ........................................................ 4717.5 SOAP-Programmierung mit C# ................................... 472

8 SAP NetWeaver Gateway und OData ...................... 477

8.1 SAP NetWeaver Gateway ............................................ 4778.1.1 Embedded Deployment ................................. 4788.1.2 Central Hub Deployment ............................... 479

8.2 OData-Protokoll ......................................................... 4808.2.1 Atom-Syndication-Format .............................. 4818.2.2 Representational State Transfer ...................... 4818.2.3 OData-Datenmodell ....................................... 482

8.3 OData-Services entwickeln ......................................... 4878.3.1 Beschreibung des Datenmodells ..................... 4898.3.2 Generierung der Komponenten und

Anlegen des OData-Services .......................... 4928.3.3 Implementierung der Data-Provider-Klasse .... 4968.3.4 Monitoring und Fehlersuche .......................... 509

8.4 OData-Services mit SAPUI5 konsumieren ................... 5118.4.1 Von Phoenix zu SAPUI5 ................................. 512

Inhalt

12

8.4.2 Konsumieren eines OData-Services ............... 5158.5 OData-Services mit C# konsumieren .......................... 522

Anhang............................................................................ 531

A Literaturhinweise .................................................................. 531B Die Autoren ......................................................................... 533

Index ............................................................................................ 535

535

Index

.NET 472

.NET Connector � SAP .NET Connector

.NET-Assembly 296/IWFND/MAINT_SERVICE 489,

493, 510

A

ABAP 20Kurz-Dump 94SOAP-Proxy 425SOAP-Webclient 415SOAP-Webservice 406Stack 19Transaktionskonzept 32

ABAP Dictionary 69, 85, 139, 250ABAP Workbench 17, 70, 405Access Control List 52, 53ACL 52, 53Adapter 45adaptiver Webservice 442ALE 98, 361

Architektur 98Ausgangsbaustein 383Ausgangsparameter 379Customizing 99Eingangsbaustein 373, 383Eingangsparameter 380, 384Empfängerermittlung 384Empfängerport 379Konfiguration 362, 375Partnerprofil 102Statusmonitor 381Verteilungsmodell 101, 368, 376,

378, 384, 388, 400, 402Vorgangscode 374

ALE_MODEL_INFO_GET 368Änderungsvormerkung 33Anmeldesprache 21Anmeldung 20Anmeldungsmandant 23Annotation 36, 471

SOAPBinding 471WebMethod 471

Annotation (Forts.)WebService 454

Anwendungsfunktionsleiste 23Anwendungskomponente 34Anwendungsprotokoll 25Anwendungsschicht 17, 18, 20,

34, 37Anwendungsserver 18, 23, 34, 85Anwendungssicherheit 40API 35app.config 475APPEND 255Application Link Enabling � ALE 361Application Programming Interface

35Applikationsschicht � Anwendungs-

schichtApplikationsserver

Monitoring 37Profiling 37

Architektur, Client-Server 18aRFC 133ARFC2 254, 267ARFC2GenericModelClass 257, 266ARFC2GenericModelClassExecutable

257, 265, 266ARFC2Model 256, 265ARFC2ModelInfo 256, 264, 265ARFCSDATA 119ARFCSSTATE 119Array 79Array Insert 143ASP.NET 81Assembly 296Assoziation 483, 491asymmetrisches Verfahren 41asynchrone Kommunikation 35asynchroner RFC 90, 132Atom 477Atom Publishing Protocol 105, 477Atom Syndication 105, 477, 481Atom-Feed 498Ausgangswarteschlange 126, 131Ausnahme 78

communication_failure 112, 122

536

Index

Ausnahme (Forts.)Klasse 318RfcAbapException 319RfcAbapRuntimeException 318RfcCommunicationException 318RfcLogonException 318system_failure 112

auth/authorization_trace 94Authentifizierung 39, 50, 255AUTHORITY CHECK 93Autorisierung 39, 50

B

Backend-Modell 254Backend-Modell, generisches 253Background-RFC 93, 133Background-Workprozess 27BAdI 140BALW_BAPIRETURN_GET2 146BAPI 95, 97, 137, 382

ALE-Schnittstelle 103, 382BAPI_TRANSACTION_COMMIT 97,

141, 154, 189, 320BAPI_TRANSACTION_ROLLBACK

97Eingabehilfe 161Fehlermeldung 150freigeben 148GetSearchhelp 161instanzabhängiges 98, 149instanzunabhängiges 98, 156Konvention 139Parameter 140Return-Parameter 142Transaktionsmodell 123, 141, 189Verbuchung 143

BAPI_TRANSACTION_COMMIT 148Batch-Input 82, 83

Mappe 83Monitor 83

BeginSaveChanges 529Beispielanwendung 68Benutzer 21

Kontext 24, 28Name 21, 23Oberfläche 80SAPJSF 44Sitzung 20, 24

Benutzer (Forts.)Stammsatz 21

Berechtigung 75Objekt 75, 93Prüfung 109, 116, 162RFC 93

Bestellung 69bgRFC 93, 133

Client 341Monitor 136SAP .NET Connector 357Scheduler 137Unit-Objekt 133

Bildschirmbild 23, 30Binding, Custom 475bindRows 519Bindungsstil

Document 412RPC 412

BOR 95, 489BSP 81, 512Business Add-in � BAdIBusiness Application Programming

Interface � BAPI 95, 137, 382Business Exception 502Business Object Builder 137Business-Objekt 95, 137

C

C# 522C++-Compiler 167CALL FUNCTION 76CALL TRANSACTION 82Cast 288CCI 279C-Compiler 167Changing-Parameter 77, 250checkTID 276Classloader, Referenz 268, 289Client 20Client-Server-Architektur 18Code, unmanaged 296Codegenerator 254commit 113, 277COMMIT WORK 32, 33, 78, 120Commit, impliziter 113Common Client Interface 279Complex Type 483

537

Index

Conceptual Schema Definition LanguageCSDL 483

confirmTID 277Connection Pool 306Consumer, Proxy 427Content-Administrator 291content-type 504Controller 513, 516cookie 504CORS 520create 482, 521CREATE_ENTITY 502, 506C-RFC-Bibliothek 226Cross Origin Resource Sharing 520Cross Site Request Forgery 503CRUD 482, 487, 492CSDL 483CSRF 503CSRF-Token 503, 504, 527, 528CurrentIndex 315CurrentRow 315

D

Data-Provider-Klasse 487, 493Data-Provider-Klasse, Implementie-

rung 496data-sap-ui-theme 518Datei

Schnittstelle 82Service 25

Datenbank 18Datenbank-Commit 92Datenbindung 514Datencontainer 184Datenelement 70Datenschicht 18Datensicherheit 40Datenzugriffsschicht 37DDIC-Import 490Delegat 341DELETE 33, 482, 508, 509DELETE_ENTITY 508, 509DeleteObject 528demilitarisierte Zone 480Dependency-Injection 465Deployment Descriptor 36, 289, 434Design by Contract 36

Destination 110, 112, 222, 254, 300, 376, 377Application Data 265Authentifizierung 305BACK 112Bezeichner 446bgRFC 135DestinationConfiguration 329DestinationDataProvider 229Konfigurationsparameter 304Manager 300NONE 112Repository-Objekt 300SPACE 112

Developer Studio � SAP NetWeaver Developer Studio 281

DIAG 20, 25Dialog 30

Schritt 30Workprozess 27

digitale Signatur 42digitales Zertifikat 43Direct Input 83direkte Verbindung 230Dispatcher 25, 28DLL 225, 295Double Stack 18Dynamic Information and Action

Gateway 20, 25Dynamic Link Library 225, 295Dynamic Web Project 260Dynpro 30

E

EAR-Projekt 268Eclipse 447, 470, 513Eclipse-Plug-in 513ECo 246, 253EDM 482Eingabeprüfung 72Eingangswarteschlange 126, 131Einwegfunktion 42EIS 278EJB � Enterprise JavaBeanEJB, Container 37Endpunkt 409, 410Endpunkt-API 469EndSaveChanges 529

538

Index

Enqueue 27Enqueue-Workprozess 32Enterprise Connector 246, 253Enterprise Information System 278Enterprise JavaBean 34, 37, 434Enterprise Service 425Enterprise Services Repository 406,

420, 421Datentyp 421Service-Interface 422

Enterprise-Application-Projekt 434, 445

Entität 483Datentyp 483Eigenschaften 483Relationen 483

Entitätsmenge anlegen 492Entity

Bean 35Container 483Data Model 482Key 483Objekt 483Set 483, 484Type 483

Ereignis 513Ereignisbehandler 514ESR � Enterprise Services

RepositoryEvent 513Eventhandler 514Execute 528Exportparameter 77, 237, 250, 252,

272, 286Extensible Markup Language � XMLExtensible Stylesheet Language for

Transformations � XSLTextern 174externer Modus 22, 24

F

Fault-Typ 251Fehlerbehandlung 251Firewall 29Fremdschlüsselbeziehung 72Function Builder 76, 78, 89, 139Funktionsbaustein 33, 76, 489

ALE_INPUT_ALEAUD 370

Funktionsbaustein (Forts.)MASTER_IDOC_DISTRIBUTE 369Metadaten 309Parameter 310QIWK_REGISTER 132remotefähiger 84Schnittstelle 77TRFC_QIN_RESTART 132, 204Verbuchung 33

Funktionsgruppe 77, 107Funktionshandler 274

generischer 348registrieren 275

G

Gateway 26, 85, 204Host 88Monitor 94Service 88Service Builder 489

Generic Security Services Application Programming Interface 63

gepoolte Verbindung 230GET 482, 504GET_ENTITY 499, 501GET_ENTITYSET 497, 500getFunctionTemplate 244GetTable() 314GetValue() 310GetXXX-Methode 310Global Assembly Cache (GAC) 295Globally Unique Identifier 323Größenkategorie 72GSS-API V2 63GUID 323GUID-Speicher 357

H

Hash-Funktion 42Hash-Wert 42Helpvalues 161Hook-Methode 36Hostname 23, 24HTMLB 512HTTP 26, 405, 480, 482HTTP Authentication 466Hypertext Transfer Protocol � HTTP

539

Index

I

ICF 104, 488, 493ICF-Recorder 509ICM 26, 104IConnection 286IConnectorGatewayService 285Identität 46IDoc 98, 100, 102, 361

Basistyp 364Bibliothek 391Client 392Datensatz 369Eingangsverarbeitung 362Empfänger 387Erzeugung 366IDOC_INBOUND_ASYNCHRO-

NOUS 99, 387, 401IDocDocument 393IDocFactory 393IDocRepository 392IDoc-Typ 101, 362IDocXMLProcessor 396Kontrollsatz 368, 369, 372mit C# 400mit Java 391Nachverarbeitung 382Nummer 373Segment 362, 393Segmentdefinition 363Segmenttyp 362Server 397Status 373Typ 364, 366, 383Versand 362XML-Verarbeitung 396

IInteraction 287IInteractionSpec 287Implementation Container 433Importparameter 77, 233, 250, 252,

286, 287IN BACKGROUND TASK 119IN UPDATE TASK 78Inbound Queue 126, 131Inbound-Szenario 133infrastrukturelle Sicherheit 40INSERT 33Insert() 316Instanz 24

Integrationclientseitige 512serverseitige 512

Integrität 40, 42Interface � Schnittstelle 393Intermediate Document � IDoc 361Internet Connection Framework 104,

488, 493Internet Connection Framework � ICFInternet Connection Manager 26, 104Internet Information Server 513IRfcAbapObject 318IRfcDataContainer 310, 312, 315IRfcField 313IRfcFunction 300, 310IRfcParameter 311IRfcStructure 312IRfcTable 314IServerSecurityHandler 349ISessionProvider 323, 353ISO-Standard, X.500 45Iterator 239ITransactionIDHandler 353IUnitIDHandler 357IUser 46IUserMaint 46

J

J2EE 34Config-Tool 45Engine 430KeyStore-Service 48

JAAS 61Java 391Java 2 Enterprise Edition � J2EEJava API for XML Web Services 469Java Architecture for XML

Binding 2.0 469Java Authentication and Authorization

Service 61Java Connector � SAP Java ConnectorJava Cryptographic Architecture 47Java Cryptographic Extension 47Java Development Kit 469Java Enterprise Edition 34, 36Java Key Store 60Java Message Service 35Java Native Interface 57, 225

540

Index

Java Server Face 445Java Server Pages 37, 81, 254Java-Bibliothek 249Java-Client 260Java-Connector 253Java-Proxy 441

deployable 445, 463standalone 442, 460

JavaScript 486, 516JavaScript Object Notation � JSONJava-Skeleton 457Java-SOAP-Programmierung 468Java-Stack 19, 34, 37JAXB 2.0 469JAX-WS 469JCE 47JCo-Destination 254JEE 34, 36JEE5 469JEE-KeyStore-Service 48JKS 60JMS 35JNI 57, 225JSON 105, 481, 485, 514JSON-Notationselemente 486JSP 37, 81

K

KeyStore 47, 58KeyStore-Datei, verify.der 48KeyStore-Inhalt

JKS 47PKCS12 47

keytool 47, 58Klasse

generische 254JCo 243

Kommandofeld 22Kommunikation

asynchrone 35Fassade 247Fehler 112

KryptografiePrivate Key 40Provider 47, 58Public Key 40

Kundenauftrag 70

L

Lastverteilung 20, 28, 85, 90, 133, 247

Laufzeitabhängigkeit 267LDAP 44Lebenszyklus 35Lieferantenbestellung 70Link 484Logical Unit of Work 117, 120, 128

DB-LUW 32SAP-LUW 32

Login-Modul 62logischer Port 416, 427, 444logisches System 99, 102, 376, 388,

399, 402Logon

Gruppe 28Ticket 52, 60

LUW � Logical Unit of Work

M

Management 278Mandant 20Massendaten 79, 143Massenverbuchung 79MDB 35Memory Analyzer 39Menüleiste 21MESSAGE 112Message-Driven Bean 35Message-Oriented Middleware 35Message-Server 20, 28, 85Metadaten 244, 270, 392

Container-Metadaten 309Destination 255Dokument 493Element-Metadaten 309

Microsoft Intermediate Language 296Microsoft Visual Studio 293

2005 2932010 293, 472, 522Konsolenanwendung 170vorkompilierter Header 170

Middleware, Schnittstelle 226Model 513Model View Controller 513Modelldaten-Destination 255

541

Index

Model-Provider-Klasse 487, 493Modulpool 81Modus, externer 22, 24MOM 35

N

Nachricht 35Klasse 146Nummer 146Typ 101, 366, 382, 411, 422XML 405

Namenskollision 415Navigation Property 484Navigationspfad 491, 500Nummernkreis

Intervall 76Objekt 75

NWA 48, 466NWDS � SAP NetWeaver Developer

Studio

O

Object Navigator 75, 406, 489Objekttyp 138OData 105, 477, 478, 480, 514

Datenmodell beschreiben 489Modell 518Query 484Service 484Servicekatalog 489, 517

ODataModel 517OData-Query

$filter 485$format 484$inlinecount 485$orderby 485$select 485$skip 484$top 484

OData-Service 477, 487, 493ABAP 487Fehlersuche 509Generierung 492Komponenten 487Modell, technisches 488, 493Service, technischer 488, 493

öffentlicher Schlüssel 41

onCreate 518One-Way-Binding 514onInit 517Open Data Protocol � ODataOpen SQL 37Operation 408

asynchrone 422synchrone 422

Outbound Queue 126, 131Outbound-Szenario 133

P

Package Explorer 282PAI 31Paket 70, 247Paket, Verwendungserklärung 415Parameter

Changing 77einfacher 310Export 77, 237, 250, 252, 286Import 77, 233, 250, 252, 286, 287skalarer 110strukturierter 110Übergabe 89

Partnervereinbarung 376, 377, 378, 389, 391, 402

Passwort 21PBO 31Performance 36Persistenz 35Personal Security Environment � PSEPhoenix 512PKI 44Pluggable Authentication Model 61Port

Default 417logischer 416, 427, 444Nummer 25

PortalRuntime 285POST 482, 503, 504Präsentationsschicht 18Primärschlüssel 483Principal API 45Private-Key-Kryptografie 40privater Schlüssel 41Process After Input 31Process Before Output 31Profil 75

542

Index

Profilparameter 54Programm

ID 88, 275ZSSF_TEST_PSE 68

ProtokollHandler 432Implementierung 432

Provider 425Proxy 233, 393, 433

deployable 460Klasse 246, 251, 287, 415, 443, 469

Prüffeld 71Prüftabelle 71PSE 50, 63

Datei 60individuelles 64zentrales 63

Public-Key-Infrastruktur 44Public-Key-Kryptografie 40Pufferbereich 28Purchase Order 70PUT 482, 507, 508

Q

QIN-Scheduler 132, 204, 338QOUT-Scheduler 128qRFC, SAP .NET Connector 338, 356qRFC-Monitor

für Ausgangswarteschlange 128für Eingangswarteschlange 131

Queue 242Queued RFC 92, 125Queue-Name 338

R

Read 482RecordFactory 287References-Projekt 434Registrierung 208Remote Function Call � RFCremove 522Report 81Repository 243Repository, serverseitiges 269Repository-Management, SAP .NET

Connector 349

Representational State Transfer � REST

Resource-Adapter 278Ressource

Nutzung 26Verbrauch 31

REST 105, 481Adressierbarkeit 481Hypermedia 482Operation 482Repräsentation 482Zustandslosigkeit 482

Return-Parameter 140RFC 26, 84, 107, 277, 489

asynchroner 90, 132Background 93, 133Berechtigung 93Bibliothek 169Client 227Datentyp 234Destination 85, 110, 181Funktionsbaustein 107Gateway 345mit C 167mit C++ 167, 174mit Java 223queued 92, 125, 241registrierter Server 88, 204, 275RfcSendData 210Server 204, 269, 341Serverkonfiguration 345Struktur-Handle 185synchroner 89, 107, 118, 232, 342Tracing 94transaktionaler 91, 119, 122, 192,

240zum Ändern 113zum Anlegen 120zum Löschen 113

RfcBackgroundUnit 338RfcConfigrationParameters 301RfcContainerMetadata 309RfcDestinationManager 301RfcElementMetadata 309RfcFunctionImpl 348RfcServer 345, 358RfcServerFunction 348RfcSessionManager 353RfcTID 323

543

Index

RfcTransaction 324RfcUnitID 338rollback 277ROLLBACK WORK 32, 33, 79, 119Rollbereich 28Route 30Router 182Router-String 30, 248RSS-Feed 481

S

Sales Order 70Sammelsuchhilfe 72SAP .NET Connector 293

Ausnahmebehandlung 316Bibliothek 341IDoc-Programmierung 400IDoc-Sender 402

SAP CRM 18SAP Crypto Toolkit 57SAP Cryptolib 63, 64SAP Enterprise Connector 246, 253SAP ERP 18SAP GUI 19, 20, 25, 28SAP Implementation Guide 101, 488SAP Java Connector 223, 392

Architektur 225, 278Factory-Klasse 231Installation 224JCo.Client 251JCoConnectionData 232JCoContext 230JCoCustomRepository 269JCoDestination 228, 233JCoDestinationManager 228JCoDestinationMonitor 231JCoFieldIterator 239JCoFunction 233, 274JCoFunctionTemplate 244, 270JCoIDocHandlerFactory 397, 398JCoIDocServer 397JCoIDocServerContext 398JCoListMetaData 244, 270JCoMetaData 244JCoParameterList 234JCoRecord 234JCoRepository 233JCoServer 272

SAP Java Connector (Forts.)JCoServerContext 274JCoServerFactory 272, 273JCoServerFunctionHandle 274JCoServerTIDHandler 277, 398JCoTable 235Server 269Session-Management 229Version 224

SAP NetWeaver Administrator 48, 466

SAP NetWeaver Application Server 17, 257, 432ABAP 20, 68Java 34

SAP NetWeaver Composition Environ-ment 36, 254, 420, 447, 469

SAP NetWeaver Developer Studio 17, 224, 246, 281, 430, 513

SAP NetWeaver Gateway 106, 477Central Hub Deployment 478, 479Core-Komponente 478Developer Tool for Visual Studio 522Embedded Deployment 478Fehlerprotokoll 510Testversion 487

SAP NetWeaver Portal 45, 51, 278, 279Applikation 283Connector Framework 278Komponente 282, 284Projekt 282System 280

SAP NetWeaver Process Integration 420

SAP NetWeaver Process Integration, Services Registry 427

SAP NetWeaver RFC SDK 167Beispielprogramme 168Bibliotheksverzeichnis 172bin-Verzeichnis 168Client 175Compiler 169, 171demo-Verzeichnis 168einfacher Parameter 182Exportparameter 184Fehlerbehandlung 176GetRowCount 186Header-Dateien 169

544

Index

SAP NetWeaver RFC SDK (Forts.)IDoc-Programmierung 387IDoc-Sender 389Importparameter 184include-Verzeichnis 169, 171komplexer Client 189Konfigurationseigenschaft 171lib-Verzeichnis 169Linker 169, 171MoveToPreviousRow 186Präprozessordefinition 172qRFC 203Queue-Name 204Repository 208RFC_CONNECTION_HANDLE 179RFC_CONNECTON_PARAMETER

179RFC_ERROR_INFO 179RFC_FUNCTION_HANDLE 179RFC_FUNCTIONDESC_HANDLE

179RFC_ON_CHECK_TID 213RFC_ON_COMMIT 213RFC_ON_CONFIRM_TID 214RFC_ON_ROLLBACK 214RFC_STRUCTURE_HANDLE 185RfcAddNewRow 186RfcAppendNewLine 188RfcAppendNewRow 187RFC-Bibliothek 169RfcCloseConnection 175, 178, 180RfcConfirmTransaction 192, 202RfcCreateFunction 175RfcCreateTransaction 192, 201RfcDeleteAlRows 186RfcDeleteCurrentRow 186RfcDestroyTable 186RfcGetChars 185RfcGetCurrentRow 186, 187, 188RfcGetFunction 180RfcGetFunctionDesc 175, 180RfcGetRowCount 187, 188RfcGetString 184RfcGetStringLength 184RfcGetStructure 185RfcGetTable 186, 188RfcGetTransactionID 192, 201RfcInsertNewRow 186RfcInstallServerFunction 204, 208

SAP NetWeaver RFC SDK (Forts.)RfcInstallTransactionHandlers

213, 215RfcInvoke 175, 180RfcInvokeInTransaction 192, 202RfcListenAndDispatch 204RfcListenDispatch 208RfcMmoveToLastRow 186RfcMoveTo 186RfcMoveToFirstRow 186RfcMoveToNextRow 186, 189RfcOnCheckTransaction 216, 218RfcOnCommitTransaction 216RfcOnConfirmTransaction 217RfcOnRollbackTransaction 217RfcOpenConnection 175, 179RfcRegisterServer 204, 208RfcSetChars 184, 188RfcSubmitTransaction 192, 202Server 204, 205Serverfunktion 209strukturierter Parameter 184Tabellenparameter 186TID-Datei 192TID-Management 193Transaktionshandle 192tRFC-Client 192, 198tRFC-Server 213Verbindungsparameter 180

SAP PLM 18SAP SCM 18SAP SRM 18SAP UI Development Toolkit for

HTML5 � SAPUI5SAP Virtual Machine 38sap.ui.table 518sapgenpse 50, 64SAP-IDoc-Bibliothek 391SAP-Instanz 86SAP-Logon-Ticket 48, 57, 255SAP-Menü 23saprfc.h 176saprfc.ini 180, 181SAP-Router 29, 182SAP-Router-String 248SAPSSOEXT 57SAP-System 24SAPUI5 81, 106, 477, 511, 512

Bibliothek 512

545

Index

SAPUI5 (Forts.)Modell 514

Save 529Scalar Type 483Scheduler

QIN 132, 204, 338QOUT 128

SchlüsselFeld 71kryptografischer 41Management 43öffentlicher 41privater 41

Schnittstelle 17, 393Middleware 226Pattern 422Technologie 81Vereinbarung 36virtuelle 431, 438

Schreibsperre 74, 117SECUDIR 65Secure Network Communication 62Secure Sockets Layer 41SEGW 489SEI 433Selektion 158Selektionsmethode 73Self-Registration 46Separation of Concerns 34, 36Server Manager 345ServerDataProvider 272Server-Proxy 425serverseitiges Repository 269Service Browser 523Service Endpoint Interface 433Service Provider Interface 35Service Registry 455service_SendingRequest 528service_WritingEntity 528Servicedokument 484Service-Explorer 494Service-Interface 422Servicemetadaten 495Service-Metadaten-Dokument 484Services-Datei 25Servlet 37, 81, 260Session Bean 430

stateful 35stateless 35, 436

Session-Cookie 503, 527Session-Management, SAP .NET

Connector 351set-cookie 504SetModel 519setTIDHandler 277SetValue() 310Sicherheit 39

Daten 40hybrides Verfahren 41infrastrukturelle 40Integration 56Management 278Management, SAP .NET Connector

349System 40Transportschicht 62Zugriff 40

Signatur 42Single Point of Access 52Single Sign-on 51Single Stack 18SLD 280, 420SNC 62SNC, PSE-Container 67SOAP 104, 405

Action 412Body 413Envelope 413Header 413

SoftwareKomponente 420Produkt 420

Solution 473Sperre 32, 117

Baustein 74Liste 43Objekt 74Verwaltungs-Workprozess 27

SPI 35Spool-Workprozess 27SPRO 488sRFC 251SSL 41, 62SSO 51stateful 35, 230, 423Stateful Session Bean 35stateless 35, 422, 423Stateless Session Bean 35, 450

546

Index

Statusleiste 23STFC_CONNECTION 352strong-Reference 268Strukturparameter 110, 237Strut 445Suchhilfe 72symmetrisches Verfahren 41synchroner RFC 89, 107System

externes 86Funktionsleiste 22ID 24logisches 99, 102, 376, 388,

399, 402Meldung 23Nummer 24, 86PSE 54Sicherheit 40

System Landscape Directory 280, 420System Landscape, Portal 279, 280system_failure 112Systemfehler 112

T

TabelleBAPIF4T 161interne 187Parameter 78, 235, 237, 250Pflege 72T100 142, 149TBDE 384transparente 70TWPSSO2ACL 53

Table-Control 517TCP 25template 518Tentative-Update-Operation 423Ticketaussteller 51TID � Transaktions-IDTidStore 329, 336Titelleiste 22Tomcat-Webserver 513Transaction Control Protocol 25Transaktion 22, 23

BAPI 97, 148BD51 373BD64 388BD87 381

Transaktion (Forts.)BDBG 382Management 278Modell 189RZ10 54, 65SA16 72SALE 99, 101, 375, 388, 399SBGRFCMON 136SE11 70, 72SE16 72SE37 76, 89SE80 70, 425, 457SICF 104, 510SM30 53, 162SM35 83SM58 119SM59 85, 102, 110, 208, 222, 275,

376, 377, 400SMGW 94, 209SMICM 104SMQ1 129SMQ2 131, 242SMQR 132SMQS 129SNRO 75SOAMANAGER 105, 408, 409, 416,

417, 425, 427, 457SPRO 101SPROXY 425SSO2 54ST05 94ST22 94STRUSTSSO2 49, 52, 54, 67SU01 75SU02 75SU03 75SU21 75SWO 95SWO1 95, 137, 147WE20 379, 380, 400WE30 101, 364WE31 101, 362WE42 374, 380WE57 373WE81 100, 366WE82 101, 366WSADMIN 442WSPUBLISH 427

transaktionaler RFC 91, 119, 122

547

Index

Transaktions-ID 91, 119, 192, 216, 240, 323, 354, 394Datei 217Handler 277Management 241, 276, 336, 398Speicher 354

Transaktionsnummer � Transaktions-ID 394

Transport-Binding 433Transportobjekt 432Trennung von Belangen 34, 36tRFC 213, 353

Client 324, 387Server 387, 400

TRFC_QIN_RESTART 338TRFC_SET_QIN_PROPERTIES 130TU&C/C 423Two-Way-Binding 514

U

UME 44UME, Persistence Manager 45Umgebungsvariable 65Umgebungsvariable, RFC_INI 181Unified Resource Identifier 481Unix-Daemon 88UPDATE 33, 522Update 482UPDATE_ENTITY 507, 508UpdateObject 528URI 481URL-Mapping 261User Data Store 46User Management Engine 44User-Mapping 55

V

Verarbeitungsreihenfolge 92Verbindlichkeit 40, 42Verbindung 286

Aufbau 251direkte 230gepoolte 230Management 278Parameter 248Pool 306Test 209

Verbuchung 141Baustein 78, 116Tabelle 33Workprozess 27, 33

Verschlüsselung 39, 40Verteilungsmodell � ALE-Verteilungs-

modellVertrauensbeziehung 58Vertrauensstellung 44Vertraulichkeit 40View 513, 516virtuelle Maschine 37, 38virtuelles Interface 431, 438Visual Studio � Microsoft Visual

StudioVorgangscode 380

W

weak-Reference 268Web Dynpro 254, 512

ABAP 81, 512Java 37, 81, 254, 446, 512

Web Feed 481Web Service Description Language

� WSDLWeb Services Navigator 440, 455Webbrowser 19Webcontainer 37Web-Modul-Projekt 445Webservice 105, 406

adaptiver 442, 446Administration 409Authentifizierung 466Binding 431Client-Programm 418Consumer 406Datentyp 437Definition 406, 431, 439deployable Proxy 463Endpunkt 406, 409, 410Inside-Out-Ansatz 105, 405, 456Interface 430Konfiguration 431Laufzeit 432mit C# 472mit J2EE 434, 438mit Java 430, 433, 441, 470Navigator 105

548

Index

Webservice (Forts.)Operation 407, 455Outside-In-Ansatz 105, 420, 425,

456Porttyp 466Profil 407Provider 406Schnittstelle 408Standalone-Proxy 463Wizard 406

Wertübergabe 110WFetch 504Windows Management

Instrumentation (WMI) 295Windows-Service 88Workprozess 26, 27WSD 431, 439WSDL 105, 410, 442, 473

Binding 433Datei 410Document-Stil 412RPC-Stil 412

wsgen 469wsimport 469

X

X.500 45x-csrf-token 503, 504XML 396, 514

Nachricht 405Schema Definition Language 411Verarbeitung, IDoc 396

XSLT 396

Z

Zertifikat 43, 63, 67, 432Export 53Import 54X.509 432

Zugriffssicherheit 40Zuständigkeit 36zustandsbehaftet � stateful 35zustandslos � stateless 35

Wir hoffen sehr, dass Ihnen diese Leseprobe gefallen hat. Gerne dürfen Sie diese Leseprobe empfehlen und weitergeben, allerdings nur vollständig mit allen Seiten. Die vorliegende Leseprobe ist in all ihren Teilen urheberrechtlich geschützt. Alle Nutzungs- und Verwertungsrechte liegen beim Autor und beim Verlag.

Teilen Sie Ihre Leseerfahrung mit uns!

Dr.MichaelWegelin ist geschäftsführender Gesellschafter der 10 point software GmbH und für den Bereich ABAP und SAP NetWeaver Process Integration verantwortlich.

Michael Wegelin, Michael Englbrecht

SAP-Schnittstellenprogrammierung548 Seiten, gebunden, 3. Auflage 2014 69,90 €, ISBN 978-3-8362-2675-2

www.sap-press.de/3496

Dipl.-Inf.(FH)MichaelEnglbrecht ist Director NetWeaver Consulting bei der 10 point software GmbH und für den Be-reich Enterprise Java, SAP NetWeaver J2EE/JEE und SAPUI5 verantwortlich.

Wissen aus erster Hand.