cancel
Showing results for 
Search instead for 
Did you mean: 

Message Mapping

Former Member
0 Kudos

Xi Gurus,

In message mapping
my source structure is as below
O1   -- order number 1
E1   -- Ean Number ( one detail record)
O1    -- order number1
E2   (one detail record for E2)
E2
E3  (one detail records for E3)
O2  -- order number 2
E4  (one detail record for E4)
E5 (one detail record for E5)
E5 

the target will be
<01>
E1
E2
E3
<01>
<02>
E4
E5
<O2>

Under a order number,detail records to be created based on number of Ean numbers

If any 2 ean numbers are same then only one detail record to be created for that ean number

How can i go forward on this, Please help.

Thanks

Srinivas

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Srinivas,

Source structure is confusing. Can you put an example payload and output expected.

If any 2 ean numbers are same then only one detail record to be created for that ean number : For this you can use eAN --> SplitbyValue(Value change), so only if their is value change in EAN then it will create or else it will not create.

Regards,

---Satish

Former Member
0 Kudos

Satish

Thanks for your response.

here are my source and target structures

row>
<ordernumber1>
<EAN1>
<row>
<row>
<ordernumber1>
<EAN1>
<row>
<row>
<ordernumber1>
<EAN2>
<row>
<row>
<ordernumber2>
<EAN3>
<row>
<row>
<ordernumber2>
<EAN4>
<row>
<row>

then the target must be as below
<header>
<ordernumber1>
<product net price>20<product net price>
<itemEAN1>
<itemEAN2>
<header>
 
<header>
<ordernumber2>
<itemEAN3>
<itemEAN4>
<header>

For ordernumber 1 it contains EAN1 EAN1 and EAN2

in the target for the ordernumber, there must be only one EAN1 item record and one EAN2 item record

Thanks

Srinivas

Former Member
0 Kudos

Map like this Srinivas:

For Header: ordernumber (change context to root) --> Splitbyvalue (valuechange) --> collapsecontext --> header

For ordernumber: ordernumber(change context to root) --> Splitbyvalue (valuechange) --> ordernumber

For Item: ordernumber(change context to root) --> Splitbyvalue (valuechange) --> item

For EAN: ean --> ean

Then your test case should work.

If your input payload is:

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

<ns0:sourcesrinvias xmlns:ns0="http://demo">

<row>

<ordernumber>576881</ordernumber>

<EAN>L0257100</EAN>

</row>

<row>

<ordernumber>576881</ordernumber>

<EAN>L0257200</EAN>

</row>

<row>

<ordernumber>576881</ordernumber>

<EAN>PPPPP</EAN>

</row>

<row>

<ordernumber>576882</ordernumber>

<EAN>36544E</EAN>

</row>

</ns0:sourcesrinvias>

Then your target payload will be:

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

<ns0:targetsrinivas xmlns:ns0="http://demo"><header><ordernumber>576881</ordernumber><Item><EAN>L0257100</EAN></Item><Item><EAN>L0257200</EAN></Item><Item><EAN>PPPPP</EAN></Item></header><header><ordernumber>576882</ordernumber><Item><EAN>36544E</EAN></Item></header></ns0:targetsrinivas>

Regards,

---Satish

Former Member
0 Kudos

satish,

sorry for the typo

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

<ns0:sourcesrinvias xmlns:ns0="http://demo">

<row>

<ordernumber>576881</ordernumber>

<EAN>L0257100</EAN>

</row>

<row>

<ordernumber>576881</ordernumber>

<EAN>L0257100</EAN>

</row>

<row>

<ordernumber>576881</ordernumber>

<EAN>PPPPP</EAN>

</row>

<row>

<ordernumber>576882</ordernumber>

<EAN>36544E</EAN>

</row>

</ns0:sourcesrinvias>

EAN L0257100 occurs 2 times for a ordernumber1,

and the target must be as below

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

<ns0:targetsrinivas xmlns:ns0="http://demo"><header><ordernumber>576881</ordernumber><Item><EAN>L0257100</EAN></Item><Item><EAN>PPPPP</EAN></Item></header><header><ordernumber>576882</ordernumber><Item><EAN>36544E</EAN></Item></header></ns0:targetsrinivas>

Regards

Srinivas

Former Member
0 Kudos

Any updates...Please help.

Former Member
0 Kudos

Srini,

Why are you getting duplicate entires into XI? What is the source. If you are picking the file say to legacy users about this. They should get rid of this easily rather than making complicaitons on our end. If source is database then your query should not pick duplicates.

Anywas even if you get you may need a user defined funciton to check this.

Regards,

---Satish

Former Member
0 Kudos

Hi Srivas

Use this functions

Header = Change the context (source)--> Split Value(change) and collapse context

order number = Change the context (source)--> Split Value(change) and collapse context -- Split Value(each value)

item segment = i think you should be use a UDF , these values are repeat , comes from source , is it correct?

EAN = EAN (source)

This is Paylod Result..

Former Member
0 Kudos

Luis/Satish

Thanks for reply

if UDF must be used, can you post the UDF code for it.

REgards

Srinivas

Former Member
0 Kudos

Please help

Former Member
0 Kudos

Use this functions

Header = Change the context (source)--> Split Value(change) and collapse context

order number = Change the context (source)--> Split Value(change) and collapse context -- Split Value(each value)

item segment = UDF (see beelow)

--Use two arguments ProductEANNumber and OrderNumber both change the contexto to root.

//Try to use


 String repeat01  = ""; String repeat02  = "";

 for  (int i = 0 ; i < val01.length ; i++) {
   if (!val02<i>.equals(repeat02) && !repeat02.equals("") )  {
		result.addValue(ResultList.CC);
		repeat01 = "";      
	}
	repeat02 = val02<i>;
	if (!val01<i>.equals(repeat01)) {
                        result.addValue(val01<i>);
                        repeat01 = val01<i>;
    }
}

EAN = Use the same function and after use Split By Value

Former Member
0 Kudos

Hi Luis,

Thanks for your help

i used the same code in the UDF

public String ProductEANNumber(String val01,String val02,Container container){
String repeat01  = " "; String repeat02  = " ";
 
 for  (int i = 0 ; i < val01.length ; i++) {
   if (!val02<i>.equals(repeat02) && !repeat02.equals(" ") )  {
		result.addValue(ResultList.CC);
		repeat01 = " ";      
	}
	repeat02 = val02<i>;
	if (!val01<i>.equals(repeat01) ) {
                        result.addValue(val01<i>);
                        repeat01 = val01<i>;
    }
}

but iam getting errors

usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Mapf5fc8fd0662011de8ea2001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:509: cannot resolve symbol symbol : variable length location: class java.lang.String for (int i = 0 ; i < val01.length ; i++) { ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Mapf5fc8fd0662011de8ea2001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:510: array required, but java.lang.String found if (!val02<i>.equals(repeat02) && !repeat02.equals(" ") ) { ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Mapf5fc8fd0662011de8ea2001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:511: cannot resolve symbol symbol : variable result location: class com.sap.xi.tf._MM_CRS_EBRAND_ result.addValue(ResultList.CC); ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Mapf5fc8fd0662011de8ea2001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:514: array required, but java.lang.String found repeat02 = val02<i>; ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Mapf5fc8fd0662011de8ea2001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:515: array required, but java.lang.String found if (!val01<i>.equals(repeat01) ) { ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Mapf5fc8fd0662011de8ea2001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:516: array required, but java.lang.String found result.addValue(val01<i>); ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Mapf5fc8fd0662011de8ea2001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:516: cannot resolve symbol symbol : variable result location: class com.sap.xi.tf._MM_CRS_EBRAND_ result.addValue(val01<i>); ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Mapf5fc8fd0662011de8ea2001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:517: array required, but java.lang.String found repeat01 = val01<i>;

Please suggest me how to proceed.

Thanks

Srinivas

Edited by: Srinivas on Jul 1, 2009 5:33 AM

Former Member
0 Kudos

Hi Luis

Thanks for your reply

i used the same code in udf as you have given

public String ProductEANNumber(String val01,String val02,Container container){
   //write your code here
String repeat01  = " "; String repeat02  = " ";
 
 for  (int i = 0 ; i < val01.length ; i++) {
   if (!val02<i>.equals(repeat02) && !repeat02.equals(" ") )  {
		result.addValue(ResultList.CC);
		repeat01 = " ";      
	}
	repeat02 = val02<i>;
	if (!val01<i>.equals(repeat01) ) {
                        result.addValue(val01<i>);
                        repeat01 = val01<i>;
    }
}

but iam getting following errors,Please suggest how to proceed

usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Map1cea4fe0662311de8f94001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:509: cannot resolve symbol symbol : variable length location: class java.lang.String for (int i = 0 ; i < val01.length ; i++) { ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Map1cea4fe0662311de8f94001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:510: array required, but java.lang.String found if (!val02<i>.equals(repeat02) && !repeat02.equals(" ") ) { ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Map1cea4fe0662311de8f94001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:511: cannot resolve symbol symbol : variable result location: class com.sap.xi.tf._MM_CRS_EBRAND_ result.addValue(ResultList.CC); ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Map1cea4fe0662311de8f94001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:514: array required, but java.lang.String found repeat02 = val02<i>; ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Map1cea4fe0662311de8f94001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:515: array required, but java.lang.String found if (!val01<i>.equals(repeat01) ) { ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Map1cea4fe0662311de8f94001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:516: array required, but java.lang.String found result.addValue(val01<i>); ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Map1cea4fe0662311de8f94001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:516: cannot resolve symbol symbol : variable result location: class com.sap.xi.tf._MM_CRS_EBRAND_ result.addValue(val01<i>); ^ /usr/sap/DHX/DVEBMGS00/j2ee/cluster/server0/./temp/classpath_resolver/Map1cea4fe0662311de8f94001125a5ce17/source/com/sap/xi/tf/_MM_CRS_EBRAND_.java:517: array required, but java.lang.String found repeat01 = val01<i>; ^

Thanks

Srinivas

Former Member
0 Kudos

Hi,

Map like below..

1. ordernumber(Change context to parent)--SplitbyValue(ValueChange)--CollapseContext--header.
2.ordernumber(Change context to parent)--SplitbyValue(ValueChange)--CollapseContext--SplitByValue(EachValue)--ordernumber
3.EAN--------------------------------------------------------------------------------FormatByExample--SplitByValue(ValueChange)--CollapseContext--Item
   ordernumber(Change context to parent)--SplitbyValue(ValueChange)--
4.EAN--------------------------------------------------------------------------------FormatByExample--SplitByValue(ValueChange)--CollapseContext--SplitByvalue(Each)--EAN
   ordernumber(Change context to parent)--SplitbyValue(ValueChange)--

Regards,

Prakasu.M

Former Member
0 Kudos

Prakasu,

Thanks for your reply,

the mapping you mentioned is working only if the ordernumbers are same

if the order numbers are different, iam getting the error in mapping.the error is as below.

ns0:MT_EBRAND_RECEIVER/header[2]/detail. Check xml instance is valid for source xsd and target-field mapping fulfills requirements of target xsd

Help me in solving this.

Thanks

Srinivas

Former Member
0 Kudos

Hi,

Can you any example?

Regards,

Prakasu.M

Former Member
0 Kudos

Hi Prakasu

My source structure is as below

<ROW>
  <OrderNumber>576881</OrderNumber> 
  <ProductEANNumber>L0257100</ProductEANNumber> 
  </ROW>
 <ROW>
  <OrderNumber>576881</OrderNumber> 
  <ProductEANNumber>L0257100</ProductEANNumber> 
  </ROW>
 <ROW>
  <OrderNumber>576881</OrderNumber> 
  <ProductEANNumber>PPPPP</ProductEANNumber> 
  </ROW>
 <ROW>
  <OrderNumber>576882</OrderNumber> 
  <ProductEANNumber>3.36544E+12</ProductEANNumber> 
  </ROW>

If order number changes anew record to be created and for item groupby must be done based on EAN Number.

for the above source, the target must be

<Header>

<ordernumber>576881<ordernumber>

<item>

<EANNUMBER>L0257100<EANNUMBER>

<item>

<EANNUMBER>ppppp<EANNUMBER>

<Header>

<Header>

<ordernumber>576882<ordernumber>

<item>

<EANNUMBER>3.36544E+12<EANNUMBER>

<item>

<Header>

Suggest me how to proceed

Thanks

Srinivas

Former Member
0 Kudos

Hi,

the above scenario that i mentioed can be done in mapping or not

Please help,

Thanks

Srinivas

Former Member
0 Kudos

Hi.

Use the UDF like a context.

The UDF received two parameters .ProductEANNumber (val01) and ROW/OrderNumber(val02).. before change the contex both elements.

try againg

This is my target payload

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

<ns0:Temp_Contact xmlns:ns0="Test1">

<OrderNumber>

<OrderNumber>576881</OrderNumber>

<Item>

<EAN>L0257100</EAN>

</Item>

<Item>

<EAN>PPPPP</EAN>

</Item>

</OrderNumber>

<OrderNumber>

<OrderNumber>576882</OrderNumber>

<Item>

<EAN>3.36544E+12</EAN>

</Item>

</OrderNumber>

</ns0:Temp_Contact>

Former Member
0 Kudos

Srinivas,

Whatever Luis has given its working. Please check once again all the mappings you have done like this or not:

For Target Header: ordernumber (context set to root) --> SplitbyValue (Valuechange) --> CollapseContext --> header

For Target ordernumber: ordernumber (context set to root) --> SplitbyValue (Valuechange) --> ordernumber

For Target Item segment: Here you use the udf given by him. You create a UDF say Test and click on Context radio button and give two input parameters val01 and val02. Then imports: java.;*

Add this code:

String repeat01 = ""; String repeat02 = "";

for (int i = 0 ; i < val01.length ; i++) {

if (!val02<i>.equals(repeat02) && !repeat02.equals("") ) {

result.addValue(ResultList.CC);

repeat01 = "";

}

repeat02 = val02<i>;

if (!val01<i>.equals(repeat01)) {

result.addValue(val01<i>);

repeat01 = val01<i>;

}

}

I didnot change anything. Whatever he has given is good.

Here is how you map: click on UDF. It asks two input parameters. For first give EAN (context set to root) and second parameter ordernumber (context set to root) --> udf (test) --> Item

For Target EAN: click on UDF. It asks two input parameters. For first give EAN (context set to root) and second parameter ordernumber (context set to root) --> udf (test) --> SplitByValue --> EAN

It is working. Do all the steps and please check everything. It should work srinivas.

Regards,

---Satish

Former Member
0 Kudos

Luis,

It worked,Thank you verymuch.iam in bit of confusion how to make it work,but iam am able to do it because of you.Thanks

Staish

Thanks for Helping me

Former Member
0 Kudos

Luis,

I found one more issue,the EAN numbers are not sorted in my source,How can i sort the EAN Numbers for a particular order number

iam using sortby key function but it is not working,Please suggest

Thanks

Srinivas

Former Member
0 Kudos

How do you want to sort your EAN Numbers ? for each order number..

Use sort after UDF function.

Former Member
0 Kudos

Luis,

I need to sort the EAN Numbers before passing the values to the UDF.

Answers (1)

Answers (1)

Former Member
0 Kudos

hI. Srinivas

Could you send a XML Example - paylod?.

Let me try to understand if you have these similar structure.

<ordernumber>

<EAN1>1</EAN1>

<EAN2>2</EAN2>

<EAN3>3</EAN3>

</ordernumber>

<ordernumber>

<EAN4>4</EAN4>

<EAN5>5</EAN5>

</ordernumber>

Former Member
0 Kudos

Li Luis

Below is the sample source payload

<ROW>
  <OrderNumber>576881</OrderNumber> 
  <ProductEANNumber>L0257100</ProductEANNumber> 
  </ROW>
 <ROW>
  <OrderNumber>576881</OrderNumber> 
  <ProductEANNumber>L0257100</ProductEANNumber> 
  </ROW>
 <ROW>
  <OrderNumber>576881</OrderNumber> 
  <ProductEANNumber>PPPPP</ProductEANNumber> 
  </ROW>
 <ROW>
  <OrderNumber>576882</OrderNumber> 
  <ProductEANNumber>3.36544E+12</ProductEANNumber> 
  </ROW>

Former Member
0 Kudos

Ok. perfect.

I have a doubt about your target structure.

According your last structure your target will be ?

<OrderNumber>

<EAN>L0257100</EAN>

<EAN>L0257100</EAN>

<EAN>PPPPP</EAN>

</OrderNumber>

<OrderNumber>

<EAN>3.36544E+12</EAN>

</OrderNumber>