UpdateComponent
【功能說明】
用途:使用於 Server 端, 本元件是為了能自動化處理 Client 端所要求的 Insert/Update/Delete 等需求, EEP Server 會以此元件來下達對應的 Insert/Update/Delete 等 SQL 指令。本元件須連接到對應的 InfoCommand 元件,並成雙成對。
【元件屬性】
Name( 名稱 )(string)
元件名稱,用於識別該元件。
AutoTrans( 自動交易 )(bool)
預設為 True ,建議最好設定為 True ,因為如果設成 True ,系統在處理 Client 端的 Insert/Update/Delete 要求時自動下 Begin/Commit Transaction ,有發生異常或錯誤時會自動下 RollbackTransaction 語句。
ExceptJoin( 關聯欄位排除 )(bool)
True/False , True 時,會自動分析 SqlCommand ,將 Left Join 欄位自動加入 FieldAttrs 中,並設為 UpdateEnable=False( 不參與更改 ) ,以防止對 Left Join 欄位下達 Update 而發生錯誤,預設為 True 。
FieldAttrs( 預設欄位明細 )(FieldAttrCollection)
特殊控制每個欄位的預設值或是否更改,欄位屬性為多個 FieldAttr 物件所組成,每個 FieldAttr 又可以設定下列屬性。
DataField( 欄位名稱 )(string) : 所要控制的欄位名稱,本名稱必須在 SqlCommand 中要有此欄位。
UpdateEnable( 更改致能 )(bool) : True 代表此欄位要進行更改, False 代表不進行更改,目的是用來過濾有 Left Join 別表的欄位不要進行對主資料表進行更改。(此用在 Update/Insert 時 )
CheckNull( 檢查空白 )(bool) : 為 True/False ,一般檢查資料有三種,一種在 Client 端用 DefaultValidate 元件的機制檢查,第二種則為本屬性,如指定本 DataField 欄位內容為空白者,系統即會放棄回寫資料庫的動作,並發出錯誤訊息通知 Client ,第三種為 Database 的設定,資料庫上也有 CheckNull 的設定,同樣也可不允許欄位空白。因為在大部份情況下希望發展的系統不受單一種類資料庫所限制,再加上
SUpdateComp 的 CheckNull 警告時點與其訊息不易控制的情況下,還是建議寫在 Client 端較佳。(此用在 Update/Insert 時)。
TrimLength( 截斷長度 )(int) : 可以讓型態為 String 的欄位依此長度截斷 , 預設為 0 代表不截斷。
DefaultValue( 預設值 )(string) : 支持文字、數字,會依欄位型態自動轉換,如果要動態的內容值,也可使用函數方式,或者可以配合 UpdateComp 的 BeforeUpdate 或 BeforeInsert 的事件來處理(此用在 Update/Insert 時)。函數設定方法:例如:給一個 DateTime 類型的欄位設值,可以在此寫上 MyGetdate() (請加括號以表示此為函數)。在程式如下:
public DateTime
MyGetDate()
{
return DateTime.Now.Date;
}
為了簡化,你也可以用 EEP 系統變數,如 _Today 即可取代以上的程式,
_ServerDay 代表主機上的日期等等。
DefaultMode( 預設選項 )(enum) : 為控制 DefaultValue 的模式,共有三種: 1. 新增時預設; 2. 更改時預設; 3. 新增更改時都預設。
WhereMode( 加入 Where)(bool) : True/False ,當 insert 或 Update 時,其欄位內容的舊值要不要加入 where 條件當中。
LogInfo( 異動記錄 )(LogInfo)
本屬性用來設定自動記錄 User 對本資料的新增、更改與刪除動作,細節說明見 LogInfo 元件。
SelectCmd( 對應 InfoCommand)(InfoCommand)
對應的 InfoCommand ,須選擇對應的 InfoCommand ,否則 UpdateComp 則無法獨立運作。
ServerModify( 與 Server 同步 )(bool)
此屬性用在當後端資料庫有 Trigger 或 Stored
Procedure 時,或有 Identity 類型欄位時,當 UpdateComp 存入後必須重新 Select 出最新的資料給相對的 Client ,才能讓 Client 的用戶取得最新的資料。在 InfoDataSet 中也有一個 ServerModify 的屬性,兩者必須相互搭配。
ServerModifyColumns( 伺服更新參考欄位 )(collection)
當 ServerModify=True 時 , 要重新取出資料到 Client 端時 , 會以此設定的指定欄位加入 Where 語句中去重讀 Server 端資料 , 沒設定則自動以 InfoCommand 的 KeyFields 為 Where 欄位。
ServerModifyGetMax( 伺服更新最大值 )(bool)
可以配合 Table 自增值的欄位 (Identify) 的取出 , 由於使用了 Select MAX(key) From Table 的方式 , 所以也無法 100% 保證取得 User 剛剛存檔的那一筆單據號碼。
TransIsolationLevel( 隔離層次 )(enum)
指 DataBase 的隔離層次 , 預設為 ReadCommitted, 其他還有 ReadUncommitted,Unspecified,Chaos,RepeatableRead,Serialzable,Snapshot, 請參考資料庫的 Isolation Level 的說明。
WhereMode(Where 模式 )(enum)
當 Update/Delete 時 UpdateComp 會自動產生 where 語法,此共有三種設定,如下:
RowAffectsCheck( 資料行影響檢查
)(bool)
當設定為 False 可解決如果資料庫設定 Trigger ,資料存檔時會出現“多筆資料異動”無法存檔的問題,但這樣會有多筆被更改或刪除的危機,使用時必須注意,預設為 True ,代表只能有一筆資料被影響。
【事件】
BeforeApply( 存檔前 ) : 不管是 Insert/Delete/Update ,都會在上述動作之前先執行存檔前這個事件
AfterApply( 存檔 過程中 ) : 不管是 Insert/Delete/Update ,都會在存檔 過程中 執行這個事件。
AfterApplied( 存檔後 ) :將在 Commit trans 後觸發,以方便處理交易成功後的程序。
BeforeInsert( 新增前 ) : Insert 前所要執行事件。
AfterInsert( 新增後 ) : Insert 後所要的執行的事件。
BeforeDelete( 刪除前 ) : Delete 前所要執行的事件。
AfterDelete( 刪除後 ) : Delete 後所要執行的事件。
BeforeModify( 更改前 ) : Update 前所要執行的事件。
AfterModify( 更改後 ) : Update 後所要執行的事件。
【功能函數】
SetFieldValue(Stirng
FieldName,object value)
可以在後端的 UpdateComp 事件中自行控制要寫入資料表的各欄位值。
GetCurrentMasterRow( stringsMasterTable)
在
Master-Detail
機制作用,可在 Detail 的 UpdateComp 事件中 , 用於在 Detail 的交易過程中來取得當前筆 Master 的 Row 資料。注意, Master 必須有欄位異動才可以被取得 DataRow 。
GetFieldCurrentValue( stringfieldName)
可以在後端的 UpdateComp 事件中取得各欄位變更後的值。
GetFieldOldValue( stringfieldName)
可以在後端的 UpdateComp 事件中取得各欄位變更前的值。
【其他說明】
UpdateComp 可以依欄位是否為 UniCode, 自動設定 N'Value' 的方式寫入 , 整個 UpdateComp 全面支援 UniCode 的存取功能。
【 範例
】
在 UpdateComp 中去決定存入資料庫的內容值
在 UpdateComp 的處理事件中 ( 如 BeforeInsert/BeforeModify 等 ) ,如果需要去決定欄位的內容值,可以使用 UpdateComp.Set FieldValue (FieldName,Value) 方式來設定,但是 SetFieldValue() 的欄位對象必須是在 InfoCommand 存在的欄位,否則會發生錯誤,以下是自動決定更改的使用者與時間的範例 :
private voiducOrders_BeforeModify(
objectsender, UpdateComponentBeforeModifyEventArgse)
{
ucOrders.SetFieldValue( "UpdatedUser", this.GetClientInfo(
ClientInfoType.LoginUser);
ucOrders.SetFieldValue( "UpdatedDate",System. DateTime.Today);
}
UpdateComp 的事件中去自行處理其他資料交易
在 UpdateComp 中的事件中,可以使用 GetFieldCurrentValue() 與 GetFieldOldValue() 來讀取 Client 所輸入的欄位新舊值,並透過 ExecuteCommand() 來自行下出 SQL 語法,為了讓此 SQL 命令能配合原來 UpdateComp 的 Transaction 須為同一個交易 ( 同步 Commit 或 RollBack) ,因此可以透過 UpdateComp 取得此 Connection 與 Transaction ,舉例如下:
int
QtyOld = UpdateComp1.GetFieldOldValue("Qty");
int QtyNew = UpdateComp1.GetFieldCurrentValue("Qty");
this.ExecuteCommand("update table2 set field = ....",
UpdateComp1.conn, UpdateComp1.trans);
需要注意的地方,新增時只能用 GetFieldCurrentValue ,刪除的時候,只能用 GetFieldOldValue 。
| Converted from CHM to HTML with chm2web Pro 2.85 (unicode) |