上面一個章節介紹了如何使用InfoTransaction元件來實現資料的交易,這一節我們將介紹如何通過程式來進行資料的交易。
使用後端資料庫的Trigger方式來設計,因為Trigger可以讓你在Table Insert/Delete/Update時搭配Inserted與Deleted的新舊資料來自行下達SQL語句達到資料過帳的目的,這種寫法優點是很方便,只要負責下基本Insert/Delete/Update指令給資料庫就可已完成過帳,執行效能高。下面我們就通過例子來看看如何進行功能的實現。需要完成在sOrders這個Sever中,當訂單明細的產品數量(Quantity)修改時,將Products表中的UnitsOnOrder中得累加。
Step1>
首先找到sOrders這個專案,找到detail相應的OrderDetails的UpdateComponent。
Step2>
在這個UpdateComponent的屬性頁找到Event按鈕。
1.
BeforeInsert
觸發在資料新增前,還未保存到資料庫的情況下。
2.
BeforeModify
觸發在資料修改前,還未保存到資料庫的情況下。
3.
BeforeDelete
觸發在資料刪除前,還未保存到資料庫的情況下。
4.
BeforeApply
觸發在資料存檔前,還未保存到資料庫的情況下。
5. AfterInsert
觸發在資料新增後,已保存到資料庫的情況下。
6. AfterModify
觸發在資料修改後,已保存到資料庫的情況下。
7. AfterDelete
觸發在資料刪除後,已保存到資料庫的情況下。
8. AfterApply
觸發在資料存檔過程中的情況下。
9. AfterApplied
觸發在資料完成交易後的情況下。
Step3>
這裡我們以BeforeModify為例子,在這個Event上雙擊進入程式碼編寫狀態。寫入如下程式。
private void
ucOrderDetails_BeforeModify(object
sender, UpdateComponentBeforeModifyEventArgs e)
{
int
qtyOld = Convert.ToInt32(ucOrderDetails.GetFieldOldValue("Quantity"));
int
qtyNew = Convert.ToInt32(ucOrderDetails.GetFieldCurrentValue("Quantity"));
int
productId = Convert.ToInt32(ucOrderDetails.GetFieldCurrentValue("ProductID"));
if
(!qtyNew.Equals(qtyOld))
{
int diference = qtyNew - qtyOld;
string sql = "update Products set UnitsOnOrder = UnitsOnOrder + " + diference.ToString() + " where ProductID = " + productId.ToString();
this.ExecuteCommand(sql, ucOrderDetails.conn,
ucOrderDetails.trans);
}
}
由上面的程式可以了解到當前修改資料的UpdateComponent擁有了GetFieldOldValue和GetFieldCurrentValue兩個方法,其中在BeforeInsert時,只有GetFieldCurrentValue可以有取出值。在BeforeDelete時,只有GetFieldOldValue方法可以取出值。
Step4>
做完上面的步驟,將sOrders重新建置,然後重新運行訂單管理這個頁面,在修改Detail存檔後,查看資料庫修改的語句。
Related Topics