版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PB函数
1.MessageBox
函数作用:显示一个信息提示窗口。该窗口中的标题、图标、内容和按钮都可以通过参数指
定。提示窗口的样式如图1所示。清楚了提示窗口的构成,非常有利于记忆该函数的语法。
函数语法:MessageBox(title,text{,icon{,button{,default}}})
..Title:窗口标题,String类型的数据。如果该参数取值为Nul1,则不显示提示窗口。
..Text:窗I」中要显示的内容,String类型的数据。如果该参数取值为Null,则不显示提示窗II。这两
个函数是必需的,使用更多的参数可以提供更多的控制。
..Icon:窗I」中显示的图标的样式,为枚举类型的数据。可.用的类型和对应的图标样式如表
序号枚举取值图标样式
1Information!
2StopSign!
3Exclamation!
4Question!
5None!
..Button:显示哪些命令按钮,枚举类型。nJ•用的取值有:
0K!
OKCancel!
YesNo!
YesNoCancel!
RetryCancel!
AbortRetryIgnore!
..Default:希望成为缺省命令按钮的编号。最左侧按钮的编号为1,往右依次加1。
返|N|值:如果执行成功,则返回用户选择的命令按钮的编号(1,2或者3);执行失败则返叫T;如果仃
参数为Null,则函数返回Null。
代码实例:
例子1,最简单的用法:
MessageBox('提示','数据保存成功。')
例子2,3个参数的:
MessageBox('提示'按回车键将关闭系统...StopSign!)
例子3,多个命令按钮的:
integerli_flag
li-flag=MessageBox('提示','数据尚未保存,是否继续关闭窗口?',&
Question!,YesNo!,2)
Choosecaseli_flag
Case1〃选择'是、继续关闭窗口
Return0
Case2〃选择'否L不再关闭窗口
Return1
Endchoose
2.SetFocus
函数作用:指定的控件或拧对象获得焦点。获得焦点的对象或者标题栏为蓝色,或者控件有
明显的边框。Drawing类型的对象不能获得焦点,所以不能在line、Oval>RectangleRoundRectangle
等控件上使用该函数。
函数语法:objectname.SetFocus()其中,ObjectName是要设置焦点的控件或者对象的名称。返回值:
如果执行成功,则返回L执行错误返回T。如果对象Objectname为Null,则返回Null。
代码实例:
例子1,窗口上:wmain.SetFocus()
例子2,命令按钮:cb_save.SetFocus0
例子3,数据窗口:dw_l.SetFocus()
3.TriggerEvent
函数作用:触发指定对象的指定事件,并且立即执行该事件中的脚木。注意该函数和PostEvent的区别。
PostEvent不是立即执行,TriggerEvent是立即执行触发事件的脚本。
函数语法:objectname.TriggerEvent(event{,word,long})
..objectname:PB中任何对象或者控件,只要有可以触发的事件就可以。
..event:要触发的事件。可以是枚举类型或者String类型。PB提供的事件可以使用枚举或者String类
型来表示,比如Clicked!或者'Clicked'都可以代表Clicked事件;自定义的用户事件只能使用String
来表示。需要注意的是,这里的事件应该提供了脚本。
..word:该参数不是必需的。当需要传递数据给被触发的事件时使用word和long参数。这两个参数都可
以传递long类型的数据,但是参数long还可以传递string类型的数据,而该参数仅能传递long类型的。
如果使用了该参数,在被触发的事件中使用Message.WordParm接收传递过去的数据。如果不使用该参数传
递数据而是使用参数long进行传递,则将该参数设置为Oo
..long:该参数也不是必须的,用来传递long或者string类型的数据。使用Message.LongParm接收传
递的数据。当传递string类型的数据时,对象Message.LongParm中保存的是所传数据的存储地址,必须
使用string(XX,'address')来读取该地址中的string类型数据。
返回值:Integer类型。如果返回1,表示该函数执行成功:如果指定事件中没有脚本或者函数执行错误,
则返回-1。当任意参数为Null时,函数返叫Null。
代码实例:
例子1,触发缺省事件:
cb1.TriggerEvent(Clicked!)
等价于:
cb1.TriggerEvent("Clicked”)
例子2,触发用户自定义事件:
wmain.TriggerEvent("ueopen")
例子3,传递信息和接收信息:
wmain.TriggerEvent("ue_open",0,'test')
在用户自定义事件ue_open中接收数据:
stringls_msg
1s_msg=String(Message.LongParm,address')
例子4,传递long数据:
wmain.TriggerEvent(<ue_open,,100,0)
在用户自定义事件ue_open中接收数据:
longll_msg
11_msg=Message.WordParm
4.Close
函数作用:关闭指定的窗口,并且释放窗口以及窗口上控件所占用的资源。该函数执行时,首先执行窗口
的CloseQueu事件脚本,然后关闭窗口,然后执行该函数所在事件中的其它脚本。一定注意这个顺序。窗
口关闭后,窗口中的属性、控件、实例变量等都不可用。执行了该函数后,如果希望还能够阻止窗口的关
闭,可以在窗口的CloseQuery中返回1。
函数语法:Close(windowname)
..windowname:要关闭的窗口的名称。
返回值:Integer类型。如果返回1,表示该函数执行成功;如果函数执行错误,则返回
当任意参数为Null时,函数返回Null。
代码实例:
例子1,以下代码在命令按钮'关闭'的Clicked事件中,执行会发生错误:
close(parent)
messageboxCJ,this,text)〃控件已经不可用,该语句执行错误。
例子2,以下代码在窗口的CloseQuery事件中,当执行函数Close之后触发该事件,如果用户回答为‘No'
则取消关闭:
IFMessageBoxC关闭','真的要关闭吗?Question!,YesNo!)=2THEN
〃如果选择'No',则停止关闭
RETURN1
ENDIF
5.SQLCA
6.connect;
7.Open
函数作用:打开指定的窗口。如果希望同一个窗口打开多个,则只能使用语法格式二。
函数语法:格式一:Open(windowvar{,parent})
格式二:Open(windowvar,windowtype(,parent})
..windowvar:要打开的窗口名称,可以是在Window画板中设计的窗口的名称,也可以是指定类型的窗口
变量。
..windowtype:一个String类型的变量,取值是已经设计好的窗II的名称。使用该参数,直到程序运行
的时候才确定要打开的窗口,所以可以提高程序的灵活性。
..parent:当windowvar参数指定的窗I」是ChiId或者Popup类型时,应该指定一个窗II作为当前windowvar
的父窗口。如果不指定父窗口,则最近打开的窗口作为当前打开窗口的父窗口。
返1"|值:如果执行成功,则返回1,执行错误则返回-1,任何参数为Null,则返回Null。
代码实例:
例子1,格式一:
open(wmain)
例子2,格式一:
w_mainlw_ToOpen1
wjnainlw_To0pen2
Open(1w_ToOpen1)〃打开窗口w_main
Open(lw_To0pen2)〃再打开一个wjnain窗口
例子3,格式一:
Open(w_msg,w_main)〃打开窗口wjnsg,并且将wjnain设置为它的父窗口
例子4,格式二:
Stringls_ToOpen
Windowlw_WinToOpen
selectwinnameinto:ls_ToOpenwhereywmc=:ls_ywmc;
Open(lwWinToOpcn,IsToOpen)〃根据业务名称打开窗口
例子5,格式二:
windowwstockwin[]
stringw_stock_type[4]
wstock_type[l]=stock_wine〃
w_stock_type[2]=,,w_stock_scotch,/
\v_stock_type[3]二"wstockbeer”
w_stock_type[4]=〃w_stock_soda”
FORn=1to4
Open(w_stock_win[n],w_stock_type[n])
NEXT
8.haltclose
9.ProfileString
函数作用:从指定的配置文件中获取String类型的数据。配置文件按照节、关键字来组织。学习该函数,
首先应该熟悉配置文件的格式。可以在你的计算机中随便查找一个后缀为ini的文件,打开观察一下文件
的格式。以下是典型的配置文件格式:
[database]
dbms=sycenterpriseserver
logid=sa
其中,database为*section*(节),dbms为(键),sycenterpriseserver是键dbms的取值。
和该函数语法类似的还有PorFilcInt,用来从配置文件中读取Integer类型的数据:函数SetProfileString
用来设置配置文件。
函数语法:ProfileString(filename,section,key,default)
..filename:配置文件的名称,可以包含完整的路径信息。如果没有指定路径信息,则使用操作系统的搜
索路径查找指定的配置文件。不区分大小写。
..section:从配置文件的指定节中读取信息。不区分大小写。
..key:要读取信息的键名称。不区分大小写。
..default:当指定的filename、section、key中任意一个没有找到时,或者读取的数据不能转换成string
类型时,函数则返回该参数指定的数据。
返回值:String类型的数据,最长为4096个字节。如果能够正确读取指定配置文件中、指定节的、指
定键的取值,则返回该键的取值,否则返回参数default指定的数据;如果执行错误,则返回'';如果任
意参数为Null,则返回Null。
代码实例:
例子1:
ifProfileString("C:\PROFILE.INI","Department","Name","None")&
="Marketing“thenOpen(wmarketing)
例子2:
sqlca.dbms=ProfileString("setup.ini","database","dbms","None")
10.Disconnect
11.IsRowModified
函数作用:该函数是数据窗口对象函数,不能在PowerScript中直接使用。该函数用来判断指定数据行的
数据是否被修改过,通常只在Detail节中使用该函数。经常在计算域中使用该函数,根据返回值决定计算
域中显示的内容;也可以为列的某属性设置表达式,使用该函数,比如设置列的背景颜色时使用该函数,
可以让修改过的数据和没有修改过的显示不同的背景颜色。
函数语法:IsRowModified((rowno})
..rowno:可选参数,要判断数据是否修改过的数据行的行号。如果省略该参数,则用来判断计算列所在
的数据行。
返回值:Boolean类型。如果数据修改过,则返回True,否则返回False。
代码实例:
例子1:
IsRowModified0
上面代码等价于:
IsRowModified(GetRowO)
12.IsRowNew
函数作用:该函数是数据窗口对象函数,不能在PowerScript中直接使用。该函数用来判断指定数据行的
数据是否是新数据行,通常只在Detail节中使用该函数。经常在计算域中使用该函数,根据返回值决定计
算域中显示的内容;也可以为列的某属性设置表达式,使用该函数,比如设置列的背景颜色时使用该函数,
可以让新增加的数据行和老的数据行显示不同的背景颜色。
函数语法:1sRowNew({rowno})
..rowno:可选参数,要判断数据是否新增加的数据行的行号。如果省略该参数,则用来判断计算列所在
的数据行。
返回值:Boolean类型。如果是新增加的数据行,则返回True,否则返回False。
代码实例:
例子1:
IsRowNedwO
上面代码等价于:
IsRowNew(GetRow())
13.数据窗口中的if函数
函数作用:根据条件表达式的取值,返回特定的参数。
函数语法:If(boolean,truevalue,falsevalue)
..boolean:返回值为Boolean类型的表达式。
..truevalue:当参数boolean取值为True时,函数if返回该参数的取值,可以是任意标准数据类型。
但是,具体类型根据该表达式所在位置而定。比如,该表达式是在字段的protect属性上,则该参数取值
为0或者1应该是合理的。
..falsevalue:当参数boolean取值为False时,函数if返回该参数的取值,可以是任意标准数据类型。
但是,具体类型根据该表达式所在位置而定。注意,该参数的数据类型和truevalue的数据类型应该是一
致的。
返回值:返回值类型为参数truevalue或者falsevalue类型的数据,返回值或者是truevalue或者是
falsevalue«两个参数的类型是相同的。
代码实例:
例子1,设置背景颜色。如果数据行修改过,则背景设置为红色,否则设置为灰色:
if(lsRowModified(),rgb(255,0,0),rgb(192,192,192))
例子2,设置数据行的修改状态。用下面的表达式创建一个计算列:
if(IsRowNewO,,新',if(isRowModified(),'改','旧'))
14.error
15.ChooseCase
16.insertrow
函数作用:在指定的数据窗口控件或者DataStore中插入一条数据。如果列定义了缺省值,则在显示新插
入的数据行之前自动设置这些列的缺省值。该函数仅仅新插入一行新数据行,不会改变当前数据行,并且
也不会改变数据窗口中数据行的显示情况。如果要改变当前数据行,或者跳转到新的数据行,则需要调用
函数SetRow
或者ScrollToRowo
函数语法:longdwcontrol.InsertRow(longrow)
..dwcontrol:要插入数据的数据窗口控件、DataStore或者子数据窗口。
..row:在该数据行之前插入新的数据行。如果希望在最后插入数据,则将该参数设置为0即可。
返1"|值:long类型,新插入的数据行的行号。如果执行错误,则返回-1;如果任意一个参数为Null,则
返回Null,
代码实例:
例子1,在当前数据行之前插入一行数据:
dw1.InsertRow(dwl.GetRowO)
例子2,在最后插入数据行,并且跳转到新插入的数据行:
long1l_newrow
llnewrow=dwemployee.InsertRow(0)
dwemployee.ScrollToRow(llnewrow)
17.setitem
函数作用:给指定的数据窗口或者Datastore中的、指定单元设置数据,通过行和列来确定哪个单元。该
函数直接修改缓冲区中的数据,而不是针对显示界面进行修改,修改成功之后,数据窗口控件上会自动反
映出最新的内容来。而函数SetText则针对显示界面进行修改,如果能够通过字段的校验规则,才能够进
入到数据窗口对应的缓冲区中。注意这两个函数的区别。
函数语法:integerdwcontrol.SetItem(longrow,integercolumn,anyvalue)
integerdwcontrol.Set!tern(longrow,stringcolumn,anyvalue)
..dwcontrol:要设置数据的数据窗口控件、DataStore或者子数据窗口的名称。
..row:要设置数据的行,为long类型。
..column:要设置数据的列,可以是string类型的列名称,也可以是integer类型的列号。
..value:要设置的数据。类型根据数据列而定,两拧的数据类型应该保持一致。
返回值:integer类型,1表示函数执行成功,T表示函数执行失败。如果有任意一个参数为Nul1,则
函数返回Null。
代码实例:
例子1,下面脚本在第一行的hire_date列中设置数据:
dworder.SetItem(1,〃hire_datc〃,1993-06-07)
例子2,当用户在数值类型的字段中输入内容,然后又删除后要离开该单元时,数据窗口尝试着将‘‘赋
值给该单元,这时会导致内容不能通过校验规则而产生错误。解决的办法就是在数据窗口控件的ItemE仃or
事件中编写下面的脚本:
integerli__Null
Stringls_type
ls_type=This.Describe(dwo.name+,.ColType*)
ls_type=Left(Lower(Trim(ls_type)),3)
choosecasels_type
casedec,int,Ion,num,rea,ulo
This.SetItem(Row,integer(dwo.ID),li_Null)
endchoose
return2
18.Print
函数作用:将数据窗口或者DataStore中的数据作为一个打印任务发送到打印机。使用这里的语法格式进
行数据窗口打印,将自动创建打印任务。在该函数执行后、将要将数据发送到打印机时触发Printstart事
件,每打印完一页后都会触发PrintPage事件,打印完毕后触发PrintEnd事件。在这些事件中如何控制打
印,可以参阅这些事件的相关帮助。
函数语法:integerdwcontrol.Print({booleancanceldialog})
..dwcontrol:要打印的数据窗II、DataStore或者子数据窗口。
..canceldialog:boolean类型,表示是否显示一个非模式的对话框,在该对话框
中用户可以取消正在打印的任务。取值为True表示显示该对话框,取值为False表示不显示该对话框。当
打印DataStore中的数据时,该参数必须为False,或者可以省略该参数。
返回值:如果函数执行成功,则返回1,否则返回T。任意参数为Null则返回Null。
代码实例:
例子1,打印数据窗口dwj中的内容:
dw_l.Print()
19.CloseWithReturn
函数作用:关闭窗口,并且将要返网的数据存储在Message对象中。只有Response类型的窗口才能使用该
函数关闭。使用该函数的目的,是将Response窗口中的处理情况返回给打开该窗口的对象,根据返回信息
决定下一步的处理。执行该函数后,首先执行窗口的CloseQuery事件脚本,然后关闭窗口,然后执行该函
数所在事件中的其它脚本。•定注意这个顺序。窗口关闭后,窗口中的属性、控件、实例变量等都不可用。
执行了该函数后,如果希望还能够阻止窗口的关闭,可以在窗口的CloseQuery中返回1。
函数语法:CloseWithReturn(windowname,returnvalue)
..windowname:要关闭的窗口的名称。
..returnvalue:当窗口关闭时,将该数据保存在Message对象中。返回的数据类型可以是String、Numberic
或者PowerObject,分别用Message对象的StringParmsDoubleParm和PowerObjectParm来接收对应类型
的数据。需要注意的是,控件和用户对象是通过引用方式进行传递的,窗口关闭后这些对象也就不存在了,
所以接收到这些对象也没有意义。只能返回这类对象的相应属性。如果需要返回多个值,可以使用结构类
型的变量。
返回值:integer类型,如果执行成功则返回1,否则返回任意参数为Null则返回Null。
代码实例:
例子1,以下脚本在命令按钮‘关闭’的Clicked事件中:
CloseWithReturn(Parent,s1e_Emp1oyeeName.text)
例子2,在窗IIw_main的自定义事件ue_openpost中,打开response类型的登录窗II,并根据用户的登
录情况决定是否关闭:
Stringls_msg
Open(wlogin)
ls_msg=Message.StringParm
ifls_msg<><success,thenhalltclose
20.数据窗口中的Lower函数
函数作用:将给定字符串中的所有字符都转换成小写。该函数的执行不会影响到作为参数的变量中的内容。
函数语法:Lower(string)
..string:要转换成小写的字符串。
返l>i|值:string类型,如果执行成功则返|“|和参数string对应的、大写字符都变成相应小写字符的一
个字符串,如果执行失败则返回一。
代码实例:
例子1,以下代码返回'baberuth':
Lower(,zBabeRuth")
21.SetTransObject
函数作用:为数据窗口或者DataStore指定一个事务对象。必须通过事务对象,PowerBuilder才能够和数
据库进行通信,才能够进行数据处理。这里的事务对象是基于程序的事务对象,可以对数据库事务进行更
多的控制。在程序中,通过SQL语句中的Connect、Rollback、Commit等进行事务的控制。使用该事务对
象,可以为PB应用程序建立一个和数据库的永久性联结,在数据窗口或者DataStore每次进行Retrieve
或者Update前不必再临时建立联结,而建立联结是比较费资源的一种操作,所以使用该函数可以提供更好
的程序执行性能。在调用该函数之前,应该设置事务对象的各个参数。缺省的事务对象SQLCA,是一个
Transaction类型的全局变量,可以在PB应用程序中直接使用。也可以定义我们自己的事务对象。和该函
数类型的还有SetTrans,两者的区别是:SetTransObject不能对事务进行自动控制,都是由程序来控制的;
使用函数SetTrans时程序不能控制事务对象,这时的事务都是自动控制的。使用事务对象按照如下步骤进
行:
1)设置事务对象的参数,根据DBMS的不同而不同,可以在DBProfile对话框的Preview中找到语法。
这些教本通常在Application的Open事件中编写;
2)使用SQL语句Connect联结数据库。通常也是在Application的Open事件中编写该教本。需要注意的
是,一定要检查是否联结成功。可以通过SQLCA.SQLCode来判断,如果SQLCA.SQLCode等于1则表示联结
成功。如果联结不成功,则不应该继续允许。
3)调用SetTransObject函数,为数据窗口对象设置事务对象。通常在窗口的Open事件或者数据窗口的
Constructor事件中编写。
4)在调用函数Update之后,检查返回值是否为1,如果是1则使用事务语句Commit提交数据,否则调
用RolIback回退事务。
函数语法:integerdwcontrol.SetTransObject(transactiontransaction)
..dwcontrol:要设置事务对象的DataWindow、子数据窗口或者DataStore的名称。
..transaction:事务对象名称,是Transaction类型的变量。
返回值:integer类型,1表示成功,如果发生错误则返回T,如果任意参数为Null则返回Null。
代码实例:
例1:以下脚本在窗口的Open事件中编写:
dw_l.SetTransObject(SQLCA)
例子2:以下脚本在数据窗口的Constructor事件中编写:
This.SetTransObject(SQLCA)
例子3:以下教本在Application对象的Open事件中编写:
//ProfileMpxt
SQLCA.DBMS=ProfileString(,setup,ini','database*,*DBMS')
SQLCA.AutoCoinmit=False
SQLCA.DBParm=ProfileString(,setup.ini','database'DBParm')
connect;
ifsqlca.sqlcode=0then
Open(w_main)
else
MessageBox(*错误','不能和数据库建M连接。按任意键关闭系统',StopSign!)
haltclose;
endif
22.Retrieve
函数作用:为DataWindow或者Datastore检索数据。在使用该函数之前应该执行过函数SetTransObject
或者SetTrans,为数据窗口设置过事务对象。该函数执行之前,首先将数据窗口中已有的数据清除掉,然
后将数据库中的数据检索到数据窗II中。所以,如果希望将检索到的数据追加到数据窗口中,需要编写程
序。在数据窗口对象的RetrievcStart事件中返回2,即可防止清除掉数据窗口中的已有数据。
函数语法:longdwcontrol.Retrieve({anyargument,anyargument...})
..dwcontrol:数据窗口、DataStore或者子数据窗口。
..argument:可选参数,根据数据窗口对象中的定义而定。参数的个数和数据类型应该和数据窗口对象中
的定义保持一致。
返回值:数字类型,表示函数执行完之后数据窗口中显示出来的数据行数。注意,该返回值不表示检索
到的数据行数。有两点,Retrievestart中是否编写了脚本、数据窗口对象定义中是否指定了过滤规则。
如果数据窗口对象中定义了过滤规则,检索完成后自动将不符合过滤规则的数据移动到数据窗口的Filter
缓冲区中,函数的返回值则是检索到的总数据行数扣除移动到Filter缓冲区的数据行数。需要注
意的是,只有数据窗口对象中定义的过滤规则影响Retrieve函数的返回值,函数SetFi1ter和Fi1ter并
不影响。
代码实例:
例1:下面的程序根据Retrieve函数的返回值显示提示信息。
long11_rows
dwmain.SetTransObject(SQLCA)
1l_rows=dwmain.RetrieveO
IF1l_rows<1THENMessageBox("错误","没有检索到数据。
例2:带参数的检索。
数据窗口对象的SQL语句如下:
SELECTName,emp.sal,sales,rgnFromEmployee,Sales
WHEREemp.sal>:an_Salaryandsales,rgn=:as_Region
其中,anSalary和as_Rcgion为检索参数,分别为数值型和字符型。可以使用下面的语法检索数据:
dw_l.Retrieve(50000,〃NW〃)
23.SetFilter
函数作用:为DataWindow或者DataStore指定数据过滤规则。通常在调用该函数前使用函
数Retrieve将数据检索到客户端,该函数可以决定检索到客户端的这些数据哪些可以显示,哪些不能显示。
该函数对客户端的数据进行操作,和后台数据库没有任何关系。在设置完过滤规则后使用函数Retrieve检
索数据是不合理的,每次设置过滤规则后都检索数据,这样的执行效率很低。需要注意的是,该函数紧紧
是设置过滤规则,并不进行过滤。函数Filter是进行过滤的,使用最近设置好的过滤规则对数据进行过滤。
函数语法:integerdwcontrol.SetFilter(stringformat)
..dwcontrol:要为其设定过滤规则的DataWindow、DataStore或者子数据窗II控件的名称;
..format:作为过滤规则的表达式,该表达式的返回值应该是Boolean类型,或者是True、或者是False。
如果表达式返同值为Null,则在执行函数Filter时自动弹出对话框让用户指定过滤规则。在表达式中可
以使用数据窗口对象函数、列名、列号、数字、字符串等。如果用到了列号,则应该以开头、后面
紧跟数字来表示。多个条件可以使用逻辑运算符进行联结,一个非常良好的习惯是每个条件都应该使用括
号。这样既可以保证表达式的清晰,又可以避免一些Bug。后面的代码实例中会讲到。
返回值:数字类型,1表示执行成功,-1表示执行失败。该函数的返回值没有多大意义,很少在程序中
使用该返回值。
代码实例:
例1:使用列名进行过滤。
stringls_filter
ls_filter="cust_qty>100andcust_code>30”
dwEmployee.SetFilter(1s_fi1ter)
dwEmployee.Filter()
例2:必须使用括号的情况。下面的脚本在逻辑上看起来没有什么问题:
Stringls_filter
ls_fi1ter=i(name1ike'张%'andarticle_titielike‘%计算机%
dw_l.SetFilter()
dw1.Filter()
实际上,上面的程序是不能正确执行的。将过滤规则作如下改动就可以了:
ls_filter=i((name1ike'张%')and(article_titlelike‘%计算机%')”
例3:取消过滤规则。下面两个语句都能实现:
语句1:dw1.SetFilter(aft)
语句2:dw_l.SetFilter("<l=lw)
例4:下面的语句在运行时可以让用户自己指定过滤规则:
Stringls_null
SetNul1(ls_nul1)
dw_l.SetFilter(ls_null)
dw1.Filter()
例5:下面脚本可以判断数据窗口中是否有主键重复的数据。假设数据窗口中的主键是dept_id:
string1s_fieldname〃主键名称
longll_rc〃数据窗口中总的数据行数
ls_fieldname=〃dept_id”
dw_l.SetFilterCl=rO〃取消过滤规则,显示全部的数据
dw_l.Filter0〃过滤
ll_rc=dw_l.RowCount()//保存数据行数
dw1.SetSort(1sfieldname+〃A")〃用主键进行排序
dw_l.Sort()
〃下面语句是核心语句。该过滤规则的含义是:只显示相邻行不同的数据。
dw_l.SetFilter(ls_fieldname+〃◊〃+ls_fieldname+z/[-1]orGetRowO=1")
dw」.Filter()
ifdw_l.RowCount()<ll_rcthen
MessageBox("提示",ls_fieldname+〃列中存在重复的数据!StopSign!)
endif
24.Filter
函数作用:使用已经设置好的过滤规则处理数据窗II中的数据,能够让过滤规则取值为True的数据都显示
出来,为False的数据移动到Filter缓冲区中。当数据窗口对象的RetrieveAsNeeded属性选中时,调
用该函数会导致检索所有的数据。该函数对Composite类型的数据窗口不起作用;对于Group类型的数据
窗口,在调用该函数后应该调用函数GroupCalc,以便重新生成分组。
函数语法:integerdwcontrol.Filter()
..dwcontrol:数据窗口、DataStore或者子数据窗口控件名称。
返1"|值:数字型,如果函数执行成功则返回1,否则返回该函数的返回值意义不大,很少在程序中
用到。如果参数decontrol为Null,则返回如果。
代码实例:参见函数SetFilter。
25.AcceptText
函数作用:函数执行时,首先对当前编辑框中的内容进行对应字段的校验规则,能够通过校验规则,则保
存在对应字段中,否则显示校验信息提示错误。需要执行该函数的原因是,当在某字段上的编辑框中输入
内容而没有移动光标到别的字段上时,其他控件获得焦点,此时编辑框中的内容不能被保存到字段中,所
以就应该在数据窗II失去焦点时执行该函数。该函数可.能会触发数据窗II的ItemChanged或者ItemError
事件。
函数语法:dwcontrol.AcceptText()
返回值:执行成功则返回1,执行过程中发生错误则返回T,如果dwcontrol为Null则返回Null。
使用说明:和数据窗II控件打交道都是通过编辑控件进行的。在数据窗口中录入数据、修改数据,实际上
是在修改单元上的编辑控件中的内容。当编辑控件移动到另外单元上之前,要对编辑控件中的数据进行校
验,如果能通过字段的校验规则,就保存到字段中。编辑控件是可以移动的,需要编辑哪个单元,编辑控
件就移动到哪个单元上,接受输入或者修改。对于熟悉MicrosoftExcel的人来说,编辑控件可以看成是
Excel网格中的单元格。当用户在一个单元格中输入一个公式,它不会被接受和计算,直到用户移到其他
单元格时才进行公式正确性检查,如果错误则不能移动到其他单元格中。数据窗口控件使用了同样的概念。
编辑控件在没有离开当前字段时,用户录入或者修改的数据就不会被保存到字段中,如何确保在数据窗口
失去焦点时,最后位置上编辑框中的内容不被遗漏呢?前面介绍了在数据窗口的LoseFocus事件中编写如
下脚本:
this.AcceptText()
这个方法在很多情况下能解决该问题。美中不足的是,如果编辑框中的内容不能通过字段的校验规则,有
时会显示两次错误信息窗口。造成两个错误信息窗口,往往是在选择其他单元时发生,在数据窗口失去焦
点之前(如单击“保存”按钮等)只会显示一个借误信息窗I用户选择其他单元时,编辑框中的
数据开始进行校验,不能通过校验规则,显示校验错误信息,在显示校验错误信息时数据窗口失去焦点,
触发数据窗口的LoseFocus事件执行AcceptText函数,又一次显示校验错误窗口。所以,显示两次校验
错误窗口的原因是LoseFocus事件中的AcceptText函数造成的。可以想法让该函数在这种情况下不执行。
为此定义一个实例变量:
Booleanib_accept=True
该变量用来表示是否正确通过了校验,然后将LoseFocus中的脚本改成下面的脚本:
Ifib_acceptThen
This.AcceptText()
Else
ib_accept=true
EndIf
在数据窗口的ItemError事件中编写脚本:
ibaccept=False
这样就可以解决显示两个校验错误信息窗I】了,并且不会遗漏最后一个编辑框中的内容。
当在某个单元中修改或者录入数据后,编辑框要离开时,要进行4个校验步骤,前面两个步骤由
PowerBuilder完成,后面两个由开发者编写。
(1)看数据和编辑前相比是否发生了改变,没有改变则不做任何处理。
(2)检查测试此值是否违反了任何•个在字段上定义的有效性校验规则,违反则拒绝接受此值,并触发
ItemError事件。
(3)检查此值是否与编辑前真的不同,没有改变则终止有效性校验。
(4)检查开发人员在ItemChanged事件中编写的脚本。具体的发生情况取决于分配给被称为动作代码的
值。
如果数据窗口用于数据录入,只在LoseFocus事件中使用函数this.AcceptText0即可,其他事件可以不
编写脚本。数据窗口中,如果仅仅修改了一个数据项,并且光标没有离开该数据项,这时保存数据窗LI将
不会产生更新,使用该函数可以避免这种情况。可以认为,在数据窗口控件中有一个移动的编辑框,编辑
哪个字段的数据,该编辑框就落在哪个字段上;在编辑框中输入内容并且还没有离开该字段时,输入的内
容仅仅保存在该编辑框中,并没有赋给字段。函数AcceptText就是将编辑框中的内容赋给字段,所以在数
据窗I1控件的LoseFocus事件中使用该函数是必须的。该函数在数据窗口的ItemChanged事件中不起作用,
因为项目改变是发生在接受编辑框中内容之后。
代码实例:
例1:下面脚本在‘保存'命令按钮的Clicked事件中编写。
dw_l.AccpetText()
ifdw1.Update0=1then
commit;
else
MessageBox('错误',’数据不能正确保存。')
RolIback;
Endif
例2:以下程序也可以避免两次显示错误提示。
定义窗口实例变量:
booleandwhas_focus
在数据窗口的GetFocus事件中编写如下脚本:
dw_has_focus=TRUE
在数据窗口的LoseFocus事件中编写如下脚本:
dwhas_focus=FALSE
dw_l.eventpostue_acceptText()
在数据窗口dw1的自定义事件ue_acceptText中编写如卜,脚本:
IFdw_has_focus=FALSETHEN
dw1.accepttext()
ENDIF
26.ModifiedCount
函数作用:获取数据窗II或者Datastore中被修改过但还没有提交到数据库中的记录数,包括主缓存区中
修改过的记录数、Filter缓存区中被修改过的记录数。新插入的数据行,如果既没有修改过其中的内容,
也没有调用过Setitem函数,则不被考虑。相关的函数还有:DeletedCount计算删除的数据行数,RowCount
计算数据窗口Primary缓冲区中的数据行数。判断数据是否修改过,通常使用该函数和DeletedCount()函
数相加得到的和,如果大于0则表示数据修改过。仅用ModifiedCount或者DeletedCount来判断是否修改
过数据都不科学。
函数语法:dwcontrol.ModifiedCount()
返回值:返回long类型的数据窗口控件中被修改过的记录数,如果没有记录被修改过或者修改后都已经
保存到了数据库中则返叫0,执行过程中如果发生借误则返回-1,如果dwcontrol为Null则返回Null。
代码实例:
下面的脚本计算数据窗II中修改过了多少行数据:
long1IRows
ll_Rows=dw_Employee.ModifiedCount()
27.DeletedCount
函数作用:获取数据窗口控件或者datastore控件dwcontrol中被删除的记录数。
函数语法:dwcontrol.DeletedCount()
返回值:返回long类型的已经被删除但还没有提交到数据库中的记录数,如果执行过程中发生了错误则
返回T,如果dwcontrol为Null则返回Null,如果没有删除过记录则返回0。
代码实例:
例1:下面代码判断数据窗II中的数据是否修改过。
Long11Rows
ll_rows=dw_l.ModifiedCount()+dw_l.DeletedCount()
ifll_Rows>0then
ifdw_l.Update()=1then
commit;
MessageBox(*提示','保存了'+String(ll_Rows)+'条数据。')
Else
Rollback;
MessageBox('错误'不能正确保存。')
Endif
endif
28.Update
函数作用:根据数据窗口或者datastore中的数据变动情况,修改数据库中对应表中的数据。注意,该函
数执行之前一定正确执行过函数SetTransObjecto另外,在数据窗口对象设计时还需要正确的设置修改属
性,以确保数据窗口具有修改数据库中数据的能力。该函数执行完成后,通常根据该函数的返回值调用事
务语句,或名•使用Commit提交事务,或者使用Rollback回退事务。
函数语法:dwcontrol.Update({accept{,resetflag}})
..accept:为True,表示在提交数据之前自动执行AccpetText函数,否则不执行该函数,该参数缺省为
True。
..resetflag:为True,表示数据提交后自动清除修改标识,该参数缺省为True。
返回值:执行成功则返回1,发生错误则返回T,如果dwcontrol为Null则返回Null。
使用说明:通常在命令按钮‘保存'中调用该函数,保存数据。如果在数据窗IIItemChanged事件中使用
该函数,则需要将参数accept设置为false,因为事件本身会自动执行和函数AcceptText类似的操作。
事件自动执行类似AcceptText的操作,参数accept设置为True也导致执行类似AcceptText的操作,容
易发生异常。所以,在该事件中调用该函数一定要将参数accept设置为False。另外,该事件中及时能够
修改成功,当前编辑的字段内容也不会保存到数据库中,因为在该事件触发的时候该字段中的内容正在被
校验。所以,需要首先获取当前输入的内容(可以使用ItemChanged事件的参数data),然后调用函数
Setltem,为当前字段赋值即可。该函数的执行可能会触发以下事件:
..DBError
..SQLPreview
.・UpdateEnd
..UpdateStart
如果参数accept设置为True,还可以触发以下事件:
..ItemChanged
・.ItemError
代码实例:
例1:常规‘保存'命令按钮的编程:
ifdw_l.Update()二1then
commitusingsqlca;
else
rollbackusingsqlca;
endif
29.commit
30.rollback
31.SelectRow
函数作用:选中或者取消选中数据窗口、DataStore中的一行或者所有行数据。该函数的执行不会改变当
前数据行。也就是说,如果第2行是当前数据行,执行完该函数,比如dw_LSelectRow(5),第2行仍然
是当前数据行。
函数语法:integerdwcontrol.SelectRow(longrow,booleanselect)
..dwcontrol:数据窗口、DataStore或者子数据窗口。
..row:long类型,耍选中或者取消选中的数据行行号。如果该参数为0,表示对所有的数据行进行操作。
..select:Boolean类型,取值为True表示要选中指定的数据行(不管在执行函数之前是否是选中的);
取值为False表示要取消选中指定的数据行(不管执行函数之前是否没有选中)。
返回值:函数执行成功返回1,执行错误返回-1,任何参数为空则返回Null。
代码实例:
例1:数据窗口中多行选中程序。
首先定义窗口实例变量:
longil_LastSelectedRow=1
然后开始编写多行选中程序。程序算法描述如下:
1)、如果按下了Control键如果是在选中行上,取消该行否则,选中该行记录当前到窗口实例变量中
2)、如果按下了Shift键取消所有选中行选中上次点击行和当前行之间的所有数据行记录当前到窗口实例
变量中
3)、如果没有按键如果点击行为选中行,不执行任何操作否则,取消所仃选中行,选中当前行记录当前到
窗口实例变量中比如,我们在窗口dw」的Clicked事件中编写该脚本,程序如下:
longll_Start
longll_End
longll_index
ifRow<1thenreturn
ifKeyDown(KeyControl!)then
ifThis.IsSelected(Row)then
This.SelectRow(Row,False)
else
This.SelectRow(Row,True)
endif
elseifKeyDown(KeyShift!)then
ifRow<ilLastSelectedRowthen
ll_Start二Row
1l_End;il_LastSelectedRow
else
ll_Start二il_LastSelectedRow
ll_End=Row
endif
This.SelectRow(0,False)
Forll_index=ll_Startto1l_End
This.SelectRow(l1index,True)
next
else
ifNotThis.IsSelected(Row)then
This.SelectRow(0,False)
This.SelectRow(Row,True)
endif
endif
i1_LastSelectedRow=Row
32.GetRow
函数作用:获取数据窗口或者DataStore中的当前数据行。需要说明的是,当前数据行不见得就是在数据
窗口中我们看见的数据行。该函数有时和SetRow函数搭配使用。
函数参数:numberdwcontrol.GetRow()
..dwcontrol:数据窗口、DataStore或者子数据窗II控件。
返回值:函数执行成功则返回当前数据行,如果没有当前数据行则返回0,如果执行错误则返回T,如
果参数dwcontrol为空则返|”|Null<,
代码实例:
例1:下面的代码为当前行的ID列设置值。该程序片段可以为多用户系统的主键生成。
Longll_CurRow
Stringls_id
ll_CurRow=dw1.GetRow()//获取当前数据行
if1l_CurRow<1thenreturn〃如果没有当前行,则返回。
//gs_userid为全局变量,保存用户的1D号。
ls_id=gs_userid+String(today(),*yyyymmdd,)+string(now(),*hhmmssr)
dwl.SetItem(ll_CurRow,id,,ls_id)
例2:当用户点击数据窗11纵向滚动条翻页时,将当前页中的第一行数据设置为当前行,这样可能更方便
用户的操作。下面脚本实现该功能:
longll_CurRow
longll_FirstRow
ll_CurRow=dw_l.GetRow()
H_FirstRow=Long(dw1.Object.DataWindow.FirstRowOnPage)
ifll_CurRow<>ll_FirstRowthenThis.SetRow(ll_FirstRow)
33.GetltemString
函数作用:从数据窗口或者DataStore控件的指定缓冲区中获取指定单元的String类型的数据。通过参数
的设置,还叫.以获取指定单元的最初数据,也就是最初Retrieve或者最近Update成功之后的该单元的取
值。需要注意的是,该函数获取的是被数据窗口中字段接受的数据,是触发完AcceptText之后列中的数据,
是通过了校验规则的数据;当用户输入完内容尚未离开该单元时,数据尚未被该单元接受,这种情况下使
用该函数是获取不到当前录入的内容的,这时需要使用函数GetText来获取。这是GctText和GetltemString
函数的区别。类似的,GetltemNumber.GetltemDecimal等系列函数还有很多,它们的用法都是类似的。
函数语法:
语法格式一:stringdwcontrol.GetItemString(longrow,integercolumn{,DWBufferdwbuffer,
booleanoriginalvalue))
语法格式二:stringdwcontrol.GetltemString(longrow,stringcolumn{,DWBufferdwbuffer,
booleanoriginalvalue})
..dwcontrol:要获取数据的数据窗口、DataStore或者子数据窗口控件:
..row:要获取哪行的数据,long类型;
..column:要获取数据的列,可以是列号,也可以是列名。当采用列号时,一定要注意只有定义数据窗口
的SQL语句中字段的顺序才能决定列号,列的显示位置不能决定列号。该列的类型必须是字符类型,否则
不能正确获取数据。
..dwbuffer:该参数是可选的。用来指明在哪个数据缓冲区中获取数据。该参数为枚举类型,可用的取值
有Filter!、Primary!和Delete!,不能使用Original!。
..originalvalue:该参数也是可选的,为Boolean类型,用来指明是否使用最初的数据。
返回值:函数执行正确时返回指定单元中的数据,执行错误返回任何参数为空时返回Null。
使用说明:该函数可以用来获取常规的列以及计算列和计算域中的数据。计算列是指在定义数据窗口的SQL
语句中指定的,可以是表达式、常量等;计算域指在数据窗II设计时添加的。用来获取常规列和计算列中
的数据时,该函数获取的是非格式数据。比如,我们定义一个字符类型的列用来保存电话号码,指定格式
为###一########,虽然这样的列中显示的数据样式也是这样的数据,但是
使用该函数获取到的数据仍然是'01081692157'。如果希望获取带有格式的数据,可以使用
GetltemFormattedString函数来代替,两个函数的参数及含义是相同的。而对于计算域,函数
GetltemString获取到的数据恰恰相反,而是格式化以后的数据。如果希望获取计算域中非格式化的数据,
可以使用函数GetltemUnformattedString,该函数的语法格式也是相同的。和该函数类似的或者相关的函
数有:
..GetltemDate
..GetltemDateTime
..GetltemDecimal
..GetItemFormattedString
..GetltemNumber
..GetltemTime
..GetltemUnformattedString
..GetText
..SetItem
..SetText
代码实例:
例1:下面脚本获取数据窗口中第3行字段emp_name中的数据:
String1s_name
Isname=dwemployee.GetltemString(3,〃empname")
例2:如何编写自定义函数GetltemAny,使用该函数可以获取任何类型的数据。
/*
求函数名称:gf_GetItemMany(datawindowad_dw,longal_row,stringas_column)
*函数作用:获取指定数据窗口中指定字段的取值.
*编写日期:2001-4-15
Stringls_type
anyla_rtn
ls_type:Trim(ad_dw.Describe(as_column+,/.ColType^))
choosecaseLower(Left(ls_Type,3))
case"cha"
la_rtn=addw.GetItemString(al_row,as_column)
case〃dat”
ifls_type="date"then
la_rtn二ad_dw.GetltemDate(al_row,as_column)
else//datetime
la_rtn;ad_dw.GetltemDateTime(al_row,as_column)
endif
caseint,ion,num,rea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论