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 語法,此共有三種設定,如下:

  1. 使用主鍵:此為預設值,一般都是以主鍵做為 where 的條件。
  2. 主鍵與欄位屬性:除了主鍵外,須加上 FieldAttrs 的欄位屬性 WhereMode 中設定為 True 的的欄位。
  3. 全部:所有欄位都置於 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)