diff --git a/base/src/org/compiere/model/LookupDisplayColumn.java b/base/src/org/compiere/model/LookupDisplayColumn.java
index 3056baa388..e594c669db 100644
--- a/base/src/org/compiere/model/LookupDisplayColumn.java
+++ b/base/src/org/compiere/model/LookupDisplayColumn.java
@@ -18,12 +18,18 @@ package org.compiere.model;
import java.io.Serializable;
+import org.compiere.util.Util;
+
/**
* Lookup Display Column Value Object
*
* @author Jorg Janke
* @version $Id: LookupDisplayColumn.java,v 1.3 2006/07/30 00:58:18 jjanke Exp $
+ *
+ * @author Teo Sarca
+ *
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
{
@@ -38,14 +44,31 @@ public class LookupDisplayColumn implements Serializable
* @param isTranslated translated
* @param ad_Reference_ID display type
* @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,
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;
IsTranslated = isTranslated;
DisplayType = ad_Reference_ID;
AD_Reference_ID = ad_Reference_Value_ID;
+ ColumnSQL = columnSQL;
+ IsVirtual = !Util.isEmpty(ColumnSQL, true);
} //
/** Column Name */
@@ -56,6 +79,10 @@ public class LookupDisplayColumn implements Serializable
public int DisplayType;
/** Value Reference */
public int AD_Reference_ID;
+ /** Column SQL */
+ public final String ColumnSQL;
+ /** Is Virtual Column */
+ public final boolean IsVirtual;
/**
* String Representation
@@ -65,6 +92,8 @@ public class LookupDisplayColumn implements Serializable
{
StringBuffer sb = new StringBuffer("LookupDisplayColumn[");
sb.append("ColumnName=").append(ColumnName);
+ if (IsVirtual)
+ sb.append(",ColumnSQL=").append(ColumnSQL);
if (IsTranslated)
sb.append(",IsTranslated");
sb.append(",DisplayType=").append(DisplayType);
diff --git a/base/src/org/compiere/model/MLookupFactory.java b/base/src/org/compiere/model/MLookupFactory.java
index 13fed325b9..42389f2808 100644
--- a/base/src/org/compiere/model/MLookupFactory.java
+++ b/base/src/org/compiere/model/MLookupFactory.java
@@ -44,6 +44,9 @@ import org.compiere.util.Language;
* BF [ 1739530 ] getLookup_TableDirEmbed error when BaseColumn is sql query
* BF [ 1739544 ] getLookup_TableEmbed error for self referencing references
* BF [ 1817768 ] Isolate hardcoded table direct columns
+ * @author Teo Sarca
+ * 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
* BF [ 2561593 ] Multi-tenant problem with webui
*/
@@ -590,7 +593,16 @@ public class MLookupFactory
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);
return embedSQL.toString();
@@ -628,6 +640,7 @@ public class MLookupFactory
// get display column names
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.ColumnSQL " // 7
+ "FROM AD_Table t"
+ " INNER JOIN AD_Column c ON (t.AD_Table_ID=c.AD_Table_ID) "
+ "WHERE TableName=?"
@@ -647,6 +660,7 @@ public class MLookupFactory
while (rs.next())
{
LookupDisplayColumn ldc = new LookupDisplayColumn (rs.getString(1),
+ rs.getString(7), // ColumnSQL
"Y".equals(rs.getString(2)), rs.getInt(3), rs.getInt(4));
list.add (ldc);
// s_log.fine("getLookup_TableDir: " + ColumnName + " - " + ldc);
@@ -687,40 +701,53 @@ public class MLookupFactory
if (i > 0)
displayColumn.append(" ||'_'|| " );
LookupDisplayColumn ldc = (LookupDisplayColumn)list.get(i);
+ String columnSQL = ldc.IsVirtual ? ldc.ColumnSQL : TableName + "." + ldc.ColumnName;
displayColumn.append("NVL(");
// 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);
+ }
// date
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
else if ((ldc.DisplayType == DisplayType.TableDir || ldc.DisplayType == DisplayType.Search)
&& 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)
displayColumn.append("(").append(embeddedSQL).append(")");
}
// Table
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)
displayColumn.append("(").append(embeddedSQL).append(")");
}
// number
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
else
- displayColumn.append(TableName).append(".").append(ldc.ColumnName);
+ {
+ displayColumn.append(columnSQL);
+ }
displayColumn.append(",'-1')");
@@ -787,6 +814,7 @@ public class MLookupFactory
// get display column name (first identifier column)
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) "
+ "WHERE TableName=?"
+ " AND c.IsIdentifier='Y' "
@@ -805,6 +833,7 @@ public class MLookupFactory
while (rs.next())
{
LookupDisplayColumn ldc = new LookupDisplayColumn (rs.getString(1),
+ rs.getString(5),
"Y".equals(rs.getString(2)), rs.getInt(3), rs.getInt(4));
list.add (ldc);
// s_log.fine("getLookup_TableDirEmbed: " + ColumnName + " - " + ldc);
@@ -841,36 +870,45 @@ public class MLookupFactory
if (i > 0)
embedSQL.append("||' - '||" );
LookupDisplayColumn ldc = (LookupDisplayColumn)list.get(i);
+ String columnSQL = ldc.IsVirtual ? ldc.ColumnSQL : TableName + "." + ldc.ColumnName;
// 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);
+ }
// date, number
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
else if ((ldc.DisplayType == DisplayType.TableDir || ldc.DisplayType == DisplayType.Search)
&& 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("),'')");
}
// Table - teo_sarca [ 1714261 ]
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("),'')");
}
// ID
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
else
- embedSQL.append("NVL(").append(TableName).append(".").append(ldc.ColumnName).append(",'')");
+ {
+ embedSQL.append("NVL(").append(columnSQL).append(",'')");
+ }
}
embedSQL.append(" FROM ").append(TableName);