IDEMPIERE-3916 / FHEG-599 / Implement migrate ID for nodes in tree tables

This commit is contained in:
Carlos Ruiz 2019-03-15 18:09:39 +01:00
parent d7f6cc7b84
commit 4f321005d7
2 changed files with 103 additions and 7 deletions

View File

@ -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();

View File

@ -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<String> columns = new ArrayList<String>();
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);
}
}
}
}