📄 mtab.java
字号:
* Validate Query.
* If query column is not a tab column create EXISTS query
* @param query query
* @return where clause
*/
private String validateQuery (MQuery query)
{
if (query == null || query.getRestrictionCount() == 0)
return null;
// Check: only one restriction
if (query.getRestrictionCount() != 1)
{
Log.trace(Log.l6_Database, "MTab.validateQuery - ignored: " + query);
return query.getWhereClause();
}
String colName = query.getColumnName(0);
// a '(' in the name = function - don't try to resolve
if (colName.indexOf('(') != -1)
{
Log.trace(Log.l6_Database, "MTab.validateQuery - ignored: " + colName);
return query.getWhereClause();
}
// Query is valid ?
if (getField(colName) != null)
return query.getWhereClause();
// Find Refernce Column e.g. BillTo_ID -> C_BPartner_Location_ID
String sql = "SELECT cc.ColumnName "
+ "FROM AD_Column c"
+ " INNER JOIN AD_Ref_Table r ON (c.AD_Reference_Value_ID=r.AD_Reference_ID)"
+ " INNER JOIN AD_Column cc ON (r.AD_Key=cc.AD_Column_ID) "
+ "WHERE c.AD_Reference_ID=18" // Table
+ " AND c.ColumnName=?";
String refColName = null;
try
{
PreparedStatement pstmt = DB.prepareStatement(sql);
pstmt.setString(1, colName);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
refColName = rs.getString(1);
rs.close();
pstmt.close();
}
catch (SQLException e)
{
Log.error("MTab.validateQuery (ref) - Column=" + colName, e);
return query.getWhereClause();
}
// Reference Column found
if (refColName != null)
{
query.setColumnName(0, refColName);
if (getField(refColName) != null)
{
Log.trace(Log.l6_Database, "MTab.validateQuery - Column " + colName + " replaced with " + refColName);
return query.getWhereClause();
}
colName = refColName;
}
// Column NOT in Tab - create EXISTS subquery
String tableName = null;
String tabKeyColumn = getKeyColumnName();
// Column=SalesRep_ID, Key=AD_User_ID, Query=SalesRep_ID=101
sql = "SELECT t.TableName "
+ "FROM AD_Column c"
+ " INNER JOIN AD_Table t ON (c.AD_Table_ID=t.AD_Table_ID) "
+ "WHERE c.ColumnName=? AND IsKey='Y'" // #1 Link Column
+ " AND EXISTS (SELECT * FROM AD_Column cc"
+ " WHERE cc.AD_Table_ID=t.AD_Table_ID AND cc.ColumnName=?)"; // #2 Tab Key Column
try
{
PreparedStatement pstmt = DB.prepareStatement(sql);
pstmt.setString(1, colName);
pstmt.setString(2, tabKeyColumn);
ResultSet rs = pstmt.executeQuery();
if (rs.next())
tableName = rs.getString(1);
rs.close();
pstmt.close();
}
catch (SQLException e)
{
Log.error("MTab.validateQuery - Column=" + colName + ", Key=" + tabKeyColumn, e);
return null;
}
// Causes could be functions in query
// e.g. Column=UPPER(Name), Key=AD_Element_ID, Query=UPPER(AD_Element.Name) LIKE '%CUSTOMER%'
if (tableName == null)
{
Log.trace(Log.l3_Util, "MTab.validateQuery not successfull - Column=" + colName + ", Key=" + tabKeyColumn + ", Query=" + query);
return query.getWhereClause();
}
query.setTableName("xx");
StringBuffer result = new StringBuffer ("EXISTS (SELECT * FROM ")
.append(tableName).append(" xx WHERE ")
.append(query.getWhereClause(true))
.append(" AND xx.").append(tabKeyColumn).append("=")
.append(getTableName()).append(".").append(tabKeyColumn).append(")");
Log.trace(Log.l6_Database, "MTab.validateQuery", result);
return result.toString();
} // validateQuery
/**
* Refresh all data
*/
public void dataRefreshAll ()
{
Log.trace(Log.l3_Util, "MTab.dataRefreshAll #" + m_vo.TabNo);
/** @todo does not work with alpha key */
int keyNo = m_mTable.getKeyID(m_currentRow);
m_mTable.dataRefreshAll();
// Should use RowID - not working for tables with multiple keys
if (keyNo != -1)
{
if (keyNo != m_mTable.getKeyID(m_currentRow)) // something changed
{
int size = getRowCount();
for (int i = 0; i < size; i++)
{
if (keyNo == m_mTable.getKeyID(i))
{
m_currentRow = i;
break;
}
}
}
}
setCurrentRow(m_currentRow, true);
} // dataRefreshAll
/**
* Refresh current row data
*/
public void dataRefresh ()
{
dataRefresh (m_currentRow);
} // dataRefresh
/**
* Refresh row data
* @param row index
*/
public void dataRefresh (int row)
{
Log.trace(Log.l3_Util, "MTab.dataRefresh #" + m_vo.TabNo, "row=" + row);
m_mTable.dataRefresh(row);
setCurrentRow(row, true);
} // dataRefresh
/**
* Uncoditionally Save data
* @param manualCmd if true, no vetoable PropertyChange will be fired for save confirmation from MTable
* @return true if save complete (or nor required)
*/
public boolean dataSave(boolean manualCmd)
{
Log.trace(Log.l3_Util, "MTab.dataSave #" + m_vo.TabNo, "row=" + m_currentRow);
boolean retValue = (m_mTable.dataSave(manualCmd) == MTable.SAVE_OK);
if (manualCmd)
setCurrentRow(m_currentRow, false);
return retValue;
} // dataSave
/**
* Do we need to Save?
* @param rowChange row change
* @param onlyRealChange if true the value of a field was actually changed
* (e.g. for new records, which have not been changed) - default false
* @return true it needs to be saved
*/
public boolean needSave (boolean rowChange, boolean onlyRealChange)
{
if (rowChange)
{
return m_mTable.needSave(-2, onlyRealChange);
}
else
{
if (onlyRealChange)
return m_mTable.needSave();
else
return m_mTable.needSave(onlyRealChange);
}
} // isDataChanged
/**
* Ignore data changes
*/
public void dataIgnore()
{
Log.trace(Log.l3_Util, "MTab.dataIgnore #" + m_vo.TabNo);
m_mTable.dataIgnore();
setCurrentRow(m_currentRow, false); // re-load data
Log.trace(Log.l3_Util, "MTab.dataIgnore #" + m_vo.TabNo + "- fini");
} // dataIgnore
/**
* Create (copy) new Row
* and process Callouts
* @param copy copy
* @return true if copied/new
*/
public boolean dataNew (boolean copy)
{
Log.trace(Log.l3_Util, "MTab.dataNew #" + m_vo.TabNo);
boolean retValue = m_mTable.dataNew (m_currentRow, copy);
setCurrentRow(m_currentRow + 1, true);
// process all Callouts (no dependency check - assumed that settings are valid)
for (int i = 0; i < getFieldCount(); i++)
processCallout(getField(i));
// check validity of defaults
for (int i = 0; i < getFieldCount(); i++)
getField(i).validateValue();
m_mTable.setChanged(false);
return retValue;
} // dataNew
/**
* Delete current Row
* @return true if deleted
*/
public boolean dataDelete()
{
Log.trace(Log.l3_Util, "MTab.dataDelete #" + m_vo.TabNo, "row=" + m_currentRow);
boolean retValue = m_mTable.dataDelete(m_currentRow);
setCurrentRow(m_currentRow, true);
return retValue;
} // dataDelete
/**
* Get Name of Tab
* @return name
*/
public String getName()
{
return m_vo.Name;
} // getName
/**
* Get Description of Tab
* @return description
*/
public String getDescription()
{
return m_vo.Description;
} // getDescription
/**
* Get Help of Tab
* @return help
*/
public String getHelp()
{
return m_vo.Help;
} // getHelp
/**
* Get Tab Level
* @return tab level
*/
public int getTabLevel()
{
return m_vo.TabLevel;
} // getTabLevel
/**
* Get Commit Warning
* @return commit warning
*/
public String getCommitWarning()
{
return m_vo.CommitWarning;
} // getCommitWarning
/**
* Return Table Model
* @return MTable
*/
protected MTable getMTable()
{
return m_mTable;
} // getMTable
/**
* Return the name of the key column - may be ""
* @return key column name
*/
public String getKeyColumnName()
{
return m_keyColumnName;
} // getKeyColumnName
/**
* Return Name of link column
* @return link column name
*/
public String getLinkColumnName()
{
return m_linkColumnName;
} // getLinkColumnName
/**
* Set Name of link column.
* Set from MWindow.loadTabData
* Used in MTab.isCurreny, (.setCurrentRow) .query - APanel.cmd_report
* and MField.isEditable and .isDefault via context
* @param linkColumnName name of column - or sets name to AD_Column_ID, if exists
*/
public void setLinkColumnName (String linkColumnName)
{
if (linkColumnName != null)
m_linkColumnName = linkColumnName;
else
{
if (m_vo.AD_Column_ID == 0)
return;
// we have a link column identified (primary parent column)
else
{
String SQL = "SELECT ColumnName FROM AD_Column WHERE AD_Column_ID=?";
try
{
PreparedStatement pstmt = DB.prepareStatement(SQL);
pstmt.setInt(1, m_vo.AD_Column_ID); // Link Column
ResultSet rs = pstmt.executeQuery();
if (rs.next())
m_linkColumnName = rs.getString(1);
rs.close();
pstmt.close();
}
catch (SQLException e)
{
Log.error("MTab.setLinkColumn", e);
}
Log.trace(Log.l6_Database, "MTab.setLinkColumnName - " + m_vo.AD_Column_ID, m_linkColumnName);
}
}
Env.setContext(m_vo.ctx, m_vo.WindowNo, m_vo.TabNo, "LinkColumnName", linkColumnName);
} // setLinkColumnName
/**
* Is the tab current?.
* <pre>
* Yes - Table must be open
* - Query String is the same
* - Not Detail
* - Old link column value is same as current one
* </pre>
* @return true if current
*/
public boolean isCurrent()
{
// Open?
if (!m_mTable.isOpen())
return false;
// Same Query
if (!m_oldQuery.equals(m_query.getWhereClause()))
return false;
// Detail?
if (!isDetail())
return true;
// Same link column value
String value = Env.getContext(m_vo.ctx, m_vo.WindowNo, getLinkColumnName());
return m_linkValue.equals(value);
} // isCurrent
/**
* Are Only Current Rows displayed
* @return true if no history
*/
public boolean isOnlyCurrentRows()
{
return m_vo.onlyCurrentRows;
} // isOnlyCurrentRows
/**
* Return Parent ArrayList
* @return parent column names
*/
public ArrayList getParentColumnNames()
{
return m_parents;
} // getParentColumnNames
/**
* Get Tree ID of this tab
* @return ID
*/
private int getTreeID()
{
Log.trace(Log.l5_DData, "MTab.getTreeID " + m_vo.TableName);
String SQL = "SELECT * FROM AD_ClientInfo WHERE AD_Client="
+ Env.getContext(m_vo.ctx, m_vo.WindowNo, "#AD_Client_ID")
+ " ORDER BY AD_Org DESC";
//
if (m_vo.TableName.equals("AD_Menu"))
return 10; // MM
else if (m_vo.TableName.equals("C_ElementValue"))
return 20; // EV
else if (m_vo.TableName.equals("M_Product"))
return 30; // PR
else if (m_vo.TableName.equals("C_BPartner"))
return 40; // BP
else if (m_vo.TableName.equals("AD_Org"))
return 50; // OO
else if (m_vo.TableName.equals("C_Project"))
return 60; // PJ
return 0;
} // getTreeID
/**
* Returns true if this is a detail record
* @return true if not parent tab
*/
public boolean isDetail()
{
// We have IsParent columns and/or a link column
if (m_parents.size() > 0 || m_vo.AD_Column_ID != 0)
return true;
return false;
} // isDetail
/**
* Is Printed (Document can be printed)
* @return true if printing
*/
public boolean isPrinted()
{
return m_vo.AD_Process_ID != 0;
} // isPrinted
/**
* Get WindowNo
* @return window no
*/
public int getWindowNo()
{
return m_vo.WindowNo;
} // getWindowNo
/**
* Get TabNo
* @return tab no
*/
public int getTabNo()
{
return m_vo.TabNo;
} // getTabNo
/**
* Get Process ID
* @return Process ID
*/
public int getAD_Process_ID()
{
return m_vo.AD_Process_ID;
} // getAD_Process_ID
/**
* Is High Volume?
* @return true if high volumen table
*/
public boolean isHighVolume()
{
return m_vo.IsHighVolume;
} // isHighVolume
/**
* Is Read Only?
* @return true if read only
*/
public boolean isReadOnly()
{
return m_vo.IsReadOnly;
} // isReadOnly
/**
* Is Single Row
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -