数据窗口常用函数数据窗口控件事务对象1.SetTransObject函数调用格式:dwcontrol.SetTransObject(transaction)其中:dwcontro为数据窗口控件的名称;transaction为缺省的或用户定义的事务对象。返回值:1-成功;-1-失败。SetTransObject函数为数据库维持了一个开放性的连接,不需要反复连接和断开数据库,对数据窗口的更新进行提交或滚回操纵。只有在用户改变数据窗口对象或者用户断开与数据库连接后,才要再次调用SetTransObject函数。SetTransObject()函数的特点是,在使用之前要求建立事务对象与数据库的连接,一直保持这一连接,直到代码执行DISCONNECT语句后才断开与数据库的连接。它在检索和更新数据时所花的时间只是检索和更新所需的时间,效率上明显高于SetTrans()函数。例如,在完成了数据库的连接之后,如果在某个窗口中有个数据窗口控件dw_1,可以在窗口打开的open事件中,添加如下代码:dw_1.SetTransObject(SQLCA)此后,就可以使用其它函数访问数据库了。数据窗口控件事务对象2.SetTrans函数调用格式:dwcontrol.SetTrans(transaction)参数及返回值与SetTransObject函数相同。不同点是SetTrans使用内部事务对象,用户不必先进行数据库的连接,而是每进行一次数据库操作,都会自动产生一个数据库的连接,并在操作结束时自动断开与数据库的连接。每当操作数据库时,都会完成连接、操作、断开数据库这一系列步骤。对绝大多数数据库管理系统来说,CONNECT、DISCONNECT操作是件极为耗时的工作。如果应用程序对数据库操作频繁,SetTrans需要花费的资源比较多,效率比较低。一般应用在远端使用应用程序或者对数据库操作较少的场合。数据窗口控件的函数数据窗口控件提供了丰富的对象函数,这些函数在增强数据窗口功能的同时,也方便了应用程序的开发,加快了开发进度。数据窗口函数编程注意事项:1.窗口函数触发数据窗口事件窗口函数会触发某些数据窗口事件,如果在这些数据窗口事件中调用能够触发该事件的数据窗口函数,就会造成死循环。2.PowerBuilder的数据处理机制数据窗口在客户机的本地内存中开辟了四个缓冲区:主缓冲区、删除缓冲区、过滤缓冲区、原始缓冲区,从数据库中检索到数据后,数据窗口根据不同情况把数据放置到不同的缓冲区。四个缓冲区各司其职,协作完成数据的增删改,最后把结果提交给数据库管理系统。除了在数据窗口画笔中可以定义数据窗口对象外,还提供了根据SQLSELECT语句和指定的属性动态创建数据窗口的能力,这样,应用程序就能够构造的更加灵活,以适应千变万化的用户需求。7.4数据窗口控件的函数当使用数据窗口控件的Retrieve()函数从数据库中提取数据后,数据被存入了数据窗口的主缓冲区中,程序对数据窗口中数据的操作均在缓冲区中完成。用户在向数据窗口中输入数据时,并没有直接把数据输入到数据窗口的主缓冲区中,而是把数据输入到悬浮在数据窗口当前单元上面的编辑控件中,当用户移动了输入焦点或代码中使用AcceptText()函数操作之后,系统验证输入数据的有效性,通过有效性验证的数据才被放置到数据窗口控件的主缓冲区中。当插入数据时,插入的数据也存放在主缓冲区。当删除数据行时,不管是使用DeleteRow()函数直接删除一行还是使用RowsMove()函数在缓冲区之间移动数据行,被删除数据行从主缓冲区移动到删除缓冲区。当使用数据窗口控件的对象函数Update()将数据窗口的修改发送到数据库管理系统后,被成功删除的记录均从删除缓冲区中清除。在保存数据时,删除缓冲区用于生成DELETE语句。过滤缓冲区用于保存那些满足数据源定义,而不满足过滤条件的行。原始缓冲区保存数据窗口从数据库中检索出的原始数据。可以通过把GetItem簇函数的入口参数originalvalue设置为true来访问原始缓冲区中数据。7.4数据窗口控件的函数数据窗口缓冲区之间的关系见图。7.4数据窗口控件的函数主缓冲区的记录行数可以通过数据窗口控件的对象函数RowCount()得到,删除缓冲区的记录行数通过数据窗口控件的对象函数DeletedCount()得到,过滤缓冲区的记录行数通过数据窗口控件的对象函数FilterCount()得到。利用数据窗口控件的对象函数SetFilter(),可以动态改变过滤条件,然后使用数据窗口控件的对象函数Filter()更新主缓冲区和过滤缓冲区中的数据。数据窗口控件只显示主缓冲区中的数据,用户的所有操作也都是针对主缓冲区进行的。编辑状态标志在数据窗口控件的主缓冲区、过滤缓冲区和删除缓冲区中,每一行和每一行中的每个列都有个编辑状态标志,这个标志指示了相应行是否是新增加的行、相应列的数据是否被修改。在往数据库中保存数据时,数据窗口利用这个标志值来决定产生什么类型的SQL语句。需要获得某行/某列的编辑状态标志的方法是使用数据窗口控件的GetItemStatus()对象函数。修改行或列的编辑状态标志的数据窗口控件对象函数是SetItemStatus()。7.4数据窗口控件的函数编辑状态标志是个dwItemStatus枚举类型。7.4数据窗口控件的函数3.访问的缓冲区dwBuffer用来指定数据窗口控件函数访问的缓冲区,dwBuffer使用枚举数据类型。表7-4dwBuffer枚举数据类型与指定的缓冲区数据窗口常用函数Dwo.Reset()重置数据窗口InsertRow()函数用来在数据窗口的主缓冲区中插入一条新记录。其语法格式为:longdwcontrol.InsertRow(longrow)其中:row用于指定新行的插入位置。若row为0,则表示在所有记录的最后插入新行。例如:dw_1.InsertRow(0)数据窗口常用函数DeleteRow()函数DeleteRow函数用来在数据窗口的主缓冲区中删除一行。其语法格式为:integerdwcontrol.DeleteRow(longrow)其中:row表示要删除的行的行号。若row为0,则表示要删除当前行。例如,语句:dw_1.DeleteRow(5)表示删除数据窗口控件中的第5条记录。数据窗口常用函数Update()函数Update函数用来把数据窗口上数据的变化更新到数据库中。Update函数的语法格式为:integerdwcontrol.Update({booleanaccept{,booleanresetflag}})其中:参数accept是一个布尔值,如果该值为true,表示在更新之前调用AcceptText函数。参数resetflag用来确定数据窗口更新后是否重设更新标记。该函数执行成功,则返回1,否则返回-1。例如,在本书实例窗口w_ini的【保存】按钮的Clicked事件代码为:数据窗口常用函数ifdw_1.Update()0thencommit;//提交elsemessagebox(,无法对数据保存!)rollback;//返回endif注释:在调用update函数后,必须做事务的管理工作,即使用SQL语句COMMIT或ROLLBACK来结束更新操作。数据窗口常用函数连接事务对象的函数Settransobject()函数参数为事务对象例:dw_1.Settransobject(sqlca)滚动数据行函数Scroll()和ScrollToRow()函数longdwcontrol.Scroll(longnumber)number指定要滚动的方向和行数。number为正数,表示向下滚动;若number为负数,表示向上滚动。如果该函数执行成功,那么将返回数据窗口控件中可见的第一行的行号;如果执行失败,则返回-1。滚动数据行函数ScrollToRow函数integerdwcontrol.ScrollToRow(longrow)参数row指定要滚动到的行号。如果row为0,则滚动到第一行,如果row大于最后一行的行号,则滚动到最后一行。该函数执行成功,则返回值为1,否则,返回-1注释:调用ScrollToRoll函数后,指定的行变为当前行,如果该行在数据窗口控件中已经可见,则数据窗口控件中显示的行没有什么变化,否则,显示这一行ScrollToRoll函数和其他数据窗口滚动函数并不能高亮度显示行。此时可使用SelectRow函数高亮度显示该行以使用户知道这是当前行。ScrollToRow函数和其他数据窗口滚动函数可能触发下列事件:ItemChanged、ItemError、ItemFocusChanged、RowFocusChanged。ScrollNextRow()和ScrollPriorRow()函数longdwcontrol.ScrollNextRow()longdwcontrol.ScrollPriorRow()作用:向上或向下滚动一行ScrollNextPage()和ScrollPriorPage()函数longdwcontrol.ScrollNextPage()longdwcontrol.ScrollPriorPage()作用:向上或向下滚动一页使当前记录亮度显示Selectrow()函数integerdwcontrol.SelectRow(long,boolean)参数long型表示行号,行号为0表示对所有行进行操作。boolean型:true表示稿亮度显示,false表示去掉亮度显示。例:Dw_1.selectrow(dw_1.getrow(),true)表示将当前行亮度显示Retrieve()函数Retrieve函数的功能是用指定的事务对象从数据库中把数据检索到数据窗口进行显示。Retrieve函数的语法格式为:longdwcontrol.Retrieve({anyargument,anyargument...})其中:argument是可选参数,它表示在数据窗口对象中定义的检索参数,这些参数的顺序必须和定义时的顺序相同。如果调用成功,则返回检索出的记录行数;否则,返回-1。SetSort()和Sort()函数SetSort()函数设置排序条件Sort()函数执行排序操作integerdwcontrol.SetSort(stringformat)其中:参数format是一个表示排序标准的字符串,包括列名或列号(列号前加#号)和排序顺序(A表示升序、D表示降序)。如果format值为NULL,PowerBuilder将显示“SpecifySortColumns”对话框,让用户选择排序条件。该函数执行成功时返回值为1,否则返回-1。numberdwcontrol.Sort()该函数没有参数,执行成功时返回值为1,否则返回-1。例如,可使用如下代码实现按第一列升序、第二列降序的顺序排序:dw_1.setSort(#1A,#2D)dw_1.sort()SetFilter()和Filter()函数SetFilter函数用来在程序中动态改变数据窗口的过滤条件。修改之后,再用Filter函数过滤数据。integerdwcontrol.SetFilter(stringformat)其中:format是个字符串,其值是作为过滤条件的逻辑表达式,表达式中可以包含列名或列号。如果format值为NULL,PowerBuilder将显示“SpecifyFilter”对话框,让用户输入过滤条件。该函数执行成功时返回1,否则返回-1。integerdwcontrol.Filter()例:dw_1.setfilter(xh='0251101')dw_1.filter()可以实现过滤学号字段为0251101学生的记录Reset()函数Reset函数可以清除数据窗口中的所有行。其语法格式为