摘要 在powerbulider中,数据窗口数据源来自两个或两个以上的表,对于这样的数据窗口powerbulider默认是不可以更改的,但是实际往往需要我们对该数据进行修改,通过修改pb的默认设置,来重新设置它的Update 属性,数据窗口的Update Properties能够完成设置数据窗口是否可Update、可Update的表、可Update列等,但不能同时设置两个以上多表可更新,本文通过设置数据窗口属性和使用Modify()函数完成多表的更新修改。
关键词 数据窗口 函数 表
0 引言
随着数据库技术在各行各业的广泛应用,作为企业级数据库前端开发工具的Power Builder日益成为开发人员的得力助手。PowerBuilder以其开放的体系结构,友好的用户界面和简洁高效的开发环境赢得业界的青睐。特别是数据窗口对象是PowerBuilder中最重要的概念之一,它是PowerBuilder应用区别于其它Windows应用的重要特征,同时也是PowerBuilder的价值所在。PowerBuilder应用通常通过数据窗对象从数据库或其它数据源取得数据并加以显示,其数据的输入、添加、修改和删除也大都通过数据窗对象来实现。多表的更新修改几乎在每个开发的系统中都会遇到,但是powerbuilder默认的数据窗口画板无法同时完成多表更新修改,实际开发中处理这个问题的方法也不尽相同。我们采用先设置一个表的属性然后更新修改另外一个表或者其他表的属性的方法来完成数据窗口的多表更新修改。
1 处理方法
由于数据窗口数据源来自多个表,所以不能简单地用dw_1.update()来更新table,需要在程序中设置数据窗口画板,可更新一个表(及其可更新列),其他表为不可更新;更新完第一个表后,再设置另外其他的表为可更新修改,然后重新设置好表的可更新状态。
2 建立两张表及数据窗口
利用PowerBuilder9自带的ASA8数据库建立两张表,表名分别为classtable 和studenttable
建立这两张表calsstable和studenttable的sql语句如下:
classtable 表:
CREATE TABLE "dba"."classtable" ("classid" char(10) NOT NULL DEFAULT NULL, "classname" char(12) DEFAULT NULL , PRIMARY KEY ("classid")) ;
studenttable表:
CREATE TABLE "dba"."studenttable" ("studentid" char(12) NOT NULL DEFAULT NULL, "sname" char(6) DEFAULT NULL, "sex" char(2) DEFAULT NULL, "address" char(16) DEFAULT NULL, "telephone" char(12) DEFAULT NULL, "classid" char(10) DEFAULT NULL , PRIMARY
KEY ("studentid")) ;
并在两张表中录入几条验证测试数据如图1、图2。
图1 classtable表
图2 studenttable表
建立数据窗口名为:d_grid_class_student,它的Select语句为
SELECT "classtable"."classid",
"classtable"."classname",
"studenttable"."studentid",
"studenttable"."sname",
"studenttable"."sex",
"studenttable"."address",
"studenttable"."telephone"
FROM "classtable",
"studenttable"
WHERE ( "classtable"."classid" = "studenttable"."classid" ) ;
根据数据窗口d_grid_class_student的属性,设置列的taborder值,这样数据窗口可以更新,因为powerbuilde默认该数据窗口是不能更新的,例如我们可以将列"classtable"."classname"、"studenttable"."studentid"、"studenttable"."sname"、"studenttable"."sex", "studenttable"."address"、 "studenttable"."telephone" 分别为10,20,30,40,50,60,由于"classtable"."classid"是两张表关联的列,所以我们不设置classid的taborder值,仍然是默认的0。如果想同时更新两张表的classid列, 我们可以用sql
语句在数据窗口控件的itemchanged事件中进行处理.
3 设置数据窗口属性
点击菜单Rows——>Update Properties,设置此数据窗口Allow Updates,Table to Update设为classtable,Updateable Columns为classtable.name。如图3同时也可以在数据窗口画板通过其他对对话框设置数据窗口的如排序等相关属性.
图3 设置数据窗口update属性
图4 程序运行测试
4 编写脚本更新数据窗口:
在应用对象里编写数据库连接脚本.建立窗口如图,窗口命名为w_update_class_student,并且在窗口中添加数据窗口控件dw_1,添加更新修改按钮cb_1,和退出按钮cb_2
在窗口的open事件中编写如下脚本:
dw_1.SetTransObject(SQLCA)
dw_1.retrieve()
在窗口中的更新修改按钮的clicked事件中编写如下脚本:
//下面脚本更新修改classtable表,因为我们先前已在数据窗口画板中设置classtable为可更新。
long ll_rtn
ll_rtn = dw_1.update(true, false)
if ll_rtn = 1 then
//下面的脚本是关闭对classtablet表的修改
dw_1.Modify("classtable_classname.Update = 'No'")
dw_1.Modify("classtable_classnid.Key = 'No'")
本例中可以修改classtable表的calssname列。
至此程序完成了对第一张表calsstabl的更新修改后又关闭对classtable的更新修改,因此接下来可以修改另外的表。
//使用modify()函数设置studenttable表成为新的可修改表
dw_1.Modify("DataWindow.Table.UpdateTable = 'studenttable'")
dw_1.Modify("studenttable_studentid.Update = 'Yes'")
dw_1.Modify("studenttable_sname.Update = 'Yes'")
dw_1.Modify("studenttable_sex.Update = 'Yes'")
dw_1.Modify("studenttable_address.Update = 'Yes'")
dw_1.Modify("studenttable_telephone.Update = 'Yes'")
dw_1.Modify("studenttable_studentid.Key = 'Yes'")
//本例可以修改studenttable表中是所有列
//下面的脚本完成更新修改studenttabled表
ll_rtn = dw_1.Update()
IF ll_rtn = 1 THEN
COMMIT USING SQLCA;
dw_1.retrieve()
messagebox("系统提示信息","更新成功!")
ELSE
ROLLBACK USING SQLCA;
MessageBox("系统提示信息", "更新失败!")
END IF
//重新恢复两张张表的修改属性标志到初始状态
dw_1.Modify("classtable.classname.Update = 'Yes'")
dw_1.Modify("classtable_classid.Key = 'yes'")
dw_1.Modify("DataWindow.Table.UpdateTable = 'classtable'")
dw_1.Modify("studenttable_studentid.Update = 'No'")
dw_1.Modify("studenttable_sname.Update = 'No'")
dw_1.Modify("studenttable_sex.Update = 'No'")
dw_1.Modify("studenttable_address.Update = 'no'")
dw_1.Modify("studenttable_telephone.Update = 'no'")
dw_1.Modify("studenttable_studentid.Key = 'No'")
ELSE
ROLLBACK USING SQLCA;
MessageBox("系统提示信息", "更新失败!")
END IF
5结束语
经过测试运行顺利的完成了两张表的更新,如果更新多个表也是一样的方法.如图4,我们可以更新修改班级的名字或者改变学号、姓名、家庭住地址通讯电话等相关信息.如图.这样就完成了对两个表的更新,当然我们可以更新多个表道理和方法是一样的,甚至我们可以编写一个函数,在需要时候调用。
参考文献:
[1]催巍.数据窗口程序设计[M].北京:清华大学出版设,2000.