PB数据窗口高级技术

上传人:仙*** 文档编号:152953716 上传时间:2022-09-16 格式:DOC 页数:129 大小:325KB
收藏 版权申诉 举报 下载
PB数据窗口高级技术_第1页
第1页 / 共129页
PB数据窗口高级技术_第2页
第2页 / 共129页
PB数据窗口高级技术_第3页
第3页 / 共129页
资源描述:

《PB数据窗口高级技术》由会员分享,可在线阅读,更多相关《PB数据窗口高级技术(129页珍藏版)》请在装配图网上搜索。

1、第10章 数据窗口高级技术10.1 概述 数据窗口对象主要用于操作数据库中的数据,它不仅为数据的增加、删除、修改、更新和查询等数据库操作提供了图形化接口,而且还可以指定数据的输入格式、输出格式以及数据的显示风格。此外,在PowerBuilder 7.0以后的版本中,用户还可以在数据窗口对象中增加多种对象(包括按钮、静态文本框、图片等)。应用程序中使用的数据窗口通常由数据窗口对象和数据窗口控件两部分组成。数据窗口控件是粘贴到窗口上的一个对象,与OLE控件有点类似;数据窗口对象是粘贴到数据窗口控件或数据存储中的对象,它通过数据窗口画笔来创建,并保存到应用库中。通过数据窗口对象与数据窗口控件的配合使

2、用,来完成数据的显示、增加、删除、修改等操作。创建数据窗口的一般步骤为:(1) 使用数据窗口画笔创建数据窗口对象,并把它保存到PowerBuilder应用库中。创建数据窗口对象的操作一般包括下述内容:定义数据源、选择数据窗口的表现风格、设置数据窗口对象及该对象内其他对象的属性(例如显示格式、编辑风格、跳转次序、有效性规则、排序与检索条件)等。如图10-1所示。图10-1 数据窗口对象的创建(2) 在窗口或用户对象中建立一个数据窗口控件,如图10-2所示。图10-2 创建数据窗口控件(3) 设置数据窗口控件的属性或编写代码,建立数据窗口控件与数据窗口对象的关联。(4) 针对具体应用,编写数据窗口

3、控件的事件处理程序,如显示数据、响应用户操作。考虑到本书的读者对PowerBuilder已经有了一定的了解,这里只给出了创建数据窗口的大致步骤,具体细节请参阅PowerBuilder的入门书籍或者帮助文件。第10章 数据窗口高级技术10.2 数据窗口控件的重要属性、事件和函数(1) 与其他控件相似,数据窗口控件也是放置在窗口或用户对象上的一个控件。数据窗口控件的属性、事件和函数的数量相当庞大,这里主要介绍一些不容易掌握的属性、函数和事件。10.2.1 数据窗口控件的重要属性在PowerBuilder的可视化界面中,可以设置数据窗口控件的绝大部分属性,多数属性的作用从属性名称中就可以判断出来,但

4、是有些属性的作用却不容易判断,例如:DataObiect、DragAuto等,此处主要介绍一下这些属性的作用。(1) DataObject属性String类型,指定与数据窗口控件相关联的数据窗口对象名或报表对象名。比如代码中使用语句dw_1.DataObject = d_zuozhe,可将数据窗口对象d_zuozhe显示在数据窗口控件dw_1中。这在创建动态数据窗口时经常用到。(2) DragAuto属性Boolean类型,指定PowerBuilder是否自动把数据窗口控件置入拖曳模式(Drag Mode)。有效取值为:True,当数据窗口控件被单击时,数据窗口控件自动进入拖曳模式;False

5、,当数据窗口控件被单击时,数据窗口控件不自动进入拖曳模式。此时,如果需要让数据窗口控件进入拖曳模式,需要在代码中使用Drag()函数手工设置。(3) Object属性DWObject类型,用于在代码中直接操作数据窗口对象中的对象,包括设置对象的属性、得到数据窗口中的数据等。数据窗口对象中的对象包括:列对象、文本对象、图像对象、按钮对象、Datawindow对象等。(4) 示例例如,放置了数据窗口dw_zuozhe的窗口w_test如图10-3所示。图10-3 更改数据窗口属性前在窗口的open事件中添加代码:dw_1.Object.s_zuozhexingming_t.text=修改后的姓名编

6、码显示的变化如图10-4所示。图10-4 更改数据窗口属性后10.2.2 数据窗口控件的重要事件数据窗口控件的事件很多,这里主要从如何利用事件进行应用开发的角度对数据窗口控件的事件分类介绍并给出部分实例。当然,本书对事件的分类并不是绝对的。对于一些比较容易的事件,例如Clicked事件等,这里就不再赘述。1. 用于触发数据窗口内部控件的事件PowerBuilder的数据窗口提供了用于触发内部控件的事件,这些事件主要用于数据窗口内的按钮控件,下面分别介绍:(1) ButtonClicking事件ButtonClicking事件在单击数据窗口内的按钮对象时触发。触发的条件是该按钮的Suppress

7、EventProcessing属性设置为no。该事件在ButtonClicked事件之前、Clicked事件之后触发。该事件在系统处理按钮的默认动作前触发。返回值的意义为:0,继续处理;1,不执行按钮的指定动作,但仍会接着触发ButtonClicked事件。返回的参数包括: row:长整形,用户单击的行号。 Actionreturncode:长整形,该事件返回的动作代码。 dwo DWObject:指针类型,指向用户单击的对象。(2) ButtonClicked事件当数据窗口内的按钮对象的SuppressEventProcessing属性设置为no后,单击该按钮时触发ButtonClicked

8、事件。该事件在系统处理完按钮的默认动作后触发。返回的参数包括: row:长整形,用户单击的行号。 dwo DWObject:指针类型,指向用户单击的对象。(3) 示例在dw_1的Buttonclicking的事件上添加代码:dw_1.Object.s_xiaozhuan_t.text=触发buttonclicking事件后的小传单击数据窗口中的【确定】按钮后可以看见窗口内容的变化,如图10-5所示。图10-5 Buttonclicking事件演示2. 用于处理数据窗口错误的事件要使应用程序具有良好的容错性,处理好数据窗口的错误事件至关重要。下面分别介绍常用的数据窗口错误事件。(1) DBErr

9、or事件当数据窗口控件访问数据库时发生数据库错误则触发该事件。该事件返回值的意义为:0,默认值,系统显示出错信息;1,系统不显示出错信息。可以利用该事件进行数据窗口的错误处理。在这个事件中,可以编写自己的出错处理程序,以提高程序的容错性。该事件的参数为: sqldbcode:长整数类型,包含由数据库厂商提供的特定出错代码,代码含义可以参见数据库厂商提供的有关文档。如果数据库厂商未提供出错代码,则sqldbcode值的意义如表10-1所示。表10-1 sqldbcode值的意义sqldbcode值意 义1不能连接到数据库(可能是因为事务对象中未正确提供某些参数)2不能连接到数据库3Update或

10、Retrieve中指定的键值与现有行不匹配4写Blob型数据时发生错误 sqlerrtext:字符串型,数据库厂商提供的错误消息文本。 Sqlsyntax:字符串型,发生错误的SQL语句的全部代码。 Buffer:数据窗口缓冲区,错误发生时数据行所在的缓冲区。它的取值为Delete!、Filter!或Primary!。 Row:长整型数,在对数据行进行UPDATED、SELECTED、INSERTED或DELETED操作时发生错误的数据行号。例如,在DBError事件中可以编写如下脚本:CHOOSE CASE sqldbcodeCASE -4 /写Blob数据类型时出错。MessageBox(

11、Error,出错行在+string(row)+ 写Blob数据时出错)CASE /其他出错代码END CHOOSERETURN 1 /隐藏系统出错消息窗口(2) Error事件Error事件当数据窗口对象的数据或属性表达式发生错误时触发。该事件的参数为: errortext:字符串型,PowerBuilder的出错消息文本。 errornumber:无符号整型数,PowerBuilder的出错信息编号。 errorwindowmenu:字符串型,引起错误的窗口或菜单名。 errorobject:字符串型,引起错误的对象。 errorline:无符号整型数,发生错误的行号。 errorscrip

12、t:字符串型,引起错误发生的脚本。 action:ExceptionAction,该参数指定执行完Error事件中的脚本以后,应用程序要做的相应工作。该参数的取值如表10-2所示。表10-2 ExceptionAction参数取值参 数 取 值意 义ExceptionFail!触发SystemError事件ExceptionRetry!如果是OLE服务器没有准备好,重新执行函数或检查表达式,该选项对数据窗口控件不适用ExceptionIgnore忽略发生的错误(使用该参数时要小心,忽略当前错误可能会引起其他错误)ExceptionSubstituteReturnValue!取消错误条件并使用r

13、eturnvalue指定的值代替OLE服务器或数据窗口返回的值 Returnvalue:Any型(Any型可以保存各种数据类型,包括标准数据类型、对象、结构等,但是它不能用于EAServer的组件定义),用于ExceptionSubstituteReturnValue!选项的返回值。例如,在Error事件中编写以下脚本(该脚本将在报错后触发SystemError事件):MessageBox(错误号:+string(errornumber),错误为:+String(errortext)Action= ExceptionFail!对于数据窗口控件来说,如果正在运行数据或属性表达式时发生错误,且Er

14、ror事件中没有脚本,或者参数action被置为ExceptionFail!,则PowerBuilder首先触发Error事件,然后SystemError事件被触发;如果SystemError事件中也没有脚本,应用程序发生错误并终止运行。10.2 数据窗口控件的重要属性、事件和函数(2) (3) ItemError事件该事件在用户修改了字段,然后移走焦点,但数据未能通过该列的有效性检查时触发。该事件返回值的意义如下。 0:(默认值),拒绝输入值并显示有效性检查出错信息,同时不允许移走焦点。 1:拒绝输入值,但不显示出错信息,同时不允许移走焦点。 2:接收输入值。 3:拒绝输入值,但允许移走焦点

15、。它的参数包括: row:长整数型,表示数据行号。该行即发生改变但没有通过有效性检验的字段的行号。 dwo:dwobject,发生错误的数据窗口对象。 data:字符串型,新输入的发生改变的项的数据。例如,在ItemError事件中添加如下脚本,则除了长整数类型的字段可以为空外,不允许数据窗口控件中的其他字段为空,系统自动检查这些字段并为其赋值。string str_colname,str_datatypestr_colname=dwo.Namestr_datatype:dwo.ColTypeIF str_datatypelong THENIF trim(data) = THEN RETURN

16、 0;ELSEIF trim(data) = THEN This.Setltem(row,str_colname,0)END IF3. 用于开发拖曳功能的事件当需要把一个数据窗口中的数据移到另一个数据窗口时,使用拖曳的方式更符合用户的习惯。开发数据的拖曳功能必须用到以下4个事件。 DragDrop事件:当某个被拖曳控件放置到数据窗口控件上时触发。 DragEnter事件:当某个被拖曳控件进入数据窗口控件时触发。 DragLeave事件:当某个被拖曳控件离开数据窗口控件时触发。 DragWithin事件:当某个被拖曳控件处于数据窗口控件内部时触发。例如,编写一个拖曳程序,当拖曳作者列表数据窗口(

17、dw_2)到作者显示数据窗口(dw_1)时,dw_1显示拖曳来的作者信息。步骤如下:(1) 在窗口中增加实例变量rownum。(2) 设置dw_2的drag属性为“假”。(3) 在dw_2中增加用户事件of_lbuttondown,映射到系统事件PBerm_lbuttondown。并在该事件中增加代码:dw_2.dragicon =Form!dw_2.drag(begin!)(4) 在dw_2的clicked事件中增加代码:dw_2.selectrow(row,true)rownum = row(5) 在dw_1数据窗口的DragEnter事件中增加代码:dw_1.retrieve(rownu

18、m)这就可以实现拖曳的显示效果了。读者可以仿照该例编写其他程序。4. 处理数据窗口变化的事件当用户在数据窗口控件中变换焦点或者输入字符时将触发数据窗口的EditChanged、ItemChanged或者ItemFocusChanged事件,下面分别介绍。(1) EditChanged事件EditChanged事件在用户在数据窗口控件的编辑控件中按任意键时触发。返回值为0,表示继续处理。它的参数包括: row:长整数型,表示数据行号。即发生改变的行号。 dwo:dwobject,发生错误的列控件,注意,并不是指列名。 data:字符串型,新输入的发生改变的项的值。(2) ItemChanged事

19、件ItemChanged事件在数据窗口控件中的某个域被修改并且该域失去输入焦点(比如,用户按下了Enter键、Tab键或箭头键,或用户单击了数据窗口中其他域)时触发。该事件返回值的意义为: 0:(默认返回值)接受新修改的值。 1:不接受新修改的值且不允许改变输入焦点。 2:不接受新修改的值但允许改变输入焦点。参数含义为: row:表示发生改变的项所在的行号。 dwo:对拥有改变数据的字段对象的引用。 data:以字符串表示的改变项的新数据。可在该事件中编写用户自定义的附加检验规则。(3) ItemFocusChanged事件ItemFocusChanged事件在焦点从一个可编辑字段切换到另一个

20、可编辑字段时触发。包括第一次显示数据窗口。参数row表示获得焦点的数据行,dwo表示获得焦点的字段对象。在ItemFocusChanged事件中,dwo总是字段对象,因此,用户可以通过字段对象的其他属性获得更多的信息,例如dwo.zuozhe和dwo.xingming属性等。10.2 数据窗口控件的重要属性、事件和函数(3) 5. 用于打印数据窗口的事件打印数据窗口时将触发数据窗口的打印事件,这些事件主要有以下这些。(1) PrintEnd事件PrintEnd事件在数据窗口打印结束后触发。(2) PrintPage事件PrintPage事件在每页数据格式化打印之前触发。该事件返回值的意义为:0

21、,打印当前页;1,跳过当前页。该事件提供以下参数。 pagenumber:长整数型,要打印的页号。 copy:要打印的拷贝。(3) PrintStart事件PrintStart事件在开始打印数据窗口之前发生。参数pagesmax表示打印的页数,该事件的返回值为长整数型,返回0时表示继续执行应用程序。如果需要忽略打印数据窗口或数据存储对象中某些页的数据时,可以在PrintPage事件中编写脚本。具体实例将在第11章报表/图表打印的高级设计中讲述。6. 用于修改数据窗口默认处理方式的Other事件该事件在发生了某个Windows消息,而该消息又不对应于该控件的某个PowerBuilder事件时触发

22、。例如,在数据窗口中常使用滚动条,在默认状态下,单击垂直滚动条时,当前的数据窗口滚动显示一页或一行新内容,但是如果希望单击滚动条时,系统有另外的响应,这时就会用到Other事件。例如,当有两个数据窗口,一个用来显示列表(dw_list),一个用来显示列表当前行的详细信息时(dw_detail),用户希望在列表中单击列表的垂直滚动条时,列表窗口只向下滚动一条记录,而且详细信息的显示也随之变化,这时可以利用Other事件来实现。具体实例参见10.6节数据窗口事件处理技术。7. 数据窗口的检索和更新事件检索或更新数据窗口时将触发数据窗口的检索和更新事件,这些事件包括:(1) RetrieveStar

23、t事件RetrieveStart事件在数据窗口开始检索数据时触发。该事件返回值的意义为: 0:(默认值)继续检索。 1:终止检索。 2:从数据库中检索数据前不清除原有数据及缓冲区。例如,可以在RetrieveStart事件中编写以下脚本,控制检索权限,即只有特定标识号的用户才可以具有检索权限。CHOOSE CASE user_idCASE IS20RETURN 1END CHOOSE当然,控制权限的代码只有放在服务器上才能真正有效。(2) RetrieveRow事件RetrieveRow事件在数据窗口每检索一条记录时触发。该事件返回值的意义为: 0:(默认值)继续随后的检索。 1:终止检索过程

24、。当需要限制检索出的数据行数或其他条件时,可以使用RetrieveRow事件的返回值1终止检索。要注意,当使用该事件检索大量数据时会明显影响到应用程序的性能。例如,在RetrieveRow事件中编写如下脚本以防止检索出超过限制的数据行数。IF row50 THENMessageBox(STOP!,已经检索50条记录)RETURN 1ELSERETURN 0END 1F(3) RetrieveEnd事件RetrieveEnd事件在当数据窗口检索完数据后触发。(4) Updatestart和UpdateEnd事件当数据窗口更新数据库后触发UpdateEnd事件。在调用Update()函数后、修改数

25、据库数据前触发UpdateStart事件。该事件返回值的意义如下。 0:(默认值)继续更新。 1:不执行更新。UpdateEnd事件提供以下参数。 argument:参数描述。 rowsinserted:长整型数,更新操作中新插入数据库的行数。 rowsupdated:长整型数,更新操作中被更新的行数。 rowsdeleted:长整型数,更新操作中被删除的行数。(5) SQLPreview事件该事件在调用Retrieve()、Update()或ReselectRow()函数后,SQL语句被发送到DBMS前发生。由Update()函数触发该事件时,该事件返回值的意义为:0,继续更新;1,停止更新

26、;2,跳过本次请求继续执行。该事件提供以下参数。 request:SQLPreviewFunction类型,表示要求访问数据库的函数类型。它的取值如下。 PreviewFunctionReselectRow!:ReselectRow()函数。 PreviewFunctionRetrieve!:Retrieve()函数。 PreviewFunctionUpdate!:Update()函数。 sqltype:SQLPreviewType类型,指发送到DBMS的SQL语句的类型,它的取值如下。 PreviewDelete!:DELETE语句。 Previewlnsert!:INSERT语句。 Pre

27、viewSelect!:SELECT语句。 PreviewUpdate!:UPDATE语句。 sqlsyntax:字符串型,全部SQL语句的文本。 buffer:DWBuffer类型,与数据库操作有关的包含数据行的缓冲区。 row:长整数型,将要被更新、插入、选择或删除的数据行。用户可以使用sqlsyntax参数修改将要执行的SQL语句,例如,可以通过获得sqlsyntax参数获得语句,修改以后调用SetSQLPreview函数,再将SQL语句发送给DBMS。若用户在数据库描述中设置了绑定选项,sqlsyntax参数得到的SQl语句就可能不完全,绑定的变量没有被实际的变量所代替,而是以问号的形

28、式出现。所以,如果需要SQL语句的完全语法,应该取消数据库的绑定设置。方法是,打开DatabaseProfile Setup对话框,选择Transaction选项卡,取消选择Disable Bind复选框。10.2 数据窗口控件的重要属性、事件和函数(4) 10.2.3 数据窗口控件的重要函数数据窗口控件的函数很多,使用起来也非常灵活。为便于查阅使用,本章将按使用方法分类介绍数据窗口控件的重要函数。1. 用于数据库操作的函数PowerBuilder的数据窗口控件提供了用于检索、更新、插入、删除数据库中数据的函数,下面分别介绍。(1) Retrieve()函数Retrieve()函数的调用格式为

29、:dwcontrol.Retrieve ( , argument, argument . . . )其中,dwcontrol为数据窗口控件名;argument为向数据窗口对象的SQL SELECT语句提供的检索参数。Retrieve()函数使用指定的数据窗口控件从数据库中提取数据。如果为该函数提供了参数,那么这些参数的值将用作数据窗口对象的SQL SELECT语句的提取参数。Retrieve()函数的返回值为Long数据类型。函数执行成功时,返回显示在数据窗口中的数据行的行数(即主缓冲区的数据行数);函数执行失败时返回-1。如果任何参数的值都为NULL,则返回NULL。使用Retrieve()

30、函数检索数据时,系统自动执行数据窗口对象的过滤条件,不满足过滤条件的行被立即移动到过滤缓冲区中,Retrieve()函数返回的行不包括移动到过滤缓冲区中的行。在执行Retrieve()函数之前,必须用数据窗口控件的对象函数SetTransObject()为数据窗口控件设置事务对象。当使用SetTransObject()函数时,在调用之前,需要使用嵌入式SQL语句CONNECT建立事务对象与数据库的连接。正常情况下,执行Retrieve()后,数据窗口中原有的数据被丢弃,并被新的数据所取代。如果想改变这种默认操作,可以通过在数据窗口控件的RetrieveStart事件中编写代码来实现,方法很简单

31、,只要在该事件的事件处理程序中放上语句“Return 2”即可。这时,Retrieve()检索出的数据将被增加到数据将被窗口原有数据的后面。如果数据窗口控件中的数据窗口对象需要检索参数,而Retrieve()函数中又没有提供这些参数,那么执行Retrieve()函数时,系统将显示一个对话框,让用户输入检索参数的取值。执行Retrieve()函数时,可能触发数据窗口控件的DBError、RetrieveEnd、RetrieveRow和RetrieveStar事件。(2) InsertRow()函数InsertRow()函数的调用格式为:dwcontrol.InsertRow ( row )其中参

32、数row表示插入行前面一行的行号。若row为0,则在最后行插入新行。LnsertRow()函数的功能为在数据窗口控件中的指定行前面插入一行。如果数据窗口中某些列定义了默认值,那么在新插入行显示之前,相应数据项的值首先使用默认值进行初始化。函数执行成功时返回新插入行的行号,函数执行出错时返回1;如果任何参数的值都为NULL,则InsertRow()函数返回NULL。新插入的行的编辑状态为New!,为该行输入数据以后,其编辑状态变为NewModify!,这时该行才会包含在改变行总数(由ModifiedCount函数获得)之中。(3) DeleteRow()函数DeleteRow()函数的调用格式为

33、:dwcontrol.DeleteRow ( row )其中,dwcontrol表示数据窗口控件名;row表示要删除数据行的行号,当该参数的值为0时,删除当前行。删除了数据窗口中的行之后,数据库中的数据并没有变动,只有在应用程序执行了数据窗口控件的Update()函数之后,数据库中的相应数据才会被删除。(4) RowsMove()函数RowsMove()函数的调用格式为:dwcontrol.RowsMove ( startrow, endrow,movebuffer, targetdw, beforerow, targetbuffer ) 其中,参数startrow表示移动行的起始行,endr

34、ow为结束行,movebuffer为源缓冲区, targetdw为目标数据窗口控件,beforerow表示数据行移动到另外缓冲区的位置,targetbuffer为目标缓冲区。RowsMove()函数的功能是将一个数据窗口控件中指定的行移动到另一个数据窗口,或将同一个数据窗口控件中一个缓冲区的指定行移动到另一个缓冲区中。RowsMove()函数的返回值为Integer类型。函数执行成功时返回1,发生错误时返回1。如果任何参数的值都为NULL,则RowsMove()函数返回NULL。使用RowsMove()函数把某些行复制到目的数据窗口控件的主缓冲区中后,这些行的修改状态为NewModified!

35、。此时,如果应用程序使用Update()函数更新目的数据窗口控件对应的表,那么PowerBuilder将对新插入的行生成SQLINSERT语句,并把这些语句发送给数据库管理系统。如果在同一个数据窗口控件的不同缓冲区之间移动行,PowerBuilder能够自动改变这些行的状态。例如,如果把未修改过的行从主缓冲区移动到同一个数据窗口的删除缓冲区,那么这些行将被标记为删除状态。如果又把这些行从删除缓冲区中移动到主缓冲区中,则这些行的状态恢复为原来的NotModified!。需要注意的是,当把一个数据窗口中的某些行移动到另一个数据窗口之后,又把它们移动回原来的数据窗口,那么这些行的状态将变为NewMo

36、dified!,这是因为它们是在不同的数据窗口中移动。利用RowsMove()函数可以实现从数据窗口的主缓冲区中移动多行数据到删除缓冲区(这时只有在应用程序执行了数据窗口控件的Update()函数之后,数据库中的相应数据才会被删除),也可以把删除缓冲区中的数据移动到主缓冲区中,这样就在应用程序中实现了恢复(Undo)功能。(5) Update()函数Update()函数的语法为:dwcontrol.Update ( accept , resetflag ) 其中,各参数意义如下。 dwcontrol:数据窗口控件名。 accept:可选项,boolean类型,指定数据窗口控件在更新数据库之前是

37、否自动执行AcceptText()的功能,该功能把编辑框中的内容放置到缓冲区中。有效取值为:TRUE,默认值,执行AcceptText()函数的功能(如果数据没有通过有效性验证,那么数据更新过程被取消);FALSE,不执行AcceptText()函数的功能。 resetflag:可选项,boolean类型,指明更新数据库后是否自动复位更新标志。有效取值为: TRUE,默认值,复位更新标志。 FALSE,不复位更新标志。该函数的功能是把数据窗口控件中所有的数据修改(插入、删除、修改等)传送到数据库,从而更新数据库中的数据。Update()函数在更新数据库之前会调用AcceptText()函数把“

38、漂浮”在当前行/列上的编辑框中的内容放入到数据窗口控件的缓冲区中。Update()函数的返回值为Integer类型。函数执行成功时返回1,发生错误时返回1。如果任何参数的值都为NULL,则Update()函数返回NULL。在默认情况下,Update函数在完成更新数据库操作以后自动重置编辑状态标记,但是如果用户需要在完成其他有效性检验以后再重置这些标记,可以将Resetflag置为False,然后,当确定更新时调用ResetUpdate函数,重置数据项的编辑标记。另外,在ItemChanged事件中调用Update函数时,一定要将accept参数置为FALSE,以避免应用程序陷入死循环或发生堆栈

39、错误。以后还会讲到,用户还应避免在ItemChanged事件中调用AcceptText函数,因为该函数的调用将触发ItemChanged事件。但是,在ItemChanged事件将Update函数的accept参数置为FALSE时也会产生一个问题,因为此时更新的是数据项中的“旧”值,新值还在可编辑控件中。要解决这个问题,就需要在该事件中适当地调用Setltem函数。10.2 数据窗口控件的重要属性、事件和函数(5) (6) ResetUpdate()函数ResetUpdate()函数的语法为:dwcontrol.ResetUpdate ()参数dwcontrol指数据窗口控件名。该函数用于清除数

40、据窗口控件主缓冲区、过滤缓冲区的更新标志并清空删除缓冲区。该函数执行成功时返回1,发生错误时返回1。如果dwcontrol的值为NULL,则ResetUpdate()函数返回NULL。当需要在一个事务中更新多个数据窗口时,应用程序可以在更新每个数据窗口时都不清除更新标志。只有所有的数据窗口更新都成功完成后,才能对每个数据窗口调用ResetUpdate()函数清除更新标志。如果某个数据窗口的更新失败,应用程序可以保留更新状态,提醒用户更正错误,之后重新更新数据窗口。使用数据窗口控件的对象函数GetItemStatus()可以找到哪些行标志为更新状态。如果某行在删除缓冲区中,或该行虽然在主缓冲区或

41、过滤缓冲区,但其具有NewModified!或DataModified!的状态,那么该行的更新标志被设置。清除更新标志之后,主缓冲区或过滤缓冲区中的行具有NotModified!或New!状态,并且删除缓冲区被清空。例如,当需要更新两个数据窗口对象时,可编写如下代码:int rtncodeCONNECT USING SQLCA;dw_1.SetTransObject(SQLCA)dw_2.SetTransObject(SQLCA)rtncode = dw_2.Update(TRUE, FALSE)IF rtncode = 1 THENrtncode = dw_1.Update(TRUE, FA

42、LSE)IF rtncode = 1 THENdw_1.ResetUpdate()dw_2.ResetUpdate()COMMIT USING SQLCA;ELSEROLLBACK USING SQLCA;END IFEND IF(7) Reset()函数Reset()函数的调用方法为:dwcontrol.Reset()该函数用于清除数据窗口控件中的所有数据。执行该函数和在数据窗口中删除数据不同,它只影响应用程序,对数据库不做任何操作。例如,当在数据窗口中使用DeleteRow函数删除一条数据并更新以后,数据库中的该数据不再存在。而当调用了Reset函数以后,数据库没有发生任何变化。如果用户使

43、用了按需检索(Retrieve As Needed)选项,调用Reset函数将清除已经检索出 来的数据行,但是由于是按需检索,数据窗口会立即检索出下一批数据。如果想避免这种情况发生,可以在调用该函数之前调用DBCancel函数。例如:dw_1.DBCancel()dw_1.Reset()2. 用于在数据窗口界面中滚动数据行的函数数据窗口控件包括6个在主缓冲区中滚动显示数据行的函数,分别是Scroll、ScrollToRow、ScrollNextPage、ScrollPriorPage、ScrollNextRow和ScrollPriorRow()函数。(1) Scroll和ScrollToRow

44、函数Scroll函数按参数row指定的行数滚动数据窗口中显示的数据,调用语法为:dwcontrol.ScrolI(number)当row为正数时,数据向下滚动,当row为负数时,数据向上滚动。如果函数调用成功,将返回在控件中第一行显示的数据行号。ScrollToRow函数用于将数据滚动到用户指定行号row的数据行。它的语法为:dwcontrol.ScrollToRow(row)调用该函数以后,指定的数据行变为当前行,但是并不高亮显示该行,用户可使用SelectRow高亮显示当前行。(2) ScrollNextPage和ScrollPriorPage函数这两个函数用于在数据窗口控件中整页滚动数据

45、,每一次滚动都将改变当前行,但是不改变当前列,调用方法很简单:dwcontrol.ScrollNextPage()dwcontrol.ScrollPriorPage()这两个函数返回相同的值,都是显示在控件顶端的数据行号。(3) ScrollNextRow和ScrollPriorRow函数这两个函数用于逐行滚动数据,每一次滚动都会改变当前行,但是不改变当前列。调用格式是:dwcontrol.ScrollNextRow()dwcontrol.ScrollPriorRow()使用数据窗口对象的按钮增强对象,也可以实现这些函数的功能。3. 用于行列控制和数据项的函数PowerBuilder的数据窗口

46、控件提供了7个用于行列控制和数据项控制的函数,下面分别介绍。(1) GetRow()函数GetRow()函数用于返回数据窗口当前行的行号。语法格式为:dwcontrol.GetRow()参数dwcontrol为数据窗口控件名。该函数的返回值为Long数据类型。函数执行成功时返回数据窗口控件dwcontrol的当前行;如果没有当前行,函数返回0;发生错误时函数返回1;如果dwcontrol的值为NULL,则返回NULL。需要注意的是,数据窗口的当前行并非总显示在数据窗口当前的可视区域中,比如,如果当前插入点位于数据窗口的第10行、第5列,然后用户通过拖曳滚动条把可视区域移动到第50行,那么,虽然

47、第10行被移出数据窗口的可视区域,但是当前行依然是第10行。当用户单击了第60行后,第60行会变成当前行。因此,有时需要调用ScrollToRow等函数将当前行滚动到可视区域。(2) SetRow()函数SetRow()函数用于设置指定行为的数据窗口控件的当前行。语法格式为:dwcontrol.SetRow(row)参数dwcontrol为数据窗口控件名,row为long类型,指要设置为当前行的行号。该函数的返回值的Integer类型。函数执行成功时返回1,发生错误时返回1。如果参数row的值小于1或大于数据窗口的总行数,那么SetRow()函数失败。如果任何参数的值都为NULL,则SetRo

48、w()函数返回NULL。执行了SetRow()函数后,数据窗口的光标移动到新的当前行上,但SetRow()并不会滚动数据窗口,以使新的当前行显示在数据窗口中。因此,有时需要调用ScrollToRow等函数将当前行滚动到可视区域。SetRow()函数可能会触发数据窗口控件ItemChanged、ItemError、ItemFocusChanged、RowFocusChanged事件。不要在数据窗口控件的上述事件的事件处理程序中调用SetRow()函数。10.2 数据窗口控件的重要属性、事件和函数(6) (3) RowCount()函数RowCount()函数用于返回数据窗口控件当前可用的行数(提

49、取的所有行数减去删除的行数,加上插入的行数,再减去过滤掉的行数,即当前主缓冲区中的数据行数)。语法格式为:dwcontrol.RowCount()参数dwcontrol为数据窗口控件名。该函数的返回值为Long。函数执行成功时返回主缓冲区中数据的行数,发生错误时返回1。如果dwcontrol的值为NULL,则RowCount()函数返回NULL。(4) GetColumn()函数GetColumn()函数用于得到数据窗口控件当前列的列号。当前列是指当前得到输入焦点的数据项所在的列。语法格式为:dwcontrol. GetColumn()该函数的返回值为Integer类型。函数执行成功时返回数据

50、窗口控件dwcontrol当前列的列号;如果没有当前列(在所有列的跳转次序(即tab值)均设置为0的情况下,所有列都不能编辑),则函数返回0;发生错误时返回-1;如果dwcontrol的值为NULL,则GetColumn()函数返回NULL。当应用程序在Clicked或DoubleClicked事件中调用GetColumn()或GetClickedColumn()函数时,得到的列号有可能不同。因为除非单击的刚好是当前列,在Clicked或DoubleClicked事件处理程序执行完毕之前,用户单击或双击的列并没有变成当前列,执行了上述事件处理程序后,用户单击或双击的列才可能成为当前列。如果需要

51、得到用户单击或双击列的列名,则可使用GetColumnName()函数。(5) SetColumn()函数SetColumn()函数用于设置指定列为数据窗口控件的当前列。语法格式为:dwcontrol.SetColumn (column)其中,参数dwcontrol为数据窗口控件名,column为指定的新当前列。column参数可以使用列名(string类型)也可以使用列号(integer类型)。执行SetColumn()函数后,光标移动到当前列上,但并不左右滚动数据窗口。只有可编辑列才能成为当前列。不要在数据窗口控件ItemChanged、ItemError、ItemFocusChanged

52、的事件中使用该函数,因为这个函数可能会触发这些事件。(6) GetItem*函数Getitem*函数用于获得数据项的GetItemString、GetItemDate、GetItemDateTime、GetItemTime、GetItemNumber和GetItemDecimal函数,并且这些函数的返回值与其函数名的意义相同,这里以GetItemDatetime为例讲述该函数的使用。GetItemDateTime()的功能是得到数据窗口控件中指定行、指定列的DateTime型(日期时间型)数据值。利用该函数,应用程序既能够得到原始缓冲区(从数据库中检索出的值,用户对数据窗口中数据的修改在下次检

53、索之前不影响这些值)中的值,也可以得到主缓冲区、删除缓冲区、过滤缓冲区中的当前值。该函数的语法格式为:dwcontrol.GetItemDateTime( row, column , dwbuffer, originalvalue )其中,参数dwcontrol为数据窗口控件名;row为long数据类型,指要得到数据值的单元所在的行;column指要得到数据值的单元所在的列,该列的数据类型必须是datetime类型。column参数可以是列号(integer类型),也可以是列名(string类型)。dwbuffer是dwbuffer枚举类型,指示想得到数据窗口哪个缓冲区的值。dwbuffer的

54、有效取值为:Primary!,为默认值,表示得到主缓冲区中的数据(未被删除或过滤掉的数据);Delete!,表示得到删除缓冲区中的数据(从数据窗口中已经删除的数据);Filter!,表示得到过滤缓冲区中的数据(从数据窗口中已经过滤掉的数据)。另一个参数originalvalue为boolean类型,指示要得到的指定单元(由行/列值决定)是原始值还是当前值。该参数的有效取值为True时,表示得到原始值(从数据库中检索出的初始值,该值不受当前修改的影响),为False时,为该参数的默认值,表示函数将得到指定单元的当前值。GetItemDateTime()函数执行成功时,返回指定单元的日期时间型数据

55、值;如果指定单元的数据值为NULL,则函数返回NULL;如果发生错误,则函数返回1900-01-01 00:00:00.000000;如果任何参数的值为都NULL,则函数返回NULL。其他几个函数的语法与GetItemDateTime()函数类似,这里不再赘述。(7) SetItem()函数SetItem()函数用于设置数据窗口控件中的指定数据项的值。该函数的语法为:dwcontrol.SetItem ( row, column, value )其中,dwcontrol为数据窗口控件名;row为long类型,指定数据项所在的行;column指定数据项所在的列,该参数可以使用列名(string类

56、型),也可以使用列号(integer类型);value指要为指定数据项设置的值,value参数的数据类型必须与指定列的数据类型相同。该函数不执行校验规则,因此一般情况下,应避免使用该函数直接为数据项赋值。但是,在用户输入不合法数据的情况下,可以使用SetItem修改最终用户输入的值,使应用程序具备良好的容错性能。在这种情况下,需要在ItemChanged事件中编写转换脚本将用户输入的值转换为合法值,并返回2。或者在ItemError事件中编写转换脚本并返回3(拒绝用户输入的值),并使焦点能够移动。例如,有一个字段只允许输入不包含符号的数字,而用户输入了带百分号的数据,如12%,这时可以在Ite

57、mError事件中编写脚本,将用户输入的值转化为合法值,并使用Setltem函数写入数据库。另外,还可以在这段脚本中调用SetText函数,使用户能够看到正确值的形式。下面是在数据窗口控件的ItemError事件中编写的脚本。string num,incharinteger nFor/去处用户输入的非法符号FOR nfor = 1 TO Len(data)Inchar = Mid(data,count,1)IF IsNumber(inchar) THEN num=num+incharNEXTNum = num/100This.Setltem(row,dwoID,Long(num)This.Se

58、tText(num)RETURN 310.2 数据窗口控件的重要属性、事件和函数(7) 4. 用于数据校验的函数PowerBuilder的数据窗口控件提供了3个用于数据校验的函数,下面分别介绍。(1) SetValidate()函数SetValidate函数的作用是为指定字段重新定义有效性检验规则,它的调用格式为:dwcontrol.SetValidate(column, rule)其中,参数rule为新的有效性检验规则。有效性规则是个布尔表达式,通常用于将当前数据项上的编辑框中的值与某些值进行比较。当用户输入的值不满足该列的有效性规则时,将触发数据窗口控件的ItemError事件。开发人员可

59、以为每个列都定义有效性规则。在PowerBuilder中,可以在3个地方定义有效性规则: 使用数据库画笔在定义或修改数据库表时定义有效性规则。 使用数据窗口画笔在创建或修改数据窗口对象时定义有效性规则。 在应用程序中使用SetValidate()函数定义有效性规则。这里要注意,后一种方法定义的规则比前一种方法定义的规则权限高。有效性规则中可以使用任何需要的数据窗口画笔函数。如果有效性规则中包含了数值,那么数据窗口要求这些数值使用美国格式。注意,String()函数在格式化数值数据时按系统的当前设置进行格式化。因此,当使用String()函数构造有效性规则时,要指定能够生成美国表示法的显示格式。

60、例如,要将某字段的有效性检验规则重新设置为只允许为数字,可以编写以下脚本,并将当前规则暂时保存。string old_Rule, New_Rulenew_Rule=Match(GetText(),0-9)old_Rule=dw_1.GetValidate(ID)dw_1.SetValidate(ID, new_Rule)(2) GetValidate()函数该函数返回数据窗口控件中的指定列使用的有效性规则。语法格式为:dwcontrol.GetValidate(column)参数dwcontrol为数据窗口控件名,column为要得到有效性规则的列。column参数可以是列号(integer类

61、型),也可以是列名(string类型)。该函数的返回值为String类型。函数执行成功时,返回数据窗口控件dwcontrol中的参数column指定的列使用的有效性规则;如果指定列未定义有效性规则,那么函数返回空字符串;如果任何参数的值都为NULL,则GetValidate()函数返回NULL。(3) FindRequired()函数在实际应用中,经常需要限制表中一些域的属性,例如身份证编码就不能为NULL。在提交数据前检查是否将必须输入的数据都赋值是一个很好的编程习惯。FindRequired函数可以解决此问题,它通过对数据窗口中数据的检查,将数据窗口中域的属性设置为Required,并将未赋值的域(包括相应的行、列)找出来。要使用这个函数,在构造数据窗口时就要注意将表中具有NOTNULL属性的数据列设为Required,并在相应事件中插入下列程序:long rownum=1 /行数赋起始值1 integer colnum=0 /列数赋起始值0 string colname /用来存储列名 /这是一个在窗口中定义的多行编辑控件,用来存储找到的不符合要求的域的行、列号mle_required.Text= DO WHILE rownum0 colnum/若程序出错则返回IF dw_1

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!