PB数据窗口基础

PB数据窗口基础
PB数据窗口基础

PB数据窗口

数据窗口控件-datawindow

PB9.0提供了28个属性、35个默认事件、162个函数。注意与数据窗口对象的区分。

【其他】

■脚本的执行效率

*尽量不要在RetrieveRow事件下编写脚本(包括注释)。

*如果数据窗口的DoubleClicked事件中编写了脚本,那么在数据窗口的C1icked事件中的脚本应该尽量短,否则双击事件中的脚本永远不可能得到执行。一般来说,Cliked中脚本的执行时间和两次击鼠标之间的间隔时间之和,不应该大于操作系统中所设定的鼠标双击时间间隔,否则双击事件永远不可能触发,双击时仅仅是接连两次触发c1icked事件。

*在数据窗口中录入数据时,事件EditChanged是触发频率最高的,每一个按钮都触发该事件;触发频率仅次于该事件的是ItemChanged事件和ItemFocusChanged,只要修改了单元中的内容,每次触发ItemFocusChanged事件都会触发ItemChanged事件。在这些事件下编写过长的脚本会非常影响录入工作的效率。同样,事件RowFocusChanged的触发频率也是相当高的。一般来说是可以避免在这四个事件中编写脚本的。

■dw o参数使用

数据窗口的某些事件中可以使用一个称为dwo的变量,该变量保存数据窗口中的部分信息,用数据窗口的属性可以读取这些信息dwo.type:读取在dwo中保存的对象类型。对象类型可能有bitmap、button、column、compute、graph、groupbox、line、ole、ellipse、rectangle、roundrectangle、report、tableblob、text、datawindow(当用户没有单击特定对象时)

https://www.360docs.net/doc/531823000.html,:column的列名

dwo.Primary[row]:column的数据

dwo.Selected:选中column的数据

■数据缓冲区

数据窗口在运行时要创建四个缓冲区,分别是主缓冲区、删除缓冲区、过滤缓冲区和原始缓

冲区,这四个缓冲区各司其职、共同配合,来保证数据窗口对数据的正确处理。下面分别加以介绍。

1、主缓冲区-Primary

这是最重要的一个缓冲区,保存的是当前显示在数据窗口中的所有数据以及它们的修改状态。在保存数据时使用这些状态生成SQL语句。平常的大多数操作都是针对该缓冲区,函数中的缓冲区参数缺省也是该缓冲区。

2、删除缓冲区-Delete

该缓冲区保存所有删除了的数据。保存数据时,该缓冲区中的数据用来产生delete语句。在数据没有提交到数据库之前,可以从该缓冲区中将数据恢复出来。数据提交后,该缓冲区中的数据清空。

3、过滤缓冲区-Filter

该缓冲区中保存的是没有通过过滤规则的所有数据,这些数据在存储时同主缓存区的数据一起生成相应的insert或update语句。

4、原始缓冲区-original

用来保存从数据库中检索到的初始值,在保存数据时用来生成where语句。

上面这四个缓冲区中,original缓冲区在脚本中很少使用,其他三个经常涉及到,很多数据窗口函数都需要指定对这三个缓冲区中的哪个进行操作,大多数情况下都使用缺省的缓冲区Primary!。这三个缓冲区,除了保存相应的数据外,都自动维护这些数据的修改标志,它们之间的协作也是自动维护的。例如,当使用过滤函数时,没有通过过滤规则的数据自动从Primary缓存区移送到Filter缓存区;执行删除操作时,数据自动从Primary缓存区移送到Delete缓存区。所有这些数据的移送无需脚本的干预,只管使用相应的函数即可。

■DWBuffer

Primary! 0

Delete! 1

Filter! 2

■DWItemStatus

NotModified! 0

DataModified! 1

New! 2

NewModified! 3

■编辑控件

和数据窗口控件打交道都是通过编辑控件进行的。在数据窗口中录入数据、修改数据,实际上是在修改单元上的编辑控件中的内容。当编辑控件移动到另外单元上之前,要对编辑控件中的数据进行校验,如果能通过字段的校验规则,就保存到字段中。编辑控件是可以移动的,需要编辑哪个单元,编辑控件就移动到哪个单元上,接受输入或者修改。

编辑控件在没有离开当前字段时,用户录入或者修改的数据就不会被保存到字段中,如何确保在数据窗口失去焦点时,最后位置上编辑框中的内容不被遗漏呢?前面介绍了在数据窗口的LoseFocus事件中编写如下脚本:

this.AcceptText()

这个方法在很多情况下能解决该问题。美中不足的是,如果编辑框中的内容不能通过字段的校验规则,有时会显示两次错误信息窗口。造成两个错误信息窗口,往往是在选择其他单元时发生,在数据窗口失去焦点之前(如单击“保存”按钮等)只会显示一个错误信息窗口。用户选择其他单元时,编辑框中的数据开始进行校验,不能通过校验规则,显示校验错误信息,在显示校验错误信息时数据窗口失去焦点,触发数据窗口的LoseFocus事件执行AcceptText 函数,又一次显示校验错误窗口。

所以,显示两次校验错误窗口的原因是LoseFocus事件中的AcceptText函数造成的。可以想法让该函数在这种情况下不执行。为此定义一个实例变量:

Boolean ib_accept = True

该变量用来表示是否正确通过了校验,然后将LoseFocus中的脚本改成下面的脚本:

If ib_accept Then

This.AcceptText()

Else

ib_accept = true

End If

在数据窗口的ItemError事件中编写脚本:

ib_accept = False

这样就可以解决显示两个校验错误信息窗口了,并且不会遗漏最后一个编辑框中的内容。

*当在某个单元中修改或者录入数据后,编辑框要离开时,要进行4个校验步骤,前面两个步骤由PowerBuilder完成,后面两个由开发者编写。

(1)看数据和编辑前相比是否发生了改变,没有改变则不做任何处理。

(2)检查测试此值是否违反了任何一个在字段上定义的有效性校验规则,违反则拒绝接受此值,并触发ItemError事件。

(3)检查此值是否与编辑前真的不同,没有改变则终止有效性校验。

(4)检查开发人员在ItemChanged事件中编写的脚本。具体的发生情况取决于分配给被称为动作代码的值。

■读取和设置数据

读取:

1、使用函数

dw_1. getitemX_r()

2、直接使用数据窗口对象属性来读取数据

dw_1.object.data.primary.current[row,column]

该语句的格式是:

dwcontrol.object.data[buffer[.whichvalue]][row,column]

dwcontrol是数据窗口控件名称。

whichvalue既可以是current(缺省值),也可以是original。这样就允许用户访问一个列的初始值或当前值。

row和column是要访问的单元所在的行号及列号。

object、data是保留字,buffer是缓存区的名称,有Delete、Primary、Filter。

这种引用方法速度比较快,尤其读取大量数据时。

设置:

使用函数

SetItem()

SetText()

【属性】

▲DataObj ect

数据源

▲Title

用来显示在数据窗口的标题条(TitleBar)上的一个字符串。建议该字符串要有一定的含义,能够标明数据窗口的用途或者其中的数据的类别。该属性的缺省值none。当属性TitleBar

为True时,该属性起作用。

▲Visible

是否显示数据窗口控件,缺省为True。有时为了向其他数据窗口提供数据,除了使用datastore 控件外,还可以使用Visible属性为False的数据窗口。如果仅仅是为了处理数据,不赞成使用Visible属性为False的数据窗口,而应该使用Datastore对象,这样可以节省计算机资源,提高处理效率。

▲Enabled

数据窗口控件是否可以获得焦点,缺省为True。可以在脚本中修改该属性以限制用户执行了某些特定操作后再允许操作数据窗口。

▲TitleBar

是否显示标题条,缺省为False。使用该属性可以在数据窗口上部显示标题条,类似于窗口的标题条。设置属性为True后,用户就能够拖动数据窗口。

▲ControlMenu

是否显示控制菜单,缺省为False。该属性当TitleBar属性为True时才有效。

▲MaxBox和MinBox

是否显示最大和最小控制按钮,缺省为False。当属性TitleBar为True时,该属性有效。属性TitleBar和ControlMenu、MinBox、MaxBox共同控制数据窗口的外观是否像窗口的外观。

▲HscrollBar和VscrollBar

这两个属性用来控制数据窗口控件的横向和纵向滚动条是否显示。设置为True时,滚动条可以根据需要自动显示,数据够显示时则不出现滚动条。

▲LiveScroll

该属性是一个比较重要的属性,缺省为True,表示当拖动垂直滚动滑块时,数据窗口中的行也跟随滚动;属性为False时表示拖动垂直滚动滑块时,数据窗口中的行不跟随滚动,放开垂直滚动滑块后,数据窗口中的数据才滚动到适当数据行上。建议选中该属性,这样当数据很多时,用户就可以拖动垂直滚动小滑块来快速浏览数据了。

▲HsplitScroll

该属性是一个非常有实际用途的属性。该属性决定是否显示分割滚动条,缺省为False。当数据窗口比较宽,要显示水平滚动条时,建议将该属性设置为True。

▲RightToLeft

该属性为True时表示数据窗口中的所有字符都从右向左显示。缺省为False。当设置该属性为True时,还必须要操作系统的支持,该属性才能起作用。

▲Resizeable

用户是否可以调整数据窗口的大小,缺省为False。

▲Border

是否显示边框,默认为True,只有在True的情况下BorderStyle才起作用

▲BorderStyle

取值为枚举型,用来定义数据窗口边框样式。有四个取值:StyleBox!、StyleLowered!、StyleRaised!、StyleShadowBox!,缺省边框类型为StyleLowered。

▲Icon

用来给数据窗口指定标题条左上角的图形,缺省为Windows标志图。

【事件】

◆Clicked

鼠标左键在数据窗口控件上任意位置单击时触发该事件。该事件中有4个参数,可以在脚本中直接使用。

xpos:表示和数据窗口最左侧的距离的整数。

ypos:表示和数据窗口最上部的距离的整数,不包括标题条。

row:表示用户所单击的行号的long型数。

dwo:用户单击对象,是DWObject类型。

在该事件的脚本中使用这些参数,可以给用户一些提示信息或者获取用户单击内容的信息。返回值:0表示继续处理,这是缺省值。1表示停止处理。

*当选择和当前行不同的数据行时可以触发ItemFocusChanged和RowFocusChanged事件,当单击当前行的其他字段时可以触发ItemFocusChanged事件。DoubleClicked事件也可以触发该Clicked事件。

◆DBError

在数据窗口控件中发生数据库错误时触发该事件。该事件有以下参数。

SQLdbcode:long类型的错误代码,具体含义由DBMS指定。当DBMS没有指定错误代码时,SQLdbcode提供4个错误代码,-1表示事务对象参数错误而不能联结到数据库,-2表示不能联结到数据库,-3表示因为其他用户的修改导致用来进行检索或修改的键值在数据库中已经不存在而产生错误,-4表示向数据库中写blob对象时失败。

SQLerrtext:string类型,数据库指定的错误信息。

SQLsyntax:string类型,当错误发生时,发送到数据库的SQL语句。

buffer:DWBuffer枚举型,表示导致错误的数据所在的缓冲区。

row:long类型,导致错误的数据的行号。

返回值:可以用return语句任意指定返回什么数据。有特定含义的返回值是0和1。0表示显示错误信息,1表示不显示错误信息。

◆DoubleClicked

鼠标左键在数据窗口控件中双击时触发该事件。该事件中的4个参数和Clicked事件中的名称及含义完全相同,也可以直接在该事件的脚本中直接使用。

该事件的返回值可以用return指定。有特殊函数的返回值是0,表示继续处理。

◆EditChanged

在数据窗口控件的编辑框中每次按钮都触发该事件。一般很少在该事件下编写脚本。该事件提供三个参数。

row:long类型,当前编辑的行号。

dwo:DWObject类型,正在编辑的对象。

data:String类型,当前编辑框中的内容。

返回值:可以用return指定任意返回值,0表示继续处理。

*每次编辑时触发

◆Error

当数据窗口对象中的数据或者表达式错误时触发该事件,在分布式系统中联结发生错误时也会触发该事件。和DBError事件不同的是,该事件在没有和数据库交互时就有可能触发,而DBError事件触发时肯定和数据库发生了交互。通常在该事件中编写脚本,提供对错误的处理。该事件提供了很多参数。

errornumber:unsigned integer类型,由PowerBuilder指定的错误代码号。

errortext:string类型,由PowerBuilder指定的错误信息。

errorwindowmenu:string类型,造成错误的脚本所在对象的父对象的名称。errorobject:string类型,造成错误的脚本所在的对象的名称。

errorscript:string类型,造成错误的语句所在的脚本的全部内容。

errorline:unsigned integer类型,造成错误的语句在其脚本中所占的行号。

action:在Error事件下的代码执行完后,该参数取值由脚本设定。可以指定的值有:ExceptionFail!表示错误处理失败(执行该值有可能触发应用的SystemError事件);ExceptionIgnore!表示忽略错误继续执行(要谨慎使用该取值,因为忽略错误有可能将再次导致其他错误);ExceptionRetry值只能用于OLE,对于数据窗口控件,没有该取值,该取值表示再次执行刚才造成错误的功能;ExceptionSubstituteReturnValue!表示使用参数returnvalue的返回值,而不是返回OLE服务器或数据窗口控件的错误代码,并且取消错误状态。

returnvalue:当Action指定为ExceptionSubstituteReturnValue!时返回该参数的取值。

*对于数据窗口控件来说,如果在运算数据或属性表达式时发生了错误,将进行如下的错误处理过程:

a.触发Error事件;

b.如果Error事件中没有脚本或者Action变量设置成ExceptionFail!,则触发应用的SystemError事件;

c.如果SystemError事件下也没有脚本,便会发生应用程序错误,然后终止应用程序。

所以,在该事件或者应用的SystemError事件下应该编写脚本。这样才不至于退出应用程序,使用户没有处理的机会,甚至录入了半天的数据连个保存的机会也没有了。

返回值:该事件没有返回值,也不在该事件中使用return语句。

◆ItemChanged

当某单元(行和列的交叉点叫做单元)编辑后(内容改变),光标要离开时触发该事件,如使用了Enter按钮、单击了Tab按钮、使用了光标键、在其他字段上单击了鼠标左键等。当编辑完一个单元的内容而没有离开该单元,这时数据窗口失去焦点,这种情况不会触发该事件(所以在LoseFocus事件中要使用函数AcceptText)。三个参数row、dwo和data的含义和EditChanged事件的三个参数完全相同。

返回值:可以使用return语句返回任意值。0表示接受刚刚修改的数据,该值是缺省值;1表示放弃刚才的修改,不允许焦点离开;2表示放弃刚才的修改,允许焦点离开。

*编辑框内容有变化并离开此编辑框时触发;注意:当editchanged事件下有代码,编辑框内容有变化且离开此编辑框时,不会触发此事件

◆ItemError

当某单元被编辑后光标要离开时,如果单元中的新数据不能通过有效性校验,则触发该事件。(同ItemChanged:当编辑完一个单元的内容而没有离开该单元,这时数据窗口失去焦点,这种情况不会触发该事件)该事件在ItemChanged事件之前触发,该事件触发就不能再触发ItemChanged事件了。该事件中的三个参数和ItemChanged事件中的三个参数完全相同。

返回值:可以使用return语句返回任意数值,0表示放弃修改的数据,并显示错误信息,焦点不离开该单元,该取值是缺省值;1表示放弃修改的数据但不显示错误信息提示,焦点不离开该单元;2表示接受刚刚修改的错误数据;3表示放弃刚刚修改的数据,并且焦点不离开该单元。

◆ItemFocusChanged

当焦点离开某单元时触发该事件(不管内容有没有改变)。该事件提供了row和dwo两个参数,含义和前面介绍的完全相同。可以使用return语句返回任意数值,0表示继续处理。

*不管编辑框中的内容有没有改变,离开编辑框时触发该事件,注意:当离开数据窗口时不触发

◆PrintEnd

当打印工作完成时触发该事件。参数PagesPrinted可以在脚本中直接使用,是一个long类型的变量,表示已经被打印的页数。

◆PrintPage

在数据窗口每页进行打印格式处理之前触发该事件。参数Copy和PageNumber在脚本中可以直接使用,表示该页要打印的份数和当前页的页号。返回值0表示不要跳过当前页,1表示跳过当前页。一般在该事件下编写脚本显示打印进度信息,例如:

st_1.text="正在打印第"+String(pageNumber)+ "页……"

也可以在该事件中决定是否真正要打印该页。例如,下面的脚本只打印偶数页码的页面:

If Mod(pagenumber,2) = 0 Then

return 0

Else

return 1

End If

◆PrintStart

数据窗口打印开始时触发该事件。该事件中的参数PagesMax是一个long型变量,表示将要被打印的总页数(不包括跳过的页)。返回0表示继续处理。

◆RetrieveEnd

当数据窗口检索完毕时触发该事件。参数rowcount是一个long型变量,表示检索完后检索到的记录数。

◆RetrieveRow

每检索到一条记录时都触发该事件。参数row是long类型变量,记录当前检索到的数据的序号。返回值0表示继续检索,1表示停止检索。检索大量数据之前可以设置中断标志,让用户在检索过程中可以停止检索。

◆RetrieveStart

当数据窗口的检索操作将要开始时触发该事件,该事件中没有参数。返回值0表示继续执行,该值是缺省值,1表示不执行检索,2表示在检索之前不清除数据行和缓存区。通常不在该

事件下编写脚本,即使编写脚本,一般也是利用返回值2的特性来控制检索操作不清除缓存区,这样可以将检索到的数据添加到数据窗口中,并且在数据窗口中保留检索之前的数据。

◆RowFocusChanged

当前行改变时触发该事件。CurrentRow参数是一个long类型变量,保存当前记录号。该事件下的典型编程是修改当前行标识,将当前行明显地标识出来,可以让用户清楚地知道要对哪行进行操作,在该事件和其他事件的配合下共同修改当前行标识。

*不管内容有没有改变,当前行改变时触发;在离开数据窗口时不触发

*RowFocusChanging:当前行改变前触发;参数currentrow触发前所在行,newrow触发后当前行;rowfocuschanged的currentrow等于rowfocuschanging的newrow

◆ScrollHorizontal

当使用光标键、Tab按钮、滚动条等等在数据窗口中进行水平滚动时触发该事件。很少在该事件上编写脚本。

◆ScrollVertical

当在数据窗口中使用光标键、滚动条、Tab键等进行上下滚动时触发该事件。通常在该事件中编写脚本来改变当前行。因为当上下滚动数据窗口时,如果当前行不在当前显示的区域内,则容易给用户造成错觉,可以在该事件中编写脚本将当前页面的第一行数据设置为当前行。使用Describe和uate函数可以实现该功能

◆SQLPreview

当执行函数Retrieve、ReselectRow和Update时,SQL语句要提交到DBMS,这时触发该事件。该事件的参数比较复杂。

request:取值为PreviewFunctionReselectRow!、PreviewFunctionRetrieve! 或PreviewFunctionUpdate!分别代表触发该事件的函数是ReselectRow、Retrieve和Update。SQLtype:引起该事件的SQL语句类型。取值为PreviewDelete!、PreviewInsert!、PreviewSelect!、PreviewUpdate! 分别表示是Delete 、Insert、Select、Update语句。

SQLsyntax:string类型,取值为提交到DBMS的SQL语句。

buffer:当前SQL语句所涉及到的数据所在的缓存区,取值为枚举型,Delete!、Filter!、Primary!分别表示删除缓存区、过滤缓存区和主缓存区。

row:long类型变量,表示该事件中涉及到的记录数。

返回值0表示继续处理,1表示停止处理,2表示处理下一个SQL请求。

◆UpdateEnd

当从数据窗口控件发送来的对数据库的修改都完成后触发该事件。该事件的三个参数RowsInserted、RowsUpdated、RowsDeleted都是long类型的变量,分别表示插入、修改和删除的记录数。

◆UpdateStart

在调用了update函数之后、开始修改之前触发该事件,该事件没有参数。返回值0表示继续处理,1表示停止修改。

◆LoseFocus

数据窗口失去焦点时触发。

该事件中编写脚本,主要是保证用户在数据窗口中最后输入的内容不丢失。数据窗口中的输入内容只有当焦点改变时才真正转交给数据窗口,否则只是保存数据窗口的编辑控件。脚本比较简单:this.AcceptText()

*GetFocus:数据窗口得到焦点时触发。

PB数据窗口一

【函数】

★SetTransObject

语法:dwcontrol.SetTransObject ( transaction )

功能:给数据窗口或者datastore控件dwcontrol设置事务对象transaction,缺省事务对象是SQLCA。

返回值:成功设置事务对象则返回1,执行过程中发生了错误则返回-1,有任意参数为Null 时返回Null。

语法:dwcontrol.Retrieve ( {, argument, argument . . . } )

功能:使用数据窗口控件的当前事务对象检索数据库中的数据。如果数据窗口控件对应的数据窗口对象定义了检索参数,则应该在该函数中指定检索参数,参数的个数和数据窗口对象的检索变量个数相等,对应的数据类型相兼容。

返回值:返回数据窗口控件主缓存区(PrimaryBuffer)中的记录数,如果检索数据时发生错误则返回-1,如果任意参数为Null则返回Null

*该函数的参数和数据窗口对象定义的参数的顺序要相同,类型要兼容。个数不能少于数据窗口对象定义的参数,即可以等于和多于数据窗口对象定义的参数,多的参数忽略。

★DeleteRow

语法:dwcontrol.DeleteRow ( row )

功能:删除数据窗口dwcontrol中的第row行数据,如果row为0则表示删除当前行的数据。返回值:执行成功则返回1,执行错误则返回-1,如果任意参数为Null则返回Null。

*该函数执行后只是将被删除的数据从数据窗口的主缓存区移放到Deleted缓冲区,在数据库中并没有真正删除数据,当正确执行了Update函数并且使用commit语句提交了事务后,才真正从数据库中删除该数据

★InsertRow

语法:dwcontrol.InsertRow ( row )

功能:在数据窗口dwcontrol的第row行前插入一行空白数据。当指定row为0时,表示在当前行之前插入一行空白数据。

返回值:返回插入的数据的行号,如果执行过程中发生错误则返回-1,如果任意参数为Null 则返回Null

★Update

语法:dwcontrol.Update ( { accept {, resetflag } } )

功能:提交数据窗口或者datastore中的数据。如果accept为True,表示在提交数据之前自动执行AccpetText函数,否则不执行该函数,该参数缺省为True;如果resetflag为True,表示数据提交后自动清除修改标识,该参数缺省为True。

返回值:执行成功则返回1,发生错误则返回-1,如果dwcontrol为Null则返回Null

语法:dwcontrol.AcceptText ( )

功能:该函数执行时,首先对当前编辑框中的内容进行对应字段的校验规则,能够通过校验规则,则保存在对应字段中,否则显示校验信息提示错误。需要执行该函数的原因是,当在某字段上的编辑框中输入内容而没有移动光标到别的字段上时,其他控件获得焦点,此时编辑框中的内容不能被保存到字段中,所以就应该在数据窗口失去焦点时执行该函数。

返回值:执行成功则返回1,执行过程中发生错误则返回-1,如果dwcontrol为Null则返回Null。

*该函数在数据窗口的ItemChanged事件中不起作用,因为项目改变是发生在接受编辑框中内容之后

★ModifiedCount

语法:dwcontrol.ModifiedCount ( )

功能:获取数据窗口或者Datastore中被修改过但还没有提交到数据库中的记录数。

返回值:返回long类型的数据窗口控件中被修改过的记录数,如果没有记录被修改过或者修改后都已经保存到了数据库中则返回0,执行过程中如果发生错误则返回-1,如果dwcontrol为Null则返回Null。

*该函数获得的修改过的记录数包括主缓存区和Filter缓存区的被修改过的和新添加到数据窗口中的记录数

★DeletedCount

语法:dwcontrol.DeletedCount ( )

功能:获取数据窗口控件或者datastore控件dwcontrol中被删除的记录数。

返回值:返回long类型的已经被删除但还没有提交到数据库中的记录数,如果执行过程中发生了错误则返回-1,如果dwcontrol为Null则返回Null,如果没有删除过记录则返回0

★RowsMove

它可以将数据从一个缓冲区移动到另外缓冲区中。该函数的语法是:

dwcontrol.RowsMove ( startrow, endrow, movebuffer, targetdw, beforerow, targetbuffer )

其中,dwcontrol是进行移动操作的源数据窗口;startrow和endrow是要移动数据的范围(包括这两个行号的数据);movebuffer指要从哪个缓存区移出数据,可以是Primary!、Delete!、

Filter!;targetdw是目标数据窗口控件名称;beforerow表示在目标数据窗口的哪一行之前插入移入的数据,如果该数值比目标数据窗口的行数大,则在最后插入移入的数据;targetbuffer 是目标缓存区,取值同movebuffer一样。

★GetItemStatus和SetItemStatus

使用函数dwcontrol. GetItemStatus_r( row, column, Primary! )可以获取该缓冲区内指定单元的状态,当参数column为0时,表示读取整个行的修改状态。有以下状态。

NotModified! :指定单元的数据和原始数据相同,没有修改过。

DataModified!:指定单元的数据和原始数据不同,修改过。

New!:该数据行是新增加的,但还没有在该行上输入数据。

NewModified!:该数据行是新增加的,并且已经在该行上录入了数据。

这些修改标识都是由数据窗口自动维护的,一般情况下没有必要编写脚本修改这些标记,但并不是说就不能修改。PowerBuilder提供了函数SetItemStatus,它的语法是:dwcontrol.SetItemStatus ( row, column, dwbuffer, status )

其中,row参数指定将要修改状态的行;column参数指定将要修改状态的列(可以是整型的列号,也可以是string类型的列名),当列号为0时表示要修改row指定的整行的状态;dwbuffer指定要修改哪个缓冲区(肯定不能是original),status为上面的四个取值中的一个,但不是任意的取值,因为有些状态不能用该函数设置成另外一种状态,必须是能够转换的状态。下面列出了能够转换的状态。

期望的状态New! NewModified! DataModified! NotModified!

当前状态

New! \ Yes Yes No

NewModified! No \ Yes New

DataModified! NewModified! Yes \ Yes

NotModified! Yes Yes Yes \

表中的Yes表示可以使用SetItemStatus进行该状态设置,No表示不会产生预期的状态,如果标明了某个特定的状态,则说明是新的状态,而不是期望的状态。例如,数据窗口dw_1的第1行第1列的当前状态为DataModified!,使用函数dw_1.SetItemStatus(1,1,New!)后,第1行第1列的状态改变为NewModified!。同样对于该数据窗口dw_1,如果使用函数

dw_1.SetItemStatus(1,1,NotModified!),则会将其状态改变为NotModified!。当从一种状态不

允许转变到另一种状态时,可以修改成其他一个中间状态,然后再进行一次转换。例如,要从new!改成NotModified,应该首先转换到DataModified!

★GetItemX

读取数据窗口中的数据

dwcontrol. GetItemX_r( row, column {, dwbuffer, originalvalue } )

其中的X可以替换成Date、DateTime、Decimal、Number、String、Time,所以读取数据的函数有6个。参数row表示要读取哪行的数据,是一个long类型数值。column代表列,可以是string型的列名,也可以是整型的列号。dwbuffer是DWBuffer枚举型,取值Primary!、Delete!、Filter!分别代表主缓冲区、删除缓冲区和过滤缓冲区。originalvalue为Boolean型,表示是否读取最近一次检索时检索到的初始值,当指定dwbuffer时必须指定该参数,该参数和dwbuffer都是可选的。函数正确执行则返回对应类型的数据,执行过程中发生错误则返回空值(""),任何参数为Null则返回Null

★SetItem和SetText

函数SetItem的语法格式是:

dwcontrol.SetItem ( row, column, value )

各个参数的含义如下。

dwcontrol:数据窗口或datastore控件名称。

row:要设置的数据所在行。

column:要设置的数据所在的列。可以用整型列号,也可以用string型列名。

value:要设置的值,应该和要设置的列的类型一致。

函数正确执行则返回1,这时数据窗口中row行column列显示的数据是刚刚用该函数设定的数据,如果函数执行过程中发生错误则返回-1。注意,该函数执行时仅仅检查函数中指定数据的类型和字段的类型是否一致,不会进行有效性校验,包括在数据窗口中设置的校验规则、在ItemChanged事件中编写的校验规则、在ItemChanged调用的校验规则都不会执行。函数SetText的语法格式是:

integer dwcontrol.SetText ( string text )

功能是设置当前编辑框中的内容。注意,当编辑框离开当前单元时要进行有效性校验,如果校验数据正确,则当前字段接受该数据,否则触发ItemError事件。所以,可以使用该函数

给带有校验规则的字段设置数据。

EG:

int li_i

dw_1.SetColumn("name") //使name列成为当前列

For li_i = 1 To dw_1.RowCount()

dw_1.SetRow(li_i) //使第I行成为当前行

dw_1.SetText("屁") //向当前编辑框中写入内容

Next

dw_1.SetColumn("sex") //选中性别列,保证最后一个也要通过校验规则

★SetColumn、SetRow和GetColumn、GetRow和GetClickedColumn、GetClickedRow和GetColumnName

设置当前列

integer dwcontrol.SetColumn ( string column)

integer dwcontrol.SetColumn ( integer column)

设置当前行

integer dwcontrol.SetRow ( long row )

得到当前列

integer dwcontrol. GetColumn_r( )

得到当前行

long dwcontrol. GetRow_r( )

得到用户单击的列

integer dwcontrol. GetClickedColumn_r( )

得到用户单击的行

long dwcontrol. GetClickedRow_r( )

得到当前列的名

string dwcontrol. GetColumnName_r( )

★SetFilter、Filter和Find

这两个函数必须配对使用,首先使用函数SetFilter设置过滤规则,然后用函数Filter进行过

滤。过滤规则是boolean类型的表达式,能够使用过滤规则的,将表达式为True的数据行显示在数据窗口中,使其为False的数据行被移送到数据窗口的Filter!缓存区。在设计数据窗口对象时也可以定义过滤规则,使用这两个函数可以根据需要来动态改变过滤规则。在设计时,指定了过滤规则的数据窗口可以使用这两个函数再进行过滤。每次过滤都是对数据窗口的Original!缓存区进行的,而不是在前一次过滤出来的数据基础上再次过滤。

函数SetFilter的语法是:

dwcontrol.SetFilter ( format )

其中,dwcontrol是要进行过滤的数据窗口控件名称。format是过滤规则,string类型。过滤规则是由字段、常量、运算符、函数构成的boolean表达式。需要取消过滤规则显示所有的数据时,可以指定过滤规则为空(""),如果让用户可以随便指定过滤规则,则可以使用Null 的过滤表达式,这时PowerBuilder提供一个和数据窗口设计时相同的过滤规则指定窗口。该函数正确执行返回1,否则返回-1。执行完后,数据窗口中显示的数据没有发生变化,只有当执行了Filter函数后才按照刚刚指定的过滤规则显示数据。

该函数的语法是:

dwcontrol.Filter ( )

dwcontrol是和SetFilter中同名的数据窗口控件名称。该函数执行正确则返回1,否则返回-1,如果dwcontrol为Null则返回Null。

函数Find也可以用来进行查询。该函数可以在数据窗口中的指定范围查找符合某些条件的数据。该函数的语法格式是:

dwcontrol.Find ( expression_r, start, end )

其中,dwcontrol是要进行查找的数据窗口控件名称,expression_r是表达式,含义和注意事项同SetFilter中的完全相同。start和end都是long类型变量,用行号表示的查找范围,它们之间没有大小约束。函数返回的是在指定范围内找到的第一个符合条件的记录号,如果没有找到或发生了错误则返回0,如果参数有Null的则返回Null

★SetSort和Sort

数据的排序可以在数据窗口对象设计时就指定排序规则,也可以在脚本中动态指定。使用函数SetSort和Sort可以完成这一任务,它们和SetFilter、Filter一样也必须配对使用。函数SetSort 设置排序的规则,不改变数据的显示,只有当执行了函数Sort时,数据才真正进行重新排列。

函数SetSort的语法是:

dwcontrol.SetSort ( format )

其中,dwcontrol为要进行排序的数据窗口控件的名称;format为排序规则,是string类型,由字段、函数、ASC或DESC、逻辑联结符、常数构成。可以使用字段名,也可以使用字段号来表示字段,字段号的格式是#X,其中X为正整数。该函数正确执行返回1,否则返回-1。和SetFilter函数类似,当指定format为空("")时,可以取消排序,当指定format为Null时,可以由用户指定排序规则。

使用函数SetSort后,再使用Sort函数才能重新排列数据。

该函数的格式是:

dwcontrol.Sort ( )

其中,dwcontrol是和SetSort中同名的数据窗口控件名称。该函数正确执行则返回1,否则返回-1,如果参数dwcontrol为Null,则返回Null。

★SelectRow

选中指定的行

dwcontrol.SelectRow ( row, boolean )

其中,dwcontrol是数据窗口控件的名称;row是行号,该参数为0则表示是对数据窗口中的所有数据行进行操作;boolean表示是否选中,如果是True,表示选中行号row的数据行,如果是False则取消。该函数正确执行返回1,发生错误返回-1,如果参数有Null则返回Null。

★PrintSetup、Print、PrintOpen、PrintDatawindow、PrintClose、PrintCancel

PrintSetup():

打印设置

PrintOpen():

启动打印作业

PrintOpen函数用来打开一个作业,并返回当前可以使用的打印作业号,该打印作业号可以标识当前的打印工作。该函数的语法是:

PrintOpen ( { jobname } )

如果发生错误,该函数返回-1。打印作业名称是可选的,名字在打印队列中。在打印作业的最后必须关闭打印作业,使PowerBuilder和Windows清除打印作业所占用的所有资源。因

此,每个启动作业的语句都有一个关闭作业的语句相对应。

PrintClose()、PrintCancel():

关闭打印作业

有两个函数可以用来关闭打印作业。PrintClose()函数把当前页传送给打印机,并关闭当前打印作业。语法格式为:

PrintClose(printjobnumber)

函数PrintCancel()取消打印作业并删除当前的打印文件。这个函数可以与Print或者PrintDataWindow()函数组合使用。用于PrintDatawindow()的语法是:DatawindowControl.PrintCancel()

用于Print()的语法是:

PrintCancel(printjobnumber)

PrintClose()函数和PrintCancel()函数是互相排斥的,成功调用过一个以后,不要在没有再次打开打印作业时调用另一个函数。

PrintDatawindow():

该函数是以单个打印作业的形式打印数据窗口控件中的内容。PowerBuilder使用数据窗口对象中定义的字体和布局进行打印。用这个函数可以在一个打印作业中打印多个数据窗口,但是每个数据窗口控件都从新的一页开始打印;如果要让几个数据窗口打印在同一页中,则需要利用底层的打印函数或将要打印在同一页中的数据窗口,创建成一个composite显示样式的数据窗口。PrintDatawindow函数的语法是:

PrintDatawindow(printjobnumber,datawindow)

其中,printjobnumber是PrintOpen函数返回的打印作业号,datawindow是要打印的数据窗口控件的名称。除了能够和Printopen()、PrintClose()函数共同使用外,其他函数都不能和PrintDatawindow共同使用。下面是一个完整地使用函数PrintDatawindow()进行数据窗口打印的例子,该例子中同时打印三个数据窗口:

Long ll_job

Ll_job = PrintOpen("数据窗口打印")

PrintDatawindow(ll_job,dw_1)

PrintDatawindow(ll_job,dw_2)

PrintDatawindow(ll_job,dw_3)

PrintClose(ll_job) //关闭打印作业

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_return

PB动态数据窗口

[PB]-动态数据窗口 〓创建动态数据窗口 若要动态创建数据窗口,需要使用函数Create,该函数的语法如下: dw_1.Create(syntax{,errorbuffer}) 其中,dw_1是数据窗口控件的名称,该数据窗口控件要和新创建的数据窗口对象相关联。syntax是用来描述创建数据窗口对象的确切语法的字符串。errorburrer是可选项,用来保存创建数据窗口对象过程中发生的错误信息。如果不指定该参数,就会在发生错误时显示一个错误信息的提示窗口。如果创建成功该函数返回1,否则返回-1,如果参数为null则函数返回null。 由于Create函数成功创建数据窗口对象后,要改变dw_1数据窗口控件所关联的数据窗口对象,因此,需要重新为数据窗口设置事务对象(使用函数SetTransObject或者SetTrans)。 获取创建数据窗口的语法有多种方法,可以对相关的SQL语句使用SyntaxFromSQL函数,也可以使用对已经创建好的数据窗口对象使用LibraryExport函数。因为创建数据窗口的语法比较复杂,即使使用了LibraryExport输出已有数据窗口对象的语法,操作起来也相当费劲。所以,更为通用的是前面一种方法。这种方法配合一定的编程技巧,让用户指定要创建的数据窗口对象的SQL语句,使用户有更多的自由和选择。使用这种方法,肯定用到函数 SyntaxFromSQL,它的语法是: transaction.SyntaxFromSQL(SQLselect,presetation,err) 其中,transaction是事务对象的名称,该事务对象必须正确地设置了相关参数,并且和数据库建立了联结。SQLselect是用来创建数据窗口的SQL语句,为String 类型。presentation是要创建的数据窗口对象的显示风格,为String类型。简单的格式是: Style(Type=presentationstyle) 其中Style和Type都是保留字,presentationstyle的取值有Tabular,Grid,Form,Graph,Group,Label和Nup,其中Tabular是缺省类型。err是用来保存函数执行时出错信息的string类型的变量。 *关于函数SyntaxFromSQL的参数presentation可以有更复杂的语法。其格式是:"Style ( Type=value property=value ... ) DataWindow ( property=value ... ) Column ( property=value ... ) Group groupby_colnum1 Fby_colnum2 ... property ... ) Text property=value ... ) Title ( 'titlestring' )" 使用这样的格式,可以详细定义要创建的数据窗口对象的外观。 〓在很多情况下都需要一个数据窗口控件和不同的数据窗口对象关联。可以通过修改数据窗口控件的dataobject属性来实现。在修改了这一特性之后,数据窗口控件就不再具有与它相关的事务处理对象了,应该再重新为数据窗口设置事务

PB中下拉数据窗口带参数应用

PB中下拉数据窗口带参数应用 在数据输入时,当用到下拉列表时,会发现有些数据是和别的数据相关的,这时我们会希望过滤掉那些不相关的数据。例如生成一个入库单,某种物料有多个供应商,我们要根据物料来过滤掉和这个物料不相关的供应商,这样会加快检索和输入的速度。 入库单表:billrec

1.以supply表,制作一个带参数的数据窗口,命名为d_supply_replace_list,参数列为item_id,字符型,隐藏物料代码列。 2.以billrec表,制作一个数据窗口,命名为billrec_maintain,将supply_id列的edit属性中的style type选定为DropDownDW,datawindow为d_supply_replace_list。 在窗口中放置数据窗口控件dw_1,将其与billrec_maintain数据窗口关联。 在窗口中定义实例变量datawindowchild idwc_child。 3.在dw_1的constructor事件中编写以下脚本: this.getchild("supply_id",idwc_child) //生成子数据窗口,supply_id为下拉列表列idwc_child.insertrow(0) idwc_child.settransobject(SQLCA) this.of_settransobject(SQLCA) this.insertrow(0) 4.在dw_1的itemchanged事件中编写以下脚本: long ll_getcolumn ll_getcolumn = this.getcolumn() //获得当前列 choose case ll_getcolumn case 7 //假设item_id列是第7列 dw_1.accepttext() is_id = dw_1.getitemstring(row,7) //获得物料代码 idwc_child.retrieve(is_id) //检索替代供应商 end choose 这样在输入不同的物料时,会像下图那样,只列出相关的供应商。

PB 数据窗口高级( DataWindow)应用37个技巧

PB 数据窗口高级( DataWindow) 37个技巧 1. 使DataWindow列只能追加不能修改 如何使DataWindow中的数据只能追加新记录而不能修改,利用Column 的Protect 属性可以很方便的做到这一点,方法如下: 将每一列的Protect 属性设置为: If( IsRowNew(), 0, 1) ) 在PowerScript 中可以动态修改Protect 属性: dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'") 这样,DataWindow 中只有新追加的记录可修改,而其他记录是只读的。 2 .如何在DataWindow中实现列的自动折行 我们在PowerBuilder应用程序的开发过程中, 使用DataWindow时, 经常会遇 到某列的数据太长, 不能同时全部显示的情况. 若采用自动水平滚动, 操作起 来又不够简便. 下面介绍一种方法, 实现列数据多行显示, 即实现列数据的自 动折行.具体步骤如下: 1) 在DataWindow Painter中打开此DataWindow.

2) 在需设定自动折行的列上双击鼠标, 弹开此列的属性窗口. 3) 选择Position标签, 选中Autosize Height 多选框. 4) 选择Edit标签, 不选中Auto Horz Scroll多选框. 5) 单击OK按钮, 保存所做的修改. 6) 点中Detail Band (即写有Detail的灰色长带), 单击鼠标右键, 选择Properties... 菜单项. 7) 选中Autosize Height多选框. 8) 单击OK按钮, 保存所做的修改. 9) 保存此DataWindow. 注意: 连在一起的汉字(中间没有标点或空格分隔), 系统将认为是一个单词, 不 会自动进行折行. 3. 在数据窗口中实现动画 要实现动画,必须要有定时器,在数据窗口中已经有了一个定时器,双击数据窗口将弹出的对话框,在Timer Interval中定义大于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。比如要改变某字段的背景颜色,可设 ackgound.color=RGB(Integer(Right(string(now(),'hhmmssf'),1))*256/10,In teger(Right(string(now(),'hhmmssf'),1))*256/10,0) 当然,您不仅可以改变背景颜色,而且可以改变字体等等任何属

PB数据窗口使用绝对技巧与方法

原文地址:PB数据窗口绝对技巧作者:千人急 1、如何让存储文件目录的列,显示图片? 答:选择对应的column的display as picture属性为true 2、如何复制grid类型的所选择的行的数据到系统剪切板? 答:string ls_selected ls_selected=dw_1.Object.DataWindow.Selected.Data clipbord(ls_selected) 4、如何设置的DW底色? 在DW的editsource中改变color的值 5、如何将Grid风格改成自由格式? 在DW的editsource中将processing=1的1改为0 6、要新建一个表A但风格和现有表格B风格一样,怎么将A表快速设置成表B 风格? 复制B表C,在C表的DW中的editsource中将表名和字段名改成A表的,即可 7、如何实现gird风格的datawindow的多栏表头? 答:添加 text到header带区,并设置band属性为foreground保存,edit source 修改text的x和width属性表达式如下: x="100~t integer(describe('firstcol.x')" width="100~tinteger(describe('lastcol.x')) - integer(describe('firstcol.x')) +integer(describe('lastcol.width')) 8、如何过滤dddw编辑风格的显示值为指定值的记录? 答: dw_1.setfilter("lookupdisplay('column_name')='"+ls_display_value_your +"'") dw_1.filter() 9、如何设置datawindow的某一列为空?

PB数据窗口绝对技巧

PB数据窗口绝对技巧 1、如何让存储文件目录的列,显示图片? 选择对应的column的display as picture属性为true。 2、如何复制grid类型的所选择的行的数据到系统剪切板? string ls_selected ls_selected=dw_1.Object.DataWindow.Selected.Data clipbord(ls_selected) 3:如何改变GRID数据窗口列位置(新手常见) 先preview,然后在预览窗口拖动位置即可。 4、如何设置DW的底色? 在DW的editsource中改变color的值。 5、如何将Grid风格改成自由格式? 在DW的editsource中将processing=1的1改为0。 6、要新建一个表A但风格和现有表B风格一样,怎么将A表快速设置成表B风格? 复制B表C,在C表的DW中的editsource中将表名和字段名改成A表的,即可。 7、如何实现gird风格的datawindow的多栏表头? 添加text到header带区,并设置band属性为foreground保存,edit source修改tex t的x和width属性表达式如下: x="100~t integer(describe('firstcol.x')" width="100~tinteger(describe('lastcol.x')) - int eger(describe('firstcol.x')) +integer(describe('lastcol.width')) 8、如何过滤dddw编辑风格的显示值为指定值的记录? dw_1.setfilter("lookupdisplay('column_name')='"+ls_display_value_your+"'") dw_1.filter() 9、如何设置datawindow的某一列为空? string ls_temp[] setnull(ls_temp) dw_1.object.columnname.primary.current=ls_temp 10、如何设置datawindow的单双行不同颜色间隔? 在detail带区的color属性表达式中写上if(mod (getrow(),2)=1 ,rgb(255,0,0),rgb(0,25 5,0)),如果是当前行以第三种颜色表示,表达式如下:if(getrow()=current(), rgb(255,0,0),if(m od(getrow(),2)=1 ,rgb(0,0,255),rgb(0,255,0))) 11、如何获取指定名称的datawindowobject? DWObject ldwo_use,ldwo_abc ldwo_use = dw_1.Object ldwo_abc = ldwo_use._ _get_attribute("t_1",FALSE)//t_1为datawindow中text对象的名称 12、如何缩放datawindow的打印大小?

PB]-子数据窗口操作

PB]-子数据窗口操作 PB]-子数据窗口 **通常的子数据窗口也就是下拉数据窗口。子数据窗口也是普通的数据窗口对象,没有什么特殊的地方,它的创建方法、可以使用的控件、编程时可以使用的函数等,都和普通的数据窗口相同。特殊的地方只是因为它放在了父数据窗口中,需要和父窗口进行配合。 **当为数据窗口中某字段指定为下拉数据窗口编辑风格时,必须提供以下三个属性: 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)有条件限制,不管是否可以更新。

PB的数据窗口操作

★SetTransObject 语法:dwcontrol.SetTransObject ( transaction ) 功能:给数据窗口或者datastore控件dwcontrol设置事务对象transaction,缺省事务对象是SQLCA。返回值:成功设置事务对象则返回1,执行过程中发生了错误则返回-1,有任意参数为Null时返回Null。 ★Retrieve 语法:dwcontrol.Retrieve ( {, argument, argument . . . } ) 功能:使用数据窗口控件的当前事务对象检索数据库中的数据。如果数据窗口控件对应的数据窗口对象定义了检索参数,则应该在该函数中指定检索参数,参数的个数和数据窗口对象的检索变量个数相等,对应的数据类型相兼容。 返回值:返回数据窗口控件主缓存区(PrimaryBuffer)中的记录数,如果检索数据时发生错误则返回-1,如果任意参数为Null则返回Null *该函数的参数和数据窗口对象定义的参数的顺序要相同,类型要兼容。个数不能少于数据窗口对象定义的参数,即可以等于和多于数据窗口对象定义的参数,多的参数忽略。 ★DeleteRow 语法:dwcontrol.DeleteRow ( row ) 功能:删除数据窗口dwcontrol中的第row行数据,如果row为0则表示删除当前行的数据。 返回值:执行成功则返回1,执行错误则返回-1,如果任意参数为Null则返回Null。 *该函数执行后只是将被删除的数据从数据窗口的主缓存区移放到Deleted缓冲区,在数据库中并没有真正删除数据,当正确执行了Update函数并且使用commit语句提交了事务后,才真正从数据库中删除该数据 ★InsertRow 语法:dwcontrol.InsertRow ( row ) 功能:在数据窗口dwcontrol的第row行前插入一行空白数据。当指定row为0时,表示在当前行之前插入一行空白数据。 返回值:返回插入的数据的行号,如果执行过程中发生错误则返回-1,如果任意参数为Null则返回Null ★Update 语法:dwcontrol.Update ( { accept {, resetflag } } ) 功能:提交数据窗口或者datastore中的数据。如果accept为True,表示在提交数据之前自动执行AccpetText函数,否则不执行该函数,该参数缺省为True;如果resetflag为True,表示数据提交后自动清除修改标识,该参数缺省为True。 返回值:执行成功则返回1,发生错误则返回-1,如果dwcontrol为Null则返回Null ★AcceptText 语法:dwcontrol.AcceptText ( ) 功能:该函数执行时,首先对当前编辑框中的内容进行对应字段的校验规则,能够通过校验规则,则保存在对应字段中,否则显示校验信息提示错误。需要执行该函数的原因是,当在某字段上的编辑框中输入内容而没有移动光标到别的字段上时,其他控件获得焦点,此时编辑框中的内容不能被保存到字段中,所以就应该在数据窗口失去焦点时执行该函数。 返回值:执行成功则返回1,执行过程中发生错误则返回-1,如果dwcontrol为Null则返回Null。 *该函数在数据窗口的ItemChanged事件中不起作用,因为项目改变是发生在接受编辑框中内容之后

pb数据窗口技巧

pb中datawindow常用技巧一 (2009-04-16 17:09:07) 转载▼ 分类:PowerBuilder 标签: 杂谈 pb中datawindow常用技巧一 1、如何让存储文件目录的列,显示图片? 答:选择对应的column的display as picture属性为true 2、如何复制grid类型的所选择的行的数据到系统剪切板? 答:string ls_selected ls_selected=dw_1.Object.DataWindow.Selected.Data clipbord(ls_selected) 4、如何设置的DW底色? 在DW的editsource中改变color的值 5、如何将Grid风格改成自由格式? 在DW的editsource中将processing=1的1改为0 6、要新建一个表A但风格和现有表格B风格一样,怎么将A表快速设置成表B风格? 复制B表C,在C表的DW中的editsource中将表名和字段名改成A表的,即可 7、如何实现gird风格的datawindow的多栏表头? 答:添加text到header带区,并设置band属性为foreground保存,edit source 修改text的x和width属性表达式如下:

x="100~t integer(describe('firstcol.x')" width="100~tinteger(describe('lastcol.x')) - integer(describe('firstcol.x')) +integer(describe('lastcol.width')) 8、如何过滤dddw编辑风格的显示值为指定值的记录? 答:dw_1.setfilter("lookupdisplay('column_name')='"+ls_display_value_your+"'") dw_1.filter() 9、如何设置datawindow的某一列为空? 答:string ls_temp[] setnull(ls_temp) dw_1.object.columnname.primary.current=ls_temp 10、如何设置datawindow的单双行不同颜色间隔? 答:在detail带区的color属性表达式中写上if(mod (getrow(),2)=1 ,rgb(255,0,0),rgb(0,255,0)),如果是当前行以第三种颜色表示,表达式如下:if(getrow()=current(), rgb(255,0,0),if(mod(getrow(),2)=1 ,rgb(0,0,255),rgb(0,255,0))) 11、如何获取指定名称的datawindowobject? 答:DWObject ldwo_use,ldwo_abc ldwo_use = dw_1.Object ldwo_abc = ldwo_use.__get_attribute("t_1",FALSE)//t_1为datawindow中text对象的名称12、如何缩放datawindow的打印大小? 答:dw_1.object.datawindow.zoom=150 or dw_1.object.datawindow.zoom=75 13、如何在已过滤后的数据基础上对datawindow进行过滤? 答: dw_1.setfilter(dw_1.describe("datawindow.table.filter")+your_join+your_new_filt er) dw_1.filter()

PB教程第九章 数据窗口与数据库

9.1 简介 在前面的内容当中,我们介绍了有关数据窗口的基本概念、功能和方法,下面我们将把使用数据窗口的一些高级技术介绍给大家。 这一章不需读者自己动手,因为需要用到很多的数据表格,这里没法都提供给读者,所以这一章只需要读者看明白就可以了,对于SCRIPT 中的语句,要是看不懂可以跳过,会在后面的章节中进行进一步的解答。 9.2 数据窗口与数据库 9.2.1 事务对象 我们知道事务对象在POWER BUILDER 当中占有非常重要的地位,POWER BUILDER的应用程序必须通过事务对象来实现与各种数据库的连接,所以在讨论数据窗口和数据库的关系之前,我们首先来介绍有关事物对象的基本内容。 在POWER BUILDER当中,要想对一个数据库进行操作,首先必须建立与这个数据库的连接。在一个POWER BUILDER数据库连接中,事务对象是一个特殊的不可视的对象,其功能就是为POWER BUILDER程序与数据库之间的通信提供一个通信区。事务对象当中定义了POWER BUI LDER用来与数据库进行连接的参数。在访问数据库之前,必须先建立一个事务对象,然后给这个事务对象的属性赋以合适的值,才能通过这个事务对象与数据库连接,完成所需的数据库操作。当一个应用程序开始运行时,POWER BUILDER 会自动创建一个名为SQLCA的默认全局事务对象。SQLCA是“SQL COMMUNICATIONS AREA”SQL通信区的缩写。可以在应用程序中使用这个默认的事务对象,也可以定义自己的事务对象。 POWER BUILDER提供了四条用来进行事务管理的语句 CONNECT:成功的CONNECT语句标志着一个事务的开始。在执行CONNECT语句之前,必须对一个已经存在的事务对象的用以连接DBMS的属性赋以合适的值。 DISCONNECT:这个语句标志着中止一个事务。 COMMIT:执行COMMIT将提交自该事务开始之后当前事务对数据库已做的所有尚未提交的更新操作。并开始一个新的事务。 ROLLBACK:执行ROLLBACK语句之后,当前事务已做的所有更新操作都将被撤消,并开始一个新的事务。 9.2.2 使用事务对象 有两种方法可以为一个数据窗口设置事务对象。 使用SETTRANS函数:SETTRANS函数将一个特定的事务对象拷贝到数据窗口控件的内部事务对象当中。在程序使用该函数的时候,数据窗口控件使用自己内部的事务对象并且根据需要

PB数据窗口基础

PB数据窗口 数据窗口控件-datawindow PB9.0提供了28个属性、35个默认事件、162个函数。注意与数据窗口对象的区分。 【其他】 ■脚本的执行效率 *尽量不要在RetrieveRow事件下编写脚本(包括注释)。 *如果数据窗口的DoubleClicked事件中编写了脚本,那么在数据窗口的C1icked事件中的脚本应该尽量短,否则双击事件中的脚本永远不可能得到执行。一般来说,Cliked中脚本的执行时间和两次击鼠标之间的间隔时间之和,不应该大于操作系统中所设定的鼠标双击时间间隔,否则双击事件永远不可能触发,双击时仅仅是接连两次触发c1icked事件。 *在数据窗口中录入数据时,事件EditChanged是触发频率最高的,每一个按钮都触发该事件;触发频率仅次于该事件的是ItemChanged事件和ItemFocusChanged,只要修改了单元中的内容,每次触发ItemFocusChanged事件都会触发ItemChanged事件。在这些事件下编写过长的脚本会非常影响录入工作的效率。同样,事件RowFocusChanged的触发频率也是相当高的。一般来说是可以避免在这四个事件中编写脚本的。 ■dw o参数使用 数据窗口的某些事件中可以使用一个称为dwo的变量,该变量保存数据窗口中的部分信息,用数据窗口的属性可以读取这些信息dwo.type:读取在dwo中保存的对象类型。对象类型可能有bitmap、button、column、compute、graph、groupbox、line、ole、ellipse、rectangle、roundrectangle、report、tableblob、text、datawindow(当用户没有单击特定对象时) https://www.360docs.net/doc/531823000.html,:column的列名 dwo.Primary[row]:column的数据 dwo.Selected:选中column的数据 ■数据缓冲区 数据窗口在运行时要创建四个缓冲区,分别是主缓冲区、删除缓冲区、过滤缓冲区和原始缓

PB 数据窗口数据导出到word文件中

PB 数据窗口数据导出到word,excel 博客分类: powerbuilder ExcelJ#Windows PB 数据窗口数据导出到word,excel, excel 可以自定义修改excel文档的列宽对齐方式,字体样式等 // dwsave2word 调用ole global type gf_exportdata2word from function_object end type forward prototypes global subroutine gf_exportdata2word (datawindow ad_datawindow) end prototypes global subroutine gf_exportdata2word (datawindow ad_datawindow);string ls_filepath ls_filepath=gf_getfilesavename() OleObject OleObjectWord OleObjectWord=Create OleObject // 连接word if OleObjectWord.ConnectToNewObject("Word.application") <> 0 then Messagebox("提示","ole连接错误!") return end if OleObjectWord.visible=false //word文档在操作数据过程中是否可见 Long col_colnum,col_rownum Constant Long wdTableBehavior=1 Constant Long wdAutoFitFixed=0 Constant Long wdCell=12 String str_value // 得到数据窗口数据的列数和行数(行数应该是数据行数+1) col_colnum=Long(ad_datawindow.object.datawindow.column.count) col_rownum=ad_datawindow.rowcount() + 1 // 先在word文档中画好表格 SetPointer(HourGlass!) OleObjectWord.Documents.Add

PB数据窗口对象

[PB]-数据窗口对象(一) //////////////////////////////////////// 数据窗口对象的数据源 ---------- PB提供5种数据源:Quick Select(快速选择类型)、SQL Select(SQL选择类型)、Query(查询类型)、External(外部类型)和Stored Procedure(存储过程类型) ---------- Quick Select 只能从一个数据表或者视图中选取数据(无关联的表或者视图)?? ---------- SQL Select 1、选择表 可以一次选择多个表 2、选择字段 Select All //选择所有字段 Select Tables //重新选择表 Convert to Syntax //进入SQL语法状态 Compute //计算字段,右键->Columns //选择字段 右键->Functions //选择函数 3、指定检索条件 Retrieval Arguments //定义检索参数变量的类型和名称 where //检索条件,右键->Columns //选择字段 右键->Functions //选择函数 右键->Arguments //选择参数 右键->Value //选择值 右键->Select //从其他表中选择 ---------- Query PB可以将特定的SQL语句保存为Query对象,不同的Query数据源的数据窗口都可以使用这些已经保存好的SQL语句来提取数据 ---------- External 当和不存在于数据库中的数据打交道或者要利用数据窗口的某些特性但不进行数据处理时,使用此数据源。无SQL语句。 ---------- Stored Procedure 使用已经定义好的存储过程来做数据源 ---------- //////////////////////////////////////// 数据窗口对象的显示样式 ----------

PB子数据窗口

[PB]-子数据窗口 **通常的子数据窗口也就是下拉数据窗口。子数据窗口也是普通的数据窗口对象,没有什么特殊的地方,它的创建方法、可以使用的控件、编程时可以使用的函数等,都和普通的数据窗口相同。特殊的地方只是因为它放在了父数据窗口中,需要和父窗口进行配合。 **当为数据窗口中某字段指定为下拉数据窗口编辑风格时,必须提供以下三个属性: 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)有条件限制,不管是否可以更新。 检索子数据窗口有两个时机,一个是在子数据窗口下拉时,另一个是在父数据窗

PB的数据窗口操作

ls1= dwo.Primary[row] ★SetTransObject 语法:dwcontrol.SetTransObject ( transaction ) 功能:给数据窗口或者datastore控件dwcontrol设置事务对象transaction,缺省事务对象是SQLCA。返回值:成功设置事务对象则返回1,执行过程中发生了错误则返回-1,有任意参数为Null时返回Null。 ★Retrieve 语法:dwcontrol.Retrieve ( {, argument, argument . . . } ) 功能:使用数据窗口控件的当前事务对象检索数据库中的数据。如果数据窗口控件对应的数据窗口对象定义了检索参数,则应该在该函数中指定检索参数,参数的个数和数据窗口对象的检索变量个数相等,对应的数据类型相兼容。 返回值:返回数据窗口控件主缓存区(PrimaryBuffer)中的记录数,如果检索数据时发生错误则返回-1,如果任意参数为Null则返回Null *该函数的参数和数据窗口对象定义的参数的顺序要相同,类型要兼容。个数不能少于数据窗口对象定义的参数,即可以等于和多于数据窗口对象定义的参数,多的参数忽略。 ★DeleteRow 语法:dwcontrol.DeleteRow ( row ) 功能:删除数据窗口dwcontrol中的第row行数据,如果row为0则表示删除当前行的数据。 返回值:执行成功则返回1,执行错误则返回-1,如果任意参数为Null则返回Null。 *该函数执行后只是将被删除的数据从数据窗口的主缓存区移放到Deleted缓冲区,在数据库中并没有真正删除数据,当正确执行了Update函数并且使用commit语句提交了事务后,才真正从数据库中删除该数据 ★InsertRow 语法:dwcontrol.InsertRow ( row ) 功能:在数据窗口dwcontrol的第row行前插入一行空白数据。当指定row为0时,表示在当前行之前插入一行空白数据。 返回值:返回插入的数据的行号,如果执行过程中发生错误则返回-1,如果任意参数为Null则返回Null ★Update 语法:dwcontrol.Update ( { accept {, resetflag } } ) 功能:提交数据窗口或者datastore中的数据。如果accept为True,表示在提交数据之前自动执行AccpetText函数,否则不执行该函数,该参数缺省为True;如果resetflag为True,表示数据提交后自动清除修改标识,该参数缺省为True。 返回值:执行成功则返回1,发生错误则返回-1,如果dwcontrol为Null则返回Null ★AcceptText 语法:dwcontrol.AcceptText ( ) 功能:该函数执行时,首先对当前编辑框中的内容进行对应字段的校验规则,能够通过校验规则,则保存在对应字段中,否则显示校验信息提示错误。需要执行该函数的原因是,当在某字段上的编辑框中输入内容而没有移动光标到别的字段上时,其他控件获得焦点,此时编辑框中的内容不能被保存到字段中,所以

PB动态创建窗口

动态创建数据窗口 在实际应用中,经常需要根据用户需求来动态创建数据窗,一般方法是这样的。 在一个window中加入一个数据窗控件,如dw_new,但是该数据窗没有data object,(空白的)就可以用以下语法来创建: dw_new.create(ls_syntax,ls_error) // 创建语法,错误信息 ls_syntax可以用以下三种方法来形成: 一、动态由sql语法创建: // 连接到pb的example数据库 string ls_sql,ls_syntax,ls_error ls_syntax = 'select * from department' ls_syntax = sqlca.SyntaxFromSQL(ls_sql,'style(type=grid)',ls_error) if len(ls_error) >0 then messagebox('Error','SyntaxFromSQL Error:~r'+ls_error) else dw_new.create(ls_syntax,ls_error) if len(ls_error) >0 then MessageBox("Error", "Create have these errors: ~r" + ls_error) else dw_new.settransobject(sqlca) dw_new.retrieve() end if end if 二、由另一个数据窗的syntax来创建 string ls_syntax,ls_error ls_syntax = dw_test.describe('datawindow.syntax') dw_new.create(ls_syntax,ls_error) if ls_error '' then messagebox('Create Error',ls_error) else dw_new.settransobject(sqlca) dw_new.retrieve() end if 三、读取psr文件来创建 string ls_syntax,ls_error,ls_ret ls_ret = char(13)+char(10) //回车键 int li_fileNum long li_length li_FileNum = FileOpen("efef.psr",Streammode!, read!, shared!, Replace!) if li_filenum >0 then FileSeek(li_FileNum, 158, FromBeginning!) li_length = fileRead(li_filenum,ls_syntax) end if

pb9中数据窗口saveas的XML特性

pb9中数据窗口的XML特性 2009-07-07 13:10 本文转自:https://www.360docs.net/doc/531823000.html,/wu_07/archive/2005/12/22/559362.aspx 一、原理 从pb9开始,DataWindow开始支持直接从XML文档中导入数据,将检索到的数据保存为XML文档,以及使用XSL格式对象(XSL-FO) 的新功能。本文根据XML Features in PowerBuilder? 9.0相关内容节选翻译。这是第一部分。 1、数据窗口导出引擎(DataWindow Export Engine) 它是数据窗口新增的组件,主要利用导出模板(Export Templates)作为基础结构来转换行数据到XML格式数据。引擎通过分析模板内容格式化数据,然后输出到XML形式。因为模板本身也是XML文档,所以它首先也需要被解析。导出引擎通过XML解析器(XML Parser)的服务来分析模板文件。在低层,XML解析通过C++和Apache Xerces实现,利用一个适配器接口(pbxerces90.dll)来访问Xerces解析器。 2、导出模板(Export Templates) 一个导出模板定义了数据窗口元素(DataWindow elements)和XML对应关系。 下面的数据窗口对象可以使用在导出模板: ? 列(Column) ? 计算列(Computed Column) ? 文本(Text Control) ? 计算域(Computed Field) ? 内嵌报表(Nested Report) 上面的数据窗口对象可以被映射到以下的XML构造 ? 元素(Element) ? 属性(Attribute) 注意:注释(comments)和处理指令(processing instructions)可以被添加到模板的任意部分,但是不能和其建立映射。CDATA可以被添加到任何元素之内,但是也不能被映射。内嵌报表(Nested Report)只能和元素建立映射,不能是属性。 当导出引擎分析XML模板内容时,根据模板中已经定义的映射关系,将元素映射到实际的数据窗口控件和它们的文本内容。在映射操作成功完成后,引擎将借助

相关主题
相关文档
最新文档