cancel
Showing results for 
Search instead for 
Did you mean: 

Remove dulicates in mapping

Former Member
0 Kudos

Hi gurus!

My input structure is

<IN_MT>
 <SHIPMENT>
         <SHIPMENT></SHIPMENT>
         <DELIVERY></DELIVERY>
 </SHIPMENT>
</IN_MT>

I need to remove duplicates like this.

INPUT:

<IN_MT>
 <SHIPMENT>
         <SHIPMENT>11</SHIPMENT>
         <DELIVERY>123</DELIVERY>
 </SHIPMENT>

 <SHIPMENT>
         <SHIPMENT>11</SHIPMENT>
         <DELIVERY>456</DELIVERY>
 </SHIPMENT>

 <SHIPMENT>
         <SHIPMENT>33</SHIPMENT>
         <DELIVERY>678</DELIVERY>
 </SHIPMENT>
</IN_MT>

OUTPUT:

<OUT_MT>
 <SHIPMENT>
         <SHIPMENT>11</SHIPMENT>
         <DELIVERY>123</DELIVERY>
         <DELIVERY>456</DELIVERY>
 </SHIPMENT>

 <SHIPMENT>
         <SHIPMENT>33</SHIPMENT>
         <DELIVERY>678</DELIVERY>
 </SHIPMENT>
</OUT_MT>

Here is my UDF RemoveDuplicates:


Vector vProd = new Vector();

int i;
for (i =0;i < var1.length;i++)
if(!vProd.contains(var1<i>)) 
vProd.add(var1<i>);

Collections.sort(vProd);
for(i=0;i<vProd.size();i++)
result.addValue((String)vProd.get(i));

Here is my mapping:

IN_MT -


> OUT_MT

SHIPMENT -


> SHIPMENT

SHIPMENT -


> RemoveContext ---> RemoveDuplicates -


> SplitByValue -


> SHIPMENT

DELIVERY -


> DELIVERY

DELIVERY -


> DELIVERY

I got:

 <OUT_MT>
   <SHIPMENT>
      <SHIPMENT>11</SHIPMENT>
      <DELIVERY>
         <DELIVERY>123</DELIVERY>
      </DELIVERY>
   </SHIPMENT>
   <SHIPMENT>
      <SHIPMENT>22</SHIPMENT>
      <DELIVERY>
         <DELIVERY>456</DELIVERY>
      </DELIVERY>
   </SHIPMENT>
   <SHIPMENT>
      <DELIVERY>
         <DELIVERY>678</DELIVERY>
      </DELIVERY>
   </SHIPMENT>
</OUT_MT>

What's wrong?

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

u can achieve ur req using standard functions only..

chk this:



SHIPMENT--REMOVECONTEXT---sort---splitbyvalue(value change)---collapse context----SHIPMNET (node)



SHIPMENT--REMOVECONTEXT---sort---splitbyvalue(value change)---collapse context---splitbyvalue(each value)-SHIPMNET (element)


SHIPMENT--REMOVECONTEXT---
-----------sortbykey----------------------------------------\
DELIVERY--REMOVECONTEXT---                                   \     
                                                         ------formatByexample------DELIEVERY
                                                          /
SHIPMENT--REMOVECONTEXT---sort---splitbyvalue(value change)--

Former Member
0 Kudos

Hi Amit,

Now I got only first shipment:

<OUT_MT>

<SHIPMENT>

<SHIPMENT>11</SHIPMENT>

<DELIVERY>123</DELIVERY>

<DELIVERY>456</DELIVERY>

</SHIPMENT>

This segment is missing:

<SHIPMENT>

<SHIPMENT>33</SHIPMENT>

<DELIVERY>678</DELIVERY>

</SHIPMENT>

</OUT_MT>

To avoid misunderstandig I changed my structure field SHIPMENT to SHIPMENT_NUM:

<SHIPMENT>

<SHIPMENT_NUM></SHIPMENT_NUM>

<DELIVERY></DELIVERY>

<DELIVERY></DELIVERY>

</SHIPMENT>

Can you please correct you mapping due to this change

Former Member
0 Kudos

hi ,

you need to see Fig.31 and Fig.32 in below link(equal to ur requirement) and same as what was i posted previousaly.

http://www.saptechnical.com/Tutorials/XI/NodeFunctions/Page7.htm

thanks,

Former Member
0 Kudos

the mapping logic wont change apart from the source/target element/node names

chk this:



SHIPMENT_NUM--REMOVECONTEXT---sort---splitbyvalue(value change)---collapse context----SHIPMNET



SHIPMENT_NUM--REMOVECONTEXT---sort---splitbyvalue(value change)---collapse context---splitbyvalue(each value)-SHIPMNET_NUM 

 



SHIPMENT_NUM--REMOVECONTEXT---
-----------sortbykey----------------------------------------\
DELIVERY--REMOVECONTEXT---                                   \     
                                                         ------formatByexample------DELIEVERY
                                                          / 
SHIPMENT_NUM--REMOVECONTEXT---sort---splitbyvalue(value change)--
 

Former Member
0 Kudos

Thanks Amit,

but sill last segment not created

Former Member
0 Kudos

hi,

u have to check SHIPMENT occurenec in target side .

if SHIPMENT occurance is 0:1 /1:1 then change to o:unbound.

thanks.

Former Member
0 Kudos

use display queue function and chk how many occ u r getting in ur mapping (right click on collapsecontext function used in the shipment mapping and select display queue)??

i hope the occ of Shipment is 1..unbounded??

Former Member
0 Kudos

Occ of SHIPMENT is 1-unbound

Display queue in SHIPMENT CollapseContext looks like this:

[ ] [ ]

[ ]

[ ]

Edited by: Dani_K on Jan 11, 2012 11:57 AM

Edited by: Dani_K on Jan 11, 2012 11:58 AM

Edited by: Dani_K on Jan 11, 2012 11:58 AM

Answers (4)

Answers (4)

Former Member
0 Kudos

Solved!

Thanks all!

Edited by: Dani_K on Jan 11, 2012 3:08 PM

Former Member
0 Kudos

Any ideas?

Former Member
0 Kudos

Hi.

Try this.

SHIPMENT( change context)->SplitbyValue(ValueChanged)->CollapseContext-->Shipment (Node)

SHIPMENT( change context)>SplitbyValue(ValueChanged)->CollapseContext->SplitbyValue (each Value)--->Shipment (Node)

***SHIPMENT = Element

***( change context) = Node.

Delivery ( change context)--->SplitbyValue(ValueChanged)-->Delivery

This will be solved your problem

Regards.

Former Member
0 Kudos

Thank you Luis, but the issue already solved.

Former Member
0 Kudos

hi dani,

dont need to write any udf . that is very simple by using NODE Func.

SHIPMENT -> remove context -> Sort -> splitByValue(valuue change) ->collapse context ->splitByValue(each value) -> Shipment

delivery ->

shipment -> remove context-> Sort -> splitByValue(valuue change) -> formatBYExample ->DELIVERy.

if you have any doubt , just see fig32

http://www.saptechnical.com/Tutorials/XI/NodeFunctions/Page7.htm

thanks.

Former Member
0 Kudos

Hi,

It'll be little difficult removing duplicates and keeping the context as it is with exixting standard functions. Removing duplicates irrespective of context changes, we can do with available functions. Please try with this UDF code which may help you...

source>sort>UDF-->Target

execution type of UDF is Allvalues of a context.

public void UDF(String[] var1, ResultList result, Container container) throws StreamTransformationException{

ArrayList aList = new ArrayList();

aList.add(var1(0));

result.addValue(var1(0));

for(int i=1; i<var1.length; i++){

if(aList.contains(var1(i)))

continue;

else{

aList.add(var1(i));

result.addValue(var1(i));

}

}

}

regards,

ganesh.

Former Member
0 Kudos

Hi Ganesh, thanks for help.

There are some errors if UDF Code:


Function Remove_Duplicates, Line 2: 
cannot find symbol
 symbol  : method var1(int)
 location: class com.sap.xi.tf._RSHAR_SHIPMENTS_FILE_TO_IDOC3_MM_
 aList.add(var1(0));
           ^
Function Remove_Duplicates, Line 3: 
cannot find symbol
 symbol  : method var1(int)
 location: class com.sap.xi.tf._RSHAR_SHIPMENTS_FILE_TO_IDOC3_MM_
 result.addValue(var1(0));
                 ^
Function Remove_Duplicates, Line 6: 
cannot find symbol
 symbol  : method var1(int)
 location: class com.sap.xi.tf._RSHAR_SHIPMENTS_FILE_TO_IDOC3_MM_
 if(aList.contains(var1(i)))
                   ^
Function Remove_Duplicates, Line 9: 
cannot find symbol
 symbol  : method var1(int)
 location: class com.sap.xi.tf._RSHAR_SHIPMENTS_FILE_TO_IDOC3_MM_
 aList.add(var1(i));
           ^
Function Remove_Duplicates, Line 10: 
cannot find symbol
 symbol  : method var1(int)
 location: class com.sap.xi.tf._RSHAR_SHIPMENTS_FILE_TO_IDOC3_MM_
 result.addValue(var1(i));

Former Member
0 Kudos

Hi,

After var1..it should be square brackets...change it in all 5 places

aList.add(var1[0]);

regards,

ganesh.

Former Member
0 Kudos

Now I got only first queue:

<SHIPMENT>

<SHIPMENT>11</SHIPMENT>

<DELIVERY>

<DELIVERY>123</DELIVERY>

</DELIVERY>

</SHIPMENT>