on 02-28-2007 2:34 PM
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,
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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 !
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
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
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
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
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
87 | |
10 | |
10 | |
9 | |
7 | |
7 | |
6 | |
5 | |
4 | |
4 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.