《数据窗口常用函数.ppt》由会员分享,可在线阅读,更多相关《数据窗口常用函数.ppt(52页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、数据窗口常用函数数据窗口控件事务对象1.SetTransObject函数函数 调用格式:调用格式:dwcontrol.SetTransObject(transaction)其其 中中:dwcontro为 数 据 窗 口 控 件 的 名 称;transaction为缺省的或 用户定义的事务对象。返返回值:回值:1-成功;-1-失败。SetTransObject函数为数据库维持了一个开放性的连接,不需要反复连接和断开数据库,对数据窗口的更新进行提交或滚回操纵。只有在用户改变数据窗口对象或者用户断开与数据库连接后,才要再次调用SetTransObject函数。SetTransObject()函数的特
2、点是,在使用之前要求建立事务对象与数据库的连接,一直保持这一连接,直到代码执行DISCONNECT语句后才断开与数据库的连接。它在检索和更新数据时所花的时间只是检索和更新所需的时间,效率上明显高于SetTrans()函数。例例如如,在完成了数据库的连接之后,如果在某个窗口中有个数据窗口控件dw_1,可以在窗口打开的open事件中,添加如下代码:dw_1.SetTransObject(SQLCA)此后,就可以使用其它函数访问数据库了。数据窗口控件事务对象 2.SetTrans函数函数 调用格式:调用格式:dwcontrol.SetTrans(transaction)参数及返回值与SetTrans
3、Object函数相同。不同点是SetTrans使用内部事务对象,用户不必先进行数据库的连接,而是每进行一次数据库操作,都会自动产生一个数据库的连接,并在操作结束时自动断开与数据库的连接。每当操作数据库时,都会完成连接、操作、断开数据库这一系列步骤。对绝大多数数据库管理系统来说,CONNECT、DISCONNECT操作是件极为耗时的工作。如果应用程序对数据库操作频繁,SetTrans需要花费的资源比较多,效率比较低。一般应用在远端使用应用程序或者对数据库操作较少的场合。数据窗口控件的函数 数据窗口控件提供了丰富的对象函数,这些函数在增强数据窗口功能的同时,也方便了应用程序的开发,加快了开发进度。
4、数据窗口函数编程注意事项:数据窗口函数编程注意事项:1.窗口函数触发数据窗口事件窗口函数触发数据窗口事件 窗口函数会触发某些数据窗口事件,如果在这些数据窗口事件中调用能够触发该事件的数据窗口函数,就会造成死循环。2.PowerBuilder的数据处理机制的数据处理机制数据窗口在客户机的本地内存中开辟了四个缓冲区:主缓冲区、删除缓冲区、过滤缓冲区、原始缓冲区,从数据库中检索到数据后,数据窗口根据不同情况把数据放置到不同的缓冲区。四个缓冲区各司其职,协作完成数据的增删改,最后把结果提交给数据库管理系统。n除了在数据窗口画笔中可以定义数据窗口对象外,还提供了根据SQL SELECT语句和指定的属性动
5、态创建数据窗口的能力,这样,应用程序就能够构造的更加灵活,以适应千变万化的用户需求。7.4 数据窗口控件的函数n 当使用数据窗口控件的Retrieve()函数从数据库中提取数据后,数据被存入了数据窗口的主缓冲区中,程序对数据窗口中数据的操作均在缓冲区中完成。n用户在向数据窗口中输入数据时,并没有直接把数据输入到数据窗口的主缓冲区中,而是把数据输入到悬浮在数据窗口当前单元上面的编辑控件中,当用户移动了输入焦点或代码中使用AcceptText()函数操作之后,系统验证输入数据的有效性,通过有效性验证的数据才被放置到数据窗口控件的主缓冲区中。n当插入数据时,插入的数据也存放在主缓冲区。当删除数据行时
6、,不管是使用DeleteRow()函数直接删除一行还是使用RowsMove()函数在缓冲区之间移动数据行,被删除数据行从主缓冲区移动到删除缓冲区。n当使用数据窗口控件的对象函数Update()将数据窗口的修改发送到数据库管理系统后,被成功删除的记录均从删除缓冲区中清除。在保存数据时,删除缓冲区用于生成DELETE语句。过滤缓冲区用于保存那些满足数据源定义,而不满足过滤条件的行。n原始缓冲区保存数据窗口从数据库中检索出的原始数据。可以通过把GetItem簇函数的入口参数originalvalue设置为true来访问原始缓冲区中数据。7.4 数据窗口控件的函数数据窗口缓冲区之间的关系见图。7.4
7、数据窗口控件的函数n 主缓冲区的记录行数可以通过数据窗口控件的对象函数RowCount()得到,删除缓冲区的记录行数通过数据窗口控件的对象函数DeletedCount()得到,过滤缓冲区的记录行数通过数据窗口控件的对象函数FilterCount()得到。n利用数据窗口控件的对象函数SetFilter(),可以动态改变过滤条件,然后使用数据窗口控件的对象函数Filter()更新主缓冲区和过滤缓冲区中的数据。数据窗口控件只显示主缓冲区中的数据,用户的所有操作也都是针对主缓冲区进行的。n编辑状态标志在数据窗口控件的主缓冲区、过滤缓冲区和删除缓冲区中,每一行和每一行中的每个列都有个编辑状态标志,这个标
8、志指示了相应行是否是新增加的行、相应列的数据是否被修改。在往数据库中保存数据时,数据窗口利用这个标志值来决定产生什么类型的SQL语句。n需要获得某行/某列的编辑状态标志的方法是使用数据窗口控件的GetItemStatus()对象函数。修改行或列的编辑状态标志的数据窗口控件对象函数是SetItemStatus()。7.4 数据窗口控件的函数 编辑状态标志是个dwItemStatus枚举类型。7.4 数据窗口控件的函数3.访问的缓冲区访问的缓冲区dwBuffer用来指定数据窗口控件函数访问的缓冲区,dwBuffer使用枚举数据类型。表表7-4 dwBuffer枚举数据类型与指定的缓冲区枚举数据类型
9、与指定的缓冲区数据窗口常用函数nDwo.Reset()重置数据窗口nInsertRow()函数函数n用来在数据窗口的主缓冲区中插入一条新记录。其语法格式为:nlong dwcontrol.InsertRow(long row)n其中:row用于指定新行的插入位置。若row为0,则表示在所有记录的最后插入新行。n例如:dw_1.InsertRow(0)数据窗口常用函数nDeleteRow()函数nDeleteRow函数用来在数据窗口的主缓冲区中删除一行。其语法格式为:ninteger dwcontrol.DeleteRow(long row)n其中:row表示要删除的行的行号。若row为0,则表
10、示要删除当前行。n例如,语句:ndw_1.DeleteRow(5)n表示删除数据窗口控件中的第5条记录。数据窗口常用函数nUpdate()函数nUpdate函数用来把数据窗口上数据的变化更新到数据库中。nUpdate函数的语法格式为:nintegerdwcontrol.Update(booleanaccept,booleanresetflag)n其中:参数accept是一个布尔值,如果该值为true,表示在更新之前调用AcceptText函数。参数resetflag用来确定数据窗口更新后是否重设更新标记。n该函数执行成功,则返回1,否则返回-1。n例如,在本书实例窗口w_ini的【保存】按钮的
11、Clicked事件代码为:数据窗口常用函数nif dw_1.Update()0 thenncommit;/提交nelsenmessagebox(,无法对数据保存!)nrollback;/返回nend ifn注释:在调用注释:在调用update函数后,必须做事务的函数后,必须做事务的管理工作,即使用管理工作,即使用SQL语句语句COMMIT或或ROLLBACK来结束更新操作。来结束更新操作。数据窗口常用函数n连接事务对象的函数nSettransobject()函数n参数为事务对象n例:dw_1.Settransobject(sqlca)n滚动数据行函数nScroll()和ScrollToRow(
12、)函数nlongdwcontrol.Scroll(longnumber)nnumber指定要滚动的方向和行数。number为正数,表示向下滚动;若number为负数,表示向上滚动。如果该函数执行成功,那么将返回数据窗口控件中可见的第一行的行号;如果执行失败,则返回-1。n滚动数据行函数nScrollToRow函数nintegerdwcontrol.ScrollToRow(longrow)n参数row指定要滚动到的行号。如果row为0,则滚动到第一行,如果row大于最后一行的行号,则滚动到最后一行。该函数执行成功,则返回值为1,否则,返回-1n注释:调用注释:调用ScrollToRoll函数后,
13、指定的行变为当函数后,指定的行变为当前行,如果该行在数据窗口控件中已经可见,则数前行,如果该行在数据窗口控件中已经可见,则数据窗口控件中显示的行没有什么变化,否则,显示据窗口控件中显示的行没有什么变化,否则,显示这一行这一行nScrollToRoll函数和其他数据窗口滚动函数并不能函数和其他数据窗口滚动函数并不能高亮度显示行。此时可使用高亮度显示行。此时可使用SelectRow函数高亮度函数高亮度显示该行以使用户知道这是当前行。显示该行以使用户知道这是当前行。nScrollToRow函数和其他数据窗口滚动函数可能触函数和其他数据窗口滚动函数可能触发下列事件:发下列事件:ItemChanged、
14、ItemError、ItemFocusChanged、RowFocusChanged。nScrollNextRow()和ScrollPriorRow()函数nlong dwcontrol.ScrollNextRow()nlong dwcontrol.ScrollPriorRow()n作用:向上或向下滚动一行nScrollNextPage()和ScrollPriorPage()函数nlong dwcontrol.ScrollNextPage()nlong dwcontrol.ScrollPriorPage()n作用:向上或向下滚动一页使当前记录亮度显示nSelectrow()函数ninteger
15、dwcontrol.SelectRow(long,boolean)n参数long型表示行号,行号为0表示对所有行进行操作。boolean型:true表示稿亮度显示,false表示去掉亮度显示。n例:Dw_1.selectrow(dw_1.getrow(),true)表示将当前行亮度显示nRetrieve()函数nRetrieve函数的功能是用指定的事务对象从数据库中把数据检索到数据窗口进行显示。nRetrieve函数的语法格式为:nlong dwcontrol.Retrieve(any argument,any argument.)n其中:argument是可选参数,它表示在数据窗口对象中定义
16、的检索参数,这些参数的顺序必须和定义时的顺序相同。n如果调用成功,则返回检索出的记录行数;否则,返回-1。nSetSort()和Sort()函数nSetSort()函数设置排序条件nSort()函数执行排序操作ninteger dwcontrol.SetSort(string format)n其中:参数format是一个表示排序标准的字符串,包括列名或列号(列号前加#号)和排序顺序(A表示升序、D表示降序)。如果format值为NULL,PowerBuilder将显示“Specify Sort Columns”对话框,让用户选择排序条件。该函数执行成功时返回值为1,否则返回-1。nnumber
17、 dwcontrol.Sort()n该函数没有参数,执行成功时返回值为1,否则返回-1。n例如,可使用如下代码实现按第一列升序、第二列降序的顺序排序:ndw_1.setSort(#1 A,#2 D)ndw_1.sort()nSetFilter()和和Filter()函数函数nSetFilter函数用来在程序中动态改变数据窗口的过滤条件。修改之后,再用Filter函数过滤数据。integer dwcontrol.SetFilter(string format)n其中:format是个字符串,其值是作为过滤条件的逻辑表达式,表达式中可以包含列名或列号。如果format值为NULL,PowerBui
18、lder将显示“Specify Filter”对话框,让用户输入过滤条件。n该函数执行成功时返回1,否则返回-1。integer dwcontrol.Filter()n例:dw_1.setfilter(xh=0251101)dw_1.filter()可以实现过滤学号字段为0251101学生的记录nReset()函数函数nReset函数可以清除数据窗口中的所有行。其语法格式为:ninteger dwcontrol.Reset()n若该函数执行成功,则返回1,否则返回-1。n执行Reset函数后再执行Update()函数并不会清除数据库中的数据,而删除数据窗口的所有行后再执行Update()函数则
19、会清除数据库中的数据。nFind()函数n查找满足条件的记录nnumberdwcontrol.Find(stringexpression,numberstart,numberend)nExpression:查找条件表达式nStart:起始行号nEnd:结束行号n返回值:返回第一条满足条件的记录号0表示查找失败,-1表示查找出错例i=dw_1.find(xh=0251101,1,dw_1.rowcount()dw_1.scrolltorow(i)n查找和过滤的区别n查找和过滤都可以找到满足条件的记录,但是,find()的查找过程在主缓冲区中进行,而Filter()将满足条件的记录过滤到过滤缓冲区
20、。n得到与设置数据项的函数nSetItem函数n参数:行号,列号,值n例如:dw_1.setitem(dw_1.getrow(),3,女)nGetItem函数nGetItemString、GetItemDateTime、GetItemTime、GetItemNumber、GetItemDecimal。n参数:行号,列号n返回值:取得的对应行、列的值数据窗口中数据处理n数据正确性检查n数据排序、过滤、分组及去掉重复值n数据检索引用数据窗口对象和数据窗口项n数据窗口对象的引用nDataobject属性:指定数据窗口对象n例:dw_1.dataobject=d_no_namen通过表达式引用数据窗口
21、项n通过列名引用ndwcontrol.Object.columnname.buffer.current.originalrownumberndwcontrol:数据窗口控件名称。nObject:必选部分,用来指定一个数据窗口对象的数据值。nColumnname:必选部分,用来指定要操作的数据窗口列名nBuffer:可选部分,指明要从哪个缓冲区中取得数据,用户可以在Primary(主缓冲区)、Delete(删除缓冲区)或Filter(过滤缓冲区)中选择一个,默认设置为Primary缓冲区。n.current.original:用来指明是从原始数据(从数据库中检索出来的数据)还是从当前缓冲区中取得
22、数据。current为默认设置,指当前数据缓冲区。original指原始数据。nrownumber:可选字段,指定数据窗口的行号或者某一范围。n例ndw_1.Object.number1=9952101n语句把数据9952101赋值给主缓冲区中的第一行的number列项:通过函数引用数据窗口项n取得数据窗口缓冲区中特定行列的数据;nGetItemStringnGetItemDateTime、GetItemTime、GetItemNumber、GetItemDecimalnGetItem n设置数据窗口特定行列的数据值。nString dwcontrol.GetItemString(row,co
23、lumn,dwbuffer,originalvalue )ndwcontrol:数据窗口控件的名字。nrow:指定要取得字符型数据项所在的行号。ncolumn:指定要取得字符型数据项所在的列,可以时列号(数值型)或列名(字符型)。ndwbuffer:指明要从哪个缓冲区中取得数据。默认设置是Primary缓冲区。noriginalvalue:用来指明是从原始数据还是从当前缓冲区中取得数据,True表示获得从数据库检索出来的原始数据;False(默认)表示获得当前缓冲区中的数据。例nrownum=dw_1.getrow()/取得当前行的行号nnum_no=dw_1.GetItemNumber (r
24、ownum,number)/取得当前行、number列的值n设置数据窗口特定行列的数据值。设置数据窗口特定行列的数据值。nSetItem,其语法格式如下:ninteger dwcontrol.SetItem(row,column,value)nrow指定赋值项所在的行,ncolumn指赋值项所在的列,可以是列号或列名;nvalue是要为数据项设置的值。n例:nDw_1.setitem(dw_1.getrow(),sex,男)数据窗口的更新控制n选择菜单【Rows】【UpdateProperties】,弹出“SpecifyUpdateProperties”设置更新属性多表数据窗口的更新n一般情况
25、下,含有多表数据的数据窗口只能用于数据检索,而不能用于更新数据,所以,通常多表的更新操作通常使用多个数据窗口来实现(在脚本中要做数据库的相关完整性检查)。但有时也会遇到在一个数据窗口中更新多个表数据的情况。n如果需要在单数据窗口中做多表更新,只能采用如下特殊的手段来解决:n第一,通过修改数据窗口的更新属性实现多表更新;n第二,用隐含数据窗口(或数据存储)实现多表更新。n创建数据窗口:n(1)选用合适的数据源和显示风格,保证数据窗口具有更新能力。n(2)选取多表中的所需数据项(各表的主键和非空列一定要包含进去)。n(3)修改所需数据项的TabOrder,保证其在数据窗口中是可修改的(TabOrd
26、er值不为0)。n(4)选取菜单【Rows】【UpdateProperties】,定义数据窗口的更新属性(只定义一个表的列为可更新列)。n保存操作:n(1)先对多表中的一个单表进行更新,使用Modify()函数将其余表中的数据项的Update属性改为False。n(2)选取单表的主键及表中其他数据项,设置此单表:nDataWindow.Table.UpdateTable=表名 /设置可更新的表名n表的主键.Key=Yes /设置可更新的主键n使用Modify()函数将要更新表中的数据项的Update属性改为True。n(3)使用Update()函数,对所选中的单表进行更新。n(4)选取数据窗口
27、中的其余表及其数据项,重复以上的操作来更新多表数据。n modify()modify()函数的用法为:函数的用法为:nstring string dwcontrol.Modifydwcontrol.Modify (string string modstringmodstring)n其其参参数数是是一一个个要要设设置置的的属属性性值值的的字字符符串串。不不同同的的属性之间可用属性之间可用 t t或多个空格间隔,或多个空格间隔,n对对数数据据窗窗口口对对象象中中列列的的属属性性值值的的设设置置可可以以用用如如下下方式:方式:controlname.propertycontrolname.prope
28、rty=value=value。n例例 如如 xshjbqk_name.Updatexshjbqk_name.Update =No=No表表 示示 将将 列列xshjbqk_namexshjbqk_name的的updateupdate(更更新新)属属性性改改为为NoNo,即即为不可更新。为不可更新。实例nlongll_rtnn/修改Department表nll_rtn=dw_1.update(true,false)nifll_rtn=1thenn/关掉对Department表的修改ndw_1.Modify(department_dept_name.Update=No)ndw_1.Modify(
29、department_dept_id.Update=No)ndw_1.Modify(department_dept_id.Key=No)nn/使Employee表成为新的可修改表ndw_1.Modify(DataWindow.Table.UpdateTable=employee)ndw_1.Modify(employee_emp_id.Update=Yes)ndw_1.Modify(employee_emp_fname.Update=Yes)ndw_1.Modify(employee_emp_lname.Update=Yes)ndw_1.Modify(employee_emp_id.Key=Y
30、es)n/修改Employee表nll_rtn=dw_1.Update()nIFll_rtn=1THENnCOMMITUSINGSQLCA;ndw_1.retrieve()nmessagebox(提示信息,更新成功!)nELSEnROLLBACKUSINGSQLCA;nMessageBox(提示信息,更新失败!)nENDIFn/如果还要修改别的表,重设修改标志ndw_1.Modify(department_dept_name.Update=Yes)ndw_1.Modify(department_dept_id.Update=Yes)ndw_1.Modify(department_dept_id
31、.Key=Yes)ndw_1.Modify(DataWindow.Table.UpdateTable=department)nndw_1.Modify(employee_emp_id.Update=No)ndw_1.Modify(employee_emp_fname.Update=No)ndw_1.Modify(employee_emp_lname.Update=No)ndw_1.Modify(employee_emp_id.Key=No)nELSEnROLLBACKUSINGSQLCA;nMessageBox(提示信息,更新失败!)nENDIF小结1.数据窗口控件常用属性数据窗口控件常用属性
32、数据窗口窗口控件常用函数:nRetrieve()检索数据nupdate()更新表数据nInsertRow(longrow)在第row行插入一空行,row=0表示在末尾插入nDeleteRow(longrow)删除第row行ngetrow()返回数据窗口当前行的行号ngetcolumn()得到数据窗口控件当前列的列号nGetColumnName()得到数据窗口控件当前列的列名nRowCount()返回数据窗口控件当前可用行数。小结nScrollToRow(longrow)滚动数据窗口控件的显示到row行,该函数改变当前行但不改变当前列。nGetItemDecimal(longrow,intcol
33、umn)得到数据窗口控件中row行、col列的数据值。返回值为DecimalnGetitemnumber(longrow,intcolumn)得到数据窗口控件中row行、col列的数据值。返回值为NumbernGetitemstring(longrow,intcolumn)得到数据窗口控件中row行、col列的数据值。返回值为stringnGetItemDate(longrow,intcolumn)得到数据窗口控件中row行、col列的数据值。返回值为DatenGetItemDateTime(longrow,intcolumn)得到数据窗口控件中row行、col列的数据值。返回值为DateTi
34、menGetitemtime(longrow,intcolumn)得到数据窗口控件中row行、col列的数据值。返回值为Time小结nSetItem(longrow,intcolumn,value)将value写到数据窗口控件的row行、col列。nSetSort(stringformat)定义数据窗口控件的排序条件nSort()根据当前的排序条件排序数据窗口控件的行nSetFilter(stringformat)定义数据窗口控件的过滤条件nFilter()在数据窗口控件中显示满足当前过滤条件的行,不满足过滤条件的行从主缓冲区中移动到过滤缓冲区nIsSelected(long row)检测数据
35、窗口控件中指定行是否被选择。被选择的行以反相形式加亮显示。返回值true/falsenSelectRow(longrow,booleanchoice)在数据窗口控件中选择或去掉选择(加亮或去掉加亮)指定的行。row=0表示所有行nSetRowFocusIndicator(pointer)设置焦点行的指针形状,其中pointer的值为:Off!无指针FocusRect!虚框Hand!手PictureControll图片控件名小结nSetRow(longrow)将第row行设为当前行。成功则返回1,失败返回-1。nSetColumn(intcol)将第col列设为当前列。成功则返回1,失败返回-1
36、。2.数据窗口窗口控件常用事件数据窗口窗口控件常用事件nDoubleClicked当用户双击数据窗口控件时触发nRowFocusChanged当数据窗口控件的当前行被改变时触发nItemFocusChanged当焦点从一个可编辑字段切换到另一个可编辑字段时触发nItemChanged当数据窗口控件中某个域被修改并且该域失去输入焦点时触发小结dberror在数据窗口控件访问数据库过程中发生数据库错误时触发。该事件返回值的为:0缺省值,系统显示出错信息;1系统不显示出错信息ItemError当用户修改了字段、然后移走焦点、但数据未能通过该列的有效性检查时触发。该事件返回值的为:0(缺省值),拒绝输入值并显示有效性检查出错信息,同时 不允许移走焦点1拒绝输入值,但不显示出错信息,同时不允许移走焦点2接收输入值3拒绝输入值,但允许移走焦点