cancel
Showing results for 
Search instead for 
Did you mean: 

ABAP mapping

Former Member
0 Kudos

Hi experts,

I am new to SAP PI and was trying to execute ABAP mapping (a simple scenario in it). Below is the code that I have used in the execute method:

REPORT Z_MAPPING_TEST.

**ABAP mapping tests by Michal Krawczyk**

DATA: target_xml type xstring.

DATA: target_xml_string type string.

DATA: PARAMONE TYPE REF TO ZCL_MAPPING_PARAM.

DATA: TRACESTART TYPE REF TO CL_MAPPING_TRACE.

DATA: xms_trace type ref to IF_XMS_TRACE.

DATA: source_xml TYPE xstring.

DATA: LOC_CONV TYPE REF TO CL_ABAP_CONV_IN_CE.

DATA: begin of itab occurs 0,

raw(255) type x,

end of itab .

DATA: sender_service type string.

DATA: receiver_service type string.

DATA: GENERICMAPPING TYPE REF TO data.

DATA: INTERFACEMAP type ref to IF_MAPPING.

FIELD-SYMBOLS: <ref> TYPE any.

CREATE OBJECT PARAMONE.

CREATE OBJECT TRACESTART

EXPORTING

XMS_TRACE = xms_trace.

Parameters: SendSer type MPP_PARAMNAME default 'Sender Service',

RecvSer type MPP_PARAMNAME default 'Receiver Service'.

Parameters: wsfile(128) default 'C:\source.xml'.

Parameters: mapping type SEOCLSNAME default 'Put here your mapping class'.

*your abap mapping mapping

CREATE DATA GENERICMAPPING type ref to (mapping).

ASSIGN GENERICMAPPING->* TO <ref>.

CREATE OBJECT <ref> TYPE (mapping).

INTERFACEMAP ?= <ref>.

sender_service = SendSer.

receiver_service = RecvSer.

CALL FUNCTION 'WS_UPLOAD'

EXPORTING

FILENAME = wsfile

FILETYPE = 'BIN'

TABLES

DATA_TAB = itab

EXCEPTIONS

CONVERSION_ERROR = 1

FILE_OPEN_ERROR = 2

FILE_READ_ERROR = 3

INVALID_TABLE_WIDTH = 4

INVALID_TYPE = 5

NO_BATCH = 6

UNKNOWN_ERROR = 7

OTHERS = 8.

IF SY-SUBRC <> 0.

WRITE: / 'Error Uploading', wsfile, SY-SUBRC.

STOP.

ENDIF.

*setting technical context objects

CALL METHOD PARAMONE->IF_MAPPING_PARAM~SET

EXPORTING

NAME = 'SenderService'

VALUE = sender_service.

CALL METHOD PARAMONE->IF_MAPPING_PARAM~SET

EXPORTING

NAME = 'ReceiverService'

VALUE = receiver_service.

LOOP AT itab.

CONCATENATE source_xml itab-raw INTO source_xml

IN BYTE MODE.

ENDLOOP.

*TRY.

*CALL METHOD INTERFACEMAP->IF_MAPPING~EXECUTE

CALL METHOD INTERFACEMAP->EXECUTE

EXPORTING

SOURCE = source_xml

PARAM = PARAMONE

TRACE = TRACESTART

  • DYNAMIC_CONFIGURATION =

IMPORTING

RESULT = target_xml

.

  • CATCH CX_MAPPING_FAULT .

*ENDTRY.

  • Convert xstring to string

CALL METHOD CL_ABAP_CONV_IN_CE=>CREATE

EXPORTING

INPUT = target_xml

ENCODING = 'UTF-8'

REPLACEMENT = '?'

IGNORE_CERR = ABAP_TRUE

RECEIVING

CONV = LOC_CONV.

TRY.

CALL METHOD LOC_CONV->READ

IMPORTING

DATA = target_xml_string.

CATCH CX_SY_CONVERSION_CODEPAGE.

CATCH CX_SY_CODEPAGE_CONVERTER_INIT.

CATCH CX_PARAMETER_INVALID_TYPE.

CATCH CX_PARAMETER_INVALID_RANGE.

ENDTRY.

write: target_xml_string.

On executing it i only get this as my output:

<?xml version="1.0"?><Persons/>

The data I am providing is this:

<?xml version="1.0" encoding="UTF-8" ?>

-<Persons>

-<Person>

<Fname>Abc</Fname>

<Lname>Xyz</Fname>

<EmpID>123</EmpID>

</Person>

</Persons>

Please let me know where am I going wrong.

Regards

Shivangi

Edited by: ssharma3 on Nov 29, 2010 7:50 AM

Accepted Solutions (0)

Answers (3)

Answers (3)

Former Member
0 Kudos

Hi Shivangi,

Appreciate if you could pleas share your  any contact details bcz I am facining  the similar kind of issue in ABAP mapping and I am stuck dont know how to proceed.

Need your suggestion on a priority.

You can reach me in mrutyunjayt@gmail.com

Regards

Jay

Former Member
0 Kudos

Hi Sharma,

There should something missing in the Mapping program.

Check your mapping using the transaction SXI_MAPPING_TEST. you would be able to identify the issue.

Thanks,

Former Member
0 Kudos

Thanks for your quick response but I tried testing it from here as well but the output I am getting is:

<?xml version="1.0" encoding="utf-8" ?>

Can I check the error in moni? Since when I tried there are no messages related to my scenario.

Thanks

Former Member
0 Kudos

Sharma,

Yes, you can check in Moni.

The issue seems to be in mapping. The root nodes are mapped. Please check it.

Thanks

Former Member
0 Kudos

Can you please provide me a sample code for the correct mapping since I am unable to figure out thye error here.

The sxi_mapping_test transaction gives me a message <SUCCESS>Services Processed Without Error</SUCCESS>

Thanks

Former Member
0 Kudos

Check the below link:

http://saptechnical .com/Tutorials/XI/ABAPMapping/page1.htm

This would give a good idea on ABAP mapping.

Thanks,

Former Member
0 Kudos

Hi Hareen,

I tried excuting my code as given in the blog but the result is the same. Cannot find the error. In the moni I can see the trace as:

<?xml version="1.0" encoding="iso-8859-1" ?>

- <Top>

<First>BeginTrace</First>

<Trace level="1" type="B">CL_MAPPING_XMS_PLSRV3-ENTER_PLSRV</Trace>

<Trace level="2" type="T">......attachment XI_Context not found</Trace>

<Trace level="3" type="T">Mapping is determined</Trace>

<Trace level="1" type="T">No mapping configured</Trace>

<Trace level="1" type="E">CL_MAPPING_XMS_PLSRV3-ENTER_PLSRV</Trace>

</Top>

Thanks

Former Member
Former Member
0 Kudos

I forgot to mention the code in the method. It is as follows:

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 ).

  • 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 ).

  • implements the DOM-generating interface to the parser

IPARSER->PARSE( ).

  • Reading source XML data

DATA: ODOCUMENT TYPE REF TO IF_IXML_DOCUMENT.

DATA: ROOT TYPE REF TO IF_IXML_ELEMENT.

DATA: MSGID TYPE REF TO IF_IXML_ELEMENT.

DATA: PERSON TYPE REF TO IF_IXML_ELEMENT.

DATA: NAME TYPE REF TO IF_IXML_ELEMENT.

DATA: FNAME TYPE REF TO IF_IXML_NODE_COLLECTION.

DATA: LNAME TYPE REF TO IF_IXML_NODE_COLLECTION.

DATA: BDATE TYPE REF TO IF_IXML_NODE_COLLECTION.

DATA: FIRSTNAME TYPE REF TO IF_IXML_NODE.

DATA: LASTNAME TYPE REF TO IF_IXML_NODE.

DATA: BIRTHDATE TYPE REF TO IF_IXML_NODE.

DATA: FULLNAME TYPE STRING.

DATA: STR_FNAME TYPE STRING.

DATA: STR_LNAME TYPE STRING.

DATA: FNAME_ITERATOR TYPE REF TO IF_IXML_NODE_ITERATOR.

DATA: LNAME_ITERATOR TYPE REF TO IF_IXML_NODE_ITERATOR.

DATA: BDATE_ITERATOR TYPE REF TO IF_IXML_NODE_ITERATOR.

DATA: OSTREAM TYPE REF TO IF_IXML_OSTREAM.

DATA: RENDERER TYPE REF TO IF_IXML_RENDERER.

DATA: RC TYPE I.

DATA: LEN TYPE I.

DATA: IDX TYPE I.

FNAME = IDOCUMENT->GET_ELEMENTS_BY_TAG_NAME( 'Fname' ).

LNAME = IDOCUMENT->GET_ELEMENTS_BY_TAG_NAME( 'Lname' ).

BDATE = IDOCUMENT->GET_ELEMENTS_BY_TAG_NAME( 'Birthdate' ).

  • create output document

ODOCUMENT = IXMLFACTORY->CREATE_DOCUMENT( ).

  • create a root node Names

ROOT = ODOCUMENT->CREATE_SIMPLE_ELEMENT(

NAME = 'Persons'

PARENT = ODOCUMENT ).

LEN = FNAME->GET_LENGTH( ).

IDX = 0.

WHILE LEN GT IDX.

IDX = IDX + 1.

  • create iterators to iterate over the data elements

FNAME_ITERATOR = FNAME->CREATE_ITERATOR( ).

LNAME_ITERATOR = LNAME->CREATE_ITERATOR( ).

BDATE_ITERATOR = BDATE->CREATE_ITERATOR( ).

  • create element 'Person' and add it to the output document

PERSON = ODOCUMENT->CREATE_SIMPLE_ELEMENT(

NAME = 'Person'

PARENT = ROOT ).

FIRSTNAME = FNAME_ITERATOR->GET_NEXT( ).

LASTNAME = LNAME_ITERATOR->GET_NEXT( ).

BIRTHDATE = BDATE_ITERATOR->GET_NEXT( ).

STR_FNAME = FIRSTNAME->GET_VALUE( ).

STR_LNAME = LASTNAME->GET_VALUE( ).

CONCATENATE STR_FNAME STR_LNAME INTO FULLNAME SEPARATED BY SPACE.

  • create element 'Name' and add it to the output document

NAME = ODOCUMENT->CREATE_SIMPLE_ELEMENT(

NAME = 'Name'

VALUE = FULLNAME

PARENT = PERSON ).

  • create element 'Birthdate' and add it to the output document

RC = PERSON->APPEND_CHILD( BIRTHDATE ).

ENDWHILE.

  • create output stream

OSTREAM = STREAMFACTORY->CREATE_OSTREAM_XSTRING( RESULT ).

  • create renderer

RENDERER = IXMLFACTORY->CREATE_RENDERER(

OSTREAM = OSTREAM

DOCUMENT = ODOCUMENT ).

RC = RENDERER->RENDER( ).

ENDMETHOD.