📄 mtable.java
字号:
singleRowWHERE = new StringBuffer(columnName)
.append ("=").append (DB.TO_STRING(value.toString()));
}
else if (field.isParentColumn())
{
String columnName = field.getColumnName();
Object value = rowData[col];
if (value == null)
{
log.log(Level.INFO, "FK data is null - " + columnName);
continue;
}
if (multiRowWHERE == null)
multiRowWHERE = new StringBuffer();
else
multiRowWHERE.append(" AND ");
if (columnName.endsWith ("_ID"))
multiRowWHERE.append (columnName)
.append ("=").append (value);
else
multiRowWHERE.append (columnName)
.append ("=").append (DB.TO_STRING(value.toString()));
}
} // for all columns
if (singleRowWHERE != null)
return singleRowWHERE.toString();
if (multiRowWHERE != null)
return multiRowWHERE.toString();
log.log(Level.WARNING, "No key Found");
return null;
} // getWhereClause
/*************************************************************************/
private ArrayList<String> m_createSqlColumn = new ArrayList<String>();
private ArrayList<String> m_createSqlValue = new ArrayList<String>();
/**
* Prepare SQL creation
* @param columnName column name
* @param value value
*/
private void createUpdateSql (String columnName, String value)
{
m_createSqlColumn.add(columnName);
m_createSqlValue.add(value);
log.finest("#" + m_createSqlColumn.size()
+ " - " + columnName + "=" + value);
} // createUpdateSQL
/**
* Create update/insert SQL
* @param insert true if insert - update otherwise
* @param whereClause where clause for update
* @return sql statement
*/
private String createUpdateSql (boolean insert, String whereClause)
{
StringBuffer sb = new StringBuffer();
if (insert)
{
sb.append("INSERT INTO ").append(m_tableName).append(" (");
for (int i = 0; i < m_createSqlColumn.size(); i++)
{
if (i != 0)
sb.append(",");
sb.append(m_createSqlColumn.get(i));
}
sb.append(") VALUES ( ");
for (int i = 0; i < m_createSqlValue.size(); i++)
{
if (i != 0)
sb.append(",");
sb.append(m_createSqlValue.get(i));
}
sb.append(")");
}
else
{
sb.append("UPDATE ").append(m_tableName).append(" SET ");
for (int i = 0; i < m_createSqlColumn.size(); i++)
{
if (i != 0)
sb.append(",");
sb.append(m_createSqlColumn.get(i)).append("=").append(m_createSqlValue.get(i));
}
sb.append(" WHERE ").append(whereClause);
}
log.fine(sb.toString());
// reset
createUpdateSqlReset();
return sb.toString();
} // createUpdateSql
/**
* Reset Update Data
*/
private void createUpdateSqlReset()
{
m_createSqlColumn = new ArrayList<String>();
m_createSqlValue = new ArrayList<String>();
} // createUpdateSqlReset
/**
* Get Mandatory empty columns
* @param rowData row data
* @return String with missing column headers/labels
*/
private String getMandatory(Object[] rowData)
{
// see also => ProcessParameter.saveParameter
StringBuffer sb = new StringBuffer();
// Check all columns
int size = m_fields.size();
for (int i = 0; i < size; i++)
{
MField field = (MField)m_fields.get(i);
if (field.isMandatory(true)) // check context
{
if (rowData[i] == null || rowData[i].toString().length() == 0)
{
field.setInserting (true); // set editable otherwise deadlock
field.setError(true);
if (sb.length() > 0)
sb.append(", ");
sb.append(field.getHeader());
}
else
field.setError(false);
}
}
if (sb.length() == 0)
return "";
return sb.toString();
} // getMandatory
/*************************************************************************/
/** LOB Info */
private ArrayList<PO_LOB> m_lobInfo = null;
/**
* Reset LOB info
*/
private void lobReset()
{
m_lobInfo = null;
} // resetLOB
/**
* Prepare LOB save
* @param lob value
*/
private void lobAdd (PO_LOB lob)
{
log.fine("LOB=" + lob);
if (m_lobInfo == null)
m_lobInfo = new ArrayList<PO_LOB>();
m_lobInfo.add(lob);
} // lobAdd
/**
* Save LOB
*/
private void lobSave (String whereClause)
{
if (m_lobInfo == null)
return;
for (int i = 0; i < m_lobInfo.size(); i++)
{
PO_LOB lob = (PO_LOB)m_lobInfo.get(i);
lob.save(whereClause, null);
} // for all LOBs
lobReset();
} // lobSave
/**************************************************************************
* New Record after current Row
* @param currentRow row
* @param copyCurrent copy
* @return true if success -
* Error info (Access*, AccessCannotInsert) is saved in the log
*/
public boolean dataNew (int currentRow, boolean copyCurrent)
{
log.info("Current=" + currentRow + ", Copy=" + copyCurrent);
// Read only
if (m_readOnly)
{
fireDataStatusEEvent("AccessCannotInsert", "", true);
return false;
}
/** @todo No TableLevel */
// || !Access.canViewInsert(m_ctx, m_WindowNo, tableLevel, true, true))
// fireDataStatusEvent(Log.retrieveError());
// see if we need to save
dataSave(-2, false);
m_inserting = true;
// Create default data
int size = m_fields.size();
m_rowData = new Object[size]; // "original" data
Object[] rowData = new Object[size];
// fill data
if (copyCurrent)
{
MSort sort = (MSort) m_sort.get(currentRow);
Object[] origData = (Object[])m_buffer.get(sort.index);
for (int i = 0; i < size; i++)
{
MField field = (MField)m_fields.get(i);
String columnName = field.getColumnName();
if (field.isVirtualColumn())
;
else if (field.isKey()
|| columnName.equals("AD_Client_ID")
//
|| columnName.startsWith("Created") || columnName.startsWith("Updated")
|| columnName.equals("EntityType") || columnName.equals("DocumentNo")
|| columnName.equals("Processed") || columnName.equals("IsSelfService")
|| columnName.equals("DocAction") || columnName.equals("DocStatus")
|| columnName.startsWith("Ref_")
// Order/Invoice
|| columnName.equals("GrandTotal") || columnName.equals("TotalLines")
|| columnName.equals("C_CashLine_ID") || columnName.equals("C_Payment_ID")
|| columnName.equals("IsPaid") || columnName.equals("IsAllocated")
)
{
rowData[i] = field.getDefault();
field.setValue(rowData[i], m_inserting);
}
else
rowData[i] = origData[i];
}
}
else // new
{
for (int i = 0; i < size; i++)
{
MField field = (MField)m_fields.get(i);
rowData[i] = field.getDefault();
field.setValue(rowData[i], m_inserting);
}
}
m_changed = true;
m_compareDB = true;
m_rowChanged = -1; // only changed in setValueAt
m_newRow = currentRow + 1;
// if there is no record, the current row could be 0 (and not -1)
if (m_buffer.size() < m_newRow)
m_newRow = m_buffer.size();
// add Data at end of buffer
MSort sort = new MSort(m_buffer.size(), null); // index
m_buffer.add(rowData);
// add Sort pointer
m_sort.add(m_newRow, sort);
m_rowCount++;
// inform
log.fine("Current=" + currentRow + ", New=" + m_newRow);
fireTableRowsInserted(m_newRow, m_newRow);
fireDataStatusIEvent(copyCurrent ? "UpdateCopied" : "Inserted", "");
log.fine("Current=" + currentRow + ", New=" + m_newRow + " - complete");
return true;
} // dataNew
/**************************************************************************
* Delete Data
* @param row row
* @return true if success -
* Error info (Access*, AccessNotDeleteable, DeleteErrorDependent,
* DeleteError) is saved in the log
*/
public boolean dataDelete (int row)
{
log.info("Row=" + row);
if (row < 0)
return false;
// Tab R/O
if (m_readOnly)
{
fireDataStatusEEvent("AccessCannotDelete", "", true); // previleges
return false;
}
// Is this record deletable?
if (!m_deleteable)
{
fireDataStatusEEvent("AccessNotDeleteable", "", true); // audit
return false;
}
// Processed Column and not an Import Table
if (m_indexProcessedColumn > 0 && !m_tableName.startsWith("I_"))
{
Boolean processed = (Boolean)getValueAt(row, m_indexProcessedColumn);
if (processed != null && processed.booleanValue())
{
fireDataStatusEEvent("CannotDeleteTrx", "", true);
return false;
}
}
/** @todo check Access */
// fireDataStatusEvent(Log.retrieveError());
MSort sort = (MSort)m_sort.get(row);
Object[] rowData = (Object[])m_buffer.get(sort.index);
//
M_Table table = M_Table.get (m_ctx, m_AD_Table_ID);
PO po = null;
int Record_ID = getKeyID(m_rowChanged);
if (Record_ID != -1)
po = table.getPO(Record_ID, null);
else // Multi - Key
po = table.getPO(getWhereClause(rowData), null);
// Delete via PO
if (po != null)
{
boolean ok = false;
try
{
ok = po.delete(false);
}
catch (Throwable t)
{
log.log(Level.SEVERE, "Delete", t);
}
if (!ok)
{
ValueNamePair vp = CLogger.retrieveError();
if (vp != null)
fireDataStatusEEvent(vp);
else
fireDataStatusEEvent("DeleteError", "", true);
return false;
}
}
else // Delete via SQL
{
StringBuffer sql = new StringBuffer("DELETE ");
sql.append(m_tableName).append(" WHERE ").append(getWhereClause(rowData));
int no = 0;
try
{
PreparedStatement pstmt = DB.prepareStatement(sql.toString(), null);
no = pstmt.executeUpdate();
pstmt.close();
}
catch (SQLException e)
{
log.log(Level.SEVERE, sql.toString(), e);
String msg = "DeleteError";
if (e.getErrorCode() == 2292) // Child Record Found
msg = "DeleteErrorDependent";
fireDataStatusEEvent(msg, e.getLocalizedMessage(), true);
return false;
}
// Check Result
if (no != 1)
{
log.log(Level.SEVERE, "Number of deleted rows = " + no);
return false;
}
}
// Get Sort
int bufferRow = sort.index;
// Delete row in Buffer and shifts all below up
m_buffer.remove(bufferRow);
m_rowCount--;
// Delete row in Sort
m_sort.remove(row);
// Correct pointer in Sort
for (int i = 0; i < m_sort.size(); i++)
{
MSort ptr = (MSort)m_sort.get(i);
if (ptr.index > bufferRow)
ptr.index--; // move up
}
// inform
m_changed = false;
m_rowChanged = -1;
fireTableRowsDeleted(row, row);
fireDataStatusIEvent("Deleted", "");
log.fine("Row=" + row + " complete");
return true;
} // dataDelete
/**************************************************************************
* Ignore changes
*/
public void dataIgnore()
{
if (!m_inserting && !m_changed && m_rowChanged < 0)
{
log.fine("Nothing to ignore");
return;
}
log.info("Inserting=" + m_inserting);
// Inserting - delete new row
if (m_inserting)
{
// Get Sort
MSort sort = (MSort)m_sort.get(m_newRow);
int bufferRow = sort.index;
// Delete row in Buffer and shifts all below up
m_buffer.remove(bufferRow);
m_rowCount--;
// Delete row in Sort
m_sort.remove(m_newRow); // pintint to the last column, so no adjustment
//
m_changed = false;
m_rowData = null;
m_rowChanged = -1;
m_inserting = false;
// inform
fireTableRowsDeleted(m_newRow, m_newRow);
}
else
{
// update buffer
if (m_rowData != null)
{
MSort sort = (MSort)m_sort.get(m_rowChanged);
m_buffer.set(sort.index, m_rowData);
}
m_changed = false;
m_rowData = null;
m_rowChanged = -1;
m_inserting = false;
// inform
// fireTableRowsUpdated(m_rowChanged, m_rowChanged); >> messes up display?? (clearSelection)
}
m_newRow = -1;
fireDataStatusIEvent("Ignored", "");
} // dataIgnore
/**
* Refresh Row - ignore changes
* @param row row
*/
public void dataRefresh (int row)
{
log.info("Row=" + row);
if (row < 0 || m_sort.size() == 0 || m_inserting)
return;
MSort sort = (MSort)m_sort.get(row);
Object[] rowData = (Object[])m_buffer.get(sort.index);
// ignore
dataIgnore();
// Create SQL
String where = getWhereClause(rowData);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -