diff --git a/org.adempiere.base/src/org/compiere/model/AccessSqlParser.java b/org.adempiere.base/src/org/compiere/model/AccessSqlParser.java index f1c8cbb8e0..10c711ba58 100644 --- a/org.adempiere.base/src/org/compiere/model/AccessSqlParser.java +++ b/org.adempiere.base/src/org/compiere/model/AccessSqlParser.java @@ -238,7 +238,7 @@ public class AccessSqlParser index = from.indexOf(ON); while (index != -1) { - int indexClose = from.indexOf(')'); // does not catch "IN (1,2)" in ON + int indexClose = getIndexClose(from); // does not catch "IN (1,2)" in ON int indexNextOn = from.indexOf(ON, index+4); if (indexNextOn != -1) indexClose = from.lastIndexOf(')', indexNextOn); @@ -383,6 +383,33 @@ public class AccessSqlParser } return ""; } // getMainSql + + /** + * Get index of ')' + * @return index of ')' + */ + public int getIndexClose(String from) + { + int parenthesisLevel = 0; + int indexOpen=from.indexOf('('); + int index=-1; + while(indexOpen!=-1) + { + parenthesisLevel++; + int indexNextOpen = from.indexOf('(', indexOpen+1); + int indexClose = from.indexOf(')',indexOpen+1); + if (indexNextOpen==-1 || indexClose0) + { + index = from.indexOf(')',index+1); + parenthesisLevel--; + } + return index; + } /** * Table Info VO diff --git a/org.adempiere.base/src/org/compiere/model/GridTab.java b/org.adempiere.base/src/org/compiere/model/GridTab.java index 2aef26f077..da93807ec8 100644 --- a/org.adempiere.base/src/org/compiere/model/GridTab.java +++ b/org.adempiere.base/src/org/compiere/model/GridTab.java @@ -111,7 +111,7 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable /** * */ - private static final long serialVersionUID = -1638364577972806113L; + private static final long serialVersionUID = -4022944302529684348L; public static final String DEFAULT_STATUS_MESSAGE = "NavigateOrUpdate"; @@ -785,20 +785,20 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable if (query.getRestrictionCount() != 1) { if (log.isLoggable(Level.FINE)) log.fine("Ignored(More than 1 Restriction): " + query); - return query.getWhereClause(); + return query.getWhereClause(true); } String colName = query.getColumnName(0); if (colName == null) { if (log.isLoggable(Level.FINE)) log.fine("Ignored(No Column): " + query); - return query.getWhereClause(); + return query.getWhereClause(true); } // a '(' in the name = function - don't try to resolve if (colName.indexOf('(') != -1) { if (log.isLoggable(Level.FINE)) log.fine("Ignored(Function): " + colName); - return query.getWhereClause(); + return query.getWhereClause(true); } // OK - Query is valid @@ -806,7 +806,7 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable if (getField(colName) != null) { if (log.isLoggable(Level.FINE)) log.fine("Field Found: " + colName); - return query.getWhereClause(); + return query.getWhereClause(true); } String refColName = null; @@ -845,7 +845,7 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable if (getField(refColName) != null) { if (log.isLoggable(Level.FINE)) log.fine("Column " + colName + " replaced with " + refColName); - return query.getWhereClause(); + return query.getWhereClause(true); } colName = refColName; } @@ -897,7 +897,7 @@ public class GridTab implements DataStatusListener, Evaluatee, Serializable if (log.isLoggable(Level.INFO)) log.info ("Not successfull - Column=" + colName + ", Key=" + tabKeyColumn + ", Query=" + query); - return query.getWhereClause(); + return query.getWhereClause(true); } query.setTableName("xx"); diff --git a/org.adempiere.base/src/org/compiere/model/GridTable.java b/org.adempiere.base/src/org/compiere/model/GridTable.java index 3edd09bed1..ab1c166058 100644 --- a/org.adempiere.base/src/org/compiere/model/GridTable.java +++ b/org.adempiere.base/src/org/compiere/model/GridTable.java @@ -100,7 +100,7 @@ public class GridTable extends AbstractTableModel /** * */ - private static final long serialVersionUID = 5782826500266625861L; + private static final long serialVersionUID = -2181155164268688340L; public static final String DATA_REFRESH_MESSAGE = "Refreshed"; @@ -2270,6 +2270,7 @@ public class GridTable extends AbstractTableModel int size = m_fields.size(); StringBuffer singleRowWHERE = null; StringBuffer multiRowWHERE = null; + String tableName = getTableName(); for (int col = 0; col < size; col++) { GridField field = (GridField)m_fields.get (col); @@ -2283,10 +2284,10 @@ public class GridTable extends AbstractTableModel return null; } if (columnName.endsWith ("_ID")) - singleRowWHERE = new StringBuffer(columnName) + singleRowWHERE = new StringBuffer(tableName).append(".").append(columnName) .append ("=").append (value); else - singleRowWHERE = new StringBuffer(columnName) + singleRowWHERE = new StringBuffer(tableName).append(".").append(columnName) .append ("=").append (DB.TO_STRING(value.toString())); } else if (field.isParentColumn()) @@ -2303,10 +2304,10 @@ public class GridTable extends AbstractTableModel else multiRowWHERE.append(" AND "); if (columnName.endsWith ("_ID")) - multiRowWHERE.append (columnName) + multiRowWHERE.append (tableName).append(".").append(columnName) .append ("=").append (value); else - multiRowWHERE.append (columnName) + multiRowWHERE.append (tableName).append(".").append(columnName) .append ("=").append (DB.TO_STRING(value.toString())); } } // for all columns @@ -2889,13 +2890,13 @@ public class GridTable extends AbstractTableModel close(false); if (retainedWhere != null) { - String whereClause = m_whereClause; + // String whereClause = m_whereClause; if (m_whereClause != null && m_whereClause.trim().length() > 0) { m_whereClause = "((" + m_whereClause + ") OR (" + retainedWhere + ")) "; } open(m_maxRows); - m_whereClause = whereClause; + // m_whereClause = whereClause; } else { diff --git a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ReportAction.java b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ReportAction.java index 9d4b7cca60..ef75c0f4e8 100644 --- a/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ReportAction.java +++ b/org.adempiere.ui.zk/WEB-INF/src/org/adempiere/webui/panel/action/ReportAction.java @@ -247,21 +247,45 @@ public class ReportAction implements EventListener int Record_ID = 0; int[] RecordIDs = null; MQuery query = new MQuery(gridTab.getTableName()); + String whereClause; + if (currentRowOnly) { Record_ID = gridTab.getRecord_ID(); - query.addRestriction(query.getTableName() + "_ID", MQuery.EQUAL, Record_ID); + whereClause = gridTab.getTableModel().getWhereClause(gridTab.getCurrentRow()); + if (whereClause==null) + whereClause = gridTab.getTableModel().getSelectWhereClause(); + } else { + whereClause = gridTab.getTableModel().getSelectWhereClause(); RecordIDs = new int[gridTab.getRowCount()]; for(int i = 0; i < gridTab.getRowCount(); i++) { RecordIDs[i] = gridTab.getKeyID(i); - query.addRestriction(query.getTableName() + "." + query.getTableName() + "_ID" + MQuery.EQUAL + RecordIDs[i], false, 0); + } + } + + if (whereClause!=null && whereClause.length() > 0) + { + if (whereClause.indexOf('@') != -1) //replace variables in context + { + String context = Env.parseContext(Env.getCtx(), panel.getWindowNo(), whereClause, false); + if(context != null && context.trim().length() > 0) + { + whereClause = context; + } + else + { + log.log(Level.WARNING, "Failed to parse where clause. whereClause= "+whereClause); + whereClause = ("1 = 2"); + } } } + query.addRestriction(whereClause); + PrintInfo info = new PrintInfo(pf.getName(), pf.getAD_Table_ID(), Record_ID); info.setDescription(query.getInfo());