From 4f321005d7d0e7122a4510e3cc2d79edbcc13125 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Fri, 15 Mar 2019 18:09:39 +0100 Subject: [PATCH] IDEMPIERE-3916 / FHEG-599 / Implement migrate ID for nodes in tree tables --- .../src/org/compiere/model/MSequence.java | 16 +++- .../src/org/idempiere/process/MigraID.java | 94 ++++++++++++++++++- 2 files changed, 103 insertions(+), 7 deletions(-) diff --git a/org.adempiere.base/src/org/compiere/model/MSequence.java b/org.adempiere.base/src/org/compiere/model/MSequence.java index 9b61346dd7..a47d66b2f8 100644 --- a/org.adempiere.base/src/org/compiere/model/MSequence.java +++ b/org.adempiere.base/src/org/compiere/model/MSequence.java @@ -54,7 +54,7 @@ public class MSequence extends X_AD_Sequence /** * */ - private static final long serialVersionUID = 7331047665037991960L; + private static final long serialVersionUID = -2215317912000946608L; /** Log Level for Next ID Call */ private static final Level LOGLEVEL = Level.ALL; @@ -919,16 +919,22 @@ public class MSequence extends X_AD_Sequence return retValue; } // getNextNo + public String validateTableIDValue() + { + return validateTableIDValue(null); + } + /** * Validate Table Sequence Values + * trxName the Transaction * @return true if updated */ - public String validateTableIDValue() + public String validateTableIDValue(String trxName) { if (!isTableID()) return null; String tableName = getName(); - int AD_Column_ID = DB.getSQLValue(null, "SELECT MAX(c.AD_Column_ID) " + int AD_Column_ID = DB.getSQLValue(trxName, "SELECT MAX(c.AD_Column_ID) " + "FROM AD_Table t" + " INNER JOIN AD_Column c ON (t.AD_Table_ID=c.AD_Table_ID) " + "WHERE t.TableName='" + tableName + "'" @@ -949,7 +955,7 @@ public class MSequence extends X_AD_Sequence String sql = "SELECT MAX(" + tableName + "_ID) FROM " + tableName; if (IDRangeEnd > 0) sql += " WHERE " + tableName + "_ID < " + IDRangeEnd; - int maxTableID = DB.getSQLValue(null, sql); + int maxTableID = DB.getSQLValue(trxName, sql); if (maxTableID < INIT_NO) maxTableID = INIT_NO - 1; maxTableID++; // Next @@ -965,7 +971,7 @@ public class MSequence extends X_AD_Sequence // Get Max System_ID used in Table sql = "SELECT MAX(" + tableName + "_ID) FROM " + tableName + " WHERE " + tableName + "_ID < " + INIT_NO; - int maxTableSysID = DB.getSQLValue(null, sql); + int maxTableSysID = DB.getSQLValue(trxName, sql); if (maxTableSysID <= 0) maxTableSysID = INIT_SYS_NO; int currentNextSysValue = getCurrentNextSys(); diff --git a/org.adempiere.base/src/org/idempiere/process/MigraID.java b/org.adempiere.base/src/org/idempiere/process/MigraID.java index be5c86ef37..c78c83844e 100644 --- a/org.adempiere.base/src/org/idempiere/process/MigraID.java +++ b/org.adempiere.base/src/org/idempiere/process/MigraID.java @@ -26,12 +26,14 @@ package org.idempiere.process; +import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.logging.Level; import org.compiere.model.MSequence; import org.compiere.model.MTable; +import org.compiere.model.MTree; import org.compiere.model.Query; import org.compiere.process.ProcessInfoParameter; import org.compiere.process.SvrProcess; @@ -113,9 +115,18 @@ public class MigraID extends SvrProcess { msg = "@OK@"; } } else { + boolean seqCheck = false; String idCol = tableName + "_ID"; if (p_ID_To <= 0) { p_ID_To = DB.getNextID(getAD_Client_ID(), tableName, get_TrxName()); + } else { + StringBuilder sqlMaxSB = new StringBuilder() + .append("SELECT MAX(").append(tableName).append("_ID)") + .append(" FROM ").append(tableName); + int maxID = DB.getSQLValueEx(get_TrxName(), sqlMaxSB.toString()); + if (p_ID_To > maxID) { + seqCheck = true; + } } // convert ID int cnt = updID(tableName, idCol); @@ -130,15 +141,17 @@ public class MigraID extends SvrProcess { migrateChildren(tableName); migrateRecordID(); migrateAD_Preference(idCol); + migrateTrees(tableName); if ("C_DocType_ID".equals(idCol)) { // special preference C_DocTypeTarget_ID migrateAD_Preference("C_DocTypeTarget_ID"); } // TODO: implement migration for SingleSelectionGrid and MultipleSelectionGrid - if (p_ID_To > p_ID_From) { + + if (seqCheck) { MSequence seq = MSequence.get(getCtx(), tableName, get_TrxName()); if (seq != null) { - seq.validateTableIDValue(); // ignore output messages + seq.validateTableIDValue(get_TrxName()); // ignore output messages } } } @@ -275,4 +288,81 @@ public class MigraID extends SvrProcess { } } + private void migrateTrees(String tableName) { + switch (tableName) { + case "AD_Menu": + migraTree("AD_TreeBar", MTree.TREETYPE_Menu); + migraTree("AD_TreeNodeMM", MTree.TREETYPE_Menu); + break; + case "C_BPartner": + migraTree("AD_TreeNodeBP", MTree.TREETYPE_BPartner); + break; + case "CM_Container": + migraTree("AD_TreeNodeCMC", MTree.TREETYPE_CMContainer); + break; + case "CM_Media": + migraTree("AD_TreeNodeCMM", MTree.TREETYPE_CMMedia); + break; + case "CM_CStage": + migraTree("AD_TreeNodeCMS", MTree.TREETYPE_CMContainerStage); + break; + case "CM_Template": + migraTree("AD_TreeNodeCMT", MTree.TREETYPE_CMTemplate); + break; + case "M_Product": + migraTree("AD_TreeNodePR", MTree.TREETYPE_Product); + break; + case "C_ElementValue": + migraTree("AD_TreeNodeU1", MTree.TREETYPE_User1); + migraTree("AD_TreeNodeU2", MTree.TREETYPE_User2); + migraTree("AD_TreeNodeU3", MTree.TREETYPE_User3); + migraTree("AD_TreeNodeU4", MTree.TREETYPE_User4); + break; + case "AD_Org": + migraTree("AD_TreeNode", MTree.TREETYPE_Organization); + break; + case "M_Product_Category": + migraTree("AD_TreeNode", MTree.TREETYPE_ProductCategory); + break; + case "M_BOM": + migraTree("AD_TreeNode", MTree.TREETYPE_BoM); + break; + case "C_Campaign": + migraTree("AD_TreeNode", MTree.TREETYPE_Campaign); + break; + case "C_Project": + migraTree("AD_TreeNode", MTree.TREETYPE_Project); + break; + case "C_Activity": + migraTree("AD_TreeNode", MTree.TREETYPE_Activity); + break; + case "C_SalesRegion": + migraTree("AD_TreeNode", MTree.TREETYPE_SalesRegion); + break; + } + migraTree("AD_TreeNode", MTree.TREETYPE_CustomTable); + } + + private void migraTree(String menuTable, String treeType) { + List columns = new ArrayList(); + columns.add("Node_ID"); + if (! "AD_TreeBar".equalsIgnoreCase(menuTable)) { + columns.add("Parent_ID"); + } + for (String col : columns) { + StringBuilder sqlUpdTreeSB = new StringBuilder() + .append("UPDATE ").append(menuTable) + .append(" SET ").append(col).append("=? WHERE ").append(col).append("=? AND AD_Tree_ID IN (SELECT AD_Tree_ID FROM AD_Tree WHERE TreeType=?"); + if (MTree.TREETYPE_CustomTable.equals(treeType)) { + sqlUpdTreeSB.append(" AND AD_Table_ID=").append(p_AD_Table_ID); + } + sqlUpdTreeSB.append(")"); + int cnt = DB.executeUpdateEx(sqlUpdTreeSB.toString(), new Object[] {p_ID_To, p_ID_From, treeType}, get_TrxName()); + if (cnt > 0) { + String msg = cnt + " tree records updated in " + menuTable + "." + col; + addBufferLog(p_ID_From, null, null, msg, 0, 0); + } + } + } + }