原理分析
数据窗口数据源来自两个或两个以上的表相当于多个表连接建立的一个视图对于这种数据窗口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表示失败
[] []