
ABAP-Mappings sind Mapping-Programme in ABAP Objects, die Kunden mit der ABAP Workbench implementieren können.
Beachten Sie unbedingt die Voraussetzungen in den Abschnitten Einsatzmöglichkeiten und Integration , sowie die Einschränkungen unter Mapping-Entwicklung mit der ABAP Workbench .
Ein ABAP-Mapping besteht aus einer ABAP-Klasse, die das Interface IF_MAPPING im Paket SAI_MAPPING implementiert. Das Interface hat eine Methode EXECUTE mit folgender Signatur:
Exporting Parameter
Parameter |
Bedeutung |
SOURCE ( Typ XSTRING ) |
Quell-XML-Dokument |
PARAM ( Typ Ref To IF_MAPPING_PARAM ) |
Parameter-Objekt für lesenden Zugriff auf Laufzeit-Konstanten (siehe unten). |
TRACE ( Typ Ref To IF_MAPPING_TRACE ) |
Trace-Objekt, mit dem Sie Meldungen in den Mapping-Trace schreiben können (siehe unten). |
Exporting-Parameter
Parameter |
Bedeutung |
RESULT ( Typ XSTRING ) |
Ziel-XML-Dokument |
Ausnahme:CX_MAPPING_FAULT
Anwendungen können innerhalb der Methode EXECUTE selbst entscheiden, auf welche Weise sie das Quell-XML-Dokument einlesen und verändern. Wenn Sie den XSLT-Prozessor des SAP Web AS nutzen wollen, können Sie anstelle von ABAP-Mappings auch direkt ein Stylesheet mit der ABAP Workbench entwickeln (siehe XSLT-Mappings (ABAP Engine) ).
Mapping Trace
Mit dem Trace-Objekt können Sie Meldungen in den Mapping-Trace schreiben, den Sie sich im Message-Monitoring anschauen können. Bei Verwendung der Methode TRACE geben Sie dazu den Trace-Level und die auszugebende Meldung an:
Trace-Level |
Bedeutung |
0 |
Es wird kein Trace geschrieben |
1 |
Ausgabe von Warnungen |
2 |
Ausgabe von Warnungen und Fehlerinformationen |
3 |
Ausgabe von Warnungen, Fehler- und Debugging-Informationen |
Alternativ können Sie mit den Methoden TRACE1 , TRACE2 oder TRACE3 verwenden, um Meldungen für Trace-Level 1, 2 oder 3 in den Trace zu schreiben.
Welche Meldungen im Monitoring erscheinen hängt davon ab, welcher Trace-Level für eine Pipeline der Integration Engine eingestellt wurde.
Laufzeit-Konstanten
Im ABAP-Mapping kann lesend auf Felder des Message-Headers zugegriffen werden. Hierzu wird der EXECUTE -Methode ein Objekt vom Typ IF_MAPPING_PARAM übergeben. Das Interface hat Konstanten für die Namen der verfügbaren Parameter, sowie eine Methode GET , die zum Parameternamen den jeweiligen Wert liefert. Die Konstanten sind die gleichen wie in der Java-Mapping-API (SAP NetWeaver 2004 und 7.0) , wobei es die Konstante MAPPING_TRACE nicht für ABAP-Mappings gibt. Das Trace-Objekt wird statt dessen direkt über den Parameter TRACE der Methode IF_MAPPING~EXECUTE übergeben (siehe oben).
Beispiel: Zugriff auf eine Laufzeit-Konstante
Method IF_MAPPING~EXECUTE. * Get mapping constant SENDER_SERVICE data: l_sender_service type string.l_sender_service = param->get( IF_MAPPING_PARAM=>SENDER_SERVICE ). ENDMETHOD. |
Das folgende Beispiel zeigt wie Sie ein ABAP-Mapping mit Hilfe des iXML-Parsers durchführen. Es soll das folgende XML-Dokument umgesetzt werden:
Ausgangs-Payload einer an den Integration Server gesendeten Message
<?xml version="1.0" encoding="UTF-8"?><ns0:BookingOrders xmlns:ns0="http://sap.com/test/ABAPMapping"> <Order> <BookingCode>2KY34R</BookingCode> <Passenger> <Name>Smith</Name> <Address>123 Main St.</Address> </Passenger> <Flight> <Date>04042004</Date> <AirlineID>SX</AirlineID> <FlightNumber>21</FlightNumber> <From>ZRH</From> <To>FRA</To> </Flight> <Flight> <Date>04042004</Date> <AirlineID>LH</AirlineID> <FlightNumber>4025</FlightNumber> <From>FRA</From> <To>LAS</To> </Flight> <Flight> <Date>04042004</Date> <AirlineID>UA</AirlineID> <FlightNumber>128</FlightNumber> <From>LAS</From> <To>SFO</To> </Flight> </Order> </ns0:BookingOrders> |
Diese Ausgangs-Payload soll über das folgende ABAP-Mapping-Programm verabeitet werden:
ABAP-Mapping-Programm
method IF_MAPPING~EXECUTE. * initialize iXML type-pools:ixml. class cl_ixml definition load. * create main factory data:ixmlfactory type ref to if_ixml. ixmlfactory = cl_ixml=>create(). * create stream factory data:streamfactory type ref to if_ixml_stream_factory. streamfactory = ixmlfactory->create_stream_factory( ). * create input stream data:istream type ref to if_ixml_istream. istream = streamfactory->create_istream_xstring( source ). * parse input document ============================================== * initialize input document data:idocument type ref to if_ixml_document. idocument = ixmlfactory->create_document( ). * parse input document data:iparser type ref to if_ixml_parser. iparser = ixmlfactory->create_parser( stream_factory = streamfactory istream = istream document = idocument ). iparser->parse(). * get message content of tag <BookingCode> data:incode type ref to if_ixml_node_collection. incode = idocument->get_elements_by_tag_name( 'BookingCode' ). * get XI header data (here:"Sender Service") data:l_sender_service type string. l_sender_service = param->get( if_mapping_param=>sender_service ). * add trace (appears in message monitoring) data:l_trace type string. concatenate 'Sender Service = ' l_sender_service into l_trace. trace->trace( level = '1' message = l_trace ). * build up output document ========================================== * create output document data:odocument type ref to if_ixml_document. odocument = ixmlfactory->create_document( ). * create element 'SenderService' and add it to the document data:msgtype type ref to if_ixml_element. msgtype = odocument->create_simple_element( name = 'MsgOut' parent = odocument ). * create element 'SenderService' and add it to the output document data:elementsender type ref to if_ixml_element. elementsender = odocument->create_simple_element( name = 'SenderService' value = l_sender_service parent = msgtype ). * add node to the output document data:outcode type ref to if_ixml_node. outcode = incode->get_item( index = 0 ). data irc type i. irc = msgtype->append_child( outcode ). * render document =================================================== * create output stream data:ostream type ref to if_ixml_ostream. ostream = streamfactory->create_ostream_xstring( result ). * create renderer data:renderer type ref to if_ixml_renderer. renderer = ixmlfactory->create_renderer( ostream = ostream document = odocument ). irc = renderer->render( ). endmethod. |
Ziel-Payload nach der Ausführung des ABAP-Mapping-Programms
<?xml version="1.0" ?> <MsgOut> <SenderService>Test_ABAP_Mapping_BS</SenderService> <BookingCode>2KY34R</BookingCode> </MsgOut> |