[返回]
中国计算机报1999年第65期

巧设PB多源数据窗口

李卫东 孙西龙

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

  下面是这个窗口的设计过程:
pb132_1.jpg (24397 bytes)
  1)创建一个多源数据窗口(一个数据窗口中的字段来自不同的表)

  本窗口采用的是一个自由格式,然后手工进行位置的调整,上一个框中是广告表中的字段,都以 ad—开头,下一框中是客户表中的字段,作为辅助信息,都以client—开头。客户号是连接两个表的键值。客户号字段的编辑属性可以设成edit加下拉数据窗口,方便使用者录入。

  2)设定此数据窗口的更新属性

  这个窗口从多个表选择数据,PB把这样的窗口缺省设置成不可更新,如果想让它可以正常工作,还要设置它的更新属性。

  从主窗口的Rows选单中单击Update Properties,出现下面的对话框,进行一定的设置工作,各个选项的含义相信大家一看就会明白,这里限于篇幅就不再罗嗦了。
pb132_2.jpg (22456 bytes)
  这样就指定了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

  这是一个通用的思路,用在您的程序中时只要略加改动就可以了。