BF [ 2933367 ] Virtual Column Identifiers are not working

https://sourceforge.net/tracker/?func=detail&atid=879332&aid=2933367&group_id=176962

Link to SF Tracker: http://sourceforge.net/support/tracker.php?aid=2933367
This commit is contained in:
teo_sarca 2010-01-18 13:25:51 +00:00
parent 0e34ee7af1
commit 772a01a1bf
2 changed files with 80 additions and 13 deletions

View File

@ -18,12 +18,18 @@ package org.compiere.model;
import java.io.Serializable; import java.io.Serializable;
import org.compiere.util.Util;
/** /**
* Lookup Display Column Value Object * Lookup Display Column Value Object
* *
* @author Jorg Janke * @author Jorg Janke
* @version $Id: LookupDisplayColumn.java,v 1.3 2006/07/30 00:58:18 jjanke Exp $ * @version $Id: LookupDisplayColumn.java,v 1.3 2006/07/30 00:58:18 jjanke Exp $
*
* @author Teo Sarca
* <li>BF [ 2933367 ] Virtual Column Identifiers are not working
* https://sourceforge.net/tracker/?func=detail&aid=2933367&group_id=176962&atid=879332
*/ */
public class LookupDisplayColumn implements Serializable public class LookupDisplayColumn implements Serializable
{ {
@ -38,14 +44,31 @@ public class LookupDisplayColumn implements Serializable
* @param isTranslated translated * @param isTranslated translated
* @param ad_Reference_ID display type * @param ad_Reference_ID display type
* @param ad_Reference_Value_ID table/list reference id * @param ad_Reference_Value_ID table/list reference id
* @deprecated Please use {@link #LookupDisplayColumn(String, String, boolean, int, int)}
*/ */
public LookupDisplayColumn(String columnName, boolean isTranslated, public LookupDisplayColumn(String columnName, boolean isTranslated,
int ad_Reference_ID, int ad_Reference_Value_ID) int ad_Reference_ID, int ad_Reference_Value_ID)
{
this(columnName, null, isTranslated, ad_Reference_ID, ad_Reference_Value_ID);
} //
/**
* Lookup Column Value Object
* @param columnName column name
* @param columnSQL column SQL (in case is virtual column)
* @param isTranslated translated
* @param ad_Reference_ID display type
* @param ad_Reference_Value_ID table/list reference id
*/
public LookupDisplayColumn(String columnName, String columnSQL, boolean isTranslated,
int ad_Reference_ID, int ad_Reference_Value_ID)
{ {
ColumnName = columnName; ColumnName = columnName;
IsTranslated = isTranslated; IsTranslated = isTranslated;
DisplayType = ad_Reference_ID; DisplayType = ad_Reference_ID;
AD_Reference_ID = ad_Reference_Value_ID; AD_Reference_ID = ad_Reference_Value_ID;
ColumnSQL = columnSQL;
IsVirtual = !Util.isEmpty(ColumnSQL, true);
} // } //
/** Column Name */ /** Column Name */
@ -56,6 +79,10 @@ public class LookupDisplayColumn implements Serializable
public int DisplayType; public int DisplayType;
/** Value Reference */ /** Value Reference */
public int AD_Reference_ID; public int AD_Reference_ID;
/** Column SQL */
public final String ColumnSQL;
/** Is Virtual Column */
public final boolean IsVirtual;
/** /**
* String Representation * String Representation
@ -65,6 +92,8 @@ public class LookupDisplayColumn implements Serializable
{ {
StringBuffer sb = new StringBuffer("LookupDisplayColumn["); StringBuffer sb = new StringBuffer("LookupDisplayColumn[");
sb.append("ColumnName=").append(ColumnName); sb.append("ColumnName=").append(ColumnName);
if (IsVirtual)
sb.append(",ColumnSQL=").append(ColumnSQL);
if (IsTranslated) if (IsTranslated)
sb.append(",IsTranslated"); sb.append(",IsTranslated");
sb.append(",DisplayType=").append(DisplayType); sb.append(",DisplayType=").append(DisplayType);

View File

@ -44,6 +44,9 @@ import org.compiere.util.Language;
* <li>BF [ 1739530 ] getLookup_TableDirEmbed error when BaseColumn is sql query * <li>BF [ 1739530 ] getLookup_TableDirEmbed error when BaseColumn is sql query
* <li>BF [ 1739544 ] getLookup_TableEmbed error for self referencing references * <li>BF [ 1739544 ] getLookup_TableEmbed error for self referencing references
* <li>BF [ 1817768 ] Isolate hardcoded table direct columns * <li>BF [ 1817768 ] Isolate hardcoded table direct columns
* @author Teo Sarca
* <li>BF [ 2933367 ] Virtual Column Identifiers are not working
* https://sourceforge.net/tracker/?func=detail&aid=2933367&group_id=176962&atid=879332
* @author Carlos Ruiz, GlobalQSS * @author Carlos Ruiz, GlobalQSS
* <li>BF [ 2561593 ] Multi-tenant problem with webui * <li>BF [ 2561593 ] Multi-tenant problem with webui
*/ */
@ -590,7 +593,16 @@ public class MLookupFactory
embedSQL.append(" FROM ").append(TableName).append(" ").append(TableNameAlias); embedSQL.append(" FROM ").append(TableName).append(" ").append(TableNameAlias);
} }
embedSQL.append(" WHERE ").append(BaseTable).append(".").append(BaseColumn); embedSQL.append(" WHERE ");
// If is not virtual column - teo_sarca [ 1739530 ]
if (! BaseColumn.trim().startsWith("("))
{
embedSQL.append(BaseTable).append(".").append(BaseColumn);
}
else
{
embedSQL.append(BaseColumn);
}
embedSQL.append("=").append(TableNameAlias).append(".").append(KeyColumn); embedSQL.append("=").append(TableNameAlias).append(".").append(KeyColumn);
return embedSQL.toString(); return embedSQL.toString();
@ -628,6 +640,7 @@ public class MLookupFactory
// get display column names // get display column names
String sql0 = "SELECT c.ColumnName,c.IsTranslated,c.AD_Reference_ID," String sql0 = "SELECT c.ColumnName,c.IsTranslated,c.AD_Reference_ID,"
+ "c.AD_Reference_Value_ID,t.AD_Window_ID,t.PO_Window_ID " + "c.AD_Reference_Value_ID,t.AD_Window_ID,t.PO_Window_ID "
+ ", c.ColumnSQL " // 7
+ "FROM AD_Table t" + "FROM AD_Table t"
+ " INNER JOIN AD_Column c ON (t.AD_Table_ID=c.AD_Table_ID) " + " INNER JOIN AD_Column c ON (t.AD_Table_ID=c.AD_Table_ID) "
+ "WHERE TableName=?" + "WHERE TableName=?"
@ -647,6 +660,7 @@ public class MLookupFactory
while (rs.next()) while (rs.next())
{ {
LookupDisplayColumn ldc = new LookupDisplayColumn (rs.getString(1), LookupDisplayColumn ldc = new LookupDisplayColumn (rs.getString(1),
rs.getString(7), // ColumnSQL
"Y".equals(rs.getString(2)), rs.getInt(3), rs.getInt(4)); "Y".equals(rs.getString(2)), rs.getInt(3), rs.getInt(4));
list.add (ldc); list.add (ldc);
// s_log.fine("getLookup_TableDir: " + ColumnName + " - " + ldc); // s_log.fine("getLookup_TableDir: " + ColumnName + " - " + ldc);
@ -687,40 +701,53 @@ public class MLookupFactory
if (i > 0) if (i > 0)
displayColumn.append(" ||'_'|| " ); displayColumn.append(" ||'_'|| " );
LookupDisplayColumn ldc = (LookupDisplayColumn)list.get(i); LookupDisplayColumn ldc = (LookupDisplayColumn)list.get(i);
String columnSQL = ldc.IsVirtual ? ldc.ColumnSQL : TableName + "." + ldc.ColumnName;
displayColumn.append("NVL("); displayColumn.append("NVL(");
// translated // translated
if (ldc.IsTranslated && !Env.isBaseLanguage(language, TableName)) if (ldc.IsTranslated && !Env.isBaseLanguage(language, TableName) && !ldc.IsVirtual)
{
displayColumn.append(TableName).append("_Trl.").append(ldc.ColumnName); displayColumn.append(TableName).append("_Trl.").append(ldc.ColumnName);
}
// date // date
else if (DisplayType.isDate(ldc.DisplayType)) else if (DisplayType.isDate(ldc.DisplayType))
{ {
displayColumn.append(DB.TO_CHAR(TableName + "." + ldc.ColumnName, ldc.DisplayType, language.getAD_Language())); displayColumn.append(DB.TO_CHAR(columnSQL, ldc.DisplayType, language.getAD_Language()));
} }
// TableDir // TableDir
else if ((ldc.DisplayType == DisplayType.TableDir || ldc.DisplayType == DisplayType.Search) else if ((ldc.DisplayType == DisplayType.TableDir || ldc.DisplayType == DisplayType.Search)
&& ldc.ColumnName.endsWith("_ID")) && ldc.ColumnName.endsWith("_ID"))
{ {
String embeddedSQL = getLookup_TableDirEmbed(language, ldc.ColumnName, TableName); String embeddedSQL;
if (ldc.IsVirtual)
embeddedSQL = getLookup_TableDirEmbed(language, ldc.ColumnName, TableName, ldc.ColumnSQL);
else
embeddedSQL = getLookup_TableDirEmbed(language, ldc.ColumnName, TableName);
if (embeddedSQL != null) if (embeddedSQL != null)
displayColumn.append("(").append(embeddedSQL).append(")"); displayColumn.append("(").append(embeddedSQL).append(")");
} }
// Table // Table
else if (ldc.DisplayType == DisplayType.Table && ldc.AD_Reference_ID != 0) else if (ldc.DisplayType == DisplayType.Table && ldc.AD_Reference_ID != 0)
{ {
String embeddedSQL = getLookup_TableEmbed (language, ldc.ColumnName, TableName, ldc.AD_Reference_ID); String embeddedSQL;
if (ldc.IsVirtual)
embeddedSQL = getLookup_TableEmbed (language, ldc.ColumnSQL, TableName, ldc.AD_Reference_ID);
else
embeddedSQL = getLookup_TableEmbed (language, ldc.ColumnName, TableName, ldc.AD_Reference_ID);
if (embeddedSQL != null) if (embeddedSQL != null)
displayColumn.append("(").append(embeddedSQL).append(")"); displayColumn.append("(").append(embeddedSQL).append(")");
} }
// number // number
else if (DisplayType.isNumeric(ldc.DisplayType)) else if (DisplayType.isNumeric(ldc.DisplayType))
{ {
displayColumn.append(DB.TO_CHAR(TableName + "." + ldc.ColumnName, ldc.DisplayType, language.getAD_Language())); displayColumn.append(DB.TO_CHAR(columnSQL, ldc.DisplayType, language.getAD_Language()));
} }
// String // String
else else
displayColumn.append(TableName).append(".").append(ldc.ColumnName); {
displayColumn.append(columnSQL);
}
displayColumn.append(",'-1')"); displayColumn.append(",'-1')");
@ -787,6 +814,7 @@ public class MLookupFactory
// get display column name (first identifier column) // get display column name (first identifier column)
String sql = "SELECT c.ColumnName,c.IsTranslated,c.AD_Reference_ID,c.AD_Reference_Value_ID " String sql = "SELECT c.ColumnName,c.IsTranslated,c.AD_Reference_ID,c.AD_Reference_Value_ID "
+ ", c.ColumnSQL " // 5
+ "FROM AD_Table t INNER JOIN AD_Column c ON (t.AD_Table_ID=c.AD_Table_ID) " + "FROM AD_Table t INNER JOIN AD_Column c ON (t.AD_Table_ID=c.AD_Table_ID) "
+ "WHERE TableName=?" + "WHERE TableName=?"
+ " AND c.IsIdentifier='Y' " + " AND c.IsIdentifier='Y' "
@ -805,6 +833,7 @@ public class MLookupFactory
while (rs.next()) while (rs.next())
{ {
LookupDisplayColumn ldc = new LookupDisplayColumn (rs.getString(1), LookupDisplayColumn ldc = new LookupDisplayColumn (rs.getString(1),
rs.getString(5),
"Y".equals(rs.getString(2)), rs.getInt(3), rs.getInt(4)); "Y".equals(rs.getString(2)), rs.getInt(3), rs.getInt(4));
list.add (ldc); list.add (ldc);
// s_log.fine("getLookup_TableDirEmbed: " + ColumnName + " - " + ldc); // s_log.fine("getLookup_TableDirEmbed: " + ColumnName + " - " + ldc);
@ -841,36 +870,45 @@ public class MLookupFactory
if (i > 0) if (i > 0)
embedSQL.append("||' - '||" ); embedSQL.append("||' - '||" );
LookupDisplayColumn ldc = (LookupDisplayColumn)list.get(i); LookupDisplayColumn ldc = (LookupDisplayColumn)list.get(i);
String columnSQL = ldc.IsVirtual ? ldc.ColumnSQL : TableName + "." + ldc.ColumnName;
// translated // translated
if (ldc.IsTranslated && !Env.isBaseLanguage(language, TableName)) if (ldc.IsTranslated && !Env.isBaseLanguage(language, TableName) && !ldc.IsVirtual)
{
embedSQL.append(TableName).append("_Trl.").append(ldc.ColumnName); embedSQL.append(TableName).append("_Trl.").append(ldc.ColumnName);
}
// date, number // date, number
else if (DisplayType.isDate(ldc.DisplayType) || DisplayType.isNumeric(ldc.DisplayType)) else if (DisplayType.isDate(ldc.DisplayType) || DisplayType.isNumeric(ldc.DisplayType))
{ {
embedSQL.append("NVL(" + DB.TO_CHAR(TableName + "." + ldc.ColumnName, ldc.DisplayType, language.getAD_Language()) + ",'')"); embedSQL.append("NVL(" + DB.TO_CHAR(columnSQL, ldc.DisplayType, language.getAD_Language()) + ",'')");
} }
// TableDir // TableDir
else if ((ldc.DisplayType == DisplayType.TableDir || ldc.DisplayType == DisplayType.Search) else if ((ldc.DisplayType == DisplayType.TableDir || ldc.DisplayType == DisplayType.Search)
&& ldc.ColumnName.endsWith("_ID")) && ldc.ColumnName.endsWith("_ID"))
{ {
String embeddedSQL = getLookup_TableDirEmbed(language, ldc.ColumnName, TableName); String embeddedSQL;
if (ldc.IsVirtual)
embeddedSQL = getLookup_TableDirEmbed(language, ldc.ColumnName, TableName, ldc.ColumnSQL);
else
embeddedSQL = getLookup_TableDirEmbed(language, ldc.ColumnName, TableName);
embedSQL.append("NVL((").append(embeddedSQL).append("),'')"); embedSQL.append("NVL((").append(embeddedSQL).append("),'')");
} }
// Table - teo_sarca [ 1714261 ] // Table - teo_sarca [ 1714261 ]
else if (ldc.DisplayType == DisplayType.Table && ldc.AD_Reference_ID != 0) else if (ldc.DisplayType == DisplayType.Table && ldc.AD_Reference_ID != 0)
{ {
String embeddedSQL = getLookup_TableEmbed (language, ldc.ColumnName, TableName, ldc.AD_Reference_ID); String embeddedSQL = getLookup_TableEmbed (language, columnSQL, TableName, ldc.AD_Reference_ID);
embedSQL.append("NVL((").append(embeddedSQL).append("),'')"); embedSQL.append("NVL((").append(embeddedSQL).append("),'')");
} }
// ID // ID
else if (DisplayType.isID(ldc.DisplayType)) else if (DisplayType.isID(ldc.DisplayType))
{ {
embedSQL.append("NVL(" + DB.TO_CHAR(TableName + "." + ldc.ColumnName, ldc.DisplayType, language.getAD_Language()) + ",'')"); embedSQL.append("NVL(" + DB.TO_CHAR(columnSQL, ldc.DisplayType, language.getAD_Language()) + ",'')");
} }
// String // String
else else
embedSQL.append("NVL(").append(TableName).append(".").append(ldc.ColumnName).append(",'')"); {
embedSQL.append("NVL(").append(columnSQL).append(",'')");
}
} }
embedSQL.append(" FROM ").append(TableName); embedSQL.append(" FROM ").append(TableName);