PowerBuilder数据窗口

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

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

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

 

10.1  创建数据窗口控件与数据窗口对象的链接工具

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

 

数据窗口对象与数据窗口控件的链接this

 

1、运用数据窗口的通常步骤编码

1.    1.    使用数据窗口画板建立数据窗口对象;指针

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

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

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

5.    5.    若是应用程序还没有与数据库创建链接,那么在某个事件处理程序中使用CONNECT语句与数据库创建链接;

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

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

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

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

2、放置数据窗口控件

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

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

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

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

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

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

 

3、链接数据窗口控件与对象

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

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

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

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

 

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

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

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

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

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

    数据窗口控件与数据窗口对象的关联是经过给数据窗口控件的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)设置为相应的值;

⑵与数据库链接;

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

⑷进行数据库处理;

⑸断开与数据库的链接。

1、与数据库创建链接

应用程序与数据库的链接经过事务对象来完成,在创建链接前须要首先给事务对象的相关属性赋值,而后用嵌入式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

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

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

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

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

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

transaction:是事务对象名。

    SetTransObject( )函数执行成功时返回1,失败时返回-1。经过该函数的返回值,应用程序可以知道SetTransObject()函数的执行状况。

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

注:通常来讲,咱们在数据窗口控件所在窗口的Open事件中执行SetTransObject()函数

3、检索数据

 数据窗口控件与事务对象创建联系以后,咱们已经在二者之间架起了一座桥梁,可是,数据还在数据库中,如今须要调用数据窗口控件的对象函数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:检索结束时触发。

4、更新数据库

 用户修改了数据窗口中的数据后,就须要把修改过数据保存到数据库中,最简便的方法就是使用函数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  数据窗口项的引用

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

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

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来访问原始缓冲区中数据。

 

2、编辑状态标志

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

 

3、插入行与删除行

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。

 

4、编辑控件

使用数据窗口控件时,须要理解的最重要概念之一是编辑控件(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

 

5、获得与设置当前行/列

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

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

  

6、获得与设置数据项的值

  数据窗口中任意一行和任意一列的表示:控件名.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  与数据窗口有关的函数

1、滚动数据行

除了用户直接操做滚动显示在数据窗口中的数据行外,经过编程一样能够滚动数据行。完成数据行滚动到函数有六个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行设置为当前行,但它并不改变当前列。

 

2、改变当前行光带

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

格式: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当前行

 

3、清除全部行

功能:清除数据窗口控件中的全部数据。

语法:dwcontrol.Reset ( )

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

返回值: Integer。

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

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

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

dw_employee.Reset( )

 

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

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

相关文章
相关标签/搜索