410 likes | 571 Views
第 8 章 数据窗口对象的应用. 创建数据窗口对象使它和数据库相连接,执行数据的检索、修改、删除等工作。注意:数据窗口对象只有通过数据窗口控件才能发挥它的巨大作用。 8.1 数据窗口控件的使用 数据窗口控件是窗口中一个标准的 PowerBuilder 控件,它放在窗口中,是窗口的一部分,不能独立存在。数据库中的数据要在数据窗口对象中显示和修改,必须依靠数据窗口控件。 把数据窗口控件放在窗口中,使这个数据窗口控件和相应的数据窗口对象关联,通过这个数据窗口控件完成数据窗口对象和数据库的连接。 8.1.1 添加数据窗口控件
E N D
第8章数据窗口对象的应用 创建数据窗口对象使它和数据库相连接,执行数据的检索、修改、删除等工作。注意:数据窗口对象只有通过数据窗口控件才能发挥它的巨大作用。 8.1 数据窗口控件的使用 数据窗口控件是窗口中一个标准的PowerBuilder控件,它放在窗口中,是窗口的一部分,不能独立存在。数据库中的数据要在数据窗口对象中显示和修改,必须依靠数据窗口控件。 把数据窗口控件放在窗口中,使这个数据窗口控件和相应的数据窗口对象关联,通过这个数据窗口控件完成数据窗口对象和数据库的连接。 8.1.1 添加数据窗口控件 打开要添加数据窗口控件的窗口,选择菜单【Insert|Control|DataWindow】,在窗口的适当位置点击鼠标左键,这时出现一个空白框,这个空白框就是数据窗口控件。 第一页 上一页 下一页 最后 一页 结束 放映
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标签页:设置控件的位置、大小及鼠标在控件中的形状。 第一页 上一页 下一页 最后 一页 结束 放映
8.1.3 设置数据窗口控件中关联的数据窗口对象 (1)静态关联 选择数据窗口控件,点击右键,选择Properties进入数据窗口控件的属性视窗,在DataObject框中输入要关联的数据窗口对象。 (2)动态关联 程序运行过程中,若一个数据窗口控件在不同情况下要关联不同的数据窗口对象,这时就要用脚本控制,实现动态关联。 脚本控制语句如下: dw_controlname.dataobject=“d_objectname”。 8.2 操作数据窗口对象中数据的前提 程序运行时,要操纵数据窗口对象中的数据,就要在程序中连接数据库,让数据窗口对象与数据库之间建立连接。必须首先创建应用程序与数据库之间的连接,应用程序与数据库之间的连接是通过事务对象完成的。 (1)什么是事务对象 事务对象是一个传递应用程序与数据库之间信息的一个变量,它驻留在内存中,存储着用于连接数据库及从数据库得到反馈的所有信息,它定义了数据库与应用程序连接的参数。一个应用程序开始创建时,系统就自动定义一个名为SQLCA的默认全局变量。 第一页 上一页 下一页 最后 一页 结束 放映
8.2 操作数据窗口对象中数据的前提 (2)事务对象的属性 事务对象共有15个属性,可以分为两类,一类有10个,用来描述连接数据库的信息,如所连接的数据库的名称;另一类有5个,用来接受有关数据库或最近执行SQL语句的情况或状态,如数据库操作是否成功。 AutoCommit:这是一个布尔型属性。它指定是否将数据库设置成自动提交所有事物。当它为TRUE时,由系统自动提交所有事务,当为FALSE时,用户必须自己在程序中设置事务管理,并在需要的时候对数据库进行提交事务。 它的默认值是FALSE。 DataBase:这是一个字符串类型的属性。它指定要连接的数据库名称。 DBMS:这是一个字符串类型的属性。它指定应用程序所使用的数据库管理系统的名称,如ODBC。 DBPass:这是一个字符串类型的属性。它描述的是用户连接数据库的密码。 Lock:这是一个字符串类型的属性。它是数据库的保护级别,一般不必给出。 LogID:这是一个字符串类型的属性。它用于指定登录数据库服务器所需的用户名或用户的ID。 第一页 上一页 下一页 最后 一页 结束 放映
8.2 操作数据窗口对象中数据的前提 SQLCode:这是一个长整型(Long)的属性。它用来指定最近一次数据库操作成功与否的代码,共有三个返回值:0表示操作成功;100表示操作成功,但没有返回数据;-1表示操作失败。用户可以从SQLDBCode或SQLErrTex中得到具体详细的错误信息。 SQLDBCode:这是一个长整型的属性。它包含了数据库错误代码,不同的数据库,错误代码不同,但大部分数据库厂商都用0表示操作成功,100表示成功但没有检索到数据,负数表示没有成功。 SQLErrText:这是一个字符串类型的属性。它包含了数据库操作的错误信息。 UserID:这是一个字符串类型的属性。它指定了连接数据库的用户名或用户的ID。 8.2.1 使用系统默认的事务对象SQLCA 系统提供了一个默认的全局事务对象SQLCA,可以在程序的任何地方使用这个事物对象。 第一页 上一页 下一页 最后 一页 结束 放映
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声明语句。 第一页 上一页 下一页 最后 一页 结束 放映
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,用户不能声明、创建、删除它,系统会自动处理对它的操作;给事务对象赋值时,只能给事物对象的属性一一赋值,不能将一个事物对象直接赋给另一事务对象。 第一页 上一页 下一页 最后 一页 结束 放映
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。 第一页 上一页 下一页 最后 一页 结束 放映
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事件中。 第一页 上一页 下一页 最后 一页 结束 放映
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。 第一页 上一页 下一页 最后 一页 结束 放映
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()。 第一页 上一页 下一页 最后 一页 结束 放映
8.3.2 更新数据(update) (2)函数返回值 若返回值是1表示成功,返回值是-1表示失败。 (3)执行函数时触发的事件 DBError SQLPreview UpdateStart UpdateEnd (4)典型应用 if dw_1.update()=1 then commit; else rollback; end if 数据窗口中数据更新正确则提交事务(保存数据),否则取消事务(不保存数据)。 第一页 上一页 下一页 最后 一页 结束 放映
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:所取字段的类型是带小数的数值型。 第一页 上一页 下一页 最后 一页 结束 放映
8.3.3 从数据窗口控件中读数据(getitemstring) (2)典型应用 string name1 name1=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 name1 name1=dw_1.getitemstring(2,“name”) dw_2.setitem(1,“name”,name1) 从dw_1的第二行中取出“name”字段,然后将取出的值放在dw_2中的第一行“name”字段上。 第一页 上一页 下一页 最后 一页 结束 放映
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”)。 第一页 上一页 下一页 最后 一页 结束 放映
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和90之间的记录(包含70,不包含90)。 第一页 上一页 下一页 最后 一页 结束 放映
8.3.7 重新设置数据窗口中的数据(reset) 在使用retrieve函数进行检索之前,系统自动调用该函数重置数据窗口,不必在retrieve函数前使用该函数。 (1)语法形式: dwcontrolname.reset() 此函数不要求参数。 (2)函数的返回值 1表示成功,-1表示失败。 (3)典型应用 dw_2.reset() dw_2.insertrow(0) 重置数据窗口控件dw_2,清除数据窗口缓冲区内的所有行后,添加一条空白记录。 第一页 上一页 下一页 最后 一页 结束 放映
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的最后插入一条空白记录,并使屏幕滚动,使刚插入的记录显示在屏幕范围内。 第一页 上一页 下一页 最后 一页 结束 放映
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中现有的所有记录,记录虽然删除,但数据库中数据并没改变,我们改变的只是缓冲区中的内容,要将删除结果保存,需要编写更新脚本。 第一页 上一页 下一页 最后 一页 结束 放映
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。 第一页 上一页 下一页 最后 一页 结束 放映
8.3.11 选择行(selectrow) 要加亮显示或取消加亮显示行,就要用到该函数。 (1)语法形式: DWcontrolname.selectrow(rownumber,select) 其中rownumber表示要加亮或取消加亮的行号,是一个long型,若rownumber=0表示要加亮或取消加亮所有行;select是布尔型值,确定指定行是否被加亮显示,若select的值是true表示加亮显示,若是false表示取消加亮显示。 (2)函数的返回值 1表示操作成功,-1表示操作失败。 (3)典型应用(该脚本写在数据窗口的clicked事件中) dw_1.selectrow(0,false) dw_1.selectrow(row,true) 数据窗口控件dw_1中点击的行加亮显示。(Row表示当前行号) 第一页 上一页 下一页 最后 一页 结束 放映
8.3.12 获取当前行(getrow) 此函数用来获取当前行的行号。 (1)语法形式: DWcontrolname.getrow() 该函数没有参数。 (2)函数的返回值 函数的返回值是long类型,表示当前行的行号;若数据窗口中没有当前行,则返回值是0;若发生错误,则返回值是-1。 (3)典型应用(该脚本写在数据窗口的clicked事件中) dw_1.setrow(row) messagebox(“当前选择的行号是:”,dw_1.getrow()) 点击数据窗口控件dw_1中的某行,就显示点击行的行号。 第一页 上一页 下一页 最后 一页 结束 放映
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。 第一页 上一页 下一页 最后 一页 结束 放映
8.3.14 获取当前列(getcolumn) (1)语法形式: DWcontrolname.getcolumn() 该函数没有参数,函数得到数据窗口中的当前列。 (2)函数的返回值 返回值是当前的列号,若返回值是0表示没有任何列被选中,-1表示失败。 (3)典型应用: 该函数应用较少。 dw_1.setcolumn(dw_1.getcolumn()+ 1) 使输入焦点下移一列。 第一页 上一页 下一页 最后 一页 结束 放映
8.3.15 设置当前列(setcolumn) 要设置某列为数据窗口当前列,可用setcolumn函数。比如数据窗口输入数据之后,列焦点没有移开,则该列值就无法取出,这时可用该函数将焦点从当前列移到其它列,就可取出该列值了。 (1)语法形式:DWcontrolname.setcolumn(columnnumber) 其中columnnumber是一个字符串,表示要设置为当前列的列,列的表示可以用列名,也可以用列号,使用列号时,要在列号的前面加上符号“#”。 (2)函数的返回值 操作成功返回1,操作失败返回-1。 (3)典型应用 假定窗口中有两个按钮,分别是“新加记录”、“存盘”,其中“新加记录”按钮上有语句dw_1.insertrow(0),“存盘”按钮上的脚本如下: 第一页 上一页 下一页 最后 一页 结束 放映
8.3.15 设置当前列(setcolumn) long nn,row1 string name1 nn=dw_1.rowcount() dw_1.setcolumn(1) name1=dw_1.getitemstring(nn,“name”) if name1=“” or isnull(name1) then messagebox(“提示:”,“名字字段不能为空。”) return else if dw_1.update()=1 then commit; else rollback; end if end if 这里的“name”字段的列号不是1,这样即使输入数据时焦点停留在“name”字段上没有移开,也能把该字段值取出来,只要该字段中值不为空,就能完成后面的更新工作。 第一页 上一页 下一页 最后 一页 结束 放映
8.4 数据窗口事件 8.4.1 Clicked (1)触发条件 当用户在数据窗口中单击鼠标左键时就触发该事件。 (2)事件所带参数 该事件带有的四个参数如下: xpos:是一个integer类型的变量,表示单击时所在位置的X坐标。 ypos:是一个integer类型的变量,表示单击时所在位置的Y坐标。 row:是一个integer类型的变量,表示单击时的行号。 dwo:是一个DWObject类型的变量,表示对单击的列对象的引用。 (3)事件的返回值 事件的返回值是long类型,0是系统的默认值,表示继续操作;1表示不能改变输入焦点。 (4)典型示例 点击数据窗口的某列,数据按该列递增排序,同时该列变为红色;再次单击该列时,数据按该列递减排序,同时该列变为蓝色。 第一页 上一页 下一页 最后 一页 结束 放映
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 第一页 上一页 下一页 最后 一页 结束 放映
8.4.2 DoubleClicked (1)触发条件 数据窗口中双击鼠标左键时就触发该事件。在触发该事件之前,先触发了单击事件。 (2)事件所带参数 同clicked事件所带参数。 (3)事件的返回值 该事件只有一个返回值0,表示继续操作。 (4)典型示例 双击数据窗口的记录时,显示双击的行号、列名、X坐标、Y坐标。 string is_columnname if dwo.type="column" then is_columnname=dwo.name end if messagebox("用户双击数据窗口控件","所在行号:"+string(row)& +"~r所在列是:"+is_columnname+"~r所在X坐标是:"+string(xpos)& +"~r所在Y坐标是:"+string(ypos)) 第一页 上一页 下一页 最后 一页 结束 放映
8.4.3 ItemChanged (1)触发条件 当修改了数据窗口中的某个数据项的值,然后按Tab键移出,鼠标单击数据窗口外的部分或是用户按了Enter时,将会触发该事件。 一般在该事件中做一些检查性工作,它是检验层中的最后一层,只有数据通过了所有的其它层的检验后才会发生这个事件。 (2)事件所带参数 该事件带有的三个参数如下: row:是一个integer类型的变量,表示修改的数据项所在的行号。 dwo:是一个DWObject类型的变量,表示对拥有修改项的列对象的引用。 data:是一个string类型的变量,表示修改后的数据。 (3)事件的返回值 该事件有三个返回值如下: 0:表示接受用户输入的数据。这是系统默认的返回值。 1:表示拒绝用户输入的数据,并且不允许改变输入焦点。这时会触发ItemError事件。 2:表示拒绝用户输入的数据,但允许用户改变输入焦点。这时不会触发ItemError事件,并且该项的值还是原来的值。 第一页 上一页 下一页 最后 一页 结束 放映
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,表示继续操作。 第一页 上一页 下一页 最后 一页 结束 放映
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:表示执行检索操作,但不删除原来数据窗口中的行和缓冲区中的数据。若返回的是该值,则新检索的数据会添加到原来数据窗口数据的后面,这样做一般会造成数据的重复。 第一页 上一页 下一页 最后 一页 结束 放映
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 第一页 上一页 下一页 最后 一页 结束 放映
8.4.6 RetrieveEnd (1)触发条件 数据窗口从数据库中检索完数据之后,就会触发该事件。 (2)事件所带参数 该事件只有一个参数rowcount,表示检索出来的总行数。 (3)事件的返回值 该事件只有一个返回值0,表示继续操作。 (4)典型示例 数据检索完毕后,弹出对话框,显示检索出来的记录数。 messagebox("提示:","数据已检索完毕,"+& "~r共有"+string(rowcount)+"条记录") 第一页 上一页 下一页 最后 一页 结束 放映
8.4.7 RetrieveRow (1)触发条件 每行数据从数据库检索到数据窗口时,就会触发该事件。 (2)事件所带参数 该事件只有一个参数row,表示刚被检索出来的行号。 (3)事件的返回值 该事件有两个返回值: 0:表示继续操作。 1:表示终止检索数据。 (4)典型示例 当检索到字段“name”的值是“wang”时,就停止检索;否则继续检索。 string name1 name1=this.getitemstring(row,"name") choose case name1 case "wang" return 1 case else return 0 end choose 第一页 上一页 下一页 最后 一页 结束 放映
8.4.8 UpdateStart (1)触发条件 在调用update()函数后,并且在这个函数被提交到数据库之前,就会触发该事件。 (2)事件所带参数 该事件没有参数。 (3)事件的返回值 该事件有两个返回值: 0:表示继续操作。 1:表示不要执行update操作。 (4)典型示例 在更新数据之前,先检验字段“name”的值是否有空白的,若有则不存盘;只有所有记录的“name”字段都不为空白才将数据存盘。 第一页 上一页 下一页 最后 一页 结束 放映
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 第一页 上一页 下一页 最后 一页 结束 放映
8.4.9 UpdateEnd (1)触发条件 对数据库的所有更新操作全部执行完毕后,就会触发该事件。 (2)事件所带参数 该事件有三个参数如下: rowsinserted:是一个long类型的变量,表示更新操作中向数据库中插入的行数。 rowsupdated:是一个long类型的变量,表示更新操作中修改数据库中记录的行数。 rowsdeleted:是一个long类型的变量,表示更新操作中删除数据库中记录的行数。 (3)事件的返回值 该事件只有一个返回值0,表示继续操作。 (4)典型示例 若数据更新成功,就显示相关信息,包括插入的行数、修改的行数、删除的行数。 messagebox("数据已成功更新。","插入的行数:"+string(rowsinserted)& +"~r修改的行数:"+string(rowsupdated)& +"~r删除的行数:"+string(rowsdeleted)) 第一页 上一页 下一页 最后 一页 结束 放映
8.4.10 ItemError (1)触发条件 当系统认为字段值不符合规则时,就会触发该事件。 (2)事件所带参数 该事件带有三个参数: row:是一个long类型的变量,表示修改的行号。 dwo:是一个DWObject类型的变量,表示修改的列对象。 data:是一个字符串类型变量,表示修改后的数据。 (3)事件的返回值 该事件有四个返回值: 0:表示拒绝用户输入的数据并且弹出一个对话框显示系统提供的错误信息。这是系统的默认值。 1:表示拒绝用户输入的数据,但不弹出一个对话框显示系统提供的错误信息。 2:表示接受用户输入的数据。 3:表示拒绝用户输入的数据,但允许用户改变输入焦点。 第一页 上一页 下一页 最后 一页 结束 放映
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!。 第一页 上一页 下一页 最后 一页 结束 放映
8.4.11 DbError (2)事件所带参数 row:这是一个long类型的参数,表示数据库产生错误的行号。 (3)事件的返回值 该事件的返回值有两个: 0:系统默认的返回值,表示弹出一个对话框来显示系统的错误信息。 1:表示不显示系统的错误信息。 (4)典型示例 若数据库发生错误,就显示错误编码、错误发生的行、发生错误时执行的语句、错误解释信息。 if sqldbcode<>0 then messagebox("数据库错误:","数据库错误编号是:"+string(sqldbcode)+& "~r错误发生时所在行是:"+string(row)+& "~r错误发生时正在执行的语句是:"+sqlsyntax+& "~r数据库的错误解释是:"+sqlerrtext) return 1 end if 第一页 上一页 下一页 最后 一页 结束 放映