Serializzazione di un IDOC in formato XML
Serializzazione di un IDOC in formato XML.
Prima di iniziare
Creare un flusso di messaggi come descritto in Creazione di un flusso di messaggi. Includere un nodo di calcolo nel flusso.
Informazioni su questa attività
È possibile utilizzare il parser XMLNSC per serializzare l'IDoc in un formato XML.
Procedura
- Fare clic con il pulsante destro del mouse sul nodo Compute e fare clic su Open ESQL per aprire il file ESQL nella vista Editor.
- Utilizzare ESQL come nell'esempio seguente:
DECLARE NS1 NAMESPACE 'http://www.ibm.com/xmlns/prod/websphere/j2ca/sapr/sapzsalepr'; CREATE COMPUTE MODULE TestInputRootAmends_ALE_IDoc_Transform -- Recursive procedure to walk through DataObject and build XML CREATE FUNCTION Main() RETURNS BOOLEAN BEGIN -- Reference to the DataObject (from SAP or another source) DECLARE inRef1 REFERENCE TO InputRoot.DataObject.*:SapZsalepr; -- Initialize XMLNSC domain CREATE LASTCHILD OF OutputRoot DOMAIN 'XMLNSC'; DECLARE outRef REFERENCE TO OutputRoot.XMLNSC; -- Create root XML tag (change 'SAPResponse' as needed) CREATE LASTCHILD OF outRef NAME 'SAPResponse'; DECLARE xmlRef REFERENCE TO outRef.SAPResponse; -- Start recursive transformation LOG EVENT VALUES('Calling ConvertToXML ' || FIELDNAME(inRef1)); CALL ConvertToXML(inRef1, xmlRef); RETURN TRUE; END; CREATE PROCEDURE ConvertToXML(IN srcRef REFERENCE, IN tgtRef REFERENCE) BEGIN DECLARE i INTEGER 1; DECLARE fieldRef REFERENCE TO srcRef; DECLARE count INTEGER CARDINALITY(fieldRef.*[]); LOG EVENT VALUES('Child Count is ' || CAST(count AS CHARACTER)|| ' and field name is '|| FIELDNAME(fieldRef)); FOR localFieldRef AS fieldRef.*[] DO DECLARE currentElement REFERENCE TO fieldRef.*[i]; DECLARE fieldName1 CHARACTER FIELDNAME(currentElement); IF ((FIELDTYPE(currentElement) IS NOT NULL) AND (CARDINALITY(currentElement.*[]) > 0)) THEN -- Create a new tag for the nested structure CREATE LASTCHILD OF tgtRef NAME fieldName1; DECLARE nestedXmlRef REFERENCE TO tgtRef.fieldName1; -- Recursive call to process children MOVE nestedXmlRef LASTCHILD; -- Moving to last child so that child elements are created under newly created element CALL ConvertToXML(currentElement, nestedXmlRef); ELSE -- Primitive field (string, number, etc.) CREATE LASTCHILD OF tgtRef NAME fieldName1 VALUE currentElement; END IF; if i > count then LOG EVENT VALUES('Called ConvertToXML loop for more than child count so exiting to avoid infinite loop'); return; end if; SET i = i + 1; END FOR; MOVE tgtRef PREVIOUSSIBLING; -- moving to parent element for scenario when child elements and their childs are created END; END MODULE; - Testare il flusso di messaggi. Negli esempi seguenti vengono forniti un esempio di messaggio IDOC in ingresso e un messaggio XML in uscita.Esempio di messaggio di ingresso:
Esempio di messaggio di uscita:EDI_DC40 1000000000000000002702 3012 ZSALEPR ZSALEPR EMEA ZSALEPSAPRE1 LS RE1_100 OUTBND0006LS ADPTR00006 20150526083752 20150521071512 Z2SALEPRH000 100000000000112700400000100000002DE0100000000000654321 ZNF1ZX2015052600047192052015012620150525GBP 1 PK Z2SALEPRC000 100000000000112700400000200000103 1.000 10.000 Z2SALEPRC000 1000000000001127004000003000001033.000 9.650 Z2SALEPRC000 1000000000001127004000004000001035.000 9.550 Z2SALEPRC000 10000000000011270040000050000010310.000 9.050 Z2SALEPRC000 100000000000112700400000600000103 20.0008.550 Z2SALEPRC000 100000000000112700400000200000103 1.000 10.000 Z2SALEPRC000 1000000000001127004000003000001033.000 9.650 Z2SALEPRC000 1000000000001127004000004000001035.000 9.550 Z2SALEPRC000 10000000000011270040000050000010310.000 9.050 Z2SALEPRC000 100000000000112700400000600000103 20.0008.550<SAPResponse> <SapZsaleprIDocBO> <SapIDocControlRecord> <TABNAM>EDI_DC40</TABNAM> <MANDT>100</MANDT> <DOCNUM>0000000000000002</DOCNUM> <DOCREL>702</DOCREL> <STATUS>30</STATUS> <DIRECT>1</DIRECT> <OUTMOD>2</OUTMOD> <EXPRSS></EXPRSS> <TEST></TEST> <IDOCTYP>ZSALEPR</IDOCTYP> <CIMTYP></CIMTYP> <MESTYP>ZSALEPR</MESTYP> <MESCOD></MESCOD> <MESFCT></MESFCT> <STD></STD> <STDVRS>EMEA</STDVRS> <STDMES>ZSALEP</STDMES> <SNDPOR>SAPRE1</SNDPOR> <SNDPRT>LS</SNDPRT> <SNDPFC></SNDPFC> <SNDPRN>RE1_100</SNDPRN> <SNDSAD></SNDSAD> <SNDLAD></SNDLAD> <RCVPOR>OUTBND0006</RCVPOR> <RCVPRT>LS</RCVPRT> <RCVPFC></RCVPFC> <RCVPRN>ADPTR00006</RCVPRN> <RCVSAD></RCVSAD> <RCVLAD></RCVLAD> <CREDAT>20150526</CREDAT> <CRETIM>083752</CRETIM> <REFINT></REFINT> <REFGRP></REFGRP> <REFMES></REFMES> <ARCKEY></ARCKEY> <SERIAL>20150521071512</SERIAL> </SapIDocControlRecord> <SapZsaleprDataRecord> <SapZsaleprZ2saleprh000> <VKORG>DE01</VKORG> <MATNR>00000000000654321</MATNR> <MTART>ZNF1</MTART> <DISMM>ZX</DISMM> <VKDAB>20150526</VKDAB> <KNUMH>0004719205</KNUMH> <DATAB>20150126</DATAB> <DATBI>20150525</DATBI> <KONWA>GBP</KONWA> <KPEIN>1</KPEIN> <KMEIN>PK</KMEIN> <PRATA></PRATA> <SapZsaleprZ2saleprc000> <KSTBM>1.000</KSTBM> <KBETR>10.000</KBETR> </SapZsaleprZ2saleprc000> <SapZsaleprZ2saleprc000> <KSTBM>3.000</KSTBM> <KBETR>9.650</KBETR> </SapZsaleprZ2saleprc000> <SapZsaleprZ2saleprc000> <KSTBM>5.000</KSTBM> <KBETR>9.550</KBETR> </SapZsaleprZ2saleprc000> <SapZsaleprZ2saleprc000> <KSTBM>10.000</KSTBM> <KBETR>9.050</KBETR> </SapZsaleprZ2saleprc000> <SapZsaleprZ2saleprc000> <KSTBM>20.000</KSTBM> <KBETR>8.550</KBETR> </SapZsaleprZ2saleprc000> </SapZsaleprZ2saleprh000> </SapZsaleprDataRecord> </SapZsaleprIDocBO> </SAPResponse>