IDEMPIERE-1425 Account element improvements / fix tree driven by value not working for multiple trees on element value / implement fix tree driven by value on verify tree

This commit is contained in:
Carlos Ruiz 2016-04-18 22:47:55 -07:00
parent 3d765f262e
commit 9a558f8997
2 changed files with 66 additions and 5 deletions

View File

@ -21,6 +21,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.logging.Level; import java.util.logging.Level;
import org.compiere.model.MTable;
import org.compiere.model.MTree; import org.compiere.model.MTree;
import org.compiere.model.MTree_Base; import org.compiere.model.MTree_Base;
import org.compiere.model.MTree_Node; import org.compiere.model.MTree_Node;
@ -170,6 +171,41 @@ public class TreeMaintenance extends SvrProcess
rs = null; rs = null;
pstmt = null; pstmt = null;
} }
// Driven by Value
if (tree.isTreeDrivenByValue()) {
sql = new StringBuilder();
sql.append("SELECT ").append(sourceTableKey)
.append(" FROM ").append(sourceTableName)
.append(" WHERE AD_Client_ID=").append(AD_Client_ID);
if (C_Element_ID > 0)
sql.append(" AND C_Element_ID=").append(C_Element_ID);
if (log.isLoggable(Level.FINER)) log.finer(sql.toString());
//
MTable table = MTable.get(getCtx(), sourceTableName);
try
{
pstmt = DB.prepareStatement(sql.toString(), get_TrxName());
rs = pstmt.executeQuery();
while (rs.next())
{
int Node_ID = rs.getInt(1);
PO rec = table.getPO(Node_ID, get_TrxName());
rec.update_Tree(tree.getTreeType());
}
}
catch (Exception e)
{
log.log(Level.SEVERE, "verifyTree", e);
}
finally
{
DB.close(rs, pstmt);
rs = null;
pstmt = null;
}
}
StringBuilder msglog = new StringBuilder().append(tree.getName()).append(" Inserted"); StringBuilder msglog = new StringBuilder().append(tree.getName()).append(" Inserted");
addLog(0,null, new BigDecimal(inserts), msglog.toString()); addLog(0,null, new BigDecimal(inserts), msglog.toString());
StringBuilder msgreturn = new StringBuilder().append(tree.getName()).append((ok ? " OK" : " Error")); StringBuilder msgreturn = new StringBuilder().append(tree.getName()).append((ok ? " OK" : " Error"));

View File

@ -107,7 +107,7 @@ public abstract class PO
/** /**
* *
*/ */
private static final long serialVersionUID = 8237905660667141657L; private static final long serialVersionUID = -2997116608353367498L;
public static final String LOCAL_TRX_PREFIX = "POSave"; public static final String LOCAL_TRX_PREFIX = "POSave";
@ -3897,7 +3897,7 @@ public abstract class PO
* @param treeType MTree TREETYPE_* * @param treeType MTree TREETYPE_*
* @return true if inserted * @return true if inserted
*/ */
protected void update_Tree (String treeType) public void update_Tree (String treeType)
{ {
int idxValueCol = get_ColumnIndex("Value"); int idxValueCol = get_ColumnIndex("Value");
if (idxValueCol < 0) if (idxValueCol < 0)
@ -3919,9 +3919,14 @@ public abstract class PO
parameters = new Object[]{treeType, this.get_Table_ID()}; parameters = new Object[]{treeType, this.get_Table_ID()};
} else { } else {
sourceTableName = MTree_Base.getSourceTableName(treeType); sourceTableName = MTree_Base.getSourceTableName(treeType);
if (MTree_Base.TREETYPE_ElementValue.equals(treeType) && this instanceof I_C_ElementValue) {
whereTree = "TreeType=? AND AD_Tree_ID=?";
parameters = new Object[]{treeType, ((I_C_ElementValue)this).getC_Element().getAD_Tree_ID()};
} else {
whereTree = "TreeType=?"; whereTree = "TreeType=?";
parameters = new Object[]{treeType}; parameters = new Object[]{treeType};
} }
}
String updateSeqNo = "UPDATE " + tableName + " SET SeqNo=SeqNo+1 WHERE Parent_ID=? AND SeqNo>=? AND AD_Tree_ID=?"; String updateSeqNo = "UPDATE " + tableName + " SET SeqNo=SeqNo+1 WHERE Parent_ID=? AND SeqNo>=? AND AD_Tree_ID=?";
String update = "UPDATE " + tableName + " SET SeqNo=?, Parent_ID=? WHERE Node_ID=? AND AD_Tree_ID=?"; String update = "UPDATE " + tableName + " SET SeqNo=?, Parent_ID=? WHERE Node_ID=? AND AD_Tree_ID=?";
String selMinSeqNo = "SELECT COALESCE(MIN(tn.SeqNo),-1) FROM AD_TreeNode tn JOIN " + sourceTableName + " n ON (tn.Node_ID=n." + sourceTableName + "_ID) WHERE tn.Parent_ID=? AND tn.AD_Tree_ID=? AND n.Value>?"; String selMinSeqNo = "SELECT COALESCE(MIN(tn.SeqNo),-1) FROM AD_TreeNode tn JOIN " + sourceTableName + " n ON (tn.Node_ID=n." + sourceTableName + "_ID) WHERE tn.Parent_ID=? AND tn.AD_Tree_ID=? AND n.Value>?";
@ -3935,7 +3940,12 @@ public abstract class PO
for (MTree_Base tree : trees) { for (MTree_Base tree : trees) {
if (tree.isTreeDrivenByValue()) { if (tree.isTreeDrivenByValue()) {
int newParentID = retrieveIdOfParentValue(value, sourceTableName, getAD_Client_ID(), get_TrxName()); int newParentID = -1;
if (I_C_ElementValue.Table_Name.equals(sourceTableName)) {
newParentID = retrieveIdOfElementValue(value, getAD_Client_ID(), ((I_C_ElementValue)this).getC_Element().getC_Element_ID(), get_TrxName());
} else {
newParentID = retrieveIdOfParentValue(value, sourceTableName, getAD_Client_ID(), get_TrxName());
}
int seqNo = DB.getSQLValueEx(get_TrxName(), selMinSeqNo, newParentID, tree.getAD_Tree_ID(), value); int seqNo = DB.getSQLValueEx(get_TrxName(), selMinSeqNo, newParentID, tree.getAD_Tree_ID(), value);
if (seqNo == -1) if (seqNo == -1)
seqNo = DB.getSQLValueEx(get_TrxName(), selMaxSeqNo, newParentID, tree.getAD_Tree_ID(), value); seqNo = DB.getSQLValueEx(get_TrxName(), selMaxSeqNo, newParentID, tree.getAD_Tree_ID(), value);
@ -3945,6 +3955,21 @@ public abstract class PO
} }
} // update_Tree } // update_Tree
/** Returns the summary node from C_ElementValue with the corresponding value */
private int retrieveIdOfElementValue(String value, int clientID, int elementID, String trxName)
{
String sql = "SELECT C_ElementValue_ID FROM C_ElementValue WHERE IsSummary='Y' AND AD_Client_ID=? AND C_Element_ID=? AND Value=?";
int pos = value.length()-1;
while (pos > 0) {
String testParentValue = value.substring(0, pos);
int parentID = DB.getSQLValueEx(trxName, sql, clientID, elementID, testParentValue);
if (parentID > 0)
return parentID;
pos--;
}
return 0; // rootID
}
/** Returns the summary node with the corresponding value */ /** Returns the summary node with the corresponding value */
public static int retrieveIdOfParentValue(String value, String tableName, int clientID, String trxName) public static int retrieveIdOfParentValue(String value, String tableName, int clientID, String trxName)
{ {