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