原理分析
數據窗口數據源來自兩個或兩個以上的表相當於多個表連接建立的一個視圖對於這種數據窗口PB默認是不能修改的當然我們可以通過設置它的Update 屬性數據窗口的Update Properties用來設置數據窗口是否可Update可Update的表可Update列等但不能同時設置兩個表可更新所以當修改它的數據項時我們不能簡單地用dw_update()來更新table我們可以在程序中設置數據窗口可更新的一個表A(及其可更新列)其他表為不可更新更新完表A後再設置另一表B為可更新表A設置為不可更新依次類推
解決示例
我們以PowerBuilder自帶的ASA數據庫為例
新建一個數據窗口d_grid_dep_emp它的Select語句為
SELECT departmentdept_id
departmentdept_name
employeeemp_id
employeeemp_fname
employeeemp_lname
FROM department employee
where employeedept_id = departmentdept_id
設置數據窗口d_grid_dep_emp的屬性將列的taborder改為非值並點擊菜單Rows――Update Properties設置此數據窗口Allow
UpdatesTable to Update設為departmentUpdateable Columns為departmentdept_iddepartmentdept_name
在窗口中更新數據窗口按鈕的clicked事件編寫腳本
long ll_rtn
// 修改Department表(Department表在第步已設置為可更新)
ll_rtn = dw_update(true false)
if ll_rtn = then
//關閉對Department表的修改
dw_Modify( department_dept_nameUpdate = No )
dw_Modify( department_dept_idUpdate = No )
dw_Modify( department_dept_idKey = No )
//設置Employee表成為新的可修改表
dw_Modify( DataWindowTableUpdateTable = employee )
dw_Modify( employee_emp_idUpdate = Yes )
dw_Modify( employee_emp_fnameUpdate = Yes )
dw_Modify( employee_emp_lnameUpdate = Yes )
dw_Modify( employee_emp_idKey = Yes )
//修改Employee表
ll_rtn = dw_Update()
IF ll_rtn = THEN
COMMIT USING SQLCA;
dw_retrieve()
messagebox( 提示信息 更新成功! )
ELSE
ROLLBACK USING SQLCA;
MessageBox( 提示信息 更新失敗! )
END IF
//重設修改標志
dw_Modify( department_dept_nameUpdate = Yes )
dw_Modify( department_dept_idUpdate = Yes )
dw_Modify( department_dept_idKey = Yes )
dw_Modify( DataWindowTableUpdateTable = department )
dw_Modify( employee_emp_idUpdate = No )
dw_Modify( employee_emp_fnameUpdate = No )
dw_Modify( employee_emp_lnameUpdate = No )
dw_Modify( employee_emp_idKey = No )
ELSE
ROLLBACK USING SQLCA;
MessageBox( 提示信息 更新失敗! )
END IF
這樣就完成了對兩個表的更新當然我們可以將上面功能編成一個函數在需要時調用
PowerBuilder的數據窗口對象是其特有的智能對象其封裝性好功能強大表現形式豐富多樣為此許多MIS開發人員對PowerBuilder推崇備至將其視為首選開發工具
一般情況下一個數據窗口只能更新一個數據庫表但在MIS開發過程中我們經常遇到這種情況一個數據窗口中由兩個或更多個數據庫
表作為數據源並需要對其進行錄入或修改如何給出多表更新的通用解決方案就成為MIS開發人員不容回避的問題筆者在某管理信息系統的
開發過程中嘗試了幾種雙表更新的解決方法選出一種比較好的方案以飨讀者
一具體步驟
在數據窗口建立時選擇SQL Select顯示風格可以是TabularGrid或FreeForm中的任一種選出兩表需要錄入或修改的列其中兩表的主鍵和非空列必須選中確定選擇條件建立連接關系
在選單Rows/Update中選擇第一個表的全部數據項為可更新項
把兩表需要修改項的Tab Order數值改為非值使其在數據窗口中成為可修改項
為了使方案具有通用性建立全局函數f―update―table有五個參數dw―objtabletablekeykey分別代表所要更新的數據窗口兩表表名和兩表主鍵列名其中dw―obj為DataWindow類型其余四參數均為String類型該函數返回值為Boolean型返回True表示成功返回False表示失敗
[] []
From:http://tw.wingwit.com/Article/program/PB/201311/24630.html