在infocommand裡,當更新table裡面的值時,要如何同時更新另外一個table的資料?
方式一.在UpdateComponent的相關事件寫程式下insert or update的sql語句(為了包在同一個Transaction請在調用ExecuteSql或者ExecuteCommand方式時使用updateComp的conn和trans)。方式二.傳參數方式
UpdateComponent的BeforeDelete如何取消刪除?
兩種方法,請參考:
1)如果您是要判斷哪些資料可以刪除哪些不可以,您可以在Client端的BeforeCommand事件中處理,比較簡單。
2)如果是必須要在Server處理的,您需要BeforeDelete事件中寫:
if (Convert.Toint16(UpdateComp1.GetFieldOldValue("Qty"))<=0) // 條件成立的話
{
throw new Exception("yourMessage"); //拋出異常與訊息
}
然後需要在Client的InfoDataSet的ApplyError事件中接收:
if (e.Exception.InnerException.Message == "yourMessage")
{
MessageBox.Show("yourMessage"); //可以自行改變訊息
e.Cancel = true; //讓系統知道後端有錯誤
}
如何在UpdateComp中去決定存入資料庫的內容值?
在UpdateComp的處理事件中(如BeforeInsert/BeforeModify等),如果需要去決定欄位的內容值,可以使用UpdateComp.SetFieldValue(FieldName,Value)方式來設定,但是SetFieldValue()的欄位對象必須是在InfoCommand存在的欄位,否則會發生錯誤,以下是自動決定更改的使用者與時間的範例:
private void ucOrders_BeforeModify(object sender, UpdateComponentBeforeModifyEventArgs e)
{
ucOrders.SetFieldValue("UpdatedUser",this.GetClientInfo(ClientInfoType.LoginUser);
ucOrders.SetFieldValue("UpdatedDate",System.DateTime.Today);
}
如何在UpdateComp的事件中去自行處理其他資料交易,而不必使用InfoTransaction元件?
在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。
在新增時,UpdateComp中使用GetFieldOldValue時,系統報錯。錯誤訊息:沒有可存取的 Original 資料.! ,這是為甚麼?
在UpdateComp的新增時,因為UpdateCom中並沒有各欄位的舊值內容,在新增的事件中,是不能使用GetFieldOldValue的方法。
UpdateComponent 中FieldAttrs屬性會應用在哪裡?
FieldAttrs是為了給特殊功能使用的,並不是一定都須設定的,沒有設定也一樣可以正常insert或者update,一般的用法有:
1. 給某個欄位預設值,這個值不一定需要在Client端顯示,比如更改者,更改時間等等。
2. 是否需要回寫此欄位元,比如有些left join進來的欄位是不能回寫到資料庫的,可以在此設定不存檔,也有一些為了顯示用的計算欄位等等,都是同樣的用法。
3. 還可以定義是否需要checknull.不過,這個功能更多的是在Client端使用DefaultValidate或WebValidate來實現,畢竟到了後端確實時機晚了一些。
當該Table有設定後端資料庫的Trigger時,可能會出現多筆資料被異動錯誤,請問應該如何解決?
在UpdateComp在存檔的時候EEP會去判斷資料受到影響的筆數,也就是說只能有一筆資料影響才會是正確的交易,如果超過一筆或沒有資料被影響,這都是會被認為是錯誤的交易,所以才會出現上述問題。在EEP SP3之後的UpdateComp元件,增加了一個屬性RowAffectCheck,可以將其設為false,這樣系統就不會去檢查這個影響筆數。