diff --git a/base/src/org/adempiere/process/rpl/exp/ExportHelper.java b/base/src/org/adempiere/process/rpl/exp/ExportHelper.java index 486fb931fe..2b4ebfbbd6 100644 --- a/base/src/org/adempiere/process/rpl/exp/ExportHelper.java +++ b/base/src/org/adempiere/process/rpl/exp/ExportHelper.java @@ -29,8 +29,6 @@ **********************************************************************/ package org.adempiere.process.rpl.exp; -import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.text.SimpleDateFormat; @@ -45,22 +43,21 @@ import javax.xml.parsers.ParserConfigurationException; import org.adempiere.process.rpl.IExportProcessor; import org.compiere.model.MClient; import org.compiere.model.MColumn; +import org.compiere.model.MEXPFormat; +import org.compiere.model.MEXPFormatLine; +import org.compiere.model.MEXPProcessor; +import org.compiere.model.MEXPProcessorType; import org.compiere.model.MReplicationStrategy; import org.compiere.model.MTable; import org.compiere.model.PO; import org.compiere.model.Query; import org.compiere.model.X_EXP_FormatLine; import org.compiere.util.CLogger; -import org.compiere.util.DB; import org.compiere.util.DisplayType; import org.compiere.util.Env; import org.compiere.util.Language; import org.compiere.util.Msg; import org.compiere.util.Trx; -import org.compiere.model.MEXPFormat; -import org.compiere.model.MEXPFormatLine; -import org.compiere.model.MEXPProcessor; -import org.compiere.model.MEXPProcessorType; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; @@ -74,6 +71,8 @@ import org.w3c.dom.Text; * @author victor.perez@e-evolution.com, e-Evolution *
  • [ 2195090 ] Stabilization of replication *
  • https://sourceforge.net/tracker/?func=detail&atid=879332&aid=2936561&group_id=176962 + *
  • BF [2947622] The replication ID (Primary Key) is not working + *
  • https://sourceforge.net/tracker/?func=detail&aid=2947622&group_id=176962&atid=879332 * */ public class ExportHelper { @@ -157,49 +156,21 @@ public class ExportHelper { outDocument = createNewDocument(); - StringBuffer sql = new StringBuffer("SELECT * ") - .append("FROM ").append(po.get_TableName()).append(" ") - .append("WHERE ").append(po.get_KeyColumns()[0]).append("=?") - ; - - if (exportFormat.getWhereClause() != null & !"".equals(exportFormat.getWhereClause())) { - sql.append(" AND ").append(exportFormat.getWhereClause()); - } - - ResultSet rs = null; - PreparedStatement pstmt = null; - try + HashMap variableMap = new HashMap(); + + Element rootElement = outDocument.createElement(exportFormat.getValue()); + if (exportFormat.getDescription() != null && !"".equals(exportFormat.getDescription())) { - pstmt = DB.prepareStatement(sql.toString(), po.get_TrxName()); - pstmt.setInt(1, po.get_ID()); - rs = pstmt.executeQuery(); - if (rs.next()) - { - HashMap variableMap = new HashMap(); - //variableMap.put(TOTAL_SEGMENTS, new Integer(1)); - - Element rootElement = outDocument.createElement(exportFormat.getValue()); - if (exportFormat.getDescription() != null && !"".equals(exportFormat.getDescription())) { - rootElement.appendChild(outDocument.createComment(exportFormat.getDescription())); - } - rootElement.setAttribute("AD_Client_Value", client.getValue()); - rootElement.setAttribute("Version", exportFormat.getVersion()); - rootElement.setAttribute("ReplicationMode", ReplicationMode.toString()); - rootElement.setAttribute("ReplicationType", ReplicationType); - rootElement.setAttribute("ReplicationEvent", ReplicationEvent.toString()); - outDocument.appendChild(rootElement); - generateExportFormat(rootElement, exportFormat, rs, po, po.get_ID(), variableMap); - } - - } finally { - try { - if (rs != null) rs.close(); - if (pstmt != null) pstmt.close(); - } catch (SQLException ex) {/*ignored*/} - rs = null; - pstmt = null; - } - + rootElement.appendChild(outDocument.createComment(exportFormat.getDescription())); + } + rootElement.setAttribute("AD_Client_Value", client.getValue()); + rootElement.setAttribute("Version", exportFormat.getVersion()); + rootElement.setAttribute("ReplicationMode", ReplicationMode.toString()); + rootElement.setAttribute("ReplicationType", ReplicationType); + rootElement.setAttribute("ReplicationEvent", ReplicationEvent.toString()); + outDocument.appendChild(rootElement); + generateExportFormat(rootElement, exportFormat, po, po.get_ID(), variableMap); + MEXPProcessor mExportProcessor = null; mExportProcessor = new MEXPProcessor (po.getCtx(), m_rplStrategy.getEXP_Processor_ID(), po.get_TrxName() ); log.fine("ExportProcessor = " + mExportProcessor); @@ -236,11 +207,11 @@ public class ExportHelper { MTable table = MTable.get(exportFormat.getCtx(), exportFormat.getAD_Table_ID()); log.info("Table = " + table); - Collection datas = new Query(exportFormat.getCtx(),table.getTableName(), exportFormat.getWhereClause(), exportFormat.get_TrxName()) + Collection records = new Query(exportFormat.getCtx(),table.getTableName(), exportFormat.getWhereClause(), exportFormat.get_TrxName()) .setOnlyActiveRecords(true) .list(); - for (PO po : datas) + for (PO po : records) { log.info("Client = " + client.toString()); log.finest("po.getAD_Org_ID() = " + po.getAD_Org_ID()); @@ -257,48 +228,20 @@ public class ExportHelper { String version = "3.2.0"; outDocument = createNewDocument(); - StringBuffer sql = new StringBuffer("SELECT * ") - .append("FROM ").append(table.getTableName()).append(" ") - .append("WHERE ").append(po.get_KeyColumns()[0]).append("=?") - ; - - if (exportFormat.getWhereClause() != null & !"".equals(exportFormat.getWhereClause())) { - sql.append(" AND ").append(exportFormat.getWhereClause()); - } - - ResultSet rs = null; - PreparedStatement pstmt = null; - try + + HashMap variableMap = new HashMap(); + Element rootElement = outDocument.createElement(exportFormat.getValue()); + if (exportFormat.getDescription() != null && !"".equals(exportFormat.getDescription())) { - pstmt = DB.prepareStatement(sql.toString(), po.get_TrxName()); - pstmt.setInt(1, po.get_ID()); - rs = pstmt.executeQuery(); - if (rs.next()) - { - HashMap variableMap = new HashMap(); - //variableMap.put(TOTAL_SEGMENTS, new Integer(1)); - - Element rootElement = outDocument.createElement(exportFormat.getValue()); - if (exportFormat.getDescription() != null && !"".equals(exportFormat.getDescription())) { - rootElement.appendChild(outDocument.createComment(exportFormat.getDescription())); - } - rootElement.setAttribute("AD_Client_Value", client.getValue()); - rootElement.setAttribute("Version", exportFormat.getVersion()); - rootElement.setAttribute("ReplicationMode", ReplicationMode.toString()); - rootElement.setAttribute("ReplicationType", ReplicationType); - rootElement.setAttribute("ReplicationEvent", ReplicationEvent.toString()); - outDocument.appendChild(rootElement); - generateExportFormat(rootElement, exportFormat, rs, po, po.get_ID(), variableMap); - } - - } finally { - try { - if (rs != null) rs.close(); - if (pstmt != null) pstmt.close(); - } catch (SQLException ex) {/*ignored*/} - rs = null; - pstmt = null; - } + rootElement.appendChild(outDocument.createComment(exportFormat.getDescription())); + } + rootElement.setAttribute("AD_Client_Value", client.getValue()); + rootElement.setAttribute("Version", exportFormat.getVersion()); + rootElement.setAttribute("ReplicationMode", ReplicationMode.toString()); + rootElement.setAttribute("ReplicationType", ReplicationType); + rootElement.setAttribute("ReplicationEvent", ReplicationEvent.toString()); + outDocument.appendChild(rootElement); + generateExportFormat(rootElement, exportFormat, po, po.get_ID(), variableMap); }// finish record read return outDocument; } @@ -310,7 +253,7 @@ public class ExportHelper { * 101 * */ - private void generateExportFormat(Element rootElement, MEXPFormat exportFormat, ResultSet rs, PO masterPO, int masterID, HashMap variableMap) throws SQLException, Exception + private void generateExportFormat(Element rootElement, MEXPFormat exportFormat, PO masterPO, int masterID, HashMap variableMap) throws SQLException, Exception { Collection formatLines = exportFormat.getFormatLines(); @SuppressWarnings("unused") @@ -323,7 +266,7 @@ public class ExportHelper { // process single XML Attribute // Create new element Element newElement = outDocument.createElement(formatLine.getValue()); - + log.info("Format Line Seach key"+ formatLine.getValue()); if (formatLine.getAD_Column_ID() == 0) { throw new Exception(Msg.getMsg (masterPO.getCtx(), "EXPColumnMandatory")); } @@ -336,7 +279,7 @@ public class ExportHelper { } else { } //log.info("["+column.getColumnName()+"]"); - Object value = rs.getObject(column.getColumnName()); + Object value = masterPO.get_Value(column.getColumnName()); String valueString = null; if (value != null) { valueString = value.toString(); @@ -350,14 +293,12 @@ public class ExportHelper { if (valueString != null) { if (formatLine.getDateFormat() != null && !"".equals(formatLine.getDateFormat())) { m_customDateFormat = new SimpleDateFormat( formatLine.getDateFormat() ); // "MM/dd/yyyy" - //Date date = m_customDateFormat.parse ( valueString ); + valueString = m_customDateFormat.format(Timestamp.valueOf (valueString)); newElement.setAttribute("DateFormat", m_customDateFormat.toPattern()); // Add "DateForamt attribute" - } else { - //valueString = m_dateFormat.format (Timestamp.valueOf (valueString)); - //newElement.setAttribute("DateFormat", m_dateTimeFormat.toPattern()); // Add "DateForamt attribute - //Standard Japanese Format (default) works better (yyyy-mm-dd) - newElement.setAttribute("DateFormat", valueString); + } else + { + newElement.setAttribute("DateFormat", valueString); } } @@ -365,13 +306,9 @@ public class ExportHelper { if (valueString != null) { if (formatLine.getDateFormat() != null && !"".equals(formatLine.getDateFormat())) { m_customDateFormat = new SimpleDateFormat( formatLine.getDateFormat() ); // "MM/dd/yyyy" - //Date date = m_customDateFormat.parse ( valueString ); valueString = m_customDateFormat.format(Timestamp.valueOf (valueString)); newElement.setAttribute("DateFormat", m_customDateFormat.toPattern()); // Add "DateForamt attribute" } else { - //valueString = m_dateTimeFormat.format (Timestamp.valueOf (valueString)); - //newElement.setAttribute("DateFormat", m_dateTimeFormat.toPattern()); // Add "DateForamt attribute - //Standard Japanese Format (default) works better (yyyy-mm-dd hh:mm:ss m.mm) newElement.setAttribute("DateFormat", valueString); } } @@ -382,8 +319,6 @@ public class ExportHelper { newElement.appendChild(newText); rootElement.appendChild(newElement); elementHasValue = true; - //increaseVariable(variableMap, formatLines[i].getVariableName()); // Increase value of Variable if any Variable - //increaseVariable(variableMap, TOTAL_SEGMENTS); } else { // Empty field. if (formatLine.isMandatory()) { @@ -407,7 +342,7 @@ public class ExportHelper { } else { } //log.info("["+column.getColumnName()+"]"); - Object value = rs.getObject(column.getColumnName()); + Object value = masterPO.get_Value(column.getColumnName()); String valueString = null; if (value != null) { valueString = value.toString(); @@ -442,8 +377,7 @@ public class ExportHelper { if (valueString != null && !"".equals(valueString) && !"null".equals(valueString)) { rootElement.setAttribute(formatLine.getValue(), valueString); elementHasValue = true; - //increaseVariable(variableMap, formatLines[i].getVariableName()); // Increase value of Variable if any Variable - //increaseVariable(variableMap, TOTAL_SEGMENTS); + } else { // Empty field. } @@ -458,44 +392,30 @@ public class ExportHelper { MTable tableEmbedded = MTable.get(masterPO.getCtx(), embeddedFormat.getAD_Table_ID()); log.info("Table Embedded = " + tableEmbedded); - StringBuffer sql = new StringBuffer("SELECT * ") - .append("FROM ").append(tableEmbedded.getTableName()).append(" ") - .append("WHERE ").append(masterPO.get_KeyColumns()[0]).append("=?") - //+ "WHERE " + po.get_WhereClause(false) - ; - if (embeddedFormat.getWhereClause() != null & !"".equals(embeddedFormat.getWhereClause())) { - sql.append(" AND ").append(embeddedFormat.getWhereClause()); - } - log.info(sql.toString()); - ResultSet rsEmbedded = null; - PreparedStatement pstmt = null; - try + + final StringBuffer whereClause = new StringBuffer(masterPO.get_KeyColumns()[0] +"=?"); + + if (embeddedFormat.getWhereClause() != null & !"".equals(embeddedFormat.getWhereClause())) { - pstmt = DB.prepareStatement(sql.toString(), masterPO.get_TrxName()); - pstmt.setInt(1, masterID); - rsEmbedded = pstmt.executeQuery(); - while (rsEmbedded.next()) - { - //System.out.println("Trifon - tableEmbedded.getTableName()_ID = "+ tableEmbedded.getTableName() + "_ID"); - int embeddedID = rsEmbedded.getInt(tableEmbedded.getTableName() + "_ID"); - PO poEmbedded = tableEmbedded.getPO (embeddedID, masterPO.get_TrxName()); - - Element embeddedElement = outDocument.createElement(formatLine.getValue()); - if (formatLine.getDescription() != null && !"".equals(formatLine.getDescription())) { - embeddedElement.appendChild(outDocument.createComment(formatLine.getDescription())); - } - generateExportFormat(embeddedElement, embeddedFormat, rsEmbedded, poEmbedded, embeddedID, variableMap); - rootElement.appendChild(embeddedElement); - } - - } finally { - try { - if (rsEmbedded != null) rsEmbedded.close(); - if (pstmt != null) pstmt.close(); - } catch (SQLException ex) { } - rsEmbedded = null; - pstmt = null; + whereClause.append(" AND ").append(embeddedFormat.getWhereClause()); } + Collection instances = new Query(masterPO.getCtx(), + tableEmbedded.getTableName(), whereClause.toString(), + masterPO.get_TrxName()).setClient_ID().setParameters( + new Object[] { masterID }).list(); + + for (PO instance : instances) + { + Element embeddedElement = outDocument.createElement(formatLine.getValue()); + if (formatLine.getDescription() != null && !"".equals(formatLine.getDescription())) + { + embeddedElement.appendChild(outDocument.createComment(formatLine.getDescription())); + } + + generateExportFormat(embeddedElement, embeddedFormat, instance, instance.get_ID(), variableMap); + rootElement.appendChild(embeddedElement); + } + } else if ( formatLine.getType().equals(X_EXP_FormatLine.TYPE_ReferencedEXPFormat) ) @@ -508,64 +428,35 @@ public class ExportHelper { MTable tableEmbedded = MTable.get(masterPO.getCtx(), embeddedFormat.getAD_Table_ID()); log.info("Table Embedded = " + tableEmbedded); - StringBuffer sql = new StringBuffer("SELECT * ") - .append("FROM ").append(tableEmbedded.getTableName()).append(" ") - .append("WHERE ").append(tableEmbedded.getTableName() + "_ID").append("=?") - //+ "WHERE " + po.get_WhereClause(false) - ; - if (embeddedFormat.getWhereClause() != null & !"".equals(embeddedFormat.getWhereClause())) { - sql.append(" AND ").append(embeddedFormat.getWhereClause()); - } - log.info(sql.toString()); - if (formatLine.getAD_Column_ID() == 0) { - throw new Exception(Msg.getMsg (masterPO.getCtx(), "EXPColumnMandatory")); - } - MColumn column = MColumn.get(masterPO.getCtx(), formatLine.getAD_Column_ID()); - if (column == null) { - throw new Exception(Msg.getMsg (masterPO.getCtx(), "EXPColumnMandatory")); - } - if ( column.isVirtualColumn() ) { - log.info("This is Virtual Column!"); - } else { } - //log.info("["+column.getColumnName()+"]"); - Object value = rs.getObject(column.getColumnName()); -/* String valueString = null; - if (value != null) { - valueString = value.toString(); - } else { - throw new Exception(Msg.getMsg (masterPO.getCtx(), "EXPFieldMandatory")); - } -*/ - log.info(sql.toString()); - ResultSet rsEmbedded = null; - PreparedStatement pstmt = null; - try + + final StringBuffer whereClause = new StringBuffer(tableEmbedded.getTableName() + "_ID =?"); + if (embeddedFormat.getWhereClause() != null & !"".equals(embeddedFormat.getWhereClause())) { - pstmt = DB.prepareStatement(sql.toString(), masterPO.get_TrxName()); - pstmt.setObject(1, value); - rsEmbedded = pstmt.executeQuery(); - while (rsEmbedded.next()) - { - //System.out.println("Trifon - tableEmbedded.getTableName()_ID = "+ tableEmbedded.getTableName() + "_ID"); - int embeddedID = rsEmbedded.getInt(tableEmbedded.getTableName() + "_ID"); - PO poEmbedded = tableEmbedded.getPO (embeddedID, masterPO.get_TrxName()); - - Element embeddedElement = outDocument.createElement(formatLine.getValue()); - if (formatLine.getDescription() != null && !"".equals(formatLine.getDescription())) { - embeddedElement.appendChild(outDocument.createComment(formatLine.getDescription())); - } - generateExportFormat(embeddedElement, embeddedFormat, rsEmbedded, poEmbedded, embeddedID, variableMap); - rootElement.appendChild(embeddedElement); - } - - } finally { - try { - if (rsEmbedded != null) rsEmbedded.close(); - if (pstmt != null) pstmt.close(); - } catch (SQLException ex) { } - rsEmbedded = null; - pstmt = null; + whereClause.append(" AND ").append(embeddedFormat.getWhereClause()); } + + Object value = masterPO.get_Value(tableEmbedded.getTableName() + "_ID"); + if (value == null) + { + continue; + } + + Collection instances = new Query(masterPO.getCtx(),tableEmbedded.getTableName(), whereClause.toString(),masterPO.get_TrxName()) + .setClient_ID() + .setParameters(new Object[] { value }) + .list(); + + for (PO instance : instances) + { + Element embeddedElement = outDocument.createElement(formatLine.getValue()); + if (formatLine.getDescription() != null && !"".equals(formatLine.getDescription())) + { + embeddedElement.appendChild(outDocument.createComment(formatLine.getDescription())); + } + + generateExportFormat(embeddedElement, embeddedFormat, instance, instance.get_ID(), variableMap); + rootElement.appendChild(embeddedElement); + } } diff --git a/base/src/org/adempiere/process/rpl/imp/ImportHelper.java b/base/src/org/adempiere/process/rpl/imp/ImportHelper.java index 8575540c3b..a0a89207fe 100755 --- a/base/src/org/adempiere/process/rpl/imp/ImportHelper.java +++ b/base/src/org/adempiere/process/rpl/imp/ImportHelper.java @@ -40,8 +40,8 @@ import java.util.Properties; import javax.xml.xpath.XPathExpressionException; import org.adempiere.exceptions.AdempiereException; -import org.adempiere.process.rpl.exp.ExportHelper; import org.adempiere.process.rpl.XMLHelper; +import org.adempiere.process.rpl.exp.ExportHelper; import org.compiere.model.I_AD_Client; import org.compiere.model.MClient; import org.compiere.model.MColumn; @@ -52,7 +52,9 @@ import org.compiere.model.MTable; import org.compiere.model.ModelValidator; import org.compiere.model.PO; import org.compiere.model.Query; +import org.compiere.model.X_AD_ReplicationDocument; import org.compiere.model.X_AD_ReplicationTable; +import org.compiere.process.DocAction; import org.compiere.util.CLogger; import org.compiere.util.DisplayType; import org.compiere.util.Env; @@ -69,6 +71,8 @@ import org.w3c.dom.NodeList; * @author victor.perez@e-evolution.com, e-Evolution *
  • [ 2195090 ] Stabilization of replication *
  • https://sourceforge.net/tracker/?func=detail&atid=879332&aid=2936561&group_id=176962 + *
  • BF [2947622] The replication ID (Primary Key) is not working + *
  • https://sourceforge.net/tracker/?func=detail&aid=2947622&group_id=176962&atid=879332 * */ public class ImportHelper { @@ -171,65 +175,62 @@ public class ImportHelper { if(po != null) { - // Here must invoke other method else we get cycle... - if (ModelValidator.TYPE_BEFORE_DELETE == ReplicationEvent - || ModelValidator.TYPE_BEFORE_DELETE_REPLICATION == ReplicationEvent - || ModelValidator.TYPE_DELETE == ReplicationEvent) - { - po.deleteEx(true); - } - else - { - if(X_AD_ReplicationTable.REPLICATIONTYPE_Broadcast.equals(ReplicationType)) - { - po.saveReplica(true); - MReplicationStrategy rplStrategy = new MReplicationStrategy(client.getCtx(), client.getAD_ReplicationStrategy_ID(), null); - ExportHelper expHelper = new ExportHelper(client, rplStrategy); - expHelper.exportRecord( po, - MReplicationStrategy.REPLICATION_TABLE, - X_AD_ReplicationTable.REPLICATIONTYPE_Merge, - ModelValidator.TYPE_AFTER_CHANGE); - } - else if(X_AD_ReplicationTable.REPLICATIONTYPE_Merge.equals(ReplicationType) - || X_AD_ReplicationTable.REPLICATIONTYPE_Reference.equals(ReplicationType)) - { - po.saveReplica(true); - } - /*else if (X_AD_ReplicationTable.REPLICATIONTYPE_Reference.equals(ReplicationType)) - { - //Do nothing?? - }*/ - else if(X_AD_ReplicationTable.REPLICATIONTYPE_Local.equals(ReplicationType)) - { - //Do nothing?? - } - else - { - // Replication Type is not one of the possible values...ERROR - throw new Exception(Msg.getMsg(ctx, "EXPReplicationTypeNonValidType")); - } - - - } - } - result.append("Save Successful ;"); - /*if (resultSave) - { - if(ReplicationMode == MReplicationStrategy.REPLICATION_DOCUMENT && - ReplicationType == X_AD_ReplicationDocument.REPLICATIONTYPE_Merge) - { - String status = po.get_ValueAsString("DocStatus"); - String action = po.get_ValueAsString("DocAction"); - DocAction m_document; - m_document=(DocAction) po; - DocumentEngine engine = new DocumentEngine (m_document, status); - engine.processIt (action); - } - // Success in save - } else { - // Failed in save - throw new Exception(Msg.getMsg(ctx, "EXPFormatFailedSave")); - }*/ + if(MReplicationStrategy.REPLICATION_TABLE==ReplicationMode) + { + // Here must invoke other method else we get cycle... + if ( ModelValidator.TYPE_BEFORE_DELETE == ReplicationEvent + || ModelValidator.TYPE_BEFORE_DELETE_REPLICATION == ReplicationEvent + || ModelValidator.TYPE_DELETE == ReplicationEvent) + { + po.deleteEx(true); + } + else + { + if(X_AD_ReplicationTable.REPLICATIONTYPE_Broadcast.equals(ReplicationType)) + { + po.saveReplica(true); + MReplicationStrategy rplStrategy = new MReplicationStrategy(client.getCtx(), client.getAD_ReplicationStrategy_ID(), null); + ExportHelper expHelper = new ExportHelper(client, rplStrategy); + expHelper.exportRecord( po, + MReplicationStrategy.REPLICATION_TABLE, + X_AD_ReplicationTable.REPLICATIONTYPE_Merge, + ModelValidator.TYPE_AFTER_CHANGE); + + } + else if(X_AD_ReplicationTable.REPLICATIONTYPE_Merge.equals(ReplicationType) + || X_AD_ReplicationTable.REPLICATIONTYPE_Reference.equals(ReplicationType)) + { + if(po.is_Changed()) + { + po.saveReplica(true); + } + } + /*else if (X_AD_ReplicationTable.REPLICATIONTYPE_Reference.equals(ReplicationType)) + { + //Do nothing?? + }*/ + else if(X_AD_ReplicationTable.REPLICATIONTYPE_Local.equals(ReplicationType)) + { + //Do nothing?? + } + else + { + // Replication Type is not one of the possible values...ERROR + throw new Exception(Msg.getMsg(ctx, "EXPReplicationTypeNonValidType")); + } + } + } + else if(MReplicationStrategy.REPLICATION_DOCUMENT == ReplicationMode + && X_AD_ReplicationDocument.REPLICATIONTYPE_Merge.equals(ReplicationType) + && po instanceof DocAction) + { + Env.setContext(Env.getCtx(), "#AD_Client_ID", po.getAD_Client_ID()); + DocAction document = (DocAction)po; + document.processIt(document.getDocAction()); + po.saveEx(); + } + } + result.append("Save Successful ;"); } /** @@ -279,7 +280,7 @@ public class ImportHelper { log.info("=================== Beginnig of Format Line ==============================="); log.info("formatLine: [" + formatLine.toString() + "]"); //Get the value - Object value = getValueFromFormat(formatLine,po,rootElement,result,ReplicationType,trxName); + Object value = getValueFromFormat(formatLine,po,rootElement,result,ReplicationType); if (value == null || value.toString().equals("")) continue; //Set the value @@ -300,7 +301,7 @@ public class ImportHelper { * @throws Exception */ private Object getValueFromFormat(MEXPFormatLine line,PO po,Element rootElement, - StringBuffer result, String ReplicationType, String trxName) throws Exception + StringBuffer result, String ReplicationType) throws Exception { Object value = null; @@ -315,7 +316,7 @@ public class ImportHelper { { // Referenced Export Format //get from cache - MEXPFormat referencedExpFormat = MEXPFormat.get(ctx, line.getEXP_EmbeddedFormat_ID(), trxName); + MEXPFormat referencedExpFormat = MEXPFormat.get(ctx, line.getEXP_EmbeddedFormat_ID(), po.get_TrxName()); log.info("referencedExpFormat = " + referencedExpFormat); int refRecord_ID = 0; @@ -329,7 +330,7 @@ public class ImportHelper { log.info("referencedNode = " + referencedNode); if(referencedNode!=null) { - refRecord_ID = getID(ctx, referencedExpFormat, referencedNode, line.getValue(), trxName); + refRecord_ID = getID(ctx, referencedExpFormat, referencedNode, line.getValue(), po.get_TrxName()); log.info("refRecord_ID = " + refRecord_ID); value = new Integer(refRecord_ID); } @@ -349,7 +350,7 @@ public class ImportHelper { // Embedded Export Format It is used for Parent-Son records like Order&OrderLine //get from cache - MEXPFormat referencedExpFormat = MEXPFormat.get(ctx, line.getEXP_EmbeddedFormat_ID(), trxName); + MEXPFormat referencedExpFormat = MEXPFormat.get(ctx, line.getEXP_EmbeddedFormat_ID(), po.get_TrxName()); log.info("embeddedExpFormat = " + referencedExpFormat); NodeList nodeList = XMLHelper.getNodeList("/"+rootElement.getNodeName() + "/" + line.getValue(), rootElement); @@ -361,7 +362,7 @@ public class ImportHelper { PO embeddedPo = null; // Import embedded PO log.info("=== BEGIN RECURSION CALL ==="); - embeddedPo = importElement(ctx, result, referencedElement, referencedExpFormat,ReplicationType, trxName); + embeddedPo = importElement(ctx, result, referencedElement, referencedExpFormat,ReplicationType, po.get_TrxName()); log.info("embeddedPo = " + embeddedPo); embeddedPo.saveReplica(true); result.append(" Embedded Save Successful ; "); @@ -394,12 +395,13 @@ public class ImportHelper { */ private void setReplicaValues(Object value,MEXPFormatLine line,PO po,StringBuffer result)throws Exception { + MColumn column = MColumn.get(ctx, line.getAD_Column_ID()); + log.info("column=[" + column + "]"); + if (value !=null) { if (!MEXPFormatLine.TYPE_EmbeddedEXPFormat.equals(line.getType()) ) { - MColumn column = MColumn.get(ctx, line.getAD_Column_ID()); - log.info("column=[" + column + "]"); // Clazz Class clazz = DisplayType.getClass(column.getAD_Reference_ID(), true); @@ -481,7 +483,11 @@ public class ImportHelper { } else if(DisplayType.YesNo == column.getAD_Reference_ID()) { - po.set_ValueOfColumn(line.getAD_Column_ID(), value); + if(clazz == Boolean.class) + { + String v = value.toString().equals("true") ? "Y" : "N"; + po.set_ValueOfColumn(line.getAD_Column_ID(), v); + } } else { @@ -491,7 +497,8 @@ public class ImportHelper { if(clazz == Boolean.class) { - po.set_ValueOfColumn(line.getAD_Column_ID(), value); + String v = value.toString().equals("true") ? "Y" : "N"; + po.set_ValueOfColumn(line.getAD_Column_ID(), v); } else { @@ -565,6 +572,7 @@ public class ImportHelper { throw new AdempiereException(Msg.getMsg(ctx, "EXPFormatLineNoUniqueColumns")); } + int replication_id = 0; Object[] cols = new Object[uniqueFormatLines.size()]; Object[] params = new Object[uniqueFormatLines.size()]; StringBuffer whereClause= new StringBuffer(""); @@ -634,6 +642,10 @@ public class ImportHelper { { //double doubleValue = Double.parseDouble(value.toString()); value = new Integer(value.toString()); + if (DisplayType.ID == column.getAD_Reference_ID()) + { + replication_id = (Integer) value; + } } else { @@ -671,7 +683,14 @@ public class ImportHelper { if(values.size()<=0)//Means that is a new record { - return MTable.get(ctx, expFormat.getAD_Table_ID()).getPO(0,trxName); + PO po = po = MTable.get(ctx, expFormat.getAD_Table_ID()).getPO(0,trxName); + + if (replication_id > 0 ) + { + po.set_CustomColumn(po.get_KeyColumns()[0], replication_id); + } + + return po; } return values.get(0);//Return the first (unique) record. diff --git a/base/src/org/compiere/model/PO.java b/base/src/org/compiere/model/PO.java index bc22517a0e..dd177b30f1 100644 --- a/base/src/org/compiere/model/PO.java +++ b/base/src/org/compiere/model/PO.java @@ -86,6 +86,8 @@ import org.w3c.dom.Element; * @author Victor Perez, e-Evolution SC *
  • [ 2195894 ] Improve performance in PO engine *
  • http://sourceforge.net/tracker/index.php?func=detail&aid=2195894&group_id=176962&atid=879335 + *
  • BF [2947622] The replication ID (Primary Key) is not working + *
  • https://sourceforge.net/tracker/?func=detail&aid=2947622&group_id=176962&atid=879332 */ public abstract class PO implements Serializable, Comparator, Evaluatee @@ -2512,6 +2514,14 @@ public abstract class PO int no = saveNew_getID(); if (no <= 0) no = DB.getNextID(getAD_Client_ID(), p_info.getTableName(), m_trxName); + // the primary key is not overwrite with the local sequence + if (isReplication()) + { + if (get_ID() > 0) + { + no = get_ID(); + } + } if (no <= 0) { log.severe("No NextID (" + no + ")");