第 8 章 数据窗口对象的应用

41
第 8 第 第第第第第第第第第 第第第第第第第第第第第第第第第第第 第第第第第第第第 第第第 第第第第第第 第第第 第第第第第第第第第第第第第第 ,、、。: 第第第第第第第第第第第第8.1 第第第第第第第第第 第第第第第第第第第第 第第第第 PowerBuilder 第第 第第第第第第第 第第第第第 第第第 第第第第第第第 ,,一,。 第第第第第第第第第第第第第第第第第第第第第 第第第第第第第第第第第 ,。 第第第第第第第第第第第第 第第第第第第第第第第第第第第第第第第第第第第 第第第第第第第第第第第第第第第第第第第 ,, 第第第第第第8.1.1 第第第第第第第第 第第第第第第第第第第第第第第 第第第第第 Insert|Control|DataWindow 第 第第第第第第 第第第第第第第第 第第第第第 第第第第第 第第第第第第第第第第第第第 ,一, 第第 第第 第第

Upload: nile

Post on 30-Jan-2016

110 views

Category:

Documents


0 download

DESCRIPTION

第 8 章 数据窗口对象的应用. 创建数据窗口对象使它和数据库相连接,执行数据的检索、修改、删除等工作。注意:数据窗口对象只有通过数据窗口控件才能发挥它的巨大作用。 8.1 数据窗口控件的使用 数据窗口控件是窗口中一个标准的 PowerBuilder 控件,它放在窗口中,是窗口的一部分,不能独立存在。数据库中的数据要在数据窗口对象中显示和修改,必须依靠数据窗口控件。 把数据窗口控件放在窗口中,使这个数据窗口控件和相应的数据窗口对象关联,通过这个数据窗口控件完成数据窗口对象和数据库的连接。 8.1.1 添加数据窗口控件 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 8 章 数据窗口对象的应用

第 8 章 数据窗口对象的应用

创建数据窗口对象使它和数据库相连接,执行数据的检索、修改、删除等工作。注意:数据窗口对象只有通过数据窗口控件才能发挥它的巨大作用。

8.1 数据窗口控件的使用数据窗口控件是窗口中一个标准的 PowerBuilder 控件,它放在窗口中,是窗

口的一部分,不能独立存在。数据库中的数据要在数据窗口对象中显示和修改,必须依靠数据窗口控件。

把数据窗口控件放在窗口中,使这个数据窗口控件和相应的数据窗口对象关联,通过这个数据窗口控件完成数据窗口对象和数据库的连接。

8.1.1 添加数据窗口控件 打开要添加数据窗口控件的窗口,选择菜单【 Insert|Control|DataWindow 】,

在窗口的适当位置点击鼠标左键,这时出现一个空白框,这个空白框就是数据窗口控件。

结束放映第一页 上一页 下一页 最后

一页

Page 2: 第 8 章 数据窗口对象的应用

8.1.2 更改数据窗口控件属性

常用的属性有:( 1 ) DataObject :设置与数据窗口控件关联的数据窗口对象名称。( 2 ) TitleBar 复选框:选中表示数据窗口控件显示标题栏,否则不显示。( 3 ) Title 文本框:定义标题栏中标题内容。( 4 ) ControlMenu 复选框:选中表示在标题栏上显示控制按钮,否则不显

示。( 5 ) MaxBox 、 MinBox :选中这两个复选框分别表示给标题栏添加最大

化按钮和最小化按钮。( 6 ) HScrollBar VscrollBar :选择这两个复选框分别表示给数据窗口控件

添加水平和垂直滚动条。( 7 ) Border 复选框和 Border Style 下拉列表框:用来设置控件的边界形状。( 8 ) Name :编辑框中的内容表示数据窗口控件名称,编写脚本时使用该

名称。( 9 ) Other 标签页:设置控件的位置、大小及鼠标在控件中的形状。

结束放映第一页 上一页 下一页 最后

一页

Page 3: 第 8 章 数据窗口对象的应用

8.1.3 设置数据窗口控件中关联的数据窗口对象

( 1 )静态关联选择数据窗口控件,点击右键,选择 Properties 进入数据窗口控件的属性视

窗,在 DataObject 框中输入要关联的数据窗口对象。( 2 )动态关联程序运行过程中,若一个数据窗口控件在不同情况下要关联不同的数据窗口

对象,这时就要用脚本控制,实现动态关联。脚本控制语句如下:dw_controlname.dataobject=“d_objectname” 。

8.2 操作数据窗口对象中数据的前提 程序运行时,要操纵数据窗口对象中的数据,就要在程序中连接数据库,让

数据窗口对象与数据库之间建立连接。必须首先创建应用程序与数据库之间的连接,应用程序与数据库之间的连接是通过事务对象完成的。

( 1 )什么是事务对象事务对象是一个传递应用程序与数据库之间信息的一个变量,它驻留在内存

中,存储着用于连接数据库及从数据库得到反馈的所有信息,它定义了数据库与应用程序连接的参数。一个应用程序开始创建时,系统就自动定义一个名为 SQLCA 的默认全局变量。

结束放映第一页 上一页 下一页 最后

一页

Page 4: 第 8 章 数据窗口对象的应用

8.2 操作数据窗口对象中数据的前提

( 2 )事务对象的属性事务对象共有 15 个属性,可以分为两类,一类有 10 个,用来描述连接数据

库的信息,如所连接的数据库的名称;另一类有 5 个,用来接受有关数据库或最近执行 SQL 语句的情况或状态,如数据库操作是否成功。

AutoCommit :这是一个布尔型属性。它指定是否将数据库设置成自动提交所有事物。当它为 TRUE 时,由系统自动提交所有事务,当为 FALSE 时,用户必须自己在程序中设置事务管理,并在需要的时候对数据库进行提交事务。

它的默认值是 FALSE 。DataBase :这是一个字符串类型的属性。它指定要连接的数据库名称。DBMS :这是一个字符串类型的属性。它指定应用程序所使用的数据库管理

系统的名称,如 ODBC 。 DBPass :这是一个字符串类型的属性。它描述的是用户连接数据库的密码。Lock :这是一个字符串类型的属性。它是数据库的保护级别,一般不必给

出。LogID :这是一个字符串类型的属性。它用于指定登录数据库服务器所需的

用户名或用户的 ID 。 结束放映第一页 上一页 下一页 最后

一页

Page 5: 第 8 章 数据窗口对象的应用

8.2 操作数据窗口对象中数据的前提

SQLCode :这是一个长整型( Long )的属性。它用来指定最近一次数据库操作成功与否的代码,共有三个返回值: 0 表示操作成功; 100 表示操作成功,但没有返回数据; -1 表示操作失败。用户可以从 SQLDBCode或 SQLErrTex 中得到具体详细的错误信息。

SQLDBCode :这是一个长整型的属性。它包含了数据库错误代码,不同的数据库,错误代码不同,但大部分数据库厂商都用 0 表示操作成功, 100 表示成功但没有检索到数据,负数表示没有成功。

SQLErrText :这是一个字符串类型的属性。它包含了数据库操作的错误信息。

UserID :这是一个字符串类型的属性。它指定了连接数据库的用户名或用户的 ID 。

8.2.1 使用系统默认的事务对象 SQLCA 系统提供了一个默认的全局事务对象 SQLCA ,可以在程序的任何地方使用

这个事物对象。

结束放映第一页 上一页 下一页 最后

一页

Page 6: 第 8 章 数据窗口对象的应用

8.2.1 使用系统默认的事务对象 SQLCA下面是一个连接 ODBC 数据库所用的代码:// Profile Exercise

SQLCA.DBMS = "ODBC"

SQLCA.AutoCommit = False

SQLCA.DBParm = "Connectstring='DSN=exercise'"

这段脚本用来设置事务对象的属性,一般把它写在应用程序的 Open 事件中8.2.2 自己定义事务对象 一般情况下,使用系统提供的全局事务处理对象 SQLCA 就可以了,但有时

需要连接多个数据库,这时只用一个 SQLCA 就不够了,需要用户自己定义事务对象,因为一个事务对象只能保存一个数据库的连接信息。

自己定义事务对象步骤如下:( 1)确定事物对象变量的作用域和名称像变量一样,事务对象的作用域有局部的、实例的、全局的和共享的,声明

的地方决定了事务对象的作用域,事务对象变量的类型是 transaction。声明事务对象的格式为: transaction 用户自定义的事务对象名如要声明一个全局的事务对象 sqluser,则在定义全局变量的位置书写 transaction sqluser 声明语句。

结束放映第一页 上一页 下一页 最后

一页

Page 7: 第 8 章 数据窗口对象的应用

8.2.2 自己定义事务对象

( 2 )创建事务对象实例上面只是声明了一个自定义的事务对象 sqluser ,但该事务对象并没有创建。

创建语句如下:自定义的事务对象名 =create transaction

如要创建事物对象 sqluser ,描述创建的语句为 sqluser=create transaction 。要使得打开应用后,就能使用自己定义的事务处理对象 sqluser ,则该语句必须写在应用的 Open 事件中。

( 3 )确定事务对象变量的属性自定义事务对象的属性设置可参考前面的 SQLCA 属性的设置,将 SQLCA

信息拷贝到应用的 Open 事件后,将其 SQLCA 改为 sqluser即可。// Profile Exercise

sqluser.DBMS = "ODBC"

sqluser.AutoCommit = False

sqluser.DBParm = "Connectstring='DSN=exercise'"

( 4 )注意:系统提供的默认事务对象 SQLCA ,用户不能声明、创建、删除它,系统会

自动处理对它的操作;给事务对象赋值时,只能给事物对象的属性一一赋值,不能将一个事物对象直接赋给另一事务对象。 结束

放映第一页 上一页 下一页 最后一页

Page 8: 第 8 章 数据窗口对象的应用

8.2.3 连接数据库 定义了事务对象之后,要在数据窗口对象中处理数据库中数据,还必须配合其它语句一起使用。

( 1 ) connect :数据库连接该语句表示与数据库连接。它的语句结构是:connect [using 事务对象名 ] ;若是使用 sqlca ,可以使用两种格式:connect ;connect using sqlca ;上面两条语句作用一样,也就是说使用系统默认的 sqlca ,语句中可以指明,也可以不指明,默认指 sqlca 。

下面两条语句作用不同:connect ;connect using sqluser ;第一条使用默认的事务对象 sqlca ,第二条使用自定义的事务对象 sqluser 。( 2 ) disconnet :断开与数据库的连接该语句表示断开与数据库的连接,它的语法结构是:disconnect [using 事务对象名 ] ;使用方法同( 1 ) connect 。

结束放映第一页 上一页 下一页 最后

一页

Page 9: 第 8 章 数据窗口对象的应用

8.2.3 连接数据库

( 3 ) commit :提交事务用来提交当前所做的一切事务,实际上是向数据库提交所有数据修改工作。

它的语句结构及使用方法同( 1 ) connect 。( 4 ) rollback :取消事务它用来回滚当前的所有事务,实际上是取消自上次提交事务以来的这一段时

间内所有数据修改工作。 它的语句结构及使用方法同前面( 1 ) connect 。 ( 5 ) settransobject ():事务对象与数据窗口控件关联通过 connect 语句,将一个事务对象与数据库连接起来了,但为了能使一个具体的数据窗口访问数据库,还必须把数据窗口控件和事务对象关联起来。关联语句中一定要使用数据窗口控件名,而不是数据窗口对象名。

使用下面语句将数据窗口控件和事务对象关联。语句格式如下:DWControlname.settransobject(TransactionObjectName)

如让 dw_1 数据窗口控件与 sqlca 事务对象关联,语句写为 dw_1.settransobject(sqlca) 。

该语句一般写在数据窗口控件所在窗口的 Open 事件中。

结束放映第一页 上一页 下一页 最后

一页

Page 10: 第 8 章 数据窗口对象的应用

8.3 操作数据窗口中的数据

8.3.1 检索数据( retrieve ) 检索数据使用函数 retrieve 。( 1 )函数不带参数格式: dwcontrolname.retrieve ()如数据窗口控件 dw_1 检索数据,可用 dw_1.retrieve ()语句。这种情况的使用简单,用于没有设定任何参数的数据窗口对象。( 2 )函数带有 n 个参数,格式是 dwcontrolname.retrieve (参数 1 ,参数 2 ,…,参数 n ),如数据窗口控件 dw_1 检索数据,可用 dw_1.retrieve (参数 1 ,参数 2 ,…,参数 n )。

要特别注意,这里参数的个数、类型、与数据窗口对象中定义的变量个数、类型要相对应,若这里给定的参数个数少于数据窗口对象中定义的变量个数,程序运行时就会出现错误;若这里的参数个数多于数据窗口对象中定义的变量个数,程序运行时就会自动去掉后面多余的参数。

检索函数多用于 settransobject ( sqlca )语句后面。 ( 3 )函数的返回值函数返回一个整型值,表示从数据库中检索到的行数;若没有匹配的结果,

则返回值是 0 ;若检索中出现了错误,返回值是 -1 。 结束放映第一页 上一页 下一页 最后

一页

Page 11: 第 8 章 数据窗口对象的应用

8.3.1 检索数据( retrieve )

( 4 )执行函数时触发的事件DBError :检索失败时发生。RetrieveRow :每行数据检索出来以后发生。RetrieveStart :检索开始时发生。RetrieveEnd :检索完成后发生。( 5 )典型应用dw_1.settransobject(sqlca)

dw_1.retrieve( )

将数据窗口与事务对象关联,并检索数据窗口中数据。

8.3.2 更新数据( update )Update函数用于把当前数据窗口中从上次执行 update 或 retrieve函数以来进

行的所有修改保存到数据库中。( 1 )常用语法形式如下:DWcontrolname.Update ()如更新数据窗口控件 dw_1 ,脚本写为:dw_1.update ()。

结束放映第一页 上一页 下一页 最后

一页

Page 12: 第 8 章 数据窗口对象的应用

8.3.2 更新数据( update )

( 2 )函数返回值若返回值是 1 表示成功,返回值是 -1 表示失败。( 3 )执行函数时触发的事件DBError

SQLPreview

UpdateStart

UpdateEnd

( 4 )典型应用if dw_1.update () =1 then

commit ;else

rollback ;end if

数据窗口中数据更新正确则提交事务(保存数据),否则取消事务(不保存数据)。

结束放映第一页 上一页 下一页 最后

一页

Page 13: 第 8 章 数据窗口对象的应用

8.3.3 从数据窗口控件中读数据( getitemstring ) 处理数据时,经常要从数据窗口中读出数据,然后再进行处理。( 1 )常用语法形式:DWcontrolname.getitemstring ( rownum,column )DWcontrolname.getitemnumber ( rownum,column )DWcontrolname.getitemdate ( rownum,column )DWcontrolname.getitemdatetime ( rownum,column )DWcontrolname.getitemdecimal ( rownum,column )如从数据窗口 dw_1 中取出第二行第一列“ name”字段值,这里假设“ name”字段是字符型,则用以下脚本:

dw_1.getitemstring ( 2 ,“ name” )或用dw_1.getitemstring ( 2 , 1 )。getitemstring 表示从数据窗口中取出字符型数据; rownum 表示所取数据在数据

窗口中的行号; column 表示所取字段,可用字段名或表示列号的整数表示,若用字段名表示,要将字段名用引号引起来;若用表示列号的整数,用数字1 、 2 、…表示。

Getitemnumber :所取字段的类型是不带小数的数值型。Getitemdate :所取字段的类型是日期型。Getitemdatetime :所取字段的类型是日期时间型。Getitemdecimal :所取字段的类型是带小数的数值型。 结束

放映第一页 上一页 下一页 最后一页

Page 14: 第 8 章 数据窗口对象的应用

8.3.3 从数据窗口控件中读数据( getitemstring )

( 2 )典型应用string name1name1=dw_1.getitemstring ( 2 ,“ name” )messagebox (“第二条记录的名字是:”, name1 )从 dw_1 的第二行中取出“ name”字段,然后以对话框的方式显示出来。 8.3.4 将数据写到数据窗口控件中( setitem )处理数据时,除了要从数据窗口中读出数据,有时还要把数据写到数据窗口

中。( 1 )语法形式:DWcontrolname.setitem ( rownum,column,value )rownum 和 column 与前面的含义相同, value 表示要放在数据窗口中的值。( 2 )典型应用string name1name1=dw_1.getitemstring ( 2 ,“ name” )dw_2.setitem ( 1 ,“ name” , name1 )从 dw_1 的第二行中取出“ name”字段,然后将取出的值放在 dw_2 中的第

一行“ name”字段上。

结束放映第一页 上一页 下一页 最后

一页

Page 15: 第 8 章 数据窗口对象的应用

8.3.5 对数据窗口控件中的数据进行排序( setsort )

运行程序数据窗口按原排序显示数据,有时希望根据不同情况对不同字段进行再排序,这时就要用到 setsort ()和 sort ()函数。

( 1 )语法形式:dwcontolname.setsort ( sortexpression )dwcontolname.sort ()sortexpression 是一个字符串,表示排序条件表达式,包括要排序的列名或列号以及排序方式,具体形式是一个列名后加上一个空格,然后是字符 A或 D ,表示升序或降序,若对多列同时排序,它们之间用逗号隔开。

说明:排序字段若用列号,表示为 #1 , #2 ,… #n ,注意这里的列号前面要加上 #符号,与前面的 getitemstring 有区别。

( 2 )函数返回值这两个函数的返回值一样, 1 表示成功, -1 表示失败。( 2 )典型应用例 1 : dw_1.setsort (“ name A” )

dw_1.sort ()将数据窗口控件 dw_1 中的数据按“ name”字段递增排序。若“ name”字段

的列号是 1 ,上述第一行脚本可写为: dw_1.setsort (“ #1 A” )。结束放映第一页 上一页 下一页 最后

一页

Page 16: 第 8 章 数据窗口对象的应用

8.3.6 对数据窗口控件中的数据进行过滤( setfilter )

对数据窗口中的数据进行过滤,但又不想重新从数据库中检索数据,这时就要用到 setfilter ()和 filter ()两个函数。

( 1 )语法形式:dwcontolname.setfilter ( filterexpression )dwcontolname.filter ()filterexpression 是一个字符串,表示过滤条件表达式,它是一个逻辑表达式,其中各关系表达式之间用逻辑运算符 and 、 or 、 not 连接。

在过滤表达式中可以使用列名或列号,列号使用方法同上面的 setsort ()函数。

( 2 )函数的返回值1 表示成功, -1 表示失败。( 3 )典型应用例 1 :过滤条件中包含数值型常量。dw_1.setfilter (“ math_score>=70 and math_score<90” )dw_1.filter ()数据窗口控件 dw_1 的过滤结果:显示“ math_score”字段的值介于 70 和 9

0 之间的记录(包含 70 ,不包含 90 )。 结束放映第一页 上一页 下一页 最后

一页

Page 17: 第 8 章 数据窗口对象的应用

8.3.7 重新设置数据窗口中的数据( reset )

在使用 retrieve函数进行检索之前,系统自动调用该函数重置数据窗口,不必在 retrieve函数前使用该函数。

( 1 )语法形式:dwcontrolname.reset ()此函数不要求参数。( 2 )函数的返回值1 表示成功, -1 表示失败。( 3 )典型应用dw_2.reset ()dw_2.insertrow ( 0 )重置数据窗口控件 dw_2 ,清除数据窗口缓冲区内的所有行后,添加一条空

白记录。

结束放映第一页 上一页 下一页 最后

一页

Page 18: 第 8 章 数据窗口对象的应用

8.3.8 插入记录( insertrow )

录入数据,添加新记录,就要用到 insertrow函数。要想将插入的记录保存到数据库中,还应执行更新命令。

( 1 )语法形式:DWcontrolname.insertrow ( rownumber )其中 rownumber 表示插入行的行号,它是一个 long 型变量。若它的值是 0 ,

表示在数据窗口的最后插入一条记录。( 2 )函数的返回值函数的返回值是 long 型,表示插入行的行号;插入失败返回值是 -1 。该函数只能插入一条记录,但不能自动滚动到插入行,也不能自动把插入行

设置为当前行。( 3 )典型应用long nn

nn=dw_1.insertrow ( 0 )dw_1.scrolltorow ( nn )在数据窗口控件 dw_1 的最后插入一条空白记录,并使屏幕滚动,使刚插入

的记录显示在屏幕范围内。

结束放映第一页 上一页 下一页 最后

一页

Page 19: 第 8 章 数据窗口对象的应用

8.3.9 删除记录( deleterow )

处理数据时,删除多余的记录,就要用到 deleterow函数。要将删除记录的结果保存到数据库,还应使用更新命令。

( 1 )语法形式:DWcontrolname.deleterow ( rownumber )其中 rownumber 表示要删除的行号,它是一个 long 型变量。若它的值是 0 ,

表示删除当前行。( 2 )函数的返回值1 表示删除成功, -1 表示删除失败。( 3 )典型应用long nn , row1

nn=dw_1.rowcount ()for row1=1 to nn

dw_1.deletrow ( 1 )next

删除数据窗口控件 dw_1 中现有的所有记录,记录虽然删除,但数据库中数据并没改变,我们改变的只是缓冲区中的内容,要将删除结果保存,需要编写更新脚本。

结束放映第一页 上一页 下一页 最后

一页

Page 20: 第 8 章 数据窗口对象的应用

8.3.10 滚动行( scrolltorow )

在缓冲区的尾部插入新记录,新插入的记录可能在数据窗口中看不到,这时就可以使用该函数将新插入的行滚动到视窗内。

( 1 )语法形式:DWcontrolname.scrolltorow ( rownumber )其中 rownumber 表示要滚动到的行号,是一个 long 型,若 rownum 为 0 ,则会滚动到数据窗口的第一行,若 rownum 的值大于数据窗口的总行数,则会滚动到最后一行。滚动到的行就是数据窗口的当前行。

( 2 )函数的返回值1 表示操作成功, -1 表示操作失败。( 3 )典型应用dw_1.scrolltorow ( dw_1.rowcount ())滚动到数据窗口的最后一行。( 4 )触发事件执行该函数时,会触发以下事件:ItemChanged 、 ItemFocusChanged 、 RowFocusChanged 、 ItemError 。

结束放映第一页 上一页 下一页 最后

一页

Page 21: 第 8 章 数据窗口对象的应用

8.3.11 选择行( selectrow ) 要加亮显示或取消加亮显示行,就要用到该函数。( 1 )语法形式:DWcontrolname.selectrow ( rownumber , select )其中 rownumber 表示要加亮或取消加亮的行号,是一个 long 型,若 rownum

ber=0 表示要加亮或取消加亮所有行; select 是布尔型值,确定指定行是否被加亮显示,若 select 的值是 true 表示加亮显示,若是 false 表示取消加亮显示。

( 2 )函数的返回值1 表示操作成功, -1 表示操作失败。( 3 )典型应用(该脚本写在数据窗口的 clicked 事件中)dw_1.selectrow ( 0 , false )dw_1.selectrow ( row , true )数据窗口控件 dw_1 中点击的行加亮显示。( Row 表示当前行号)

结束放映第一页 上一页 下一页 最后

一页

Page 22: 第 8 章 数据窗口对象的应用

8.3.12 获取当前行( getrow )

此函数用来获取当前行的行号。( 1 )语法形式:DWcontrolname.getrow ()该函数没有参数。( 2 )函数的返回值函数的返回值是 long 类型,表示当前行的行号;若数据窗口中没有当前行,

则返回值是 0 ;若发生错误,则返回值是 -1 。( 3 )典型应用(该脚本写在数据窗口的 clicked 事件中)dw_1.setrow ( row )messagebox (“当前选择的行号是:”, dw_1.getrow ())点击数据窗口控件 dw_1 中的某行,就显示点击行的行号。

结束放映第一页 上一页 下一页 最后

一页

Page 23: 第 8 章 数据窗口对象的应用

8.3.13 设置当前行( setrow )

该函数用来接受一个行号并且使它成为当前行。( 1 )语法形式:DWcontrolname.setrow ( rownumber )其中 rownumber 是一个 long 类型的变量,表示要指定为当前行的行号。( 2 )函数的返回值操作成功返回 1 ,操作失败返回 -1 。( 3 )典型应用dw_1.setrow ( dw_1.getrow () - 1 )使输入焦点上移一行。( 4 )触发事件执行该函数时,会触发以下事件:ItemFocusChanged 、 RowFocusChanged 、 ItemError 、 ItemChanged 。

结束放映第一页 上一页 下一页 最后

一页

Page 24: 第 8 章 数据窗口对象的应用

8.3.14 获取当前列( getcolumn )

( 1 )语法形式:DWcontrolname.getcolumn ()该函数没有参数,函数得到数据窗口中的当前列。( 2 )函数的返回值返回值是当前的列号,若返回值是 0 表示没有任何列被选中, -1 表示失败。( 3 )典型应用:该函数应用较少。dw_1.setcolumn ( dw_1.getcolumn () + 1 )使输入焦点下移一列。

结束放映第一页 上一页 下一页 最后

一页

Page 25: 第 8 章 数据窗口对象的应用

8.3.15 设置当前列( setcolumn )

要设置某列为数据窗口当前列,可用 setcolumn函数。比如数据窗口输入数据之后,列焦点没有移开,则该列值就无法取出,这时可用该函数将焦点从当前列移到其它列,就可取出该列值了。

( 1 )语法形式: DWcontrolname.setcolumn ( columnnumber )其中 columnnumber 是一个字符串,表示要设置为当前列的列,列的表示可

以用列名,也可以用列号,使用列号时,要在列号的前面加上符号“ #” 。( 2 )函数的返回值操作成功返回 1 ,操作失败返回 -1 。( 3 )典型应用假定窗口中有两个按钮,分别是“新加记录”、“存盘”,其中“新加记录”按钮上有语句 dw_1.insertrow ( 0 ),“存盘”按钮上的脚本如下:

结束放映第一页 上一页 下一页 最后

一页

Page 26: 第 8 章 数据窗口对象的应用

8.3.15 设置当前列( setcolumn )

long nn , row1string name1nn=dw_1.rowcount ()dw_1.setcolumn ( 1 )name1=dw_1.getitemstring ( nn ,“ name” )if name1=“” or isnull ( name1 ) then

messagebox (“提示:”,“名字字段不能为空。”)return

elseif dw_1.update () =1 then

commit;else

rollback;end if

end if这里的“ name”字段的列号不是 1 ,这样即使输入数据时焦点停留在“ na

me”字段上没有移开,也能把该字段值取出来,只要该字段中值不为空,就能完成后面的更新工作。

结束放映第一页 上一页 下一页 最后

一页

Page 27: 第 8 章 数据窗口对象的应用

8.4 数据窗口事件 8.4.1 Clicked ( 1 )触发条件当用户在数据窗口中单击鼠标左键时就触发该事件。( 2 )事件所带参数该事件带有的四个参数如下:xpos :是一个 integer 类型的变量,表示单击时所在位置的 X坐标。ypos :是一个 integer 类型的变量,表示单击时所在位置的 Y坐标。row :是一个 integer 类型的变量,表示单击时的行号。dwo :是一个 DWObject 类型的变量,表示对单击的列对象的引用。( 3 )事件的返回值事件的返回值是 long 类型, 0 是系统的默认值,表示继续操作; 1 表示不

能改变输入焦点。( 4 )典型示例点击数据窗口的某列,数据按该列递增排序,同时该列变为红色;再次单击

该列时,数据按该列递减排序,同时该列变为蓝色。

结束放映第一页 上一页 下一页 最后

一页

Page 28: 第 8 章 数据窗口对象的应用

8.4.1 Clicked ( 4 )典型示例首先在窗口中定义一个实例变量 string last_sort ,该变量用于存放上次的排序方式。string column_name,this_sort// 定义两个变量,分别存放当前点击的列标题及当// 前的排序方式。if dwo.type="text" then // 若点击的是列标题

column_name=dwo.name //取出的值是列名 +“_t”

column_name=left(column_name,len(column_name) - 2) //取出列名if last_sort<>column_name+' a' then // 若以前的排序方式不是按该列递增排序,

// 注意‘ a’ 前面有一空格。this_sort=column_name+' a' //排序方式设置为按该列递增排序。dwo.color=rgb(255,0,0) // 将点击的列变为红色。

else

this_sort=column_name+' d' //排序方式设置为按该列递减排序。dwo.color=rgb(0,0,255) // 将点击的列变为蓝色。

end if

this.setsort(this_sort) // 设置排序表达式this.sort() // 进行排序last_sort=this_sort // 将当前排序方式保存起来以备下次使用。

end if 结束放映第一页 上一页 下一页 最后

一页

Page 29: 第 8 章 数据窗口对象的应用

8.4.2 DoubleClicked

( 1 )触发条件数据窗口中双击鼠标左键时就触发该事件。在触发该事件之前,先触发了单

击事件。( 2 )事件所带参数同 clicked 事件所带参数。( 3 )事件的返回值该事件只有一个返回值 0 ,表示继续操作。( 4 )典型示例双击数据窗口的记录时,显示双击的行号、列名、 X坐标、 Y坐标。string is_columnnameif dwo.type="column" then

is_columnname=dwo.nameend ifmessagebox(" 用户双击数据窗口控件 "," 所在行号: "+string(row)&+"~r 所在列是: "+is_columnname+"~r 所在 X坐标是: "+string(xpos)&+"~r 所在 Y坐标是: "+string(ypos))

结束放映第一页 上一页 下一页 最后

一页

Page 30: 第 8 章 数据窗口对象的应用

8.4.3 ItemChanged

( 1 )触发条件当修改了数据窗口中的某个数据项的值,然后按 Tab 键移出,鼠标单击数据

窗口外的部分或是用户按了 Enter 时,将会触发该事件。一般在该事件中做一些检查性工作,它是检验层中的最后一层,只有数据通

过了所有的其它层的检验后才会发生这个事件。( 2 )事件所带参数该事件带有的三个参数如下:row :是一个 integer 类型的变量,表示修改的数据项所在的行号。dwo :是一个 DWObject 类型的变量,表示对拥有修改项的列对象的引用。data :是一个 string 类型的变量,表示修改后的数据。( 3 )事件的返回值该事件有三个返回值如下:0 :表示接受用户输入的数据。这是系统默认的返回值。1 :表示拒绝用户输入的数据,并且不允许改变输入焦点。这时会触发 Item

Error 事件。2 :表示拒绝用户输入的数据,但允许用户改变输入焦点。这时不会触发 Ite

mError 事件,并且该项的值还是原来的值。结束放映第一页 上一页 下一页 最后

一页

Page 31: 第 8 章 数据窗口对象的应用

8.4.3 ItemChanged

( 4 )典型示例当前数据窗口中有一字段 sex1 表示性别,要求该字段输入的值只能是 M 或

F ,否则不许改变输入焦点。if dwo.name="sex1" then

if not match(data,"[MF]") then

return 1

end if

end if

8.4.4 RowFocusChanged ( 1 )触发条件数据窗口的当前行发生变化,就会触发该事件。( 2 )事件所带参数该事件只有一个参数 currentrow ,它是一个 long 类型的变量,表示当前行的

行号。( 3 )事件的返回值 该事件只有一个返回值 0 ,表示继续操作。

结束放映第一页 上一页 下一页 最后

一页

Page 32: 第 8 章 数据窗口对象的应用

8.4.3 ItemChanged

( 4 )典型示例当数据窗口的当前行号发生变化时,就显示当前行行号及总行数。this.selectrow(0,false)this.selectrow(currentrow,true)messagebox(" 提示: "," 当前的行号是 "+string(currentrow)+&"~r 数据窗口中共有 "+string(this.rowcount())+" 行 ")

8.4.5 RetrieveStart( 1 )触发条件数据窗口开始执行 SQL SELECT 语句时,就会触发该事件。( 2 )事件所带参数 该事件没有参数。 ( 3 )事件的返回值该事件有三个返回值如下:0 :表示继续操作。1 :表示不执行检索操作。2 :表示执行检索操作,但不删除原来数据窗口中的行和缓冲区中的数据。

若返回的是该值,则新检索的数据会添加到原来数据窗口数据的后面,这样做一般会造成数据的重复。

结束放映第一页 上一页 下一页 最后

一页

Page 33: 第 8 章 数据窗口对象的应用

8.4.5 RetrieveStart

( 4 )典型示例只检索数据窗口中的前 200 条记录。long nn

nn=this.rowcount()

choose case nn

case 200

return 1

case is <200

return 0

end choose

结束放映第一页 上一页 下一页 最后

一页

Page 34: 第 8 章 数据窗口对象的应用

8.4.6 RetrieveEnd

( 1 )触发条件数据窗口从数据库中检索完数据之后,就会触发该事件。( 2 )事件所带参数该事件只有一个参数 rowcount ,表示检索出来的总行数。( 3 )事件的返回值该事件只有一个返回值 0 ,表示继续操作。( 4 )典型示例数据检索完毕后,弹出对话框,显示检索出来的记录数。messagebox(" 提示: "," 数据已检索完毕, "+&

"~r 共有 "+string(rowcount)+" 条记录 ")

结束放映第一页 上一页 下一页 最后

一页

Page 35: 第 8 章 数据窗口对象的应用

8.4.7 RetrieveRow

( 1 )触发条件每行数据从数据库检索到数据窗口时,就会触发该事件。( 2 )事件所带参数该事件只有一个参数 row ,表示刚被检索出来的行号。( 3 )事件的返回值该事件有两个返回值:0 :表示继续操作。1 :表示终止检索数据。( 4 )典型示例当检索到字段“ name” 的值是“ wang” 时,就停止检索;否则继续检索。string name1name1=this.getitemstring(row,"name")choose case name1

case "wang"return 1

case elsereturn 0

end choose结束放映第一页 上一页 下一页 最后

一页

Page 36: 第 8 章 数据窗口对象的应用

8.4.8 UpdateStart

( 1 )触发条件在调用 update ()函数后,并且在这个函数被提交到数据库之前,就会触发

该事件。( 2 )事件所带参数该事件没有参数。( 3 )事件的返回值该事件有两个返回值:0 :表示继续操作。1 :表示不要执行 update 操作。( 4 )典型示例在更新数据之前,先检验字段“ name” 的值是否有空白的,若有则不存盘;

只有所有记录的“ name”字段都不为空白才将数据存盘。

结束放映第一页 上一页 下一页 最后

一页

Page 37: 第 8 章 数据窗口对象的应用

8.4.8 UpdateStart

string name1,sign="T"

long nn,row1

nn=this.rowcount()

for row1=1 to nn

name1=this.getitemstring(row1,"name")

if name1="" or isnull(name1) then

sign="F"

exit

end if

next

if sign="F" then

messagebox(" 提示: "," 名字字段有空白,不能存盘。 ")

return 1

else

return 0

end if结束放映第一页 上一页 下一页 最后

一页

Page 38: 第 8 章 数据窗口对象的应用

8.4.9 UpdateEnd

( 1 )触发条件对数据库的所有更新操作全部执行完毕后,就会触发该事件。( 2 )事件所带参数该事件有三个参数如下:rowsinserted :是一个 long 类型的变量,表示更新操作中向数据库中插入的

行数。rowsupdated :是一个 long 类型的变量,表示更新操作中修改数据库中记录

的行数。rowsdeleted :是一个 long 类型的变量,表示更新操作中删除数据库中记录

的行数。( 3 )事件的返回值该事件只有一个返回值 0 ,表示继续操作。( 4 )典型示例若数据更新成功,就显示相关信息,包括插入的行数、修改的行数、删除的

行数。messagebox(" 数据已成功更新。 ","插入的行数: "+string(rowsinserted)&+"~r 修改的行数: "+string(rowsupdated)&+"~r 删除的行数: "+string(rowsdeleted))

结束放映第一页 上一页 下一页 最后

一页

Page 39: 第 8 章 数据窗口对象的应用

8.4.10 ItemError

( 1 )触发条件当系统认为字段值不符合规则时,就会触发该事件。( 2 )事件所带参数该事件带有三个参数:row :是一个 long 类型的变量,表示修改的行号。dwo :是一个 DWObject 类型的变量,表示修改的列对象。data :是一个字符串类型变量,表示修改后的数据。( 3 )事件的返回值该事件有四个返回值:0 :表示拒绝用户输入的数据并且弹出一个对话框显示系统提供的错误信息。

这是系统的默认值。1 :表示拒绝用户输入的数据,但不弹出一个对话框显示系统提供的错误信

息。2 :表示接受用户输入的数据。3 :表示拒绝用户输入的数据,但允许用户改变输入焦点。

结束放映第一页 上一页 下一页 最后

一页

Page 40: 第 8 章 数据窗口对象的应用

8.4.10 ItemError

( 4 )典型示例事先在数据库表列的 Extended Attributes 属性视窗的 Validation Rules 标签页

中,定义有效性规则 name_rule ,其规则内容是 match(@VAR, "^[A-Za-z]+$") 。

然后在数据库相应表中,选择“ name”字段的属性,将该字段的 Validation属性设置为 name_rule规则。这样以后按该表生成的数据窗口中的“ name”字段输入的必须是英文字母,否则不能通过有效性检验。

messagebox(“ 提示:” ,“ 第” +string(row)+“ 条记录没有通过有效性检验。” )

8.4.11 DbError ( 1 )触发条件当数据窗口控件的操作引发数据库错误时,就触发该事件。( 2 )事件所带参数该事件带有的五个参数如下:sqldbcode :这是一个 long 类型的参数,表示数据库指定的错误代码。sqlerrtext :这是一个 string 类型的参数,表示数据库指定的错误信息。sqlsyntax :这是一个 string 类型的参数,表示数据库产生错误时正在执行的

SQL 语句。buffer :这是一个枚举类型参数,表示导致产生错误的行所在的缓冲区,它

的取值可以是 delete!、 filter! 、 primary! 。 结束放映第一页 上一页 下一页 最后

一页

Page 41: 第 8 章 数据窗口对象的应用

8.4.11 DbError

( 2 )事件所带参数row :这是一个 long 类型的参数,表示数据库产生错误的行号。 ( 3 )事件的返回值该事件的返回值有两个:0 :系统默认的返回值,表示弹出一个对话框来显示系统的错误信息。1 :表示不显示系统的错误信息。( 4 )典型示例若数据库发生错误,就显示错误编码、错误发生的行、发生错误时执行的语句、错误解释信息。

if sqldbcode<>0 thenmessagebox(" 数据库错误: "," 数据库错误编号是: "+string(sqldbcode)+&"~r错误发生时所在行是: "+string(row)+&"~r错误发生时正在执行的语句是: "+sqlsyntax+&"~r 数据库的错误解释是: "+sqlerrtext)return 1

end if

结束放映第一页 上一页 下一页 最后

一页