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:
parent
3d765f262e
commit
9a558f8997
|
@ -21,6 +21,7 @@ import java.sql.PreparedStatement;
|
|||
import java.sql.ResultSet;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import org.compiere.model.MTable;
|
||||
import org.compiere.model.MTree;
|
||||
import org.compiere.model.MTree_Base;
|
||||
import org.compiere.model.MTree_Node;
|
||||
|
@ -170,6 +171,41 @@ public class TreeMaintenance extends SvrProcess
|
|||
rs = 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");
|
||||
addLog(0,null, new BigDecimal(inserts), msglog.toString());
|
||||
StringBuilder msgreturn = new StringBuilder().append(tree.getName()).append((ok ? " OK" : " Error"));
|
||||
|
|
|
@ -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";
|
||||
|
||||
|
@ -3897,7 +3897,7 @@ public abstract class PO
|
|||
* @param treeType MTree TREETYPE_*
|
||||
* @return true if inserted
|
||||
*/
|
||||
protected void update_Tree (String treeType)
|
||||
public void update_Tree (String treeType)
|
||||
{
|
||||
int idxValueCol = get_ColumnIndex("Value");
|
||||
if (idxValueCol < 0)
|
||||
|
@ -3919,9 +3919,14 @@ public abstract class PO
|
|||
parameters = new Object[]{treeType, this.get_Table_ID()};
|
||||
} else {
|
||||
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=?";
|
||||
parameters = new Object[]{treeType};
|
||||
}
|
||||
}
|
||||
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 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) {
|
||||
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);
|
||||
if (seqNo == -1)
|
||||
seqNo = DB.getSQLValueEx(get_TrxName(), selMaxSeqNo, newParentID, tree.getAD_Tree_ID(), value);
|
||||
|
@ -3945,6 +3955,21 @@ public abstract class PO
|
|||
}
|
||||
} // 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 */
|
||||
public static int retrieveIdOfParentValue(String value, String tableName, int clientID, String trxName)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue