1、问题的提出 数据窗口是Power Builder中检索、表现和操纵数据的对象。如果一个数据表的列不多,用单数据窗口操纵数据很易实现,但在实际应用中,数据表的列数动辄几十,甚至上百也并不少见,这时用单数据窗口滚动显然不方便,一个自然的想法是采用TAB控件和TAB页,在每个TAB页上放置一个数据窗口控件,每个数据窗口控件分门别类操纵数据表的列,但随之而来的问题是如何协调分布在这些数据窗口中录入或修改数据的存储,针对每个数据窗口发布一个UPDATE()函数的调用不可行。我们在实际开发中经过探索,增加一个后台的数据窗口做中介,解决了多数据窗口操纵数据的问题。
2、协调多数据窗口数据操纵的一种解决方法 基本思路是:在进行数据操纵的数据窗口控件之外,另外放置一个数据窗口控件,设置其不可见,并设其数据窗口对象为一个选择了数据表中所有列的数据窗口,其他数据窗口控件中录入或修改的数据实时地传送过来,对该控件的数据进行更新操作即可。 不失一般性,下面以POWERBUILDER自带数据库psDemoDB.db中的customer表的数据录入为例来说明。 Customer表有"id","fname","lname","address","city","state","zip","phone","company"九个列,其中"id"为integer类型,其余均为char类型。 (1)创建数据窗口 建立三个数据窗口d_1、d_2、d_3,数据窗口d_1选"id","fname","lname"三列,d_2中选"address","city","state"三列,d_3选"zip",""phone","company_name"三列。再建立数据窗口d_4,选中数据表中的所有列。 (2)建TAB控件和TAB页 建立一个TAB控件tab_1,建立三个TAB页tabpage_1、tabpage_2、tabpage_3。 (3)建数据窗口控件 在(2)中建的三个TAB页中分别放置dw_1、dw_2、dw_3三个数据窗口控件,设其数据窗口对象分别为d_1、d_2、d_3。 另外,在窗口中放置一个数据窗口控件dw_4,不选其"visible"属性. (4)编写代码 在tabb1.tab_page_1.dw_1的editchanged事件中编写代码如下: //代码由此开始 //设置变量,id_value存放数据表中id列的值 int i_m,i_n,id_value string str_fname,str_lname //取dw_1当前的行数 i_m=tab_1.tabpage_1.dw_1.getrow() //取dw_4当前的行数 i_n=dw_4.getrow()
//tab_1.tabpage_1.dw_1及dw_4接收浮在数据窗口控件表面的数据 tab_1.tabpage_1.dw_1.accepttext() dw_4.accepttext()
//取dw_1中的"id"列的值给变量id_value id_value=tab_1.tabpage_1.dw_1.getitemnumber(i_m,"id") //将变量id_value的值赋给dw_4中"id"列 dw_4.setitem(i_n,"id",id_value)
//取dw_1中的"fname"列的值给变量str_fname str_fname=tab_1.tabpage_1.dw_1.getitemstring(i_m,"fname") //将变量str_fname的值赋给dw_4中"fname"列 dw_4.setitem(i_n,"fname",str_fname)
//取dw_1中的"lname"列的值给变量str_lname str_lname=tab_1.tabpage_1.dw_1.getitemstring(i_m,"lname") //将变量str_lname的值赋给dw_4中"lname"列 dw_4.setitem(i_n,"lname",str_lname) //代码到此结束
tab1.tab_page_2.dw_2、tab1.tab_page_3.dw_3的editchanged事件代码可比照tab1.tab_page_1.dw_1的editchanged事件代码编写,从略。 程序在PB65和PB7中调试通过,程序运行时,无论新增数据,还是对dw_1、dw_2、dw_3中的数据列进行修改,数据都实时地传送给dw_4,只需对dw_4进行保存或更新操作,从而解决了多数据窗口数据操纵的协调问题。
[文章录入员:nancy] |