2023年11月27日发(作者:)

PB数据窗口

数据窗口控件-datawindow

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

【其他】

脚本的执行效率

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

*如果数据窗口的DoubleClicked事件中编写了脚本,那么在数据窗口的C1icked事件中的脚

本应该尽量短,否则双击事件中的脚本永远不可能得到执行。一般来说,Cliked中脚本的执

行时间和两次击鼠标之间的间隔时间之和,不应该大于操作系统中所设定的鼠标双击时间间

隔,否则双击事件永远不可能触发,双击时仅仅是接连两次触发c1icked事件。

*在数据窗口中录入数据时,事件EditChanged是触发频率最高的,每一个按钮都触发该事

件;触发频率仅次于该事件的是ItemChanged事件和ItemFocusChanged只要修改了单元中

的内容,每次触发ItemFocusChanged事件都会触发ItemChanged事件。在这些事件下编写

过长的脚本会非常影响录入工作的效率。同样,事件RowFocusChanged的触发频率也是相

当高的。一般来说是可以避免在这四个事件中编写脚本的。

■dwo参数使用

数据窗口的某些事件中可以使用一个称为dwo的变量,该变量保存数据窗口中的部分信息,

用数据窗口的属性可以读取这些信息:读取在dwo中保存的对象类型。对象类型

可能有bitmapbuttoncolumncomputegraphgroupboxlineoleellipserectangle

roundrectanglereporttableblobtextdatawindow(当用户没有单击特定对象时)

column的列名

y[row]column的数据

ed:选中column的数据

数据缓冲区

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

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

以介绍。

1、主缓冲区-Primary

这是最重要的一个缓冲区,保存的是当前显示在数据窗口中的所有数据以及它们的修改状

态。在保存数据时使用这些状态生成SQL语句。平常的大多数操作都是针对该缓冲区,函

数中的缓冲区参数缺省也是该缓冲区。

2、删除缓冲区-Delete

该缓冲区保存所有删除了的数据。保存数据时,该缓冲区中的数据用来产生delete语句。

数据没有提交到数据库之前,可以从该缓冲区中将数据恢复出来。数据提交后,该缓冲区中

的数据清空。

3、过滤缓冲区-Filter

该缓冲区中保存的是没有通过过滤规则的所有数据,这些数据在存储时同主缓存区的数据一

起生成相应的insertupdate语句。

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事件中编写如下脚本:

Text()

这个方法在很多情况下能解决该问题。美中不足的是,如果编辑框中的内容不能通过字段的

校验规则,有时会显示两次错误信息窗口。造成两个错误信息窗口,往往是在选择其他单元

时发生,在数据窗口失去焦点之前(如单击保存按钮等)只会显示一个错误信息窗口。用

户选择其他单元时,编辑框中的数据开始进行校验,不能通过校验规则,显示校验错误信息,

在显示校验错误信息时数据窗口失去焦点,触发数据窗口的LoseFocus事件执行AcceptText

函数,又一次显示校验错误窗口。

所以,显示两次校验错误窗口的原因是LoseFocus事件中的AcceptText函数造成的。可以想

法让该函数在这种情况下不执行。为此定义一个实例变量:

Boolean ib_accept = True

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

If ib_accept Then

Text()

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_t[row,column]

该语句的格式是:

[buffer[.whichvalue]][row,column]

dwcontrol是数据窗口控件名称。

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

初始值或当前值。

rowcolumn是要访问的单元所在的行号及列号。

objectdata是保留字,buffer是缓存区的名称,有DeletePrimaryFilter

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

设置:

使用函数

SetItem()

SetText()

【属性】

▲DataObject

数据源

▲Title

用来显示在数据窗口的标题条(TitleBar)上的一个字符串。建议该字符串要有一定的含义,

能够标明数据窗口的用途或者其中的数据的类别。该属性的缺省值none。当属性TitleBar

True时,该属性起作用。

▲Visible

是否显示数据窗口控件,缺省为True有时为了向其他数据窗口提供数据,除了使用datastore

控件外,还可以使用Visible属性为False的数据窗口。如果仅仅是为了处理数据,不赞成使

Visible属性为False的数据窗口,而应该使用Datastore对象,这样可以节省计算机资源,

提高处理效率。

▲Enabled

数据窗口控件是否可以获得焦点,缺省为True。可以在脚本中修改该属性以限制用户执行

了某些特定操作后再允许操作数据窗口。

▲TitleBar

是否显示标题条,缺省为False。使用该属性可以在数据窗口上部显示标题条,类似于窗口

的标题条。设置属性为True后,用户就能够拖动数据窗口。

▲ControlMenu

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

▲MaxBoxMinBox

是否显示最大和最小控制按钮,缺省为False。当属性TitleBarTrue时,该属性有效。属

TitleBarControlMenuMinBoxMaxBox共同控制数据窗口的外观是否像窗口的外观。

▲HscrollBarVscrollBar

这两个属性用来控制数据窗口控件的横向和纵向滚动条是否显示。设置为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表示停止处理。

*当选择和当前行不同的数据行时可以触发ItemFocusChangedRowFocusChanged事件,

当单击当前行的其他字段时可以触发ItemFocusChanged事件。DoubleClicked事件也可以触

发该Clicked事件。

DBError

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

SQLdbcodelong类型的错误代码,具体含义由DBMS指定。当DBMS没有指定错误代码

时,SQLdbcode提供4个错误代码,-1表示事务对象参数错误而不能联结到数据库,-2

示不能联结到数据库,-3表示因为其他用户的修改导致用来进行检索或修改的键值在数据

库中已经不存在而产生错误,-4表示向数据库中写blob对象时失败。

SQLerrtextstring类型,数据库指定的错误信息。

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

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

rowlong类型,导致错误的数据的行号。

返回值:可以用return语句任意指定返回什么数据。有特定含义的返回值是010表示

显示错误信息,1表示不显示错误信息。

DoubleClicked

鼠标左键在数据窗口控件中双击时触发该事件。该事件中的4个参数和Clicked事件中的名

称及含义完全相同,也可以直接在该事件的脚本中直接使用。

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

EditChanged

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

提供三个参数。

rowlong类型,当前编辑的行号。

dwoDWObject类型,正在编辑的对象。

dataString类型,当前编辑框中的内容。

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

*每次编辑时触发

Error

当数据窗口对象中的数据或者表达式错误时触发该事件,在分布式系统中联结发生错误时也

会触发该事件。DBError事件不同的是,该事件在没有和数据库交互时就有可能触发,

DBError事件触发时肯定和数据库发生了交互。通常在该事件中编写脚本,提供对错误的处

理。该事件提供了很多参数。

errornumberunsigned integer类型,由PowerBuilder指定的错误代码号。

errortextstring类型,由PowerBuilder指定的错误信息。

errorwindowmenustring类型,造成错误的脚本所在对象的父对象的名称。

errorobjectstring类型,造成错误的脚本所在的对象的名称。

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

errorlineunsigned 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)。三个参数rowdwodata的含义和

EditChanged事件的三个参数完全相同。

返回值:可以使用return语句返回任意值。0表示接受刚刚修改的数据,该值是缺省值;1

表示放弃刚才的修改,不允许焦点离开;2表示放弃刚才的修改,允许焦点离开。

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

容有变化且离开此编辑框时,不会触发此事件

ItemError

当某单元被编辑后光标要离开时,如果单元中的新数据不能通过有效性校验,则触发该事件。

(ItemChanged当编辑完一个单元的内容而没有离开该单元,这时数据窗口失去焦点,

种情况不会触发该事件)该事件在ItemChanged事件之前触发,该事件触发就不能再触发

ItemChanged事件了。该事件中的三个参数和ItemChanged事件中的三个参数完全相同。

返回值:可以使用return语句返回任意数值, 0表示放弃修改的数据,并显示错误信息,

焦点不离开该单元,该取值是缺省值;1表示放弃修改的数据但不显示错误信息提示,焦点

不离开该单元;2表示接受刚刚修改的错误数据;3表示放弃刚刚修改的数据,并且焦点不

离开该单元。

ItemFocusChanged

当焦点离开某单元时触发该事件(不管内容有没有改变)该事件提供了rowdwo两个参数,

含义和前面介绍的完全相同。可以使用return语句返回任意数值,0表示继续处理。

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

触发

PrintEnd

当打印工作完成时触发该事件。参数PagesPrinted可以在脚本中直接使用,是一个long类型

的变量,表示已经被打印的页数。

PrintPage

在数据窗口每页进行打印格式处理之前触发该事件。参数CopyPageNumber在脚本中可

以直接使用,表示该页要打印的份数和当前页的页号。返回值0表示不要跳过当前页,1

示跳过当前页。一般在该事件下编写脚本显示打印进度信息,例如:

st_="正在打印第"+String(pageNumber)+ "……"

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

If Mod(pagenumber,2) = 0 Then

return 0

Else

return 1

End If

PrintStart

数据窗口打印开始时触发该事件。该事件中的参数PagesMax是一个long型变量,表示将要

被打印的总页数(不包括跳过的页)。返回0表示继续处理。

RetrieveEnd

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

到的记录数。

RetrieveRow

每检索到一条记录时都触发该事件。参数rowlong类型变量,记录当前检索到的数据的

序号。返回值0表示继续检索,1表示停止检索。检索大量数据之前可以设置中断标志,让

用户在检索过程中可以停止检索。

RetrieveStart

当数据窗口的检索操作将要开始时触发该事件,该事件中没有参数。返回值0表示继续执行,

该值是缺省值,1表示不执行检索,2表示在检索之前不清除数据行和缓存区。通常不在该

事件下编写脚本,即使编写脚本,一般也是利用返回值2的特性来控制检索操作不清除缓存

区,这样可以将检索到的数据添加到数据窗口中,并且在数据窗口中保留检索之前的数据。

RowFocusChanged

当前行改变时触发该事件。CurrentRow参数是一个long类型变量,保存当前记录号。该事

件下的典型编程是修改当前行标识,将当前行明显地标识出来,可以让用户清楚地知道要对

哪行进行操作,在该事件和其他事件的配合下共同修改当前行标识。

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

*RowFocusChanging当前行改变前触发;参数currentrow触发前所在行,newrow触发后当

前行;rowfocuschangedcurrentrow等于rowfocuschangingnewrow

ScrollHorizontal

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

事件上编写脚本。

ScrollVertical

当在数据窗口中使用光标键、滚动条、Tab键等进行上下滚动时触发该事件。通常在该事件

中编写脚本来改变当前行。因为当上下滚动数据窗口时,如果当前行不在当前显示的区域内,

则容易给用户造成错觉,可以在该事件中编写脚本将当前页面的第一行数据设置为当前行。

使用Describeuate函数可以实现该功能

SQLPreview

当执行函数RetrieveReselectRowUpdate时,SQL语句要提交到DBMS,这时触发该事

件。该事件的参数比较复杂。

request:取值为PreviewFunctionReselectRow!PreviewFunctionRetrieve!

PreviewFunctionUpdate!分别代表触发该事件的函数是ReselectRowRetrieveUpdate

SQLtype引起该事件的SQL语句类型。取值为PreviewDelete!PreviewInsert!PreviewSelect!

PreviewUpdate! 分别表示是Delete InsertSelectUpdate语句。

SQLsyntaxstring类型,取值为提交到DBMSSQL语句。

buffer当前SQL语句所涉及到的数据所在的缓存区,取值为枚举型,Delete!Filter!Primary!

分别表示删除缓存区、过滤缓存区和主缓存区。

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

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

UpdateEnd

当从数据窗口控件发送来的对数据库的修改都完成后触发该事件。该事件的三个参数

RowsInsertedRowsUpdatedRowsDeleted都是long类型的变量,分别表示插入、修改和

删除的记录数。

UpdateStart

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

续处理,1表示停止修改。

LoseFocus

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

该事件中编写脚本,主要是保证用户在数据窗口中最后输入的内容不丢失。数据窗口中的输

入内容只有当焦点改变时才真正转交给数据窗口,否则只是保存数据窗口的编辑控件。脚本

比较简单:Text()

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

PB数据窗口一

【函数】

SetTransObject

语法:nsObject ( transaction )

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

SQLCA

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

时返回Null

Retrieve

语法:ve ( {, argument, argument . . . } )

功能:使用数据窗口控件的当前事务对象检索数据库中的数据。如果数据窗口控件对应的数

据窗口对象定义了检索参数,则应该在该函数中指定检索参数,参数的个数和数据窗口对象

的检索变量个数相等,对应的数据类型相兼容。

返回值:返回数据窗口控件主缓存区(PrimaryBuffer)中的记录数,如果检索数据时发生错

误则返回-1,如果任意参数为Null则返回Null

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

窗口对象定义的参数,即可以等于和多于数据窗口对象定义的参数,多的参数忽略。

DeleteRow

语法:Row ( row )

功能:删除数据窗口dwcontrol中的第row行数据,如果row0则表示删除当前行的数据。

返回值:执行成功则返回1,执行错误则返回-1,如果任意参数为Null则返回Null

*该函数执行后只是将被删除的数据从数据窗口的主缓存区移放到Deleted缓冲区,在数据

库中并没有真正删除数据,当正确执行了Update函数并且使用commit语句提交了事务后,

才真正从数据库中删除该数据

InsertRow

语法:Row ( row )

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

当前行之前插入一行空白数据。

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

则返回Null

Update

语法: ( { accept {, resetflag } } )

功能:提交数据窗口或者datastore中的数据。如果acceptTrue,表示在提交数据之前自

动执行AccpetText函数,否则不执行该函数,该参数缺省为True;如果resetflagTrue

表示数据提交后自动清除修改标识,该参数缺省为True

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

AcceptText

语法:Text ( )

功能:该函数执行时,首先对当前编辑框中的内容进行对应字段的校验规则,能够通过校验

规则,则保存在对应字段中,否则显示校验信息提示错误。需要执行该函数的原因是,当在

某字段上的编辑框中输入内容而没有移动光标到别的字段上时,其他控件获得焦点,此时编

辑框中的内容不能被保存到字段中,所以就应该在数据窗口失去焦点时执行该函数。

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

Null

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

内容之后

ModifiedCount

语法:edCount ( )

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

返回值:返回long类型的数据窗口控件中被修改过的记录数,如果没有记录被修改过或者

修改后都已经保存到了数据库中则返回0,执行过程中如果发生错误则返回-1,如果

dwcontrolNull则返回Null

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

窗口中的记录数

DeletedCount

语法:dCount ( )

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

返回值:返回long类型的已经被删除但还没有提交到数据库中的记录数,如果执行过程中

发生了错误则返回-1,如果dwcontrolNull则返回Null,如果没有删除过记录则返回0

RowsMove

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

ve ( startrow, endrow, movebuffer, targetdw, beforerow, targetbuffer )

其中,dwcontrol是进行移动操作的源数据窗口;startrowendrow是要移动数据的范围(

括这两个行号的数据)movebuffer指要从哪个缓存区移出数据,可以是Primary!Delete!

Filter!targetdw是目标数据窗口控件名称;beforerow表示在目标数据窗口的哪一行之前插

入移入的数据,如果该数值比目标数据窗口的行数大,则在最后插入移入的数据;targetbuffer

是目标缓存区,取值同movebuffer一样。

GetItemStatusSetItemStatus

使用函数dwcontrol. GetItemStatus_r( row, column, Primary! )可以获取该缓冲区内指定单元的

状态,当参数column0时,表示读取整个行的修改状态。有以下状态。

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

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

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

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

这些修改标识都是由数据窗口自动维护的,一般情况下没有必要编写脚本修改这些标记,

并不是说就不能修改。PowerBuilder提供了函数SetItemStatus,它的语法是:

mStatus ( 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_mStatus(1,1,New!)后,

1行第1列的状态改变为NewModified!。同样对于该数据窗口dw_1,如果使用函数

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

允许转变到另一种状态时,可以修改成其他一个中间状态,然后再进行一次转换。例如,要

new!改成NotModified,应该首先转换到DataModified!

GetItemX

读取数据窗口中的数据

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

其中的X可以替换成DateDateTimeDecimalNumberStringTime,所以读取数据的

函数有6个。参数row表示要读取哪行的数据,是一个long类型数值。column代表列,可

以是string型的列名,也可以是整型的列号。dwbufferDWBuffer枚举型,取值Primary!

Delete!Filter!分别代表主缓冲区、删除缓冲区和过滤缓冲区。originalvalueBoolean型,

表示是否读取最近一次检索时检索到的初始值,当指定dwbuffer时必须指定该参数,该参

数和dwbuffer都是可选的。函数正确执行则返回对应类型的数据,执行过程中发生错误则

返回空值(""),任何参数为Null则返回Null

SetItemSetText

函数SetItem的语法格式是:

m ( row, column, value )

各个参数的含义如下。

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

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

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

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

函数正确执行则返回1,这时数据窗口中rowcolumn列显示的数据是刚刚用该函数设定

的数据,如果函数执行过程中发生错误则返回-1。注意,该函数执行时仅仅检查函数中指定

数据的类型和字段的类型是否一致,不会进行有效性校验,包括在数据窗口中设置的校验规

则、在ItemChanged事件中编写的校验规则、在ItemChanged调用的校验规则都不会执行。

函数SetText的语法格式是:

integer t ( string text )

功能是设置当前编辑框中的内容。注意,当编辑框离开当前单元时要进行有效性校验,如果

校验数据正确,则当前字段接受该数据,否则触发ItemError事件。所以,可以使用该函数

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

EG

int li_i

dw_umn("name") //使name列成为当前列

For li_i = 1 To dw_nt()

dw_(li_i) //使第I行成为当前行

dw_t("") //向当前编辑框中写入内容

Next

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

SetColumnSetRowGetColumnGetRowGetClickedColumnGetClickedRow

GetColumnName

设置当前列

integer umn ( string column)

integer umn ( integer column)

设置当前行

integer ( long row )

得到当前列

integer dwcontrol. GetColumn_r( )

得到当前行

long dwcontrol. GetRow_r( )

得到用户单击的列

integer dwcontrol. GetClickedColumn_r( )

得到用户单击的行

long dwcontrol. GetClickedRow_r( )

得到当前列的名

string dwcontrol. GetColumnName_r( )

SetFilterFilterFind

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

滤。过滤规则是boolean类型的表达式,能够使用过滤规则的,将表达式为True的数据行

显示在数据窗口中,使其为False的数据行被移送到数据窗口的Filter!缓存区。在设计数据

窗口对象时也可以定义过滤规则,使用这两个函数可以根据需要来动态改变过滤规则。在设

计时,指定了过滤规则的数据窗口可以使用这两个函数再进行过滤。每次过滤都是对数据窗

口的Original!缓存区进行的,而不是在前一次过滤出来的数据基础上再次过滤。

函数SetFilter的语法是:

ter ( format )

其中,dwcontrol是要进行过滤的数据窗口控件名称。format是过滤规则,string类型。过滤

规则是由字段、常量、运算符、函数构成的boolean表达式。需要取消过滤规则显示所有的

数据时,可以指定过滤规则为空(""),如果让用户可以随便指定过滤规则,则可以使用Null

的过滤表达式,这时PowerBuilder提供一个和数据窗口设计时相同的过滤规则指定窗口。

该函数正确执行返回1,否则返回-1。执行完后,数据窗口中显示的数据没有发生变化,只

有当执行了Filter函数后才按照刚刚指定的过滤规则显示数据。

该函数的语法是:

( )

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

如果dwcontrolNull则返回Null

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

数据。该函数的语法格式是:

( expression_r, start, end )

其中,dwcontrol是要进行查找的数据窗口控件名称,expression_r是表达式,含义和注意事

项同SetFilter中的完全相同。startend都是long类型变量,用行号表示的查找范围,它

们之间没有大小约束。函数返回的是在指定范围内找到的第一个符合条件的记录号,如果没

有找到或发生了错误则返回0,如果参数有Null的则返回Null

SetSortSort

数据的排序可以在数据窗口对象设计时就指定排序规则,也可以在脚本中动态指定。使用函

SetSortSort可以完成这一任务,它们和SetFilterFilter一样也必须配对使用。函数SetSort

设置排序的规则,不改变数据的显示,只有当执行了函数Sort时,数据才真正进行重新排

列。

函数SetSort的语法是:

t ( format )

其中,dwcontrol为要进行排序的数据窗口控件的名称;format为排序规则,是string类型,

由字段、函数、ASCDESC、逻辑联结符、常数构成。可以使用字段名,也可以使用字段

号来表示字段,字段号的格式是#X其中X为正整数。该函数正确执行返回1否则返回-1

SetFilter函数类似,当指定format为空("")时,可以取消排序,当指定formatNull时,

可以由用户指定排序规则。

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

该函数的格式是:

( )

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

返回-1,如果参数dwcontrolNull,则返回Null

SelectRow

选中指定的行

Row ( row, boolean )

其中,dwcontrol是数据窗口控件的名称;row是行号,该参数为0则表示是对数据窗口中

的所有数据行进行操作;boolean表示是否选中,如果是True表示选中行号row的数据行,

如果是False则取消。该函数正确执行返回1发生错误返回-1如果参数有Null则返回Null

PrintSetupPrintPrintOpenPrintDatawindowPrintClosePrintCancel

PrintSetup()

打印设置

PrintOpen()

启动打印作业

PrintOpen函数用来打开一个作业,并返回当前可以使用的打印作业号,该打印作业号可以

标识当前的打印工作。该函数的语法是:

PrintOpen ( { jobname } )

如果发生错误,该函数返回-1。打印作业名称是可选的,名字在打印队列中。在打印作业的

最后必须关闭打印作业,使PowerBuilderWindows清除打印作业所占用的所有资源。因

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

PrintClose()PrintCancel()

关闭打印作业

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

印作业。语法格式为:

PrintClose(printjobnumber)

函数PrintCancel()取消打印作业并删除当前的打印文件。这个函数可以与Print或者

PrintDataWindow()函数组合使用。用于PrintDatawindow()的语法是:

ancel()

用于Print()的语法是:

PrintCancel(printjobnumber)

PrintClose()函数和PrintCancel()函数是互相排斥的,成功调用过一个以后,不要在没有再次

打开打印作业时调用另一个函数。

PrintDatawindow()

该函数是以单个打印作业的形式打印数据窗口控件中的内容。PowerBuilder使用数据窗口对

象中定义的字体和布局进行打印。用这个函数可以在一个打印作业中打印多个数据窗口,

是每个数据窗口控件都从新的一页开始打印;如果要让几个数据窗口打印在同一页中,则需

要利用底层的打印函数或将要打印在同一页中的数据窗口,创建成一个composite显示样式

的数据窗口。PrintDatawindow函数的语法是:

PrintDatawindow(printjobnumber,datawindow)

其中,printjobnumberPrintOpen函数返回的打印作业号,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) //关闭打印作业

Print()

该函数是一个通用的函数,可以用来打印PowerBuilder中许多可视对象。下面介绍打印数

据窗口时的语法,格式如下:

( { canceldialog } )

datawindowname为要打印的数据窗口控件名称,canceldialog是一个boolean型变量,指示

在打印时是否显示一个无模式的可以随时取消打印的窗口,该变量缺省为True。该函数正

确执行则返回1,执行过程中发生错误则返回-1

*虽然该函数和PrintDatawindow一样都可以打印数据窗口,但是它们之间是有区别的。Print

函数使用设置在数据窗口对象的打印规范来打印数据窗口,而PrintDatawindow函数使用打

印机当前的设置来打印数据窗口。

PB数据窗口二

〒获取数据窗口信息

※函数Describe

使用函数Describe可以获取数据窗口对象中的信息。该函数语法是:

be(propertylist)

其中,dwcontrol是数据窗口控件名称,propertylist是以空格分隔的特性或运算表达式列表,

它用来报告列与图形对象的属性值。表达式可以用特定行与列的值进行运算。Describe函数

返回的是一个字符串,该字符串是对指定属性的描述,不同的属性占用不同的行(不同属性

~n分隔)。如果有无效属性则返回该属性之前的属性取值和一个惊叹号(!)。如果某个

属性没有值,则返回一个问号(?)。

如:

dw_be(" s")

header~tdetail~tsummary~tfooter~nemp_id~temp_id

dw_be(" s")

!

dw_be(" ")

header~tdetail~tsummary~tfooter!

如果特性值容易引起混淆,例如,带有感叹号、问号、Tab键或换行符,这些符号在返回字

符串中将用引号括起来。为了测试这种情况,先给数据窗口中的标签name_t中输入内容为

name?,然后使用下面的语句:

dw_be("name_")

上面的语句显示"name?",这是因为如果值列表中的第一个值用引号引着,那么该特性列表

中的剩余值也用引号引着。

*标签name_taddr_t中分别输入内容为name?zjhz

dw_be("name_ addr_")-------"name?" zjhz

dw_be("addr_ name_")-------zjhz "name?"

*最后不显示空格(~n)

※对列的引用

在属性描述时,经常要对列进行引用。引用列的方法有两种,或者使用列名,或者使用列号。

应尽量避免使用列号,因为列号是和创建数据窗口时选择字段的顺序相对应的。在以后的修

改中很有可能取消某些字段或者调整字段的选择顺序,或者改变数据源,这时就很容易出现

错误,更糟糕的是这时很有可能没有错误信息,张冠李戴了。

下面是一个使用列号进行属性描述的语句:

dw_be("#e")

这种语法可以和函数getcolumn搭配使用,用来检索当前列号。下面是一个显示数据窗口中

所有字段类型的例程:

integer li_count,li_index

li_count = integer(dw_be(""))

for li_index = 1 to li_count

messagebox(string(li_index),dw_be("#" + string(li_index) + "coltype"))

next

※函数uate

在使用Describe描述数据窗口对象中的相关信息时,有一个非常重要的函数不能不掌握,

就是uate。虽然函数Describe可以获取对象的信息,但是表达式的取值就不能正常读取了,

而这又是经常遇到的。所以,函数uate非常重要,它可以使函数Describe获取表达式的取

值。该函数的语法是:

ute('expression_r',rowno)

其中,expression_r是属性表达式,rowno是要描述的行号。该函数放置在Describe的属性

列表中。例如,判断第3行的salary工资是否大于1000,如果大于则返回1,否则返回0

可以使用下面的语句:

dw_be("uate('if(salary > 1000,1,0)',3)")

而使用下面的语法就是错误的:

dw_be("if(salary > 1000,1,0)")

*单行(如第二行)

dw_be("uate('if(isnull(emp_no) or emp_no = '',~~'*~~',emp_no)',2)")

*多行

long ll_i

string ls_emp

for ll_i = 1 to dw_nt()

ls_emp = dw_be("uate('if(isnull(emp_no),~~'NULL~~',emp_no)'," + string(ll_i) + ")")

dw_m(ll_i,'emp_no',ls_emp)

next

※函数LookUpDisplay

字段使用了下拉列表框、下拉数据窗口和单选按钮等有代码表的编辑风格时,在数据窗口控

件上显示的值和字段实际得到的值并不相同,使用函数GetItemX只能读取这样的字段的真

实取值,而不是用户看到的值。如何才能读取用户看到的值?可以使用函数LookUpDisplay

LookUpDisplay函数不能直接从PowerScript调用,可以在Describeuate函数配合使用。

因为函数LookUpDisplay不能指定对哪行数据进行操作,它的参数只有一个字段名称,所以

必须和uate函数配合使用。该函数的语法是:

LookUpDisplay(columnname)

其中,参数columnname是字段的名称,而不是一个字符串。函数执行错误则返回空字符串。

下面是一个和函数GetItemString相比较的例子。假设在一个数据窗口中定义字段sex

编辑风格为DropDownListBox,定义该字段使用编码表,编码表的定义是显示值“Male”

“Female”分别对应。然后,在某个按钮的clicked事件中编写如下脚本:

messagebox("getitemstring:"+dw_mstring(1,"sex"),"lookupdispaly:"+dw_be("uate

('lookupdisplay(sex)',1)"))

::getitemstring:

::lookupdisplay:male

〒修改数据窗口信息

为了在运行时修改数据窗口对象特征,应该使用Modify函数,而不是直接访问语法。该函

数的语法如下:

(modstring)

其中,dwcontrol是数据窗口控件名称,既可以是数据窗口也可以是子数据窗口,还可以是

datastore对象。modstring是修改字符串,用来指示要修改哪些对象的哪些属性。如果修改

成功函数则返回空字符串,如果修改的语法错误则返回对错误的描述,格式是:line n Column

incorrect syntax,这里是第n列是从modstring开始计数的错误位置。

数据窗口对象可以在运行时使用合适的语法修改其外观、行为和数据库信息。通过提供完整

的对象规范,甚至可以在数据窗口对象内部创建和删除对象。

使用modstring参数可以指定CreateDestroyAttribute alteration三种类型的语句。

※创建对象

可以使用下面的语法来添加对象(如文本、计算域以及位图):

Create object(settings)

其中,settings为将要创建的对象定义的一组特性和值,定义对象时,用户必须提供足够的

信息。

想要得到某个对象的正确语法的最好的方法就是导出一个包含对象的简单的数据窗口。然后

就能把对象的语法剪切并粘贴到应用程序中。另一种办法是使用那些能成为数据窗口内特定

对象显示语法的许多工具之一(它们正变得越来越商业化)

下面的示例用来说明这种格式,假设用户刚刚从头开始动态地创建了一个完全新的数据窗

口,现在需要在标题头放置一个公司标志,其语法是:

string ls_modify,ls_result

ls_modify = "Create bitmap(band = background filename = 'c:' x = '60' y = '8' width =

'1308' height = '513' border = '0' name = logo)"

ls_result = dw_(ls_modify)

if ls_result <> "" then

messagebox("提示",ls_result)

end if

这段代码为用户刚刚创建的报表数据窗口在恰当的位置创建标识。

※删除对象

除了可以在数据窗口内创建对象外,还可以使用下面语法删除对象:

Destroy [Column] object

这里的object是数据窗口对象内要删除对象的名字。若要把列和列的数据从缓冲区中删除,

需要指定Column关键字。

例如,上一个示例中向动态创建的报表中添加了一个公司标志。如果用户把这一功能作为运

行时的选项,比如说通过复选框,那么就不仅需要能够创建对象而且还需要删除该对象。

面是用于删除的代码:

string ls_result

ls_result = dw_("destroy logo")

if ls_result <> "" then

messagebox("错误",ls_result)

※特性修改

Attribute alteration 类型的语句格式是modify三种格式中最常用的一种,这种语法的格式如

下:

ute = value

按照被影响的attribute的不同,value可以是下面类型中的任何一种:

a)常量:指简单的、不使用表达式的特性修改值。如:

= footer

b)带引号的常量:也是指简单的特性修改值。如:

= '65'

c)表达式:由一个默认值及其后的表达式组成,它的返回值与特性的数据类型相同。如:

'167725~tif(emp_status=~'A~',255,16777215)'

请注意这种表达式的格式。整个表达式括在单引号中,表达式需要缺省值,而且该值通过

Tab(~t)与余下的表达式隔开。表达式返回0或者1,它们是特性的有效值。

在实际使用时,这种格式的语句经常简单写成属性访问格式。如:

dw_("oval_ = rgb(255,0,128)")

和以下直接属性访问方式是等价的:

dw__ = rgb(255,0,128)

〒字段和计算域的属性-更多见帮助(DataWindow object properties)

*获取字段的类型(Coltype属性)

字段的ColType属性是一个非常有用的属性,使用该属性可以在程序运行时获取字段的类

型。但是不能在运行时修改该属性。下面是它的语法:

直接引用:dw_e

Describe函数中:"e"

不管使用哪种方式,对同一个字段获得的类型都相同。字段类型有char(n)datedatetime

decimal(n)intlongnumberrealtimetimestampulong11种,其中的n代表字

符的长度或者小数后的精度。

如:

ls_coltype = dw__e

ls_coltype = dw_be("emp_e")

在实际编程中,获取字段的类型后,紧接着使用choose case语句针对不同的类型进行相关

的处理。

*背景属性(ty

在运行时修改字段的背景,这是标识特殊数据行的一种手段。使用该属性可以在程序运行时

获取字段的背景,也可以修改字段的背景。它的语法如下:

直接引用:dw_ty

DescribeModify函数中:"ty{ ='value'}"

其中,property可以是color或者mode。当为color时取值应该是长格式表示的颜色,或者

使用RGB函数中红、绿、蓝表示的颜色;当为mode时,0表示将背景设置为不透明的(即

可以显示背景颜色),1表示背景为透明的。

实际上,字段的背景属性也可以在数据窗口画板中进行设定。下面是修改和读取字段背景属

性的实例:

//修改字段的背景颜色

dw__ = rgb(255,0,128)

dw_("emp_ = '11665407'") //这里好象不能用rgb()

//读取字段的背景颜色

ls_data = dw_be("oval_")

//读取字段的背景模式

ls_data = dw_be("emp_")

//设置字段的背景模式

dw_("emp_ = '1'")

dw_("mdrect_ = '0'")

*指定检索规则(ty属性)

在脚本运行时,可以控制是否显示检索规则窗口或者读取数据窗口这方面的信息。语法如下:

直接引用:dw_ty

describemodify函数中:"ty{ = value}"

其中,dw_1是数据窗口控件名称,columnname是要获取或者设置检索规则的字段名称,value

yes或者noproperty是以下属性:

a)Dialog:是否显示检索规则窗口。取值为yes则显示,取值为no则不显示。如,在一个数

据窗口中放置了字段name,可以编写如下脚本:

dw_(" = yes de_edit = yes")

dw_ve()

脚本运行,显示检索规则输入窗口

b)override_edit是否用户必须在检索规则窗口中输入数据。取值为yes则用户必须输入数据,

取值为no时用户可以不输入数据。

c)required是否用户只能使用等号进行查询。如果取值为yes则用户的输入只能是等号,

果取值为no则用户可以使用各种符号,包括=<>>>=<=<等。

*Edit风格的字段属性(ty属性)

编辑风格为Edit类型的字段,可以通过ty来获取其相关信息或者设置其外观及动

作。下面是它的语法:

直接引用:dw_ty

describemodify函数中:"ty{ =value}"

其中,columnname是哟啊读取或者设置属性的字段名称,value根据property不同而可以使

用不同类型的值。property可以有17个取值,其中:

a)和滚动控制有关的有AutoHScrollAutoVScrollHscrollBarVscrollBar,它们的取值都

yes或者no,表示是否显示该滚动条。

b)和显示的内容有关的属性有CaseCodeTableFormatNillsNullPassword,这些属性

用来控制字段中的内容如何显示。Case的取值为AnyUpperLowerPainter,表示不管

用户在该字段上输入的大小写,都按照该属性自动进行转换。CodeTable的取值为yes或者

no,表示该字段是否有代码表。Format规定对用户输入的内容进行格式化时应该采用的格

式。NillsNull的取值为yes或者no,表示当用户在字段中不输入内容而离开该字段时,是

否将该字段中的内容自动置为NULLPassword属性的取值也是yes或者no,表示是否将

用户的输入作为密码样式显示,如果作为密码则用户的输入内容作为*号显示,显示的个数

和用户输入字符个数相等。

c)和编辑控制有关的属性有AutoSelectDisplayOn1yFocusRectangleLimitRequired

StyleValidateCode,除了Limit取值为正整数、Stylee取值为String类型外,其他属性的

取值都是yes或者noAutoSelect属性表示当字段获得焦点时是否自动选中该单元中的内容。

Display0nly表示是否允许用户修改该字段中的内容,如果取值为yes,则用户虽然可以选中

该字段中的内容但是不能修改。FocusRectangle表示当字段获得焦点时是否显示矩形的边框,

以表示当前焦点的位置。Limit是一个相当重要的属性,用来限制用户可以输入字符的长度。

Required属性如果为yes,则在获得焦点后用户不输入内容就休想离开。虽然该属性可以很

好地保证非空字段不为空,但该属性非常不友好,建议慎重使用。Style属性在程序运行时

不能修改,只能读取其中的信息。该属性返回的是关于字段的编辑风格。ValidateCode属性

表示是否使用代码表进行有效性校验。该属性当CodeTable属性为yes时才有效。

下面是关于该属性的一些实例:

ls_setting = dw__croll //是否允许自动横向滚动

ls_setting = dw_be("emp_croll") //同上

dw__ed = "no" //将字段设置成必须输入的字段

dw_("emp_ed = no") //同上

*字段的显示格式(Format属性)

可以使用Format属性来指定字段的显示格式。但是,在实际编程中使用更多的是函数

GetFormat或者SetFormat,以取代Modify或者Descrie来设置字段的显示格式。

该语法使用时的重点在于格式串的使用。下面是相关的语法:

直接引用:dw_

在函数describemodify中:"{='value'}"

其中,objectname是字段或者计算字段或者计算域的名称value是字符型的表达式,取值是

一种格式串。下面是一些使用实例:

ls_setting = dw_ //读取字段的电话显示格式

ls_setting = dw_be("")

dw_ = "yyyy-mm-dd" //设置日期格式

dw_(" = 'yyyy-mm-dd'")

*设置数据窗口修改时的主键(key属性)

该属性在一个数据窗口修改多个表时非常有用,因为这时必须根据要修改的表动态修改主

键,属性key就可以实现该功能。该属性使用时的语法如下:

直接引用:dw_

在函数modify或者describe中:"{=value}"

其中,columnname是要作为主键的字段名,或者是要判断是否为主键的字段的名称;value

取值为yes或者no。如:

ls_setting = dw_ //判断字段empid是否为主键

ls_setting = dw_be("")

dw_ = "yes" //将字段empid作为主键

dw_(" = yes")

*字段名称(name属性)

使用name属性可以获取字段的名称。可以使用字段号或者字段名称来标识一个字段,但使

用字段号不太安全,所以用获取字段名比较好一些。语法如下:

直接引用:dw_

在函数describe中:""

其中,objectname是要获取名称的控件标识,因为在数据窗口对象中有很多控件有多种标识

方法。如,下面可以获取字段号为1的字段的名称:

dw_be("#")

*字段中的数据保护(protect属性)

该属性表示是否对字段中的数据进行保护,取值为0或者11表示实行保护,0表示不保

护。当进行数据保护时,即使字段的TabOrder值大于0用户也不能对字段进行编辑,并且

该字段都不能获得焦点(和TabOrder取值为0时的表现完全相同)。下面是该属性使用时

的语法:

直接引用:dw_t

在函数describemodify中:"t{='integer'}"

其中,columnname是要获取或者设置protect属性的字段的标识,integer取值为0或者1

下面是使用实例:

ls_setting = dw__t //获取字段emp_startprotect属性取值

ls_setting = dw_be("emp_t")

dw__t = 1 //设置字段emp_startprotect属性

dw_("emp_t = 1")

dw_("emp_t = '1~tif(isrownew(),0,1)'")

//设置protect属性为表达式,含义是:如果是新数据行则将protect设置为0,否则设置为

1//,缺省为1

*字段的滑动属性(slideleftslideup

使用字段的滑动属性可以更好地根据运动时的情况安排数据的布局。有两个和滑动有关的属

性,SlideLeft表示当左面空白时是否向左滑动,SlideUp表示当上面出现空白时是否向上滑

动。使用该属性的语法是:

直接引用:

dw_eft

dw_p

在函数describemodify中:

"eft{='value'}"

"p{='value'}"

其中,slideleft中的value取值为yes或者noslideup中的value取值为:

a)AllAbove:当上面数据行中的所有 对象都为空时向上滑动

b)DirectlyAbove:当上面和本对象对应位置的对象为空时向上滑动

c)No:不进行滑动

下面是应用的实例:

dw__p = 'no'

ls_setting = dw_be("graph_p")

dw_("emp_p = no")

*字段的TabOrder值(TabSequence属性)

字段的TabOrder值是一个比较重要的属性,取值大于0时用户可以编辑该字段,等于0

无法编辑该字段。在运行时,根据程序的运行情况有可能动态修改字段的TabOrder值,这

时可以使用TabSequence属性。该属性应用时的语法如下:

直接引用:dw_uence

在函数modifyDescribe中:"uence{=number}"

其中,number为从032000的正整数,当为0时表示字段不允许编辑。下面是使用实例:

ls_setting = dw__uence //获取字段的TabOrder

ls_setting = dw_be("emp_uence")

dw__uence = 10 //设置字段的taborder

dw_("emp_uence = 10")

实际上,在编程时经常使用函数SetTabOrder来设置或者获取字段的TabOrder值,因为该函

数正确执行后,字段被设置成指定的TabOrder值,并且返回设置之前的TabOrder值。

*用户是否可以保存字段内容(update属性)

当数据窗口中的数据提交时,可以修改的字段及其对应的数据用来产生update SQL语句,

使用该SQL语句进行数据的保护。所以,在程序运行时,如果不希望用户保存某字段中的

数据,可以修改字段的update属性。下面是该属性的语法:

直接引用:dw_

在函数modify或者describe中:"{=value}"

其中,value的取值为yes或者no。下面是使用实例:

ls_setting = dw__ //获取字段是否可以修改

ls_setting = dw_be("emp_")

dw__ = "no" //使字段emp_name不能修改

dw_("emp_ = no")

在应用时,可以根据用户的权限,或者根据用户的录入数据是否齐全(通常需要保证数据一

致性)来动态修改某些字段的update属性。另外,在一个数据窗口修改多个数据表时也经

常使用该属性。

*字段校验(ValidationValidationMsg属性)

字段的校验规则在数据窗口画板中可以指定,但有时需要在程序运行时动态地修改,可以使

ValidationValidationMsg属性来指定。属性Validation使用时的语法如下:

直接引用:dw_tion

在函数describemodify中:"tion{='validationstring'}"

其中,validaionstring是一个包含校验规则的字符串,该字符串的结果或者是True或者是

False。下面是使用实例:

ls_setting = dw__tion //获取字段的校验规则

ls_setting = dw_be("emp_tion")

dw_("tion = 'sex = ~~~'f~~~' or sex = ~~~'m~~~''") //设置规则

dw_tion="sex='f' or sex='m'"

字段的校验规则设置好后,用户在该字段上输入数据并要离开时,如果数据不能通过校验则

显示错误信息,采用系统缺省的错误信息不太友好。这时,可以通过设置validationgMsg

性来指定错误信息。该属性使用时的语法如下:

直接引用:dw_tionMsg

在函数describeModify中:"tionMsg{='string'}"

其中,string为数据不能通过校验规则时要提示的信息。如:

dw_tiongmsg = "性别必须为f或者m!"

实际上,当用户输入的数据不能通过校验规则时将触发数据窗口控件的itemerror事件,该

事件的返回值可以决定是否显示错误信息提示窗口。如果在itemerror事件中也编写了错误

信息提示脚本,该脚本能够正常执行并且用validationgmsg属性定义的错误信息也会显示。

*计算域的属性

计算域除了具有上面介绍的属性外,还有一个重要属性expression_r。使用这个属性可以根

据用户的执行情况来更好地调整程序的动作,下面是其使用时的语法:

直接引用:dw_sion_r

在函数modifydescribe中:"computename,expression_r{='string'}"

其中,computename是计算域的名称,string是字符串,它应该包含合法的表达式。如:

ls_setting = dw__sion_r //获取表达式

ls_setting = dw_be("comp_sion_r")

dw__sion_r = "avg(salart for all)" //设置表达式

dw_("comp_sion_r = 'avg(salary for all)'")

Button重要属性

*Action属性

该属性是Button控件最重要的一个属性。在数据窗口画板中,可以选择一个按钮有哪个动

作。可选的动作都是事先定义好的,开发人员没有机会精确定义某个动作的执行,只能在运

行时动态改变按钮的动作。

可以在设计时指定按钮的动作。在按钮属性窗口的General属性页,下拉列表框Action

中可以选择可用的动作。

在程序运行时可以使用Action属性来获取或者修改按钮的动作。该属性使用时的语法如

下:

直接引用:dw_

在函数DescribeModify中:"{='value'}"

其中,buttonname是要获取或者设置动作的按钮的名称;value是动作代码,可以是下拉列

表框Action中的值。

代码 动作 解释 返回值

11 AppendRow 在最后增加一空白行 新增加行的行号

3 Cancel 取消使用了yield函数的检索过程 0

10 DeleteRow 如果按钮在detail带中则删除按钮 成功返回1,否则-1

,否则删除当前数据行。

9 Filter 显示Filter对话框, 过滤掉的数据行数。

并在指定条件后进行检索 如果发生错误则返回小于0的数

12 InsertRow 如果按钮在detail带中,则以按钮 新插入行的行号

所在行为参数插入数据,否则在当

前行插入一空白行

6 PageFirst 翻到第一页 成功返回1,否则返回-1

7 PageLast 翻到最后一页 最后一页中第一行的行号。

如果失败则返回-1

4 PageNext 翻到下一页 同上

5 PagePrior 翻到前一页 同上

16 Preview 进入、退出预览状态 0

17 PreviewWithRulers 打开或者关闭标尺 0

15 Print 打印一份数据窗口 0

20 QueryClear 删除where子句 0

18 QueryMode 进入、退出查询模式 0

19 QuerySort 指定查询时的排序规则 0

2 Retrieve 从数据库中检索数据 检索到的记录数

1 Retrieve(Yield) 从数据库中检索数据,并随时允许 检索到的记录数

用户终止

14 SaveRowsAs 以用户指定的格式保存数据 记录数

8 Sort 显示排序窗口并按指定规则排序成功则返回1,否则-1

13 Update 将修改了的数据保存到数据库。修成功则返回1,否则-1

改成功则自动执行commit,否则执

rollback

0 UserDefined 允许为按钮的ButtonClicked 用户脚本中定义的返回值

ButtonClicking事件编写脚本

*SuppressEventProcessing属性

SuppressEventProcessing属性用于是否触发ButtonClicked事件或者ButtonClicking事件。

语法格式是:

直接引用:dw_sseventprocessing

在函数describemodify中:"sseventprocessing{='value'}"

其中,value的取值为yes或者no,表示是否触发事件。如:

dw_.b_sseventprocessing = 'yes'

dw_("b_sseventprocessing = 'no'")

ls_setting = dw_be("b_sseventprocessing")

*Text属性

通过Text属性可以获取或者设置按钮上的文字。当运行时,如果要动态修改按狃的Action

属性,就应该利用Text属性修改。该属性使用时的语法如下:

直接引用:dw_

在函数modifydescribe中:"{='string'}"

其中,string是一个字符串或者表达式,如果要给按钮设置快捷键,可以在字符串中使用&

符号。如:

ls_setting = dw__ //获取按钮上的文字

ls_setting = dw_be("text_")

dw__ = "employee &Name" //给按钮设置文字,并有快捷键

dw_("text_ = 'employee &Name'")