cancel
Showing results for 
Search instead for 
Did you mean: 

Message splitting using java mapping and BPM

Former Member
0 Kudos

Hi all,

I have a PLAIN FILE to IDOC Scenario.

We decide to use javamapping instead of message mapping because we have several hierachical structures.

We has more than one IDOC for file. And the mapping it's unable to detect the another header and create it at XI.

I had seen:

/people/michal.krawczyk2/blog/2005/12/04/xi-idoc-bundling--the-trick-with-the-occurance-change

"XI: IDOC bundling - the "trick" with the occurance change"

But the problem it's we doesn't use mapping programs, so we can't apply to this case.

So now i need to create a BPM scenario for resolve this issue. Anyone knows any example for split the income message and send any idocs to destination?

Thanks in advance,

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Federico,

-

-


><SAP:P1>Segmento 'E1BPEBANC', número de segmento '000005' no es correcto en estructura PREQCR02 ZPREEX01</SAP:P1

The error message tells you that the IDOC Adapter is not expecting the segment 'E1BPEBANC' at position 5. As per the structure of the IDoc it is expecting some other segment.

Did you incorporate the IDoc 'Begin' attribute when building the the IDoc by Java mapping. If not try incorporating that into the structure and check again.

/*Sample Code

Element subroot = IDocOut.createElement("IDOC");

subroot.setAttributeNode(IDocOut.createAttribute("BEGIN"));

subroot.setAttribute("BEGIN", "1");

/*

I think that without the 'Begin' attribute the IDoc adapter is considering the whole structure as one IDoc, even though you have multiple IDoc segments.

Do try and let me know.

Thanks,

Anand

Former Member
0 Kudos

IT WORKED !!!!

The only thing it's at out code line we must improve it in another way.

For everyone who needs to resolve, i copy the code line of the java mapping program.

The relationship is from the specific mapping for every scenary calling GenToHierMap.


0.0.0.0.0.0.0.0.0.0.0.0.1. GENERIC PACKAGE (GenToHierMap)
0.0.0.0.0.0.0.0.0.0.0.0.2.

package com.sap.javaMapping;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Map;
import java.util.Vector;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import com.sap.aii.mapping.api.StreamTransformation;



public class GenToHierMap
{
	private Element root, idoc;
	private Element nodeArrayRef[];
	private String nodeArrayTagName[];
	private Relation  rel ;
	private int  stack_count ;
	private String nameSpace;
	private String separator="#!";
	protected String msgName;

	GenToHierMap(InputStream in, OutputStream out,Vector v1,String msgName1,String nameSpace1)
	{
	msgName = msgName1;
	nameSpace = nameSpace1;
	rel = new Relation(v1);
	execute(in,out);
	}

    public void execute(InputStream in, OutputStream out)
    {
		Element e ;
		Relation cur_rel;
		DOMSource domS = null;
		Element keyNodeParent;
		//int numdocs;
		try
		{

			        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			        factory.setNamespaceAware(true);
					TransformerFactory tf = TransformerFactory.newInstance();
					Transformer transform = tf.newTransformer();
					// Create DOM structure from input XML
					DocumentBuilder builderel = factory.newDocumentBuilder();
					Document docIn = builderel.parse(in);
	    			NodeList rows = docIn.getElementsByTagName("ROW");
	    			nodeArrayTagName = new String[rows.getLength() + 1];
	    			nodeArrayRef = new Element[rows.getLength() + 1];
					Document docOut = builderel.newDocument();
					root = docOut.createElement(msgName);
					docOut.appendChild(root);
					//idoc = docOut.createElement("IDOC");
					//root.appendChild(idoc);	
	    			//Número de documents inicialitzat a 0
	    			//numdocs=0;
			    	//Per cada filera ROW
	    		for (int count=0;count<rows.getLength();count++)
					{
						String dataRecord = "";
						Node node = rows.item(count);
						node = node.getFirstChild();
						dataRecord = node.getNodeValue();
						String fieldValue [] = dataRecord.split(separator);
						//Cada cop que es troba una nova capçalera es crea un nou document.
						//Això permet que hi hagi més d'un IDOC per missatge processat.
						if (Integer.valueOf(fieldValue[0]).intValue()==1){
							//numdocs = numdocs + 1;
							//if (numdocs > 1){
								//Es dona sortida al document anterior abans de crear-ne un de nou - BE AWARE BECAUSE IN THE NEXT LINES WE DEFINE THE UNBOUNDED IDOC ATTRIBUTE, WITH BEGIN = 1 ****
								//transform.transform((domS),new StreamResult(out));
								//docOut = builderel.newDocument();
								//root = docOut.createElement(msgName);
								//docOut.appendChild(root);
								idoc = docOut.createElement("IDOC");
								idoc.setAttribute("BEGIN","1");
								root.appendChild(idoc);	
							//}
						}
						cur_rel = (Relation) rel.v.get(Integer.valueOf(fieldValue[0]).intValue());				
						String keyId = cur_rel.node;
						keyNodeParent = searchNode(keyId);
						nodeArrayTagName[count] = keyId;
			            e = docOut.createElement(keyId);
						e.setAttribute("SEGMENT",fieldValue[0]);
			            nodeArrayRef[count]= e;
		                keyNodeParent.appendChild(e);
		                createXmlTree(docOut,e,keyId,fieldValue);
		                domS = new DOMSource(docOut);
		                stack_count = stack_count + 1;
				    }

	                transform.transform((domS),new StreamResult(out));
      }
 	  catch (Exception t)
 	  {
	   	 t.printStackTrace();
 	  }
return;
 }

//returns the parent of the given node
 private Element searchNode(String keyId)
 {
	Relation cur_rel;
	for (int i=0;i<rel.v.size();i++)
	{
		cur_rel = (Relation) rel.v.get(i);
		if (cur_rel.node.equals(keyId))
		 	 {
                 for (int j=0;j<cur_rel.parents.length;j++)
				 {
					 if (cur_rel.parents[j].equals("NULL")) return root;
					 if (cur_rel.parents[j].equals("IDOC")) return idoc;

  				     for (int k=(stack_count-1);k>=0;k--)
  				     {
  				         for (int p=0;p<cur_rel.parents.length;p++)
  				         {
						     if (nodeArrayTagName[k].equals(cur_rel.parents[p]))
						     return nodeArrayRef[k];
				         }

		             }
			     }
		     }
	}

return null;
 }
 //Creates all the elements of the given node
 private void createXmlTree(Document docOut,Element node,String keyId, String fieldValue[])
	{
	 Element tagName;
	 Text tagValue;
	 Relation cur_rel;
	 for (int i=0;i<rel.v.size();i++)
	    {
		 	 cur_rel = (Relation) rel.v.get(i);
		 	 if (cur_rel.node.equals(keyId))
		 	 {
				for (int j=1;j<cur_rel.elements.length;j++)
				 {
				   tagName = docOut.createElement(cur_rel.elements[j]);
				   node.appendChild(tagName);
				   if ( j < fieldValue.length  && fieldValue[j].length() != 0 )
				   if ( fieldValue[j].substring(0,1).equals("""))
				   if ( fieldValue[j].length() > 2 )
				   fieldValue[j] = fieldValue[j].substring(1,( fieldValue[j].length() - 1 ));
				   else
				   fieldValue[j] = new String ();
				   if ( j >= fieldValue.length )
				   tagValue = docOut.createTextNode(new String());
				   else
				   tagValue = docOut.createTextNode(fieldValue[j]);
				   tagName.appendChild(tagValue);


		         }

		          return;
		     }
		  }
      }
//Main thread of execution


0.0.0.0.0.0.0.0.0.0.0.0.1. SPECIFIC ONE
0.0.0.0.0.0.0.0.0.0.0.0.2.

package com.sap.javaMapping;
/*****************************************************************************************************
* Mapping Program to Convert NOM IDOC Master Structure to the Generic structure Expected by
* the FTP Receiver adapter
******************************************************************************************************/
import com.sap.aii.mapping.api.*;
import java.io.*;
import java.util.Map;
import java.util.Vector;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
import org.xml.sax.*;


//Specify the Hirearchial Structure
public class INT938_mapping implements StreamTransformation
{


	public Vector v;
    private Map map;
    /** * method setParamters is required, but we do not anything with it */
	public void setParameter(Map param)
	{
		map = param;
	} /** * method execute is called by the XI mapping program */

public void buildXsd()
{


  Relation  mriRel ;
  v = new Vector();
 
 
  /* *************************************************** */
  /* INICI MODIFICACIÓ ESTRUCTURA DE SORTIDA DEL MAPPING */
  /* *************************************************** */
 
  // --> TOCAR AQUEST NODE IMPLICA MODIFICAR EL CÒDI!!!
  
  mriRel = new Relation();
  mriRel.parents = new String[1];
  mriRel.node =  "IDOC" ;
  mriRel.parents[0] =   "NULL" ;
  v.add(mriRel) ;
    
  /* ****************************** */
  /* ESTRUCTURA DEL IDOC DE SORTIDA */
  /* ****************************** */
  
  //NODE - 01
  mriRel = new Relation();                           
  mriRel.parents = new String[1];                                                     
  mriRel.elements = new String[22];                                                                  
  mriRel.node = "E1BPEBANC";                                     
  mriRel.parents[0]   =   "IDOC";                                               
  mriRel.elements[0]  =   "SEGMENT";    
  mriRel.elements[1]  =   "PREQ_ITEM";  
  mriRel.elements[2]  =   "DOC_TYPE";   
  mriRel.elements[3]  =   "PUR_GROUP";  
  mriRel.elements[4]  =   "CREATED_BY";
  mriRel.elements[5]  =   "PREQ_NAME";  
  mriRel.elements[6]  =   "PREQ_DATE";  
  mriRel.elements[7]  =   "SHORT_TEXT";
  mriRel.elements[8]  =   "MATERIAL";   
  mriRel.elements[9]  =   "PLANT";      
  mriRel.elements[10] =   "STORE_LOC";
  mriRel.elements[11] =   "TRACKINGNO";
  mriRel.elements[12] =   "MAT_GRP";    
  mriRel.elements[13] =   "QUANTITY";   
  mriRel.elements[14] =   "UNIT";       
  mriRel.elements[15] =   "DELIV_DATE";
  mriRel.elements[16] =   "ACCTASSCAT";
  mriRel.elements[17] =   "DES_VENDOR";
  mriRel.elements[18] =   "PURCH_ORG";  
  mriRel.elements[19] =   "BATCH";      
  mriRel.elements[20] =   "VEND_MAT";   
  mriRel.elements[21] =   "CURRENCY";
  v.add(mriRel) ;  

  //NODE - 02
  mriRel = new Relation();                                    
  mriRel.parents = new String[1];                                                     
  mriRel.elements = new String[2];                                                                   
  mriRel.node = "Z1SOLCOM";                                     
  mriRel.parents[0]  =   "E1BPEBANC";                                                      
  mriRel.elements[0] =   "SEGMENT";   
  mriRel.elements[1] =   "ZPO_NUMBER";
  v.add(mriRel) ; 
  
  //NODE - 03
  mriRel = new Relation();                                    
  mriRel.parents = new String[1];                                                     
  mriRel.elements = new String[3];                                                                  
  mriRel.node = "E1BPEBKN";                                     
  mriRel.parents[0]  =   "IDOC";                                                    
  mriRel.elements[0] =   "SEGMENT";
  mriRel.elements[1] =   "PREQ_ITEM";    
  mriRel.elements[2] =   "COST_CTR";
  v.add(mriRel) ; 
  
  //NODE - 04
  mriRel = new Relation();                                    
  mriRel.parents = new String[1];                                                     
  mriRel.elements = new String[8];                                        
  mriRel.node = "Z1SOLRES";                                     
  mriRel.parents[0]  =   "E1BPEBKN";                                                    
  mriRel.elements[0] =   "SEGMENT";             
  mriRel.elements[1] =   "DADES_PACIENT";       
  mriRel.elements[2] =   "NOHIS";               
  mriRel.elements[3] =   "ZNINTER";             
  mriRel.elements[4] =   "ZFEIMP";              
  mriRel.elements[5] =   "NMPAC";               
  mriRel.elements[6] =   "ZNLOTE";              
  mriRel.elements[7] =   "ZNSERIE";             
  v.add(mriRel) ;
  
  /* *************************************************** */
  /* FI    MODIFICACIÓ ESTRUCTURA DE SORTIDA DEL MAPPING */
  /* *************************************************** */


}
public void execute(InputStream in, OutputStream out) throws com.sap.aii.mapping.api.StreamTransformationException
{
	INT938_mapping rel = new INT938_mapping();
	rel.buildXsd();
	new GenToHierMap(in,out,rel.v,"ZPREEX01","http://namespace1/namespace");

}
public static void main (String[] args) throws Exception
	{
		try
		{
			INT938_mapping rel = new INT938_mapping();
			FileInputStream in = new FileInputStream ("C:/DOM_IN.xml");
			FileOutputStream out = new FileOutputStream ("C:/DOM_OUT.xml");
			rel.buildXsd();
			new GenToHierMap(in,out,rel.v,"ZPREEX01","http://namespace1/namespace");

		}catch(Exception e) {e.printStackTrace();}
	}
}

//Transformation of flat structure to hirearchial structure

Any issue you can contact me. Best regards and reward points !

Answers (2)

Answers (2)

bhavesh_kantilal
Active Contributor
0 Kudos

Hi,

We have used a Java Mapping plus Idoc packaging. It works fine.

1 .In this case, you do not need to use the External Defintion with the Idoc Made 0 to unbounded.

2. In your Java Mapping , make sure that the mapping output will have one IDOC tag for every IDOC that you waat to post.

i.e , java mapping output should be,

<IDOCNAME>
<IDOC>
<Segments>...
</IDOC>
<IDOC>
</IDOC>
</IDOCNAME>

Regards

Bhavesh

Former Member
0 Kudos

RAJEEV GUPTA:

The problem is not to define the destination, because all from one message goes to the same one. It's defined via file adapter.

BAVESH:

The problem it's XI is unable to use 2 messages at mapping.

INBOUND:

<?xml version="1.0" encoding="utf-8" ?> 
- <ns:MT_row xmlns:ns="http://aaaaaa/bbb/ccccccccccc">
- <RECORDSET>
+ <DATA>
  <ROW>1#!00010#!ZPIE#!hgc#!dvpotue#!dvpotue#!20070228#!#!000000000020000001#!AH02#!#!1234567890#!E01001001#!9#!UNI#!20070228#!Z#!#!AH02#!#!#!EUR</ROW> 
  </DATA>
  </RECORDSET>
- <RECORDSET>
+ <DATA>
  <ROW>2#!0000000001</ROW> 
  </DATA>
  </RECORDSET>
- <RECORDSET>
+ <DATA>
  <ROW>3#!00010#!31ZZZZZZZZ</ROW> 
  </DATA>
  </RECORDSET>
- <RECORDSET>
+ <DATA>
  <ROW>4#!N#!#!#!#!#!#!</ROW> 
  </DATA>
  </RECORDSET>
- <RECORDSET>
+ <DATA>
  <ROW>1#!00010#!ZPIE#!hgc#!dvpotue#!dvpotue#!20070228#!#!000000000020000001#!AH02#!#!1234567890#!E01001001#!9#!UNI#!20070228#!Z#!#!AH02#!#!#!EUR</ROW> 
  </DATA>
  </RECORDSET>
- <RECORDSET>
+ <DATA>
  <ROW>2#!0000000001</ROW> 
  </DATA>
  </RECORDSET>
- <RECORDSET>
+ <DATA>
  <ROW>3#!00010#!31ZZZZZZZZ</ROW> 
  </DATA>
  </RECORDSET>
- <RECORDSET>
+ <DATA>
  <ROW>4#!N#!#!#!#!#!#!</ROW> 
  </DATA>
  </RECORDSET>
  </ns:MT_row>

OUTBOUND PAYLOAD:

<?xml version="1.0" encoding="utf-8" ?> 
- <ZPREEX01>
+ <IDOC>
- <E1BPEBANC SEGMENT="1">
  <pre><code>00010</code></pre> 
  <DOC_TYPE>ZPIE</DOC_TYPE> 
  <PUR_GROUP>hgc</PUR_GROUP> 
  <CREATED_BY>dvpotue</CREATED_BY> 
  <pre><code>dvpotue</code></pre> 
  <pre><code>20070228</code></pre> 
  <SHORT_TEXT></SHORT_TEXT> 
  <MATERIAL>000000000020000001</MATERIAL> 
  <PLANT>AH02</PLANT> 
  <STORE_LOC></STORE_LOC> 
  <TRACKINGNO>1234567890</TRACKINGNO> 
  <MAT_GRP>E01001001</MAT_GRP> 
  <QUANTITY>9</QUANTITY> 
  <UNIT>UNI</UNIT> 
  <DELIV_DATE>20070228</DELIV_DATE> 
  <ACCTASSCAT>Z</ACCTASSCAT> 
  <DES_VENDOR></DES_VENDOR> 
  <PURCH_ORG>AH02</PURCH_ORG> 
  <BATCH></BATCH> 
  <VEND_MAT></VEND_MAT> 
  <CURRENCY>EUR</CURRENCY> 
- <Z1SOLCOM SEGMENT="2">
  <ZPO_NUMBER>0000000001</ZPO_NUMBER> 
  </Z1SOLCOM>
  </E1BPEBANC>
- <E1BPEBKN SEGMENT="3">
  <pre><code>00010</code></pre> 
  <COST_CTR>31ZZZZZZZZ</COST_CTR> 
- <Z1SOLRES SEGMENT="4">
  <DADES_PACIENT>N</DADES_PACIENT> 
  <NOHIS></NOHIS> 
  <ZNINTER></ZNINTER> 
  <ZFEIMP></ZFEIMP> 
  <NMPAC></NMPAC> 
  <ZNLOTE></ZNLOTE> 
  <ZNSERIE></ZNSERIE> 
  </Z1SOLRES>
  </E1BPEBKN>
  </IDOC>
+ <IDOC>
- <E1BPEBANC SEGMENT="1">
  <pre><code>00010</code></pre> 
  <DOC_TYPE>ZPIE</DOC_TYPE> 
  <PUR_GROUP>hgc</PUR_GROUP> 
  <CREATED_BY>dvlatorre</CREATED_BY> 
  <pre><code>DVlatorre</code></pre> 
  <pre><code>20070228</code></pre> 
  <SHORT_TEXT></SHORT_TEXT> 
  <MATERIAL>000000000020000001</MATERIAL> 
  <PLANT>AH02</PLANT> 
  <STORE_LOC></STORE_LOC> 
  <TRACKINGNO>1234567890</TRACKINGNO> 
  <MAT_GRP>E01001001</MAT_GRP> 
  <QUANTITY>9</QUANTITY> 
  <UNIT>UNI</UNIT> 
  <DELIV_DATE>20070228</DELIV_DATE> 
  <ACCTASSCAT>Z</ACCTASSCAT> 
  <DES_VENDOR></DES_VENDOR> 
  <PURCH_ORG>AH02</PURCH_ORG> 
  <BATCH></BATCH> 
  <VEND_MAT></VEND_MAT> 
  <CURRENCY>EUR</CURRENCY> 
- <Z1SOLCOM SEGMENT="2">
  <ZPO_NUMBER>0000000001</ZPO_NUMBER> 
  </Z1SOLCOM>
  </E1BPEBANC>
- <E1BPEBKN SEGMENT="3">
  <pre><code>00010</code></pre> 
  <COST_CTR>31ZZZZZZZZ</COST_CTR> 
- <Z1SOLRES SEGMENT="4">
  <DADES_PACIENT>N</DADES_PACIENT> 
  <NOHIS></NOHIS> 
  <ZNINTER></ZNINTER> 
  <ZFEIMP></ZFEIMP> 
  <NMPAC></NMPAC> 
  <ZNLOTE></ZNLOTE> 
  <ZNSERIE></ZNSERIE> 
  </Z1SOLRES>
  </E1BPEBKN>
  </IDOC>
  </ZPREEX01>

ERROR:

 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <!--  Call Adapter 
  --> 
- <SAP:Error xmlns:SAP="http://sap.com/xi/XI/Message/30" xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/" SOAP:mustUnderstand="">
  <SAP:Category>XIAdapter</SAP:Category> 
  <SAP:Code area="IDOC_ADAPTER">ATTRIBUTE_IDOC_METADATA</SAP:Code> 
  <SAP:P1>Segmento 'E1BPEBANC', número de segmento '000005' no es correcto en estructura PREQCR02 ZPREEX01</SAP:P1> 
  <SAP:P2></SAP:P2> 
  <SAP:P3></SAP:P3> 
  <SAP:P4></SAP:P4> 
  <SAP:AdditionalText></SAP:AdditionalText> 
  <SAP:ApplicationFaultMessage namespace=""></SAP:ApplicationFaultMessage> 
  <SAP:Stack>Error: Segmento 'E1BPEBANC', número de segmento '000005' no es correcto en estructura PREQCR02 ZPREEX01</SAP:Stack> 
  <SAP:Retry>M</SAP:Retry> 
  </SAP:Error>

If we send 1 header for file all works fine. So that is the issue for use BPM.

Thanks in advance, regards.

Message was edited by:

Federico Martin

Former Member
0 Kudos

Hi Martin,

so this is why Michal blog says to change the occuarance of IDOC to 0..9999

so just change the XSD of your IDOC for it......

You are using JAVA mapping program, so in interface mappng, you will tell the JAVA mapping prg and there you can see the effect of changing occurance of your IDOC.....

Thanks,

Rajeev Gupta

Message was edited by:

RAJEEV GUPTA

Former Member
0 Kudos

Rajeev,

The problem it's that in java mapping program we can use the IDOC but not the External Definition that Michal references in the blog.

Thanks,

Former Member
0 Kudos

Hi Fedrico,

So tell me why are you not taking External Definiton, create a msg interface for your External Definiton...

Then in ID, make a RFC adapter comm channel to connect to R/3 and then post it in SAP.

Thanks,

Rajeev Gupta

Message was edited by:

RAJEEV GUPTA

Former Member
0 Kudos

Hi Fedrico,

in IR, in interface mapping, change occurance of target msg.....apply JAVA mapping in msg mapping......

Use conditional recever determintiaon in ID, then you dont need BPM

Thanks,

Rajeev Gupta

Message was edited by:

RAJEEV GUPTA