Code: Alles auswählen.
DATA BEGIN OF selection_data.
DATA: bestellnr TYPE ebeln,
posting_date TYPE budat,
doc_date TYPE bldat,
ref_doc_no TYPE xblnr,
matnr TYPE matnr,
lifnr TYPE elifn,
gm_code TYPE gm_code,
plant TYPE werks_d,
lgort TYPE lgort_d,
move_type TYPE bwart,
entry_qnt TYPE erfmg,
position_no TYPE ebelp,
mvt_ind TYPE kzbew.
DATA END OF selection_data.
MOVE server->request->get_data( ) TO xml_in.
CASE server->request->get_method( ).
WHEN 'GET'.
WHEN 'POST'.
CALL TRANSFORMATION z_mm_we_rest_xml
SOURCE XML xml_in
RESULT output = selection_data.
Code: Alles auswählen.
<xml>
<bestellnr>1234</bestellnr>
<posting_date>2025-03-24</posting_date>
<doc_date>2025-03-24</doc_date>
<ref_doc_no>TEST</ref_doc_no>
<matnr>12345</matnr>
<lifnr>1234</lifnr>
<gm_code>01</gm_code>
<plant>1234</plant>
<lgort>1234</lgort>
<move_type>101</move_type>
<entry_qnt>1111</entry_qnt>
<position_no>00010</position_no>
<mvt_ind>B</mvt_ind>
</xml>
Code: Alles auswählen.
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<OUTPUT>
<BESTELLNR>
<xsl:value-of select="*//bestellnr"/>
</BESTELLNR>
<POSTING_DATE>
<xsl:value-of select="*//posting_date"/>
</POSTING_DATE>
<DOC_DATE>
<xsl:value-of select="*//doc_date"/>
</DOC_DATE>
<REF_DOC_NO>
<xsl:value-of select="*//ref_doc_no"/>
</REF_DOC_NO>
<MATNR>
<xsl:value-of select="*//matnr"/>
</MATNR>
<LIFNR>
<xsl:value-of select="*//lifnr"/>
</LIFNR>
<GM_CODE>
<xsl:value-of select="*//gm_code"/>
</GM_CODE>
<PLANT>
<xsl:value-of select="*//plant"/>
</PLANT>
<LGORT>
<xsl:value-of select="*//lgort"/>
</LGORT>
<MOVE_TYPE>
<xsl:value-of select="*//move_type"/>
</MOVE_TYPE>
<ENTRY_QNT>
<xsl:value-of select="*//entry_qnt"/>
</ENTRY_QNT>
<POSITION_NO>
<xsl:value-of select="*//position_no"/>
</POSITION_NO>
<MVT_IND>
<xsl:value-of select="*//mvt_ind"/>
</MVT_IND>
</OUTPUT>
</asx:values>
</asx:abap>
</xsl:template>
</xsl:transform>
Soweit ich REST bisher immer verstanden hab, geht es hierbei darum den "Stand" des Endpoints via API Call abzufragen und ihn zu liefern. Das kann entweder anonym (ohne irgendwelche Eingabeparameter passieren also quasi ein SELECT * FROM dbTab) oder für spezifische Kriterien passieren. Also ich kann die REST API aufrufen mit einer Belegnummer und bekomm dann die Daten *zu* dieser Nummer geliefert (Kundenaufträge, Umsatz, ...). Wenn ich jetzt erst ein komplexes Objekt in eine REST API reinschiebe damit mir die REST API das ummodelt und in anderer Form wieder ausgibt ist das (meines Verständnisses nach) kein REST mehr sondern *irgendwas anderes* 😅 Falls ich dich dahingehend missverstanden habe gerne Korrektur.über die REST-Schnittstelle von SAP eine XML-Datei in SAP verarbeiten und die verarbeiteten Daten danach wieder über die Schnittstelle ausgeben.
Also wenn du eine ein einziges Datenobjekt (als XML) an die API schickst funktioniert alles aber wenn du eine (im .NET Sprech) Collection von einzelnen Objekten schickst schmiert dir die Anwendung ab. Oder? Oder schickst du innerhalb kurzer Zeit immer wieder einzelne Objekte hin woraurf dir der Endpoint absemmelt?Wenn jetzt aber der Datenblock öfter in der XML-Datei vorkommen [...]
Ich habe das mal gemacht und eine 3 zeilige Tabelle mir in der XML ausgeben lassen. Dann ist die XML wie folgt aufgebaut:a-dead-trousers hat geschrieben: ↑24.03.2025 15:10Ein kleiner Tipp meinerseits: Wenn du die Transformation testweise einmal genau anders herum aufrufst (also die Strukturierte Tabelle als Source) und das Ergebnis in einen String schreibst (und eventuell als Datei ablegst), kannst du dir den korrekten Aufbau des asAXL-Formats anschauen und für deine eigentliche Transformation als Spickzettel nutzen.
Code: Alles auswählen.
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<OUTPUT>
<item>
<BESTELLNR>1234</BESTELLNR>
<POSTING_DATE>2025-03-24</POSTING_DATE>
<DOC_DATE>2025-03-24</DOC_DATE>
<REF_DOC_NO>TEST</REF_DOC_NO>
<MATNR>12345</MATNR>
<LIFNR>1234</LIFNR>
<GM_CODE>01</GM_CODE>
<PLANT>1111</PLANT>
<LGORT>1111</LGORT>
<MOVE_TYPE>101</MOVE_TYPE>
<ENTRY_QNT>1111.0</ENTRY_QNT>
<POSITION_NO>00010</POSITION_NO>
<MVT_IND>B</MVT_IND>
</item>
<item>
<BESTELLNR>1234</BESTELLNR>
<POSTING_DATE>2025-03-24</POSTING_DATE>
<DOC_DATE>2025-03-24</DOC_DATE>
<REF_DOC_NO>TEST</REF_DOC_NO>
<MATNR>12345</MATNR>
<LIFNR>1234</LIFNR>
<GM_CODE>01</GM_CODE>
<PLANT>1111</PLANT>
<LGORT>1111</LGORT>
<MOVE_TYPE>101</MOVE_TYPE>
<ENTRY_QNT>1111.0</ENTRY_QNT>
<POSITION_NO>00010</POSITION_NO>
<MVT_IND>B</MVT_IND>
</item>
<item>
<BESTELLNR>1234</BESTELLNR>
<POSTING_DATE>2025-03-24</POSTING_DATE>
<DOC_DATE>2025-03-24</DOC_DATE>
<REF_DOC_NO>TEST</REF_DOC_NO>
<MATNR>12345</MATNR>
<LIFNR>1234</LIFNR>
<GM_CODE>01</GM_CODE>
<PLANT>1111</PLANT>
<LGORT>1111</LGORT>
<MOVE_TYPE>101</MOVE_TYPE>
<ENTRY_QNT>1111.0</ENTRY_QNT>
<POSITION_NO>00010</POSITION_NO>
<MVT_IND>B</MVT_IND>
</item>
</OUTPUT>
</asx:values>
</asx:abap>
Code: Alles auswählen.
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<OUTPUT>
<ITEM>
<BESTELLNR>
<xsl:value-of select="*//bestellnr"/>
</BESTELLNR>
<POSTING_DATE>
<xsl:value-of select="*//posting_date"/>
</POSTING_DATE>
<DOC_DATE>
<xsl:value-of select="*//doc_date"/>
</DOC_DATE>
<REF_DOC_NO>
<xsl:value-of select="*//ref_doc_no"/>
</REF_DOC_NO>
<MATNR>
<xsl:value-of select="*//matnr"/>
</MATNR>
<LIFNR>
<xsl:value-of select="*//lifnr"/>
</LIFNR>
<GM_CODE>
<xsl:value-of select="*//gm_code"/>
</GM_CODE>
<PLANT>
<xsl:value-of select="*//plant"/>
</PLANT>
<LGORT>
<xsl:value-of select="*//lgort"/>
</LGORT>
<MOVE_TYPE>
<xsl:value-of select="*//move_type"/>
</MOVE_TYPE>
<ENTRY_QNT>
<xsl:value-of select="*//entry_qnt"/>
</ENTRY_QNT>
<POSITION_NO>
<xsl:value-of select="*//position_no"/>
</POSITION_NO>
<MVT_IND>
<xsl:value-of select="*//mvt_ind"/>
</MVT_IND>
</ITEM>
</OUTPUT>
</asx:values>
</asx:abap>
</xsl:template>
</xsl:transform>
Code: Alles auswählen.
<xml>
<item>
<bestellnr>1234</bestellnr>
<posting_date>2025-03-24</posting_date>
<doc_date>2025-03-24</doc_date>
<ref_doc_no>TEST1</ref_doc_no>
<matnr>12345</matnr>
<lifnr>1234</lifnr>
<gm_code>01</gm_code>
<plant>1111</plant>
<lgort>1111</lgort>
<move_type>101</move_type>
<entry_qnt>1111</entry_qnt>
<position_no>00010</position_no>
<mvt_ind>B</mvt_ind>
</item>
<item>
<bestellnr>1234</bestellnr>
<posting_date>2025-03-24</posting_date>
<doc_date>2025-03-24</doc_date>
<ref_doc_no>TEST2</ref_doc_no>
<matnr>12345</matnr>
<lifnr>1234</lifnr>
<gm_code>01</gm_code>
<plant>1111</plant>
<lgort>1111</lgort>
<move_type>101</move_type>
<entry_qnt>1111</entry_qnt>
<position_no>00010</position_no>
<mvt_ind>B</mvt_ind>
</item>
<item>
<bestellnr>1234</bestellnr>
<posting_date>2025-03-24</posting_date>
<doc_date>2025-03-24</doc_date>
<ref_doc_no>TEST3</ref_doc_no>
<matnr>12345</matnr>
<lifnr>1234</lifnr>
<gm_code>01</gm_code>
<plant>1111</plant>
<lgort>1111</lgort>
<move_type>101</move_type>
<entry_qnt>1111</entry_qnt>
<position_no>00010</position_no>
<mvt_ind>B</mvt_ind>
</item>
</xml>
Code: Alles auswählen.
MOVE server->request->get_data( ) TO xml_in.
CASE server->request->get_method( ).
WHEN 'GET'.
WHEN 'POST'.
CALL TRANSFORMATION z_mm_we_rest_xml
SOURCE XML xml_in
RESULT output = gt_selection_data.
CALL TRANSFORMATION id
SOURCE output = gt_selection_data
RESULT XML xml_out.
server->response->set_data( xml_out ).
Code: Alles auswählen.
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<OUTPUT>
<item>
<BESTELLNR>1234</BESTELLNR>
<POSTING_DATE>2025-03-24</POSTING_DATE>
<DOC_DATE>2025-03-24</DOC_DATE>
<REF_DOC_NO>TEST1</REF_DOC_NO>
<MATNR>12345</MATNR>
<LIFNR>1234</LIFNR>
<GM_CODE>01</GM_CODE>
<PLANT>1111</PLANT>
<LGORT>1111</LGORT>
<MOVE_TYPE>101</MOVE_TYPE>
<ENTRY_QNT>1111.0</ENTRY_QNT>
<POSITION_NO>00010</POSITION_NO>
<MVT_IND>B</MVT_IND>
</item>
</OUTPUT>
</asx:values>
</asx:abap>
Also letztendlich schicke ich per Curl Aufruf über PowerShell meine XML Datei an SAP. Da sind jetzt eben paar Daten drin die verarbeitet werden sollen. Es gibt mir das nicht in anderer Form aus sondern verarbeitet die Daten. Zum Testen schicke ich mir die Daten die ich rein gebe meistens wieder zurück um zu sehen ob das Einlesen schonmal funktioniert. Für einfache Abfragen wie ich schicke Daten zu einer Bestellnummer und lasse mir zugehörige Daten zurück geben ist das kein Problem. Da ich nur einen Datenblock an SAP übergebe. Da ich aber jetzt mehrere Daten an SAP auf einmal übergeben möchte, da ich diese Daten in meinem Code verbuchen möchte, stoße ich auf das Problem, dass ich mehrere Datenblöcke verarbeiten möchte. Nun könnte ich natürlich die Transformation so erweitern, dass 3 Datenblöcke statt 1 Datenblock erkannt wird, aber dann wäre das ja nicht dynamisch. Da ich im Voraus nicht weiß wie groß die XML ist, soll das eben dynamisch funktionieren und dann eben beim Einlesen in eine Tabelle gespeichert werden.Radinator hat geschrieben: ↑24.03.2025 15:07
Soweit ich REST bisher immer verstanden hab, geht es hierbei darum den "Stand" des Endpoints via API Call abzufragen und ihn zu liefern. Das kann entweder anonym (ohne irgendwelche Eingabeparameter passieren also quasi ein SELECT * FROM dbTab) oder für spezifische Kriterien passieren. Also ich kann die REST API aufrufen mit einer Belegnummer und bekomm dann die Daten *zu* dieser Nummer geliefert (Kundenaufträge, Umsatz, ...). Wenn ich jetzt erst ein komplexes Objekt in eine REST API reinschiebe damit mir die REST API das ummodelt und in anderer Form wieder ausgibt ist das (meines Verständnisses nach) kein REST mehr sondern *irgendwas anderes* 😅 Falls ich dich dahingehend missverstanden habe gerne Korrektur.
Code: Alles auswählen.
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="/">
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<OUTPUT>
<xsl:apply-templates select="item"/>
</OUTPUT>
</asx:values>
</asx:abap>
</xsl:template>
<xsl:template match="item">
<ITEM>
<BESTELLNR>
<xsl:value-of select="bestellnr"/>
</BESTELLNR>
<POSTING_DATE>
<xsl:value-of select="posting_date"/>
</POSTING_DATE>
<DOC_DATE>
<xsl:value-of select="doc_date"/>
</DOC_DATE>
<REF_DOC_NO>
<xsl:value-of select="ref_doc_no"/>
</REF_DOC_NO>
<MATNR>
<xsl:value-of select="matnr"/>
</MATNR>
<LIFNR>
<xsl:value-of select="lifnr"/>
</LIFNR>
<GM_CODE>
<xsl:value-of select="gm_code"/>
</GM_CODE>
<PLANT>
<xsl:value-of select="plant"/>
</PLANT>
<LGORT>
<xsl:value-of select="lgort"/>
</LGORT>
<MOVE_TYPE>
<xsl:value-of select="move_type"/>
</MOVE_TYPE>
<ENTRY_QNT>
<xsl:value-of select="entry_qnt"/>
</ENTRY_QNT>
<POSITION_NO>
<xsl:value-of select="position_no"/>
</POSITION_NO>
<MVT_IND>
<xsl:value-of select="mvt_ind"/>
</MVT_IND>
</ITEM>
</xsl:template>
</xsl:transform>
Code: Alles auswählen.
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
<asx:values>
<OUTPUT/>
</asx:values>
</asx:abap>
Damit klappts. Danke :)a-dead-trousers hat geschrieben: ↑25.03.2025 10:03Wenn das nicht klappt ginge auch noch //item bzw. *//item
Ja der xml-Knoten ist der oberste Knoten.a-dead-trousers hat geschrieben: ↑25.03.2025 10:03EDIT: Ist der xml-Knoten wirklich der oberste (Root-) Knoten in deinem XML-Dokument oder ist darüber noch eine Notation, die du in deinem Beispiel weggelassen hast?
Code: Alles auswählen.
<xsl:apply-templates select="xml/item"/>
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Julia.hrtm