📄 po.java
字号:
sql.append(encrypt(i,DB.TO_STRING(value.toString())));
// Change Log - Only
if (session != null
&& m_IDs.length == 1
&& !p_info.isEncrypted(i) // not encrypted
&& !p_info.isVirtualColumn(i) // no virtual column
&& !"Password".equals(columnName)
)
{
Object oldV = m_oldValues[i];
Object newV = value;
if (oldV != null && oldV == Null.NULL)
oldV = null;
if (newV != null && newV == Null.NULL)
newV = null;
//
MChangeLog cLog = session.changeLog (
m_trxName, AD_ChangeLog_ID,
p_info.getAD_Table_ID(), p_info.getColumn(i).AD_Column_ID,
get_ID(), getAD_Client_ID(), getAD_Org_ID(), oldV, newV);
if (cLog != null)
AD_ChangeLog_ID = cLog.getAD_ChangeLog_ID();
}
} // for all fields
// Custom Columns (cannot be logged as no column)
if (m_custom != null)
{
Iterator it = m_custom.keySet().iterator();
while (it.hasNext())
{
if (changes)
sql.append(", ");
changes = true;
//
String column = (String)it.next();
String value = (String)m_custom.get(column);
int index = p_info.getColumnIndex(column);
sql.append(column).append("=").append(encrypt(index,value));
}
m_custom = null;
}
// Something changed
if (changes)
{
if (m_trxName == null)
log.fine(p_info.getTableName() + "." + where);
else
log.fine("[" + m_trxName + "] - " + p_info.getTableName() + "." + where);
if (!updated) // Updated not explicitly set
{
Timestamp now = new Timestamp(System.currentTimeMillis());
set_ValueNoCheck("Updated", now);
sql.append(",Updated=").append(DB.TO_DATE(now, false));
}
if (!updatedBy) // UpdatedBy not explicitly set
{
int AD_User_ID = Env.getContextAsInt(p_ctx, "#AD_User_ID");
set_ValueNoCheck("UpdatedBy", new Integer(AD_User_ID));
sql.append(",UpdatedBy=").append(AD_User_ID);
}
sql.append(" WHERE ").append(where);
/** @todo status locking goes here */
log.finest(sql.toString());
int no = DB.executeUpdate(sql.toString(), m_trxName);
boolean ok = no == 1;
if (ok)
ok = lobSave();
else
{
if (m_trxName == null)
log.log(Level.WARNING, p_info.getTableName() + "." + where);
else
log.log(Level.WARNING, "[" + m_trxName + "] - " + p_info.getTableName() + "." + where);
}
return saveFinish (false, ok);
}
// nothing changed, so OK
return saveFinish (false, true);
} // saveUpdate
/**
* Create New Record
* @return true if new record inserted
*/
private boolean saveNew()
{
// Set ID for single key - Multi-Key values need explicitly be set previously
if (m_IDs.length == 1 && p_info.hasKeyColumn()
&& !m_KeyColumns[0].equals("AD_Language"))
{
int no = DB.getNextID(getAD_Client_ID(), p_info.getTableName(), m_trxName);
if (no <= 0)
{
log.severe("No NextID (" + no + ")");
return saveFinish (true, false);
}
m_IDs[0] = new Integer(no);
set_ValueNoCheck(m_KeyColumns[0], m_IDs[0]);
}
if (m_trxName == null)
log.fine(p_info.getTableName() + " - " + get_WhereClause(true));
else
log.fine("[" + m_trxName + "] - " + p_info.getTableName() + " - " + get_WhereClause(true));
// Set new DocumentNo
String columnName = "DocumentNo";
int index = p_info.getColumnIndex(columnName);
if (index != -1)
{
String value = (String)get_Value(index);
if (value != null && value.startsWith("<") && value.endsWith(">"))
value = null;
if (value == null || value.length() == 0)
{
int AD_Client_ID = getAD_Client_ID();
int dt = p_info.getColumnIndex("C_DocTypeTarget_ID");
if (dt == -1)
dt = p_info.getColumnIndex("C_DocType_ID");
if (dt != -1) // get based on Doc Type (might return null)
value = DB.getDocumentNo(get_ValueAsInt(dt), m_trxName);
if (value == null) // not overwritten by DocType and not manually entered
value = DB.getDocumentNo(AD_Client_ID, p_info.getTableName(), m_trxName);
set_ValueNoCheck(columnName, value);
}
}
// Set empty Value
columnName = "Value";
index = p_info.getColumnIndex(columnName);
if (index != -1)
{
String value = (String)get_Value(index);
if (value == null || value.length() == 0)
{
value = DB.getDocumentNo (getAD_Client_ID(), p_info.getTableName(), m_trxName);
set_ValueNoCheck(columnName, value);
}
}
lobReset();
// SQL
StringBuffer sqlInsert = new StringBuffer("INSERT INTO ");
sqlInsert.append(p_info.getTableName()).append(" (");
StringBuffer sqlValues = new StringBuffer(") VALUES (");
int size = get_ColumnCount();
boolean doComma = false;
for (int i = 0; i < size; i++)
{
Object value = get_Value(i);
// Don't insert NULL values (allows Database defaults)
if (value == null
|| p_info.isVirtualColumn(i))
continue;
// Display Type
int dt = p_info.getColumnDisplayType(i);
if (DisplayType.isLOB(dt))
lobAdd (value, i, dt);
// ** add column **
if (doComma)
{
sqlInsert.append(",");
sqlValues.append(",");
}
else
doComma = true;
sqlInsert.append(p_info.getColumnName(i));
//
// Based on class of definition, not class of value
Class c = p_info.getColumnClass(i);
try
{
if (c == Object.class) // may have need to deal with null values differently
sqlValues.append (saveNewSpecial (value, i));
else if (value == null || value.equals (Null.NULL))
sqlValues.append ("NULL");
else if (value instanceof Integer || value instanceof BigDecimal)
sqlValues.append (encrypt(i,value));
else if (c == Boolean.class)
{
boolean bValue = false;
if (value instanceof Boolean)
bValue = ((Boolean)value).booleanValue();
else
bValue = "Y".equals(value);
sqlValues.append (encrypt(i,bValue ? "'Y'" : "'N'"));
}
else if (value instanceof Timestamp)
sqlValues.append (DB.TO_DATE ((Timestamp)encrypt(i,value), p_info.getColumnDisplayType (i) == DisplayType.Date));
else if (c == String.class)
sqlValues.append (encrypt(i,DB.TO_STRING ((String)value)));
else if (DisplayType.isLOB(dt))
sqlValues.append("null"); // no db dependent stuff here
else
sqlValues.append (saveNewSpecial (value, i));
}
catch (Exception e)
{
String msg = "";
if (m_trxName != null)
msg = "[" + m_trxName + "] - ";
msg += p_info.toString(i)
+ " - Value=" + value
+ "(" + (value==null ? "null" : value.getClass().getName()) + ")";
log.log(Level.SEVERE, msg, e);
throw new DBException(e); // fini
}
}
// Custom Columns
if (m_custom != null)
{
Iterator it = m_custom.keySet().iterator();
while (it.hasNext())
{
String column = (String)it.next();
index = p_info.getColumnIndex(column);
String value = (String)m_custom.get(column);
if (doComma)
{
sqlInsert.append(",");
sqlValues.append(",");
}
else
doComma = true;
sqlInsert.append(column);
sqlValues.append(encrypt(index, value));
}
m_custom = null;
}
sqlInsert.append(sqlValues)
.append(")");
//
int no = DB.executeUpdate(sqlInsert.toString(), m_trxName);
boolean ok = no == 1;
if (ok)
{
ok = lobSave();
if (!load(m_trxName)) // re-read Info
{
if (m_trxName == null)
log.log(Level.SEVERE, "reloading");
else
log.log(Level.SEVERE, "[" + m_trxName + "] - reloading");
ok = false;;
}
}
else
{
String msg = "Not inserted - ";
if (CLogMgt.isLevelFiner())
msg += sqlInsert.toString();
else
msg += get_TableName();
if (m_trxName == null)
log.log(Level.WARNING, msg);
else
log.log(Level.WARNING, "[" + m_trxName + "]" + msg);
}
return saveFinish (true, ok);
} // saveNew
/**
* Create Single/Multi Key Where Clause
* @param withValues if true uses actual values otherwise ?
* @return where clause
*/
public String get_WhereClause (boolean withValues)
{
StringBuffer sb = new StringBuffer();
for (int i = 0; i < m_IDs.length; i++)
{
if (i != 0)
sb.append(" AND ");
sb.append(m_KeyColumns[i]).append("=");
if (withValues)
{
if (m_KeyColumns[i].endsWith("_ID"))
sb.append(m_IDs[i]);
else
sb.append("'").append(m_IDs[i]).append("'");
}
else
sb.append("?");
}
return sb.toString();
} // getWhereClause
/**
* Save Special Data.
* To be extended by sub-classes
* @param value value
* @param index index
* @return SQL code for INSERT VALUES clause
*/
protected String saveNewSpecial (Object value, int index)
{
String colName = p_info.getColumnName(index);
String colClass = p_info.getColumnClass(index).toString();
String colValue = value == null ? "null" : value.getClass().toString();
int dt = p_info.getColumnDisplayType(index);
log.log(Level.SEVERE, "Unknown class for column " + colName
+ " (" + colClass + ") - Value=" + colValue);
if (value == null)
return "NULL";
return value.toString();
} // saveNewSpecial
/**
* Encrypt data.
* Not: LOB, special values/Obkects
* @param index index
* @param xx data
* @return xx
*/
private Object encrypt (int index, Object xx)
{
if (xx == null)
return null;
if (index != -1 && p_info.isEncrypted(index))
return SecureEngine.encrypt(xx);
return xx;
} // encrypt
/**
* Decrypt data
* @param index index
* @param yy data
* @return yy
*/
private Object decrypt (int index, Object yy)
{
if (yy == null)
return null;
if (index != -1 && p_info.isEncrypted(index))
return SecureEngine.decrypt(yy);
return yy;
} // decrypt
/**************************************************************************
* Delete Current Record
* @param force delete also processed records
* @return true if deleted
*/
public boolean delete (boolean force)
{
if (is_new())
return true;
if (!force)
{
int iProcessed = get_ColumnIndex("Processed");
if (iProcessed != -1)
{
Boolean processed = (Boolean)get_Value(iProcessed);
if (processed != null && processed.booleanValue())
{
log.warning("Record processed");
log.saveError("Processed", "Processed", false);
return false;
}
} // processed
} // force
try
{
if (!beforeDelete())
{
log.warning("beforeDelete failed");
return false;
}
}
catch (Exception e)
{
log.log(Level.SEVERE, "beforeDelete", e);
log.saveError("Error", e.toString(), false);
// throw new DBException(e);
return false;
}
String errorMsg = ModelValidationEngine.get().fireModelChange
(this, ModelValidator.TYPE_DELETE);
if (errorMsg != null)
{
log.saveError("Error", errorMsg);
return false;
}
// Prepare Delete Attachment
StringBuffer attachment = new StringBuffer ("DELETE FROM AD_Attachment WHERE AD_Table_ID=")
.append(p_info.getAD_Table_ID()).append(" AND Record_ID=").append(m_IDs[0]);
// The Delete Statement
StringBuffer sql = new StringBuffer ("DELETE ")
.append(p_info.getTableName())
.append(" WHERE ")
.append(get_WhereClause(true));
//
deleteTranslations();
int no = DB.executeUpdate(sql.toString(), m_trxName);
// Save ID
m_idOld = get_ID();
boolean success = no == 1;
//
if (success)
{
// Change Log
MSession session = MSession.get (p_ctx, false);
if (session == null)
log.fine("No Session found");
else if (m_IDs.length == 1
&& MChangeLog.isLogged(p_info.getAD_Table_ID()))
{
int AD_ChangeLog_ID = 0;
int size = get_ColumnCount();
for (int i = 0; i < size; i++)
{
Object value = m_oldValues[i];
if (value != null
&& !p_info.isEncrypted(i) // not encrypted
&& !p_info.isVirtualColumn(i) // no virtual column
&& !"Password".equals(p_info.getColumnName(i))
)
{
MChangeLog cLog = session.changeLog (
m_trxName, AD_ChangeLog_ID,
p_info.getAD_Table_ID(), p_info.getColumn(i).AD_Column_ID,
get_ID(), getAD_Client_ID(), getAD_Org_ID(), value, null);
if (cLog != null)
AD_ChangeLog_ID = cLog.getAD_ChangeLog_ID();
}
} // for all fields
}
// Delete Attachments
DB.executeUpdate(attachment.toString(), m_trxName);
// Housekeeping
m_IDs[0] = I_ZERO;
if (m_trxName == null)
log.fine("complete");
else
log.fine("[" + m_trxName + "] - complete");
}
else
log.warning("Not deleted");
m_attachment = null;
try
{
success = afterDelete (success);
}
catch (Exception e)
{
log.log(Level.SEVERE, "afterDelete", e);
log.saveError("Error", e.toString(), false);
success = false;
// throw new DBException(e);
}
// Reset
m_idOld = 0;
int size = p_info.getColumnCount();
m_oldValues = new Object[size];
m_newValues = new Object[size];
CacheMgt.get().reset(p_info.getTableName());
// log.info("" + success);
return success;
} // delete
/**
* Delete Current Record
* @param force delete also processed records
* @param trxName
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -