巧设PB多源数据窗口
李卫东 孙西龙
在PowerBuilder中,数据窗口是靠retrieve()函数来获取数据的,要么所有的列都获取,要么都不获取,数据查询时窗口中可以得到所需的结果,但在录入时就不行了。比如:在一个广告管理系统中,我们设计两个表,一个存广告登记,一个存客户信息。在录入广告登记时输入一个客户号,应当立即出现这个客户的名称、联系人、电话等辅助提示信息。但按一般的方法,只有先保存录入的数据后再重新retrieve()才能看到这些辅助信息,这既麻烦,又不符合我们的日常习惯,怎样解决这个问题呢?我们可以用PB多源数据窗口加以解决。
下面是这个窗口的设计过程:

1)创建一个多源数据窗口(一个数据窗口中的字段来自不同的表)
本窗口采用的是一个自由格式,然后手工进行位置的调整,上一个框中是广告表中的字段,都以
ad—开头,下一框中是客户表中的字段,作为辅助信息,都以client—开头。客户号是连接两个表的键值。客户号字段的编辑属性可以设成edit加下拉数据窗口,方便使用者录入。
2)设定此数据窗口的更新属性
这个窗口从多个表选择数据,PB把这样的窗口缺省设置成不可更新,如果想让它可以正常工作,还要设置它的更新属性。
从主窗口的Rows选单中单击Update Properties,出现下面的对话框,进行一定的设置工作,各个选项的含义相信大家一看就会明白,这里限于篇幅就不再罗嗦了。

这样就指定了ad(广告登记表)是可以更新的,凡不能更新的列,PB把它们的Tab值都设为0。
3)编写数据窗口代码
建立一个窗体,然后在上面建立一个datawindow控件,并让datawindow控件的dataobject属性关联此数据窗口。然后为datawindow的itemchanged事件编写下面的程序:
//定义几个变量来存放数据
string c—id,name,address,linkman, area—code,tel
long c—row,c—col
//记录当前的行列值
//取出当前的行与列
c—col=dw—1.getcolumn()
c—row=dw—1.getrow()
//第二列是客户号
if c—col=2 then
//*在数据窗口上进行输入数据时,PB会自动在输入的项目上放置一个编辑框,当输入完成后,再把输入的值变换成输入项数据的类型,如果成功了,就成功了就接收数据,否则报错,原数据项的值不变。从而起到了数据保护作用。*//
//下面一行是从编辑框中取出数值。
c—id=gettext()
//从客户库中选出一些条件,用于提示信息
SELECT ″client″.″name″,
″client″.″address″,
″client″.″linkman″,
″client″.″area—code″,
″client″.″tel″
INTO :name,
:address,
:linkman,
:area—code,
:tel
FROM ″client″
WHERE ″client″.″c—id″ = :c—id ;
//*如果在客户库中找不到输入的编码,则返回一个错误号且禁止光标移开,这样可以保证数据的完整性*//
if name=″ ″ then
return 1
end if
//*对数据窗口中字段赋值,使在输入客户号后马上可以看到辅助信息*//
dw—1.setitem(c—row,″client—name″,name)
dw—1.setitem(c—row,″client—address″,address)
dw—1.setitem(c—row,″client—linkman″,linkman)
dw—1.setitem(c—row,″client—area—code″,area—code)
dw—1.setitem(c—row,″client—tel″,tel)
end if
这是一个通用的思路,用在您的程序中时只要略加改动就可以了。