首页 > 代码库 > PowerBuilder数据窗口

PowerBuilder数据窗口

数据窗口控件是应用程序在窗口中展示数据窗口对象的唯一途径,数据窗口控件与数据窗口对象的结合构成了应用程序访问和操作数据库数据的主要手段。

数据窗口在处理数据时很有特色,它在客户机的本地内存中开辟了四个缓冲区:主缓冲区、删除缓冲区、过滤缓冲区、原始缓冲区,从数据库中检索到数据后,数据窗口根据不同情况把数据放置到不同的缓冲区。四个缓冲区各司其职,协作完成数据的增删改,最后把结果提交给数据库管理系统。

数据窗口的属性、事件和函数是灵活运用数据窗口的基础,也是数据窗口的博大精深之所在。事实上,只要有足够的代码(不考虑效率的话),数据窗口能够完成任何功能。

 

10.1  建立数据窗口控件与数据窗口对象的连接

在数据窗口画板中定义一个数据窗口对象后,要把数据窗口控件放置在窗口中才能利用它来处理数据。数据窗口控件是标准的PowerBuilder控件,可以像使用其它控件一样使用它,既用户先要在窗口中添加一个数据窗口控件,然后将在数据窗口画板中创建的数据窗口对象与这个数据窗口控件连接起来,如下图:

 

数据窗口对象与数据窗口控件的连接

 

一、运用数据窗口的一般步骤

1.    1.    使用数据窗口画板创建数据窗口对象;

2.    2.    在窗口上放置数据窗口控件;

3.    3.    通过属性设置或编码将数据窗口控件与数据窗口对象联系起来;

4.    4.    设置数据窗口控件的属性,以控制它的外观和行为;

5.    5.    如果应用程序尚未与数据库建立连接,那么在某个事件处理程序中使用CONNECT语句与数据库建立连接;

6.    6.    将数据窗口控件与事务对象联系起来(使用数据窗口控件的对象函数SetTransObject ( )或SetTrans ( ));

7.    7.    使用数据窗口控件的对象函数Retrieve ( )把数据库中的数据装入数据窗口中;

8.  8.  针对具体应用,编写某些数据窗口控件事件的事件处理程序,响应用户的操作;

9.  9.  需要时使用数据窗口控件的对象函数Update ( )保存用户对数据的修改。

二、放置数据窗口控件

通过数据窗口控件运用数据窗口对象是数据窗口的最常见用法。数据窗口控件可以放置到窗口上,也可以放置到定制可视用户对象中,它们的处理方法都是一致的。

在窗口上放置数据窗口控件步骤为:

1.                    1.                    单击画板栏上的窗口画板,打开要放置数据窗口控件的窗口;

2.                    2.                    单击窗口画板工具栏图标上的箭头,打开控件图标列表,从中选择数据窗口控件图标

3.                    3.                    单击窗口上想放置数据窗口控件的地方,此处即出现一个空白的方框,该方框就是数据窗口控件;

4.                    4.                    根据需要移动数据窗口控件的位置和改变它的大小。

 

三、连接数据窗口控件与对象

窗口上放置了数据窗口控件后,还需要将数据窗口对象与它结合起来才能发挥数据窗口控件的作用,其结合方法为:

1.双击放置在窗口上的数据窗口控件,或右击数据窗口控件并从弹出菜单中选择“Properties”菜单项;

2. 系统显示“DataWindow”属性对话框;

3. 在“General”选项卡中,“DataWindow Object Name”编辑框用于指定与数据窗口控件相关联的数据窗口对象,在该编辑框中可以直接键入数据窗口对象的名字,不过更常用的方法是单击“Browse…”按钮,系统显示如下图所示的“Select Object”对话框;

 

4.在该对话框底部的“Application Libraries”列表框中单击包含要选择数据窗口对象的应用库;

5.通过单击在中部列表框中选择数据窗口对象,此时该对象的名称出现在顶部的编辑框中、相应数据窗口对象的注释显示在“Comments”中(当然,直接在编辑框中键入数据窗口对象名也可以);

6.单击“OK”按钮返回属性对话框;

7. 在属性对话框中单击“OK”按钮,我们就把数据窗口对象与数据窗口控件结合了起来。

四、动态更换数据窗口对象

    数据窗口控件与数据窗口对象的关联是通过给数据窗口控件的dataobject属性赋值实现的,dataobject属性的数据类型为字符串(String)。程序中通过给dataobject属性赋不同的值而让数据窗口控件关联不同的数据窗口对象,这个值就是数据窗口对象的名称。

    例如,将数据窗口控件dw_1关联的数据窗口对象换成名为d_graph,在按钮程序中写上下述语句:

//清除数据窗口控件dw_1数据窗口中的所有数据。

dw_1.reset( )  

//将数据窗口控件dw_1关联的数据窗口对象换成名为d_graph dw_1.dataobject="d_graph"

//让数据窗口控件d_graph使用系统缺省的事务对象SQLCA

 

dw_1.settransobject(SQLCA)

//让数据窗口控件d_graph从数据库中提取数据。

 

dw_1.retrieve( )    

 

10.2  数据窗口控件与数据库

在窗口画板中,把一个数据窗口对象与一个数据窗口控件连接后,如果预览该数据窗口,数据窗口会显示一个没有数据的数据窗口控件。应用程序是通过数据窗口控件与数据窗口对象交互的,如果要想在数据窗口控件中显示数据,必须把定义数据窗口对象的数据源连接到数据窗口控件中,也就是说要创建应用程序与数据库的连接。

一个应用程序要创建与数据库的连接需完成以下步骤:

⑴将事务对象(Transaction Object)设置为相应的值;

⑵与数据库连接;

⑶为数据窗口控件设置事务对象;

⑷进行数据库处理;

⑸断开与数据库的连接。

一、与数据库建立连接

应用程序与数据库的连接通过事务对象来完成,在建立连接前需要首先给事务对象的相关属性赋值,然后用嵌入式SQL语句CONNECT建立连接。

如果应用程序只访问一个数据库,那么使用PowerBuilder的缺省事务对象SQLCA也就可以了。SQLCA是个全局对象,在应用程序的任何地方都可以访问。下面是使用SQLCA与ODBC数据源建立连接的简单示例:

//设置事务对象属性

// Profile stock

SQLCA.DBMS = "ODBC"

SQLCA.AutoCommit = False

SQLCA.DBParm = "ConnectString=‘DSN=stock;UID=sa;PWD=‘"

//与数据库连接

CONNECT USING SQLCA;

//检查连接是否成功

If  SQLCA.SQLCode<0 Then

     MessageBox("连接失败",SQLCA.SQLErrText,Exclamation!)

End If

二、为数据窗口控件分配事务对象

在使用数据窗口控件检索数据前,必须通知数据窗口使用哪个事务对象来操作数据库(实际上也就是告诉数据窗口从哪个数据库中检索数据)。

要完成这个任务,可以使用数据窗口控件的对象函数SetTransObject()。

其语法格式为: dwcontrol.SetTransObject (事务对象名)       

其中:dwcontrol是数据窗口控件的名称;

transaction:是事务对象名。

    SetTransObject( )函数执行成功时返回1,失败时返回-1。通过该函数的返回值,应用程序能够知道SetTransObject()函数的执行情况。

    例如:把数据窗口控件dw_1与连接数据库的事务对象SQLCA联系在一起。dw_1.SetTransObject (SQLCA)

注:一般来说,我们在数据窗口控件所在窗口的Open事件中执行SetTransObject()函数

三、检索数据

 数据窗口控件与事务对象建立联系之后,我们已经在两者之间架起了一座桥梁,但是,数据还在数据库中,现在需要调用数据窗口控件的对象函数Retrieve()把数据装入数据窗口中。

Retrieve( )函数的语法格式为:

dwcontrol.Retrieve ( {argument, argument . . .} )

 该函数执行成功时返回一个长整数指示显示的数据行数(即主缓冲区中的数据行数),失败时返回-1。如果参数中有空值(NULL),则该函数返回空值。

 例1,语句lrc=dw_1.Retrieve ( )执行无参数检索,返回值放到long型变量lrc中。

 例2,假定数据窗口控件dw_1包含的数据窗口对象使用下述SQL SELECT语句:

SELECT indate, sid, quantity,unit,cost From instock

   WHERE indate between :a_date1 and :a_date2

其中 :a_date1:a_date2是数据窗口画板中定义的参数,对应的检索语句可以为:

   lrc=dw_1.Retrieve (date(‘2000-01-01’ ‘2001-01-01’))

检索数据时发生的事件执行Retrieve ( )函数时触发下列的数据窗口控件事件:

DBError检索失败时触发。

RetrieveRow:每检索一行数据触发一次,利用该事件可向用户提供当前已检索数据条数的信息,并可在检索过程中终止检索,但对该事件编程后,将会显著增加检索时间,严重影响程序的运行效率。该事件的返回值为:

0----继续检索(缺省值)

1----停止检索

RetrieveStart检索开始时触发,此时数据库尚未检索数据,应用程序可以控制是否继续检索、是否不做任何处理停止检索、以及是否把新检索出的行添加到数据窗口原有行末尾。上述动作通过该事件的不同返回值来控制,RetrieveStart事件的返回值为:

0----继续检索(缺省值)

1----停止检索

2----在检索数据前不清除数据窗口控件的缓冲区和显示行

  RetrieveEnd:检索结束时触发。

四、更新数据库

 用户修改了数据窗口中的数据后,就需要把修改过数据保存到数据库中,最简便的方法就是使用函数Update()了。该函数语法格式为:   

 dwcontrol.Update ( {accept {,resetflag}})

其中:⑴dwcontrol:数据窗口控件名;

  ⑵Accept:可选参数,它用一个Boolean值指明在更新数据库数据前是否先执行AcceptText()函数把用户当前输入的数据放到数据窗口中,有效取值为:

①                              ①                              TRUE---缺省值,自动执行AcceptText()函数,若未通过数据有效性校 验,则取消更新操作;

②                              ②                              FALSE-----不执行AcceptText()函数。

⑶Resetflag---可选参数,它用一个Boolean值指明该控件是否自动复位更新标志。有效取值为:

①    ①    TRUE---缺省值,自动复位更新标志;

②    ②    FALSE---不复位更新标志。

    如果更新成功,Update()函数的返回值为1,如果失败,返回值为-1。执行该函数后,应该检查返回值,当返回值为1时,使用COMMIT语句提交修改,让数据库永久性地记录数据的修改;否则,使用ROLLBACK语句撤消所有修改。

   下面是Update()函数的一个应用示例:

integer        rc

    string    str

    rc=dw_1.Update()

    if  rc>0 then

                 COMMIT USING SQLCA;

             MessageBox("提示信息","提交成功!")

    Else

        Str = "错误号="+String(SQLCA.SQLDBCode)+"原因为:"+SQLCA.SQLErrText

        ROLLBACK USING SQLCA ;

        MessageBox("数据库出错", str) 

end if

Update( )函数可触发下述事件:

 DBError:更新失败时触发。

 SQLPreview:在SQL语句发送到数据库时触发。

 UpdateStart:更新开始时触发。

 UpdateEnd:更新结束时触发。

如果accept参数设置为TRUE,那么Update( )函数还会触发下述事件:

   ItemChanged

   ItemError

 

10.3  数据窗口项的引用

一、数据窗口控件的缓冲区

数据窗口从数据库中检索到的数据都放置在客户机的内存中,这片内存被分成了四个区域,分别为:

u      u      主缓冲区(Primary Buffer)

u      u      删除缓冲区(Delete Buffer)

u      u      过滤缓冲区(Filter Buffer)

u      u      原始缓冲区(Original Buffer)

代码中可以直接访问这四个缓冲区。

主缓冲区保存显示在数据窗口控件中的所有数据行,以及这些行和各个列的状态。当使用数据提取函数Retrieve()检索数据时,检索到的数据放置在主缓冲区中;当插入数据时,插入的数据也存放在主缓冲区。行和列的状态用于数据窗口保存数据时生成合适的SQL语句。

当删除数据行时(不管是使用DeleteRow()函数直接删除一行还是使用RowsMove()函数在缓冲区之间移动数据行),被删除数据行从主缓冲区移动到删除缓冲区。当使用数据窗口控件的对象函数Update()将数据窗口的修改发送到数据库管理系统后,被成功删除的记录均从删除缓冲区中清除。在保存数据时,删除缓冲区用于生成DELETE语句。

过滤缓冲区用于保存那些满足数据源定义(即满足SELECT语句中的条件)而不满足过滤条件的行。过滤缓冲区与主缓冲区一起在更新数据时生成所需的INSERT或UPDATE语句。

原始缓冲区保存数据窗口从数据库中检索出的原始数据,这些数据用于构造修改数据库数据的SQL语句的WHERE子句。原始缓冲区在5.0以前的版本中应用程序不能直接访问,现在可以通过把GetItem簇函数(包括GetItemString()、GetItemDecimal()、GetItemDate()…)的第四个参数设置为TRUE来访问原始缓冲区中数据。

 

二、编辑状态标志

在数据窗口控件的主缓冲区、过滤缓冲区和删除缓冲区中,每一行和每一行中的每个列(即每个数据项)都有个编辑状态标志(Edit Status Flag),这个标志指示了相应行是否是新增加的行、相应列的数据是否被修改。在往数据库中保存数据时,数据窗口利用这个标志值来决定产生什么类型的SQL语句。

 

三、插入行与删除行

1.  1  插入行InsertRow( )

InsertRow()函数在数据窗口的主缓冲区中插入一个空行,其语法格式为:

dwcontrol.InsertRow ( row )

其中:row是个长整数(long型),它指定插入行的插入位置。

功能:在数据窗口的主缓冲区中插入一个空行

例如,我们想在数据窗口dw_1中插入一行,并让该行成为数据窗口的第10行,那么语句:

dw_1.InsertRow ( 10 )

即能完成这个任务。

row等于0时含义特殊,它表示在主缓冲区最后一行后面插入一行。

    InsertRow( )函数执行成功时,返回一个long型值指示插入行的行号,执行失败时返回 -1。

2.  2  删除行DeleteRow( )

   DeleteRow()函数在数据窗口的主缓冲区(即显示在用户面前的数据中)中删除一行,语法格式为:   

语法格式:dwcontrol.DeleteRow ( row )

   其中: row为要删除行的行号,row等于0时删除当前行。

功能:删除数据窗口主缓冲区中一行记录。

      DeleteRow ()函数执行成功时返回1,失败时返回-1。

例如: dw_1.DeleteRow ( 10)

   删除数据窗口控件dw_1中的第10行。

   DeleteRow ()函数执行成功时返回1,失败时返回-1。

 

四、编辑控件

使用数据窗口控件时,需要理解的最重要概念之一是编辑控件(EditControl)。请注意,这里讲述的编辑控件不是放置在窗口上的编辑框。

当数据窗口中的列可以编辑时,系统自动创建一个编辑控件“漂浮”在得到输入焦点的可编辑项上,这个编辑控件没有边框,从外观上我们只能看到插入指针在闪动。当用户按Tab键或通过单击改变输入焦点时,编辑控件随之移动到得到焦点的项上,同时编辑控件根据该项的设置及相应列的编辑风格调整自将编辑控件数据放到数据窗口列中。

因此,本质上用户是在编辑控件中键入、编辑、修改数据。我们知道,编辑控件是个文本型控件,在它里面输入的所有数据都被当作字符串保存。

列的编辑风格控制着数据的显示和操作方式,而显示格式则控制着编辑控件不再有效时(也就是输入焦点离开该列时)数据的显示方式。

当用户按Tab键或通过单击改变输入焦点时,数据窗口接受编辑控件中的数据(当然数据要通过适当的有效性检查,后文将介绍检查步骤),并将其置入相应的数据项中(放到数据窗口的主缓冲区中)。

1.在编辑控件中的数据被放到主缓冲区之前获取用户在编辑控件中输入的值可以使用数据窗口控件的对象函数GetText()

GetText()函数的语法为:dwcontrol.GetText( )

无论编辑控件当前所在行的数据类型是什么,GetText()函数都返回一个字符串。应用程序负责适当的数据类型转换。如果数据窗口中没有可编辑列,那么GetText( )函数返回空串。

一般来说。GetText()函数在数据窗口控件的ItemChanged和ItemError事件的事件处理程序中调用。

2.在代码中设置编辑控件的值

语法格式:dwcontrol. SetText( )

例:dw_1.SetText()

用途: 用户输入了某个选择项的一部分时,程序自动填充整个选项。

此时可以使用数据窗口控件的对象函数SetText( )达到目的。

3. 将编辑控件数据放到数据窗口列中

前面我们曾经讲到,用户输入数据时,实际上是在编辑控件中输入,该控件框“漂浮”在当前列上面,用户移动输入焦点后,数据窗口把编辑控件中的数据移到列中。当用户没有移动输入焦点时,怎么把编辑控件中的数据送到列中呢?

这就要使用AcceptText( )函数了,它告诉数据窗口控件:如果编辑控件中还有数据未检验,那么现在检验它并把它放入主缓冲区中。

AcceptText ( )函数的格式为: dwcontrol.AcceptText ( )

例:dw_1.AcceptText()

这个函数没有参数,返回值1表示执行成功,返回值-1表示执行出错。AcceptText ( )函数可触发下述事件:

ItemChanged

ItemError

 

五、得到与设置当前行/列

    当前行和当前列是目前正操作的行和列,用户在编辑数据时,也就是正编辑数据项所在的行和列。

1.得到当前行号GetRow ( )

GetRow ( )函数返回当前行的行号。

语法格式为:dwcontrol.GetRow ( )

功能:得到当前行的行号。

    该函数返回一个long型值,表示当前行号。如果没有选中任一行,则返回0,出错时返回-1。

2.      2.      设置某行为当前行SetRow ( )

SetRow(row)函数把参数row指定的行设置成当前行。

语法格式为: dwcontrol.SetRow ( row )

功能:把参数row指定的行设置成当前行。

    设置成功时该函数返回1,否则返回-1。如果row的值小于1或大于数据窗口中的总行数,则SetRow ( )函数执行失败。SetRow ( )函数可能触发下述事件:  ItemChanged

      ItemError

      ItemFocusChanged

      RowFocusChanged

3.      3.      得到记录行数RowCount( )

语法格式:dwcontrol. RowCount( )

功能:返回当前数据窗口中的记录个数。

   该数据窗口控件的对象函数可以返回当前数据窗口中的记录个数。

例:按钮“下一条”可以改变数据窗口的当前行

    long   row, rsm

      dw_1.SetRowFocusIndicator(Hand!)      // 设置行光标指示为手。

      rsm = dw_1.RowCount( )

row = dw_1.GetRow( )

      if row >= rsm then

          row = 1

         else

          row ++

      end if

      dw_1.SetRow( )

:为了清楚显示,可在窗口Open事件中加入

      dw_1.SetRowFocusIndicator(Hand!)      //设置行光标指示为手。

4.得到当前列号GetColumn ( )

GetColumn ( )返回当前列号。语法格式为:dwcontrol.GetColumn ( )

功能:得到当前列号

该函数返回一个integer型值,表示当前行号。返回值为0表示无当前列,返回值为-1表示操作失败。

5. 设置某列为当前列SetColumn ( )

SetColumn ( )把参数column指定的列设置为当前列。

语法格式为: dwcontrol.SetColumn ( column )

功能:把参数column指定的列设置为当前列。

       设置成功时该函数返回1,否则返回-1。如果column的值小于1或大于数据窗口中的总列数,则SetColumn ( )函数执行失败。参数column可以是个列号(integer)、也可以是列名(String)。

    SetColumn ( )函数可能触发下述事件:

     ItemChanged

     ItemError

     ItemFocusChanged

  

六、得到与设置数据项的值

  数据窗口中任意一行和任意一列的表示:控件名.Object.列名[行号  

例如:dw_1.object.name[1]

例1:  编写按钮控件事件,在控件dw_1中的顾客表中插入一条记录,然后赋值。

      Long    row

      Row = Dw_1.InsertRow (0)   //在数据窗口控件的最后一行后面插入一行

         Dw_1.ScrollToRow ( row )    

      Dw_1.object.cname[row] = “

      Dw_1.object.age[row] = 20

      …..

例2:编写按钮控件事件,将控件dw_1中的顾客表中凡年龄>=18的顾客的备注中写入“成年人”,否则写入“少年儿童”。

      long   I, row, rsm

      rsm = dw_1.RowCount()

      for I=1 to rsm

          if dw_1.object.age[I] >= 18 then

              dw_1.object.memory[I] = “成年人

          else

              dw_1.object.memory[I] = “少年儿童

          end if

      next

 

10.4  与数据窗口有关的函数

一、滚动数据行

除了用户直接操作滚动显示在数据窗口中的数据行外,通过编程同样可以滚动数据行。完成数据行滚动到函数有六个Scroll( )ScrollToRow( )ScrollNextRow ( )ScrollPriorRow ( )ScrollNextPage ( )ScrollPriorPage ( )

1.  1.  Scroll( )函数滚动“漂浮”数据窗口上的编辑控件中的文本行,使相应行显示在编辑控件中。

  Scroll()函数的语法为: dwcontrol.Scroll ( number )

其中:dwcontrol:数据窗口控件名;

number:long类型,指定要滚动的行数和方向。Number大于0时向下滚动number行,number小于0时向上滚动number行。如果number值超过余下可滚动行数,那么该函数滚动到编辑控件中数据的开头或结尾(依据滚动方向)。

返回值:Long。

函数执行成功时,Scroll()函数返回编辑框中第一个可见行的行号;发生错误时返回-1。如果任何参数的值为NULL,则Scroll()函数返回NULL。

用法:如果Scroll( )函数参数中指定的滚动行数超过了编辑框中余下的实际行数,则该函数将回绕滚动。

例1:下面的代码把数据窗口控件当前编辑框的内容向下滚动4行:

dw_Employee.Scroll(4)

例2:下面的代码把数据窗口控件当前编辑框的内容向上滚动4行:dw_Employee.Scroll(-4)

2ScrollToRow()当在数据窗口主缓冲区的末尾插入一行时,新行并不一定能在数据窗口中看到,这时可以使用函数ScrollToRow( )

将该行滚动到窗口视野中,让用户不用按滚动条就看到新行。同时,ScrollToRow( )函数还把指定行设置为当前行,但它并不改变当前列。

功能:滚动数据窗口控件的显示到指定行,该函数改变当前行但不改变当前列。语法:dwcontrol.ScrollToRow ( row )

参数:dwcontrol:数据窗口控件名;

row:long类型,指明要滚动到哪一行。如果row参数设置为0,则滚动到第一行;如果row大于最后一行的行号,则滚动到最后一行。

用法:

执行了ScrollToRow()函数后,指定的行成为新的当前行。如果该行已经显示在数据窗口中(即用户可以直接看到该行),那么显示行不会变化。如果该行不可见,则显示行向所需方向滚动,以把当前行显示在数据窗口中。

ScrollToRow()并不加亮(或称选中)当前行。如果想加亮当前行,请使用数据窗口控件的对象函数。

SelectRow()。ScrollToRow()函数可能触发数据窗口的下述事件:

u      u      ItemChangedn

u      u      ItemErrorn

u      u       ItemFocusChangedn

u      u      RowFocusChanged

 

注意,该函数隐含地把第row行设置为当前行,但它并不改变当前列。

 

二、改变当前行光带

功能:在数据窗口控件中选择或去掉选择(加亮或去掉加亮)指定的行。

格式:dwcontrol. SelectRow(row, boolean)

参数dwcontrol:数据窗口控件名;

row:long类型,指定要选择或去掉选择行的行号。该参数的值指定为0时,选择或去掉选择所有的行;

boolean :boolean类型,指定要选择行或是去掉选择行。有效取值为:

u      u      TRUE选中指定的行,被选中行被加亮显示;

u      u      FALSE不选中指定的行,这些行正常显示

返回值:Integer。

函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,则SelectRow()函数返回NULL。

例:在dw_1的rowfocuschanged事件中写入

    dw_1.SelectRow(0, FALSE)

dw_1.SelectRow(CurrentRow, TRUE)      // CurrentRow当前行

 

三、清除所有行

功能:清除数据窗口控件中的所有数据。

语法:dwcontrol.Reset ( )

参数:dwcontrol:数据窗口控件名。

返回值: Integer。

函数执行成功时返回1,发生错误时返回-1。如果dwcontrol的值为NULL,则Reset()函数返回NULL。

数据窗口在检索数据前自动清除原有数据,因此检索前不需要调用该函数。Reset ( )函数的功能与删除数据窗口的所有行有些差别,执行Reset ( )函数后再执行Update( )函数并不会清除数据库中的数据,而删除数据窗口的所有行后再执行Update( )函数就会清除数据库中的数据。

例1,下面的语句清除数据窗口控件dw_employee的内容:

dw_employee.Reset( )

 

四、修改过滤条件及过滤数据

1.SetFilter( )

功能:定义数据窗口控件的过滤条件。

语法:dwcontrol.SetFilter ( format )

参数:dwcontrol:数据窗口控件名;

format:string类型,其值是用做过滤条件的逻辑表达式。表达式中可以使用列名或列号,使用列号时,在列号前加上个#符号。如果format参数的值为NULL,那么程序运行时PowerBuilder会提醒用户输入过滤条件。

返回值:Integer。函数执行成功时返回1,发生错误时返回-1。如果任何参数的值为NULL,则SetFilter()函数返回NULL。

用法:在定义数据窗口对象时,可以同时定义过滤条件,这样,程序运行时,检索出数据窗口中的数据后,不满足过滤条件的数据立刻从主缓冲区被移动到过滤缓冲区。

执行SetFilter()函数后,新的过滤条件将取代原来的过滤条件(如果原来有过滤条件的话)。此时,数据窗口并没有真正地过滤数据,要完成过滤任务,还需要执行数据窗口控件的对象函数Filter(),该函数把不满足过滤条件的数据从主缓冲区移动到过滤缓冲区。

过滤表达式是由列名或列号、关系操作符、以及要比较的值组成的逻辑表达式。逻辑表达式中可以使用AND、OR、NOT逻辑操作符连接不同的部分。使用括号可以改变求值顺序。

2Filter( )

功能:在数据窗口控件中显示满足当前过滤条件的行,不满足过滤条件的行从主缓冲区中移动到过滤缓冲区。

语法:dwcontrol.Filter ( )

参数:dwcontrol:数据窗口控件名。

返回值:Integer。函数执行成功时返回1,出现错误时返回-1。如果dwcontrol的值为NULL,则Filter()函数返回NULL。

用法:Filter()函数使用数据窗口当前的过滤条件过滤数据窗口中的数据,函数执行之后,数据窗口中只显示满足过滤条件的数据。

使用SetFilter()函数改变当前的过滤条件。定义了新的过滤条件后,使用Filter( )函数把不满足条件的数据移动到过滤缓冲区中。

例1:dw_1.SetFilter(“age>20 and sex=’’”)

      dw_1.Filter()

例2:清除过滤条件

dw_1.SetFilter(“”)

dw_1.Filter( )

 

 

10.5  数据窗口事件

    观察营业员管理窗口中的数据窗口控件中的各个事件。

例1:实现营业员表的主从显示。

解:dw_1作为主表采用grid风格,dw_2作为从表采用自由风格,且按营业员号检索。

在dw_1的rowfocuschanged事件中,有如下脚本

long       row, rsm, id

rsm = this.RowCount()

row = this.GetRow()

if row>0 and row<=rsm then

       id = this.Object.SalerID[row]

       row = dw_2.retrieve(id)

end if  

 

例2: 在dw_2输入营业员编号过程中,当输入的营业员编号与以前的营业员编号重复,应报警提示。

解:在dw_2的itemchanged事件中,编写以下脚本

/*********************

 *  防止不合法的ID     *

 *********************/

string     str

long       i, num

 

if dwo.Name="salerid" then

       num = dw_1.RowCount()

       for i=1 to num

              if (integer(dw_2.GetText())=dw_1.Object.salerid[i]) then

                     str = "当前ID号与第"+string(i)+"条记录的ID号重复"

                     MessageBox("错误信息", str, stopsign!)

                     dw_2.SetColumn(dw_2.GetColumn())

                     return 2

              end if

       next

end if

return 0