合理利用DW完成PB的多表更新

2021-04-14 22:40:17 字數 2036 閱讀 8433

案例:有乙個業務需要同時更新兩個或以上的表

分析:同時更新兩個表,簡單一點的就是用其中乙個表做dw更新,同時用sql更新另外乙個表;或者頁trigger實現其他表的更新。但這樣對於相類似的業務就無疑是大大增加工作量。而且維護不方便。

但我們細細考慮一下,dw作為pb的利器自然有他獨到的地方。更新屬性就好像是為了這種多表更新而設計的。

pb更新資料庫的時候首先看更新的table,然後看需要更新的column。也就是說,只需要在更新的時候設定好更新屬性,就可以方便的實現多表更新了。

步驟可以簡單理解為:更新的時候將表1作為可更新表,表1的column作為可更新column。更新完後再設定表2作為可更新表,表2的column作為可更新column。

例項:假設有tabletbl_1(col_1, col_2), tbl_2(col_1, col3)

那麼,dw的sql就是

select  tbl_1.col_1,

tbl_1.col_2,

tbl_2.col_3

from tbl_1, tbl_2

where tbl_1.col_1 = tbl_2.col_1

當dw作了一系列操作後,在更新的時候執行以下script

long ll_cnt = 0

int i = 0

string ls_table[2] =

string ls_col

string ls_col_dbname

string ls_update

string ls_updateable

string ls_error

boolean lb_update

// 迴圈table列表,實現多表更新

for i = 1 to upperbound(ls_table)

// 迴圈dw的column

for ll_cnt = 1 to long(dw_1.describe("datawindow.column.count"))

ls_col = dw_1.describe("#" + string(ll_cnt) + ".name")

ls_col_dbname = dw_1.describe("#" + string(ll_cnt) + ".dbname")

// 如果屬於更新表的column或者key,設為可更新column

// 這裡也可以將公共column也列作可更新column

if pos(ls_col_dbname, ls_table + ".") = 1 or &

lower(dw_1.describe("#" + string(ll_cnt) + ".key")) = "yes" then

ls_updateable = ".update=yes"

else

ls_updateable = ".update=no"

end if

ls_update += "~t" + ls_col + ls_updateable

next

// 設定更新table

ls_update += "~tdatawindow.table.updatetable='" + ls_table[i] + "'"

// 更新設定無誤後update

ls_error = dw_1.modify(ls_update)

if trim(ls_error) <> '' or ls_error <> '!' then

if dw_1.update(true, false) = 1 then

lb_update = true

else

lb_update = false

// 退出for迴圈

exit

end if

end if

nex// 此處根據更新情況提交事務

if lb_update then

commit;

// 重設dw狀態

dw_1.resetupdate()

else

rollback;

end if

//到這裡就完成了多表更新了

合理利用DW完成PB的多表更新

案例 有乙個業務需要同時更新兩個或以上的表 分析 同時更新兩個表,簡單一點的就是用其中乙個表做dw更新,同時用sql更新另外乙個表 或者頁trigger實現其他表的更新。但這樣對於相類似的業務就無疑是大大增加工作量。而且維護不方便。但我們細細考慮一下,dw作為pb的利器自然有他獨到的地方。更新屬性就...

PB的N UP型別的DW的設計 一行顯示多條資料

n up型別的dw就是在一行顯示多條記錄的格式,如下圖所示的格式 新建dw,選擇n up型別,選擇表的字段後按下一步會出現乙個對話方塊,輸入每行顯示的數量,再下一步就顯示dw設計畫板。在這裡可以看到,每個欄位都在明細帶中重了定義的次數,並且它的名字屬性分別是原欄位名後面加下劃線加數字。但是如果用計算...

PB視窗之間多引數的傳遞

在powerbuilder中函式openwithparm,closewithreturn,opensheetwithparm,windowname.openuserobjectwithparm等都有乙個在進行視窗操作 開啟或者關閉 時存入message訊息物件的引數parameter或returnv...