📄 mtable.java
字号:
/******************************************************************************
* The contents of this file are subject to the Compiere License Version 1.1
* ("License"); You may not use this file except in compliance with the License
* You may obtain a copy of the License at http://www.compiere.org/license.html
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
* The Original Code is Compiere ERP & CRM Smart Business Solution. The Initial
* Developer of the Original Code is Jorg Janke. Portions created by Jorg Janke
* are Copyright (C) 1999-2005 Jorg Janke.
* All parts are Copyright (C) 1999-2005 ComPiere, Inc. All Rights Reserved.
* Contributor(s): ______________________________________.
*****************************************************************************/
package org.compiere.model;
import java.beans.*;
import java.io.*;
import java.math.*;
import java.sql.*;
import java.util.*;
import java.util.logging.*;
import javax.swing.event.*;
import javax.swing.table.*;
import org.compiere.util.*;
/**
* Grid Table Model for JDBC access including buffering.
* <pre>
* The following data types are handeled
* Integer for all IDs
* BigDecimal for all Numbers
* Timestamp for all Dates
* String for all others
* The data is read via r/o resultset and cached in m_buffer. Writes/updates
* are via dynamically constructed SQL INSERT/UPDATE statements. The record
* is re-read via the resultset to get results of triggers.
*
* </pre>
* The model maintains and fires the requires TableModelEvent changes,
* the DataChanged events (loading, changed, etc.)
* as well as Vetoable Change event "RowChange"
* (for row changes initiated by moving the row in the table grid).
*
* @author Jorg Janke
* @version $Id: MTable.java,v 1.108 2006/01/23 04:54:49 jjanke Exp $
*/
public final class MTable extends AbstractTableModel
implements Serializable
{
/**
* JDBC Based Buffered Table
*
* @param ctx Properties
* @param TableName table name
* @param WindowNo window no
* @param TabNo tab no
* @param withAccessControl if true adds AD_Client/Org restrictuins
*/
public MTable(Properties ctx, int AD_Table_ID, String TableName, int WindowNo, int TabNo,
boolean withAccessControl)
{
super();
log.info(TableName);
m_ctx = ctx;
m_AD_Table_ID = AD_Table_ID;
setTableName(TableName);
m_WindowNo = WindowNo;
m_TabNo = TabNo;
m_withAccessControl = withAccessControl;
} // MTable
private static CLogger log = CLogger.getCLogger(MTable.class.getName());
private Properties m_ctx;
private int m_AD_Table_ID;
private String m_tableName = "";
private int m_WindowNo;
/** Tab No 0.. */
private int m_TabNo;
private boolean m_withAccessControl;
private boolean m_readOnly = true;
private boolean m_deleteable = true;
//
/** Rowcount */
private int m_rowCount = 0;
/** Has Data changed? */
private boolean m_changed = false;
/** Index of changed row via SetValueAt */
private int m_rowChanged = -1;
/** Insert mode active */
private boolean m_inserting = false;
/** Inserted Row number */
private int m_newRow = -1;
/** Is the Resultset open? */
private boolean m_open = false;
/** Compare to DB before save */
private boolean m_compareDB = true; // set to true after every save
// The buffer for all data
private volatile ArrayList<Object[]> m_buffer = new ArrayList<Object[]>(100);
private volatile ArrayList<MSort> m_sort = new ArrayList<MSort>(100);
/** Original row data */
private Object[] m_rowData = null;
/** Original data [row,col,data] */
private Object[] m_oldValue = null;
//
private Loader m_loader = null;
/** Columns */
private ArrayList<MField> m_fields = new ArrayList<MField>(30);
private ArrayList<Object> m_parameterSELECT = new ArrayList<Object>(5);
private ArrayList<Object> m_parameterWHERE = new ArrayList<Object>(5);
/** Complete SQL statement */
private String m_SQL;
/** SQL Statement for Row Count */
private String m_SQL_Count;
/** The SELECT clause with FROM */
private String m_SQL_Select;
/** The static where clause */
private String m_whereClause = "";
/** Show only Processed='N' and last 24h records */
private boolean m_onlyCurrentRows = false;
/** Show only Not processed and x days */
private int m_onlyCurrentDays = 1;
/** Static ORDER BY clause */
private String m_orderClause = "";
/** Index of Key Column */
private int m_indexKeyColumn = -1;
/** Index of Color Column */
private int m_indexColorColumn = -1;
/** Index of Processed Column */
private int m_indexProcessedColumn = -1;
/** Index of IsActive Column */
private int m_indexActiveColumn = -1;
/** Index of AD_Client_ID Column */
private int m_indexClientColumn = -1;
/** Index of AD_Org_ID Column */
private int m_indexOrgColumn = -1;
/** Vetoable Change Bean support */
private VetoableChangeSupport m_vetoableChangeSupport = new VetoableChangeSupport(this);
/** Property of Vetoable Bean support "RowChange" */
public static final String PROPERTY = "MTable-RowSave";
/**
* Set Table Name
* @param newTableName table name
*/
public void setTableName(String newTableName)
{
if (m_open)
{
log.log(Level.SEVERE, "Table already open - ignored");
return;
}
if (newTableName == null || newTableName.length() == 0)
return;
m_tableName = newTableName;
} // setTableName
/**
* Get Table Name
* @return table name
*/
public String getTableName()
{
return m_tableName;
} // getTableName
/**
* Set Where Clause (w/o the WHERE and w/o History).
* @param newWhereClause sql where clause
* @param onlyCurrentRows only current rows
* @param onlyCurrentDays how many days back for current
* @return true if where clase set
*/
public boolean setSelectWhereClause(String newWhereClause, boolean onlyCurrentRows, int onlyCurrentDays)
{
if (m_open)
{
log.log(Level.SEVERE, "Table already open - ignored");
return false;
}
//
m_whereClause = newWhereClause;
m_onlyCurrentRows = onlyCurrentRows;
m_onlyCurrentDays = onlyCurrentDays;
if (m_whereClause == null)
m_whereClause = "";
return true;
} // setWhereClause
/**
* Get record set Where Clause (w/o the WHERE and w/o History)
* @return where clause
*/
public String getSelectWhereClause()
{
return m_whereClause;
} // getWhereClause
/**
* Is History displayed
* @return true if history displayed
*/
public boolean isOnlyCurrentRowsDisplayed()
{
return !m_onlyCurrentRows;
} // isHistoryDisplayed
/**
* Set Order Clause (w/o the ORDER BY)
* @param newOrderClause sql order by clause
*/
public void setOrderClause(String newOrderClause)
{
m_orderClause = newOrderClause;
if (m_orderClause == null)
m_orderClause = "";
} // setOrderClause
/**
* Get Order Clause (w/o the ORDER BY)
* @return order by clause
*/
public String getOrderClause()
{
return m_orderClause;
} // getOrderClause
/**
* Assemble & store
* m_SQL and m_countSQL
* @return m_SQL
*/
private String createSelectSql()
{
if (m_fields.size() == 0 || m_tableName == null || m_tableName.equals(""))
return "";
// Create SELECT Part
StringBuffer select = new StringBuffer("SELECT ");
for (int i = 0; i < m_fields.size(); i++)
{
if (i > 0)
select.append(",");
MField field = (MField)m_fields.get(i);
select.append(field.getColumnSQL(true)); // ColumnName or Virtual Column
}
//
select.append(" FROM ").append(m_tableName);
m_SQL_Select = select.toString();
m_SQL_Count = "SELECT COUNT(*) FROM " + m_tableName;
//
StringBuffer where = new StringBuffer("");
// WHERE
if (m_whereClause.length() > 0)
{
where.append(" WHERE ");
if (m_whereClause.indexOf("@") == -1)
where.append(m_whereClause);
else // replace variables
where.append(Env.parseContext(m_ctx, m_WindowNo, m_whereClause, false));
}
if (m_onlyCurrentRows && m_TabNo == 0)
{
if (where.toString().indexOf(" WHERE ") == -1)
where.append(" WHERE ");
else
where.append(" AND ");
// Show only unprocessed or the one updated within x days
where.append("(Processed='N' OR Updated>");
if (DB.isSybase())
where.append("dateadd(dd,-1,getdate())");
else
where.append("SysDate-1");
where.append(")");
}
// RO/RW Access
m_SQL = m_SQL_Select + where.toString();
m_SQL_Count += where.toString();
if (m_withAccessControl)
{
boolean ro = MRole.SQL_RO;
// if (!m_readOnly)
// ro = MRole.SQL_RW;
m_SQL = MRole.getDefault(m_ctx, false).addAccessSQL(m_SQL,
m_tableName, MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO);
m_SQL_Count = MRole.getDefault(m_ctx, false).addAccessSQL(m_SQL_Count,
m_tableName, MRole.SQL_FULLYQUALIFIED, MRole.SQL_RO);
}
// ORDER BY
if (!m_orderClause.equals(""))
m_SQL += " ORDER BY " + m_orderClause;
//
log.fine(m_SQL_Count);
Env.setContext(m_ctx, m_WindowNo, m_TabNo, "SQL", m_SQL);
return m_SQL;
} // createSelectSql
/**
* Add Field to Table
* @param field field
*/
public void addField (MField field)
{
log.fine("(" + m_tableName + ") - " + field.getColumnName());
if (m_open)
{
log.log(Level.SEVERE, "Table already open - ignored: " + field.getColumnName());
return;
}
if (!MRole.getDefault(m_ctx, false).isColumnAccess (m_AD_Table_ID, field.getAD_Column_ID(), true))
{
log.fine("No Column Access " + field.getColumnName());
return;
}
// Set Index for Key column
if (field.isKey())
m_indexKeyColumn = m_fields.size();
else if (field.getColumnName().equals("IsActive"))
m_indexActiveColumn = m_fields.size();
else if (field.getColumnName().equals("Processed"))
m_indexProcessedColumn = m_fields.size();
else if (field.getColumnName().equals("AD_Client_ID"))
m_indexClientColumn = m_fields.size();
else if (field.getColumnName().equals("AD_Org_ID"))
m_indexOrgColumn = m_fields.size();
//
m_fields.add(field);
} // addColumn
/**
* Returns database column name
*
* @param index the column being queried
* @return column name
*/
public String getColumnName (int index)
{
if (index < 0 || index > m_fields.size())
{
log.log(Level.SEVERE, "Invalid index=" + index);
return "";
}
//
MField field = (MField)m_fields.get(index);
return field.getColumnName();
} // getColumnName
/**
* Returns a column given its name.
*
* @param columnName string containing name of column to be located
* @return the column index with <code>columnName</code>, or -1 if not found
*/
public int findColumn (String columnName)
{
for (int i = 0; i < m_fields.size(); i++)
{
MField field = (MField)m_fields.get(i);
if (columnName.equals(field.getColumnName()))
return i;
}
return -1;
} // findColumn
/**
* Returns Class of database column/field
*
* @param index the column being queried
* @return the class
*/
public Class<?> getColumnClass (int index)
{
if (index < 0 || index >= m_fields.size())
{
log.log(Level.SEVERE, "Invalid index=" + index);
return null;
}
MField field = (MField)m_fields.get(index);
return DisplayType.getClass(field.getDisplayType(), false);
} // getColumnClass
/**
* Set Select Clause Parameter.
* Assumes that you set parameters starting from index zero
* @param index index
* @param parameter parameter
*/
public void setParameterSELECT (int index, Object parameter)
{
if (index >= m_parameterSELECT.size())
m_parameterSELECT.add(parameter);
else
m_parameterSELECT.set(index, parameter);
} // setParameterSELECT
/**
* Set Where Clause Parameter.
* Assumes that you set parameters starting from index zero
* @param index index
* @param parameter parameter
*/
public void setParameterWHERE (int index, Object parameter)
{
if (index >= m_parameterWHERE.size())
m_parameterWHERE.add(parameter);
else
m_parameterWHERE.set(index, parameter);
} // setParameterWHERE
/**
* Get Column at index
* @param index index
* @return MField
*/
protected MField getField (int index)
{
if (index < 0 || index >= m_fields.size())
return null;
return (MField)m_fields.get(index);
} // getColumn
/**
* Return Columns with Indentifier (ColumnName)
* @param identifier column name
* @return MField
*/
protected MField getField (String identifier)
{
if (identifier == null || identifier.length() == 0)
return null;
int cols = m_fields.size();
for (int i = 0; i < cols; i++)
{
MField field = (MField)m_fields.get(i);
if (identifier.equalsIgnoreCase(field.getColumnName()))
return field;
}
// log.log(Level.SEVERE, "getField - not found: '" + identifier + "'");
return null;
} // getField
/**
* Get all Fields
* @return MFields
*/
public MField[] getFields ()
{
MField[] retValue = new MField[m_fields.size()];
m_fields.toArray(retValue);
return retValue;
} // getField
/**************************************************************************
* Open Database.
* if already opened, data is refreshed
*
* @return true if success
*/
public boolean open ()
{
log.info("");
if (m_open)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -