2011年9月9日 星期五

Datawindow裡面資料Row的狀態變化

DataWindow 的 Row 在讀取、新增、修改後都有不同的狀態紀錄,

要取得該 Row 狀態只要使用下面這個指令就可以:
DWItemStatus ldwi_row

ldwi_row = dw_1.GetItemStatus(ll_row , li_column , Primary!)或
ldwi_row = dw_1.GetItemStatus(ll_row , "col_name", Primary!)

上面程式片碼中 li_column 如果為 0 ,代表取得整個 Row 狀態。

DWItemStatus 有四種狀態:
New! (新增 row)
NewModified! (新增 row 並修改內容)
DataModified! (資料內容被修改)
NotModified! (沒有任何修改)
但是要注意的是一個 Row 有兩種狀態 Flag (標籤)用來記錄其受影響的目標:
Row Flag (影響範圍屬於整列狀態,一列資料只有一個這樣的標籤紀錄)
Column Flag (影響範圍為單一欄位,每個欄位都有一個這樣的標籤紀錄)
而各狀態相關的範圍如下:

狀態受影響標籤
New!Rows
NewModified!Rows
DataModified!Rows 與 Columns
NotModified!Rows 與 Columns



  1. 資料如果從資料庫讀取以後,狀態會屬於 NotModified!
  2. 資料如果是新增,狀態會是 New!
  3. 資料如果是匯入以後,狀態會是 NewModified!
  4. 如果是新增以後,修改資料內容,狀態也會是 NewModified!
  5. 如果是 NotModified! 狀態修改資料,狀態會變更為 DataModified!
  6. 當DataWindow執行過 Update(),如果成功改 Row 會變更為 NotModified!


關於 SQL 的執行
DataWindow 在 Update() 時,會自動產生 SQL 語法,因此會跟狀態有關:

狀態產生語法
NewModified!INSERT
DataModified!UPDATE


你也可以自行變更狀態
當然,某些情況須需要時,可以自行變更 Row/Column 的狀態的,以下就是變更方式:
DWItemStatus ldwi_row

ldwi_row = NotModifuied!
dw_1.SetItemStatus(ll_row , li_column , Primary! , ldwi_row) 或
dw_1.SetItemStatus(ll_row , "col_name" , Primary! , ldwi_row)

上面程式片碼中 li_column 如果為 0 ,代表設定整個 Row 狀態。

設定要素
由於 Row 與 Column 的 Flag 分別為不同紀錄標籤,所以在設定時要注意到影響的目標,
下面這個表可以表示哪些狀態可以被變更,或是變更後會形成新的狀態:

原始狀態 更新狀態
New! NewModified! DataModified! NotModified!
New! 不變 Yes Yes No
NewModified! No 不變 Yes New!
DataModified! NewModified! Yes 不變 Yes
NotModified! Yes Yes Yes 不變


無法直接變更要怎麼處理
如上表所示,某些狀態變會無法直接變更,在這種情況下,就必須採用轉向方式變更,
下面的程式碼展示如何將 New! 變更成 NotModified :
DWItemStatus ldwi_row

ldwi_row = dw_1.SetItemStatus(ll_row , li_column , Primary!)
if ldwi_row = New! or ldwi_row = NewModified! then
  dw_1.SetItemStatus(ll_row , li_column , Primary! , DataModified!)
  dw_1.SetItemStatus(ll_row , "col_name" , Primary! , NotModified!)
end if


清除所有狀態
如若要一次清除 Datawindow 內所有狀態到 NotModified!,可以直接使用 RestUpdate() 指令:
dw_1.ResetUpdate()

1 個回應:

Phil Chen 提到...

解說詳盡.幫助不小. 謝版大.