案例:有乙個業務需要同時更新兩個或以上的表
分析:同時更新兩個表,簡單一點的就是用其中乙個表做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...