数据窗口常用函数_第1页
数据窗口常用函数_第2页
数据窗口常用函数_第3页
数据窗口常用函数_第4页
数据窗口常用函数_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

pb中数据窗口函数小结 一、连接数据库连接数据库也就是指定事务对象。PowerBuilder提供了两个函数:SetTrans()和SetTransObject()。语法格式:dw_control.SetTrans(TransactionObject)dw_control.SetTransObject(TransactionObject)其中,dw_control是所使用的数据窗口控件,transactionObject是所要指定的事务对象。这两个函数有一个重要的区别就是在使用SetTrans()函数时,用户不需做任何数据初始化或事务对象初始化工作。用户只需要在这里填充一个事务对象,PB就会自动完成对该事物对象的初始化以及和数据库连接的工作。而使用SetTransObject()函数时,用户必须首先把所用的事务对象连接到数据库上。但是,这并不意味着SetTrans()函数比SetTransObject()函数更好,使用SetTrans()函数时,每调用一次函数必须连接一次数据库,因为这个函数在每个事务处理的末端都会执行Disconnect语句。与此相反,使用SetTransObject()函数可以为数据库维持一个开放性的连接。因此在一般情况下,为了提高效率,总是采用SetTransObject()函数。这两个函数都是成功时返回1,发生错误时返回-1。二、检索数据用于检索数据的函数只有一个,就是Retrieve()函数。语法格式:dw_control.Retrieve()如果数据窗口控件上的数据窗口对象是有检索参数的,就要在这个函数调用时加上检索参数。而且检索参数必须和数据窗口对象中定义顺序一致。此函数返回一个长整型的数据,代表检索出来的数据行数。如果发生错误,将返回-1。三、更新数据当用户对数据窗口对象内的数据修改后,想把这些修改反映到数据库中去时,必须使用Update()函数。语法格式:dw_control.Update()这个更新可能成功,也可能失败。一般在这个函数被调用之后,总是要做一个检查。请看下面的例子:Int li_returnli_return = dw_1.Update()IF li_return = 1 THEN COMMIT USING SQLCA;ELSE ROLLBACK USING SQLCA;END IF在这段代码中,首先对数据窗口控件进行更新操作。但是更新只是把数据写入到客户机的内存,并没有提交到数据库中。如果更新成功,就把它提交到数据库中,如果更新失败,就回滚到当前的事务。行操作行操作的函数主要是对数据库中的数据进行插入、删除或选择操作。一、插入行在DataWindow中插入一行,可以使用InsertRow()函数。语法格式:dw_control.InsertRow(rownumber)dw_control是数据窗口控件名,rownumber是要插入行的的行号。如果这个参数为0,代表在当前DataWindow的最后一行插入一空行。InsertRow()函数返回一个长整型值,以此来代表插入的行号。如果插入失败,则返回-1。二、删除行要删除DataWindow内的一行数据,则要使用DeleteRow()函数。语法格式:dw_control.DeleteRow(rownumber)其中rownumber是要删除的行号。如果该值为0,表示删除当前行。如果删除成功,返回1,失败则返回-1。三、设置当前行如果要设置DataWindow中的某行为当前行,可以使用SetRow()函数。语法格式:dw_control.SetRow(rownumber)其中rownumber是要设置为当前行的行号。如果函数返回1表示成功,返回-1代表失败。四、获取当前行如果想要获取DataWindow中的某行为当前行,可以使用GetRow()函数。语法格式:dw_control.GetRow()该函数没有参数,它返回一个长整型,代表当前行号。如果返回-1代表失败。如果返回0代表没有选中任何行。五、选择行如果想要在DataWindow中加亮显示某一行或取消加亮显示某一行,可以使用SelectRow()函数。语法格式:dw_control.SelectRow(rownumber,select)其中,rownumber表示要加亮或者取消加这显示的行号,0表示所有行。select是一个布尔类型的值,TRUE表示加亮,FALSE表示取消加亮显示。该函数返回1时表示成功,返回-1时表示失败。如果想要直接设置某一行为加亮,需要首先取消其它行的加亮显示状态,采用如下的两行代码:dw_1.SelectRow(0,FALSE)dw_1.SelectRow(rownumber,TRUE)六、获取选择行如果想要获取当前DataWindow中加亮显示的行,可以使用GetSelectRow()函数。语法格式:dw_control.GetSelectRow(rownumber)其中,rownumber为开始查找的行的行号,0表示从头开始查找。该函数返回一个长整数,表示从rownumber开始查找第一个加亮显示的行的行号。如果失败返回0。七、滚动行如果在DataWindow的末尾插入一行数据,而当前行是在DataWindow的中央,那么这种插入可能不会被用户觉察。为了改变这种情况,可以滚动行到DataWindow的末尾,这样用户就能发现新的改变。要滚动行,可以使用ScrollToRow()函数。语法格式:dw_control.ScrollToRow(rownumber)该函数返回1时表示成功,返回-1时表示失败。与ScrollToRow()函数据功能相关的还有如下几个函数:ScrollPriorRow():向上滚动一行ScrollNextRow():向下滚动一行列操作列操作类的函数主要是选择指定的列和获取列的信息。一、获取列如果要获取当前的列号,可以使用GetColumn()函数,如果要获取当前的列名,可以使用GetColumnName()函数。语法格式:dw_control.GetColumn()dw_control.GetColumnName()这两个函数都没有参数,GetColumn()函数返回一个长整型值,代表当前的列号,GetColumnName()函数返回当前列的列名。如果返回0,表示当前没有任何列被选择返回-1表示失败。二、设置列要设置某一列为DataWindow中的当前列,可以使用SetColumn()函数。语法格式:dw_control.SetColumn(column)其中column既可以是列号,也可以是列名。当该函数返回1时表示成功,返回-1时表示失败。数据操作数据操作类的函数主要是对DataWindow中的数据进行获取、设置。一、获取数据如果要从DataWindow的指定行和列中获取数据,就要使用GetItem系列的函数。这个系列的函数共有五个,分别是对字符串、数字、日期、日期时间和小数。语法格式:dw_control.GetItemString(rownumber,column)dw_control.GetItemNumber(rownumber,column)dw_control.GetItemDate(rownumber,column)dw_control.GetItemDateTime(rownumber,column)dw_control.GetItemDecimal(rownumber,column)其中,rownumber参数表示行号,column可以是列号或列名。二、设置数据与获取数据所用的函数不同,设置DataWindow内指定行列处的数据只要使用一个SetItem()函数就可以了。语法格式:dw_control.SetItem(rownumber, column, value)其中rownumber表示行号,column可以是列号,也可以是列名,value表示要设置的值。但是该必须与DataWindow中指定的行列处的数据类型一致,不然PowerBuilder会报错。SetItem()函数返回1时表示成功,返回-1时表示失败。三、数据排序如果希望对DataWindow内的数据进行重新排序,而又不想重新从数据库中检索数据,可以使用SetSort()和Sort()函数。这两个函数一起完成对DataWindow进行排序的功能。其中SetSort()函数用于设置如何排序,Sort()函数用于对DataWindow实际进行排序。语法格式:dw_control.SetSort(expression)dw_control.Sort()其中expression是一个字符串,表示排序的表达式,它的具体值是一个列名后面加一个空格,然后是A,表示升序,或D,表示降序。如果有多个列要同时进行排序,它们之间用逗号隔开。例:dw_1.SetSort(name A,xh D)这两个函数都是返回1表示成功,返回-1表示失败。四、数据过滤如果希望对DataWindow内的数据进行过滤而不重新从数据库中检索数据,可以使用SetFilter()和Filter()函数。它们一起完成对数据的过滤功能。其中SetFilter()函数用来设置过滤条件,Filter()函数用于对DataWindow进行过滤。语法格式:dw_control.SetFiter(expression)dw_control.Fiter()其中expression是一个字符串,表示过滤的条件,它实际是一个逻辑表达式。例:dw_1.SetFilter(id003 AND name like王%)dw_1.Filter()这两个函数都是返回1表示成功,返回-1表示失败。五、数据检查PowerBuilder提供了两个函数用于数据的检查,它们是DeleteCount()和ModifiedCount(),其作用分别是检查DataWindow中的数据自上一次更新到现在,被删除的行数和被修改的行数。它们一般在窗口的CloseQuery事件中使用,用来检查该窗口的DataWindow中的数据是否有尚未保存的修改。语法格式:dw_control.DeleteCount()dw.control.ModifiedCount()它们分别返回从上一次更新到现在,DataWindow中被删除和被修改的行数。如果没有行被删除或被修改,那么它们返回0。如果出现错误则返回-1。一般情况下,如果窗口中含有可供修改的数据窗口对象,那么在窗口的CloseQuery事件中通常使用如下代码检查数据窗口对象中是否有尚未保存的数据:Int li_returnIF dw_1.ModifiedCount() 0 OR dw_1.DeletedCount() 0 THEN li_return = MessageBox(提示,数据尚未保存,是否保存?,Question!,YesNoCancel!,3) CHOOSE CASE li_return CASE 1 TriggerEvent(ue_save) RETURN 0 CASE 2 RETURN 0 CASE 3 RETURN 1 END CHOOSEEND IFPB-子数据窗口 *通常的子数据窗口也就是下拉数据窗口。子数据窗口也是普通的数据窗口对象,没有什么特殊的地方,它的创建方法、可以使用的控件、编程时可以使用的函数等,都和普通的数据窗口相同。特殊的地方只是因为它放在了父数据窗口中,需要和父窗口进行配合。*当为数据窗口中某字段指定为下拉数据窗口编辑风格时,必须提供以下三个属性:a)子数据窗口名称。b)显示字段名称:该字段中的内容显示在父数据窗口的字段上,只是显示。c)数据字段名称:该字段中的内容要赋给父数据窗口的字段,要保存到数据库中。分别对应数据窗口画板的Edit属性页中的:Eidt Style、Display Column、Data Column。*子数据窗口不能再包含子数据窗口;父数据窗口可以对其包含的子数据窗口进行插入、删除、检索和保存等操作。*获取子数据窗口的引用是进行其他操作的前提,使用函数GetChild来获取指定字段的子数据窗口。该函数的语法如下:dw_1.GetChild(name,dwchildvariable)其中,dw_1.是数据窗口控件名称;name为字段名称,为string类型;dwchildvariable为datawindowchild类型变量,该变量在函数正确执行后保存对子数据窗口的引用。该函数正确执行则返回1,否则返回-1。在获取了子数据窗口的引用之后,就可以捡索子数据窗口中的数据了。但是,检索子数据窗口的情况比较多,并且也有多种方法。*保证子数据窗口中的数据更新用户使用下拉数据窗口录入数据时,其中的数据并不一定有用户需要的。在某些情况下不允许用户再输入其他值,否则可能造成数据的不一致性,这时就可以不再编写其他的脚本。但在允许用户录入时,就需要把用户录入的数据保存在子数据窗口对应的数据表中,以便以后数据录入时不再重复输入该数据。这时就应该编写脚本保存该数据了。*检索子数据窗口在应用中,对子数据窗口的编程不是检索数据,就是更新其中的数据。检索数据时,如果只显示子数据窗口中同父数据窗口中某字段取值对应的数据,这时子数据窗口的定义就应该有检索参数。根据检索和更新数据这两个因素,可以将检索数据的情况划分成以下三种: a)没有条件限制,并且不允许更新。 b)没有条件限制,并且允许更新。 c)有条件限制,不管是否可以更新。 检索子数据窗口有两个时机,一个是在子数据窗口下拉时,另一个是在父数据窗口检索时。在子数据窗口打开时进行数据检索,每次录入该字段时都要进行,所以可以保证子数据窗口中的数据是最新的,所以这样的检索是在数据可以更新的情况下才使用。而不允许更新时,子数据窗口中的数据总是和父数据窗口检索时相同,如果不根据其他字段取值检索数据,就没有必要每次录入时都进行检索,只要在窗口打开时进行检索就可以了;当要根据其他字段取值检索数据时,还得在每次下拉子数据窗口时进行检索。*和父数据窗口共享事务对象在和父数据窗口共享事务对象的情况下的编程最简单。因为子数据窗口可以和父数据窗口共享事务对象,只是简单地对父数据窗口进行检索,即可将子数据窗口中的所有数据自动检索出来。一般在窗口的open事件中编写如下脚本:dw_1.settransobject(sqlca)dw_1.retrieve()一种特殊的情况需要注意。当A、B两个数据窗口共享数据时,如果其中B有子数据窗口,A设置事务对象而B没有设置,当A使用函数Retrieve检索数据后,B因为共享数据也会自动获得数据,但是B中的下拉子数据窗口的字段只能显示编码而不能显示对应的汉字,即使该下拉子数据窗口的属性中显示列、数据列都设置正确也是如此。只有当数据窗口B设置了事务对象才能在A检索数据之后正确显示下拉子数据窗口Display Value中指定的字段数据。*检索子数据窗口的数据因为用户随时都有可能录入了新数据,为了保证子数据窗口中显示最新数据,每次打开子数据窗口时都重新进行数据检索。用户在打开子数据窗口之前一般有鼠标点击动作,所以可以在数据窗口控件的clicked事件中编写脚本。例如,在一个进行工资人事管理的软件中,人事信息保存在employee库中,录入工资的数据窗口要选择职工时可以使用下拉数据窗口。子数据窗口至少包含职工姓名name和职工身份证号no。下面是完整脚本:datawindowchild ldwc_dataif dw_1.getchild(name,ldwc_data) -1 thenldwc_data.settransobject(sqlca)ldwc_data.retrieve()end if在很多书籍和讲座中,都使用上面的编程方法进行子数据窗口的数据检索。(*可以在单击事件中先判断是否是下拉的字段列,再进行检索子数据窗口)实际上,还有更为合理的解决办法。因为上面的方法不管用户点击的是否是下拉数据窗口,都要执行脚本,并且用户选择下拉数据窗口中的数据之前也并不总是首先点击鼠标,还可能通过键盘来操作,不仅这样做的程序执行效率不高,而且逻辑上也不是很严格。如果有这样一个事件,该事件只有当用户使用下拉数据窗口时才触发,这样脚本的执行效率就会高了。另外,上面的解决方法,在一个数据窗口中有多个子数据窗口时也比较麻烦,必须书写多个类似上面的脚本,对每个有下拉数据窗口的字段都进行判断,烦琐的很;并且一旦字段的名字发生变化时,脚本也必须加以修改,通用性也很差。下面再介绍一种方法。首先定义一个自定义事件ue_dropdown,映射pbm_dwndropdown。该事件只有用户下拉数据窗口要打开时触发,所以执行效率比较高。然后在该事件中编写如下脚本:datawindowchild ldwc_datagetchild(getcolumnname(),ldwc_data)ldwc_data.settransobject(sqlca)ldwc_data.retrieve()这样,就可以很好地解决上面提到的烦琐和不通用的问题。 第二种需要检索数据的情况,是当用户录入了某个宇段时,该字段可以决定其他字段的取值范围,这时就要检索铁决定的字段的子数据窗口中的数据。*使用带参数检索在检索受其他字段录入影响的字段数据的情况下,子数据窗口的设计应该是带有检索参数的,在适当的事件中使用带参数检索。比如,当用户录入了部门名称后,应该让“职工”,字段的子数据窗口只显示该部门的职工姓名。可以在该数据窗口控件的ue_dropdown(映射pbm_dwndropdown事件)事件中编写如下脚本: /首先获取子数据窗口的引用。 child.retrieve(getitemstring(getrow(),department)当然上面的脚本也可以在数据窗口控件的Clicked事件中编写。 如果子数据窗口的检索条件总取决于某个固定的字段,可以使用上面的带参数检索。如果取决于多个字段,可以使用过滤来实现。*共享子数据窗口当同时打开多个包含相同字段的子数据窗口时,有必要保证这些子数据窗口之间的数据同步,这是一个比较重要的问题。因为,如果有一个子数据窗口中,用户输入了新数据并且该子数据窗口正确保存,其他子数据宙口如果不能同步反映出来,就会造成很多问题。如果其他用户没有重新输入该数据,这时的情况还好一些,如果又重新输入了该数据,保存会出现错误信息,用户会感觉到莫名其妙。所以,一定要重视这时的同步问题。 对于同一个客户端同时打开的多个子数据窗口,使用数据共享可以很好地解决它们之间的同步问题。比如,在工资、

温馨提示

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

评论

0/150

提交评论