PowerBuilder常用函数功能和用法解析

郭宝利先生在他的帮助文档里总结的一个系统用到的所有函数,他们也是软件开发中常用的,为了方便查阅,我把这些函数按照字母顺序进行了整理并添加了使用方法,方便我和一些其他的初学者学习使用:

1.AcceptText 将“漂浮”在数据窗口控件上编辑框的内容放入到数据窗口控件的当前项中(主缓区中)。

用法:

dwcontrol.AcceptText ( )

dwcontrol:数据窗口控件名

返回值:Integer。函数执行成功时返回1,出现错误(比如数据不满足有效性规则)时返回-1。

注意: (1)在将数据放入到当前项之前,编辑框中的数据必须通过有效性规则检查

   (2)不要在数据窗口控件的ItemChanged事件处理程序中调用AcceptText()函数。AcceptText()函数还可能触发数据窗口控件的ItemChanged或ItemError事件。

例子:

   

2.Choose Case  条件分支语句

例子:对于不同的重量,提供不同的处理

CHOOSE CASE Weight

CASE IS<16

Postage=Weight*0.30

Method=”USPS”

CASE 16 to 48

Postage=4.50

Method=”UPS”

CASE ELSE

Postage=25.00

Method=”FedEx”

END CHOOSE

3.Close 关闭 立即关闭程序

Close事件在触发Deconstructor之前所执行的最后一个事件,CloseQuery事件在Close事件触发之前发生。设置CloseQuery事件是为了增强可靠性。通常在CloseQuery事件中判断某些工作是否完成,并显示一个提示窗口询问用户,根据用户的确认,返回一个值来决定是否触发窗口的Close事件。返回值为1,表示取消关闭动作;返回值为0,表示继续执行Close事件。

比如,可以在CloseQuery事件中编写如下脚本,判断是否保存了数据窗口中的修改,并询问用户是否保存数据,根据用户的回答决定是否触发Close事件。在“关闭”按钮上编写脚本Close(parent),然后在CloseQuery中编写如下脚本:

Int li_flag

//如果数据窗口中没有修改,则允许执行Close,直接返回

If dw_user.ModifiedCount() <= 0 And dw_user.DeletedCount() <= 0 Then Return 0

//如果数据窗口有修改,询问用户是否保存

li_flag = MessageBox(“提示”,”数据已经修改,是否保存?”,question!,yesnocancel!,1)

Choose Case li_flag //根据用户选择执行

Case 1     //用户选择要保存数据

If dw_user.Update() = 1 Then   //如果修改数据成功

Commit;

//提交

Return 0    //继续执行Close事件

Else            //修改数据不成功

Rollback;

//回退事务

li_flag = MessageBox(“提示”,”数据错误,是否继续关闭!”,question!,yesnocancel!,2)         //显示错误

If li_flag = 1 Then

Return 0 //允许关闭

Else

Return 1 //不允许关闭

End If

End If

Case 2 //用户选择不保存数据

Rollback;

//回退事务

Return 0              //允许执行Close事件

Case 3                 //用户选择取消

Return 1              //不允许关闭

End Choose    //用户所有的选择情况处理完毕

4.CloseWithReturn 带返回值的关闭

用法:

closewithreturn(要关闭的窗口,’要返回的值’)

要返回的值存在stringparm内,获取方法如下:

接收返回的值 = message.stringparm

例子:

closewithreturn(parent,’abc123′)

——————————-

String s

s = Message.StringParm

5.commit
提交

用法:

sql语句,提交更改

例子:

6.connect; 连接数据库

8.count 计算数据窗口规定的行数

9.Create函数 使用数据窗口源代码创建数据窗口对象,并将该对象放入指定的数据窗口控件或数据存储对象中。此动态数据窗口对象不会成为应用程序源库的永久部分。

例子:

string error_syntaxfromSQL, error_create

string new_sql, new_syntax

new_sql = ‘SELECT emp_data.emp_id, ‘ &

+ ’emp_data.emp_name ‘ &

+ ‘from emp_data ‘ &

+ ‘WHERE emp_data.emp_salary>45000’

new_syntax = SQLCA.SyntaxFromSQL(new_sql, &

‘Style(Type=Form)’, error_syntaxfromSQL)

IF Len(error_syntaxfromSQL) > 0 THEN

// Display errors

mle_sfs.Text = error_syntaxfromSQL

ELSE

// Generate new DataWindow

dw_new.Create(new_syntax, error_create)

IF Len(error_create) > 0 THEN

mle_create.Text = error_create

END IF

END IF

dw_new.SetTransObject(SQLCA)

dw_new.Retrieve()

10.Create语句 创建对象使用 类似java的new关键字  用法 objectvariable = CREATE objecttype

例子:

transaction DBTrans

DBTrans = CREATE transaction

DBTrans.DBMS = ‘ODBC

11.dbname 属性,数据库的名字

dbcol = dw_1.Object.emp_id.dbName

12.DeletedCount 检查数据窗口自上次更新所删除的行数

如果deletedcount()+modifiedcount()> 0 则表明数据窗口有操作

13.DeleteRow 删除数据窗口的一行  dw_control.DeleteRow(rownumber)

(1)函数功能:删除行, 将被删除的数据从数据窗口的主缓存区移放到删除缓冲区

dw_name.deleterow(row) \\当前行的话为0,其它的为行数

row—要删除的行号,row=0时删除当前行。成功时返回1,失败时返回-1

(2)实例:删除数据窗口控件的dw_1中的第10行: dw_1.DeleteRow(10)

14.Describe 判断数据窗口指定字段的数据类型

例子:

Dw_1.describe(“colname.coltype”) 返回string

15.destroy语句 在是用create关键字创建对象之后销毁对象

释放destroy dbtrans

16.Disconnect 断开连接数据库

17.dwo对象 即为datawindow object 数据窗口对象

数据窗口的即写即现

string ls_name,ls_staffcode

choose case dwo.name

  case ‘xf_staffcode’

  ls_staffcode = trim(data) 

  If gnv_data.of_HaveValue( ls_staffcode ) Then

  select xf_name into :ls_name

  from xf_staff

  where xf_staffcode = :ls_staffcode

  using itrans_current;

  this.setitem(row,’xf_name’,ls_name)

end choose

18.error error事件

19.Filter 按条件过滤数据窗口数据,配合setfilter()使用,先设置过滤条件,再执行过滤

20.GetClickedRow 得到用户点击的行号

21.GetItemStatus 报告一行中行或者列的修改状态。//暂时不会用

dw_name.getitemstatus(row\\第几行,哪一列,哪个缓冲区)

缓冲区有三种:应该有四种的,不过另一种原始缓冲区不常用

primary! delete! filter!

状态有四种:

datamodified! new! newmodified! notmodified!

22.GetItemString 读取数据窗口中的值,条件是这个值必须是字符

例子:

dw_1.getitemstring(1,3) //取得第2行,第4列的值(行列起始从0开始标)

23.GetRow 得到行号

24.GetSelectedRow 得到选择的行号

25.GetSqlSelect
获得数据窗口的sql语句

例子:

dw_name.getsqlselect()

26.halt close; 先触发关闭事件,关掉主线程并释放资源

27.idle 在规定的时间内触发事件

例子:

idle(60) //如果60秒没有操作的话就触发application对象的idle事件

28.insertrow 插入新行,该函数有一个返回值,该值为新插入这条记录的行号。

用法:

dw_1.insertrow(cur_row)其中,dw_1为datawindow控件名,cur_row为一具体的行号,在该行前插入一新行。

例子:

dw_1.insertrow(4) //将在第4行前插入一条空记录

29.integer 1.数据类型:int类型包装类,属于对象 2.函数:可将字符串转换为integer类型

用法:

integer( string a )

例子:

integer(‘123’) //把字符串‘123’转换为整数类型

30.IsNull 判断变量是否为空

用法:

isnull( any ) // any为任意类型变量

例子:

string ls_a

isnull(ls_a) //判断ls_a是否为空

32.IsNumber 判断变量是否为数字

用法:

isnumber(any) //判断变量any是否为数字,是的话返回true

例子:

int a 

string b

a = 123

b = ‘abc’

isnumber(a) //返回true

isnumber(b) //返回false

33.isRowModified 是否修改过该行

if dw_1.modifiedcount()+dw_1.deletedcount()>0 then

…….//数据窗口处于修改状态

end if

34.isRowNew 数据窗口中的if函数,判断行是否是新建的

用法:

if(true\false,’为true时返回的值’,’为false时返回的值’,)

例子:

如:if(isrownew(),’新’,if(isrowmodified(),’改’,’旧’))


35.IsSelected
是否被选中

用法:

dw_1.isselected(rownumber)

例子:

dw_name.isselected(用循环语句检查每一行是否被选择li_row)

36.KeyDown 键盘键按下触发

37.Len 判断字符串长度

用法:

得到Blob类型变量的数据长度,以字节为单位。

Len ( blob ) 

参  数:blob:Blob类型变量。

返回值:Long。函数执行成功时返回blob变量的长度,发生错误时返回-1。如果任何参数的值为NULL,则Len()函数返回NULL。

例子:

(4)用法:如果在说明Blob类型的变量时指定了变量长度,那么对该变量来说,Len()函数得到的就是这个指定的长度。如果在变量说明时未指定变量长度,那么PowerBuilder在赋值时调整长度,未赋值Blob类型变量的长度为0。

38.lower&upper 转换大小写

用法:

将字符串中的大写字母转换为小写字母。

Lower(string) 转换为小写

39.Message 系统预设全局变量,窗口之间传递消息使用

40.MessageBox 提示框

41.Mid 居中

42.ModifiedCount 修改的行数

43.Modify 修改数据窗口相关内容:外观,行为,数据库信息

用法:

更多例子参考f1帮助

string dwcontrol.Modify  ( string modstring ) //参数都用string类型传入

例子:

dwcontrolname.Modify ( “DataWindow.Color=’long'” )

44.Open 打开窗口

用法:

open(windowname)

例子:

open(w_1)

45.OpenWithParm 在打开窗口时传入参数

用法:

46.parent 关键字,代词,表示当前组件所在的父组件

用法:

在关闭窗口时用到,在按钮内编辑代码,在使用close(parent)则关闭按钮所在的窗口

例子:

close(parent) //关闭当前组件的所在的窗口

47.Pos 寻找字符在字符串中的位置

用法:

Pos ( String1,String2 {, start } ) //string1 从这个字符串中查找,string2 要查找的字符串, long 从第几个字符开始查找

例子:

long p1,p2

p1 = pos(‘aabcdaee’,’a’,0) //返回值为0,字符串下标从1开始,不存在时返回0

p2 = pos(‘aabcdaee’,’a’,3) //返回值为6

48.PostEvent 延时触发事件

triggerevent 是即时触发事件与postevent不同

49.print 打印

用法:

数据窗口名.print() 打印这个数据窗口的内容

例子:

dw_error.print() //打印错误窗口的错误信息

50.ProfileString 从ini配置文件中提取string数据

用法:

profilestring(‘文件名,可以包含路径’,’主要字节’,’在主要字节下的关键字’,’如果找不到数据则返回的数据’)

例子:

//读取数据库的名称和密码

SQLCA.Database = ProfileString(‘setup.ini’,’database’,’Database’,”)

SQLCA.LogPass = ProfileString(‘setup.ini’,’database’,’LogPass’,”)

51.Replace

用法:

Replace ( string1, start, n, string2 )

string1:string类型,指定要使用string2替换其中一部分内容的字符串;

start:long类型,指定要从哪个字符位置开始替换字符串,字符串中第一个字符的位置为1,一个中文字符占两个位置

n:long类型,指定要替换多少个字符;

string2:string类型,指定用哪个字符串替换string1的部分字符。

返回值:String。函数执行成功时返回替换后的字符串,发生错误时返回空字符串(””)。如果任何参数的值为NULL,Replace()函数返回NULL。

注意:替换中文是,一个中文字符长度是两个字节,占两个位置。要是位置或者长度错误会引起乱码

例子:

String name

        Name= ”春眠不倔小”

        Name= Replace(Name , 7 , 4 , “觉晓”)

52.Reset 清除数据窗口内的数据

用法:

dw_name.reset() 将数据窗口控件dw_1中的数据清除。

例子:

dw_1.reset() //清除数据窗口dw_1的数据

53.Retrieve

用法:

dw_name.retrieve()

里面可以有参数变量不过要与数据窗口中定义的类型与顺序一样

注:retrieve之前要settransobject()和reset()一下datawindow,初始化数据窗口

例子:

dw_1.retrieve():强制dw_1数据窗口控件从数据库读数据,即从数据库中检索数据。

54.Right 取字符串右面的字符

用法:

right(string s,long n)

rightw()为有中英双字节输入的时候用的

(1) 功能从字符串右端取指定个数字符。

(2) 语法Right ( string, n )

(3) 参数string:string类型,指定要提取子串的字符串 n:long类型,指定子串长度返回值String。

函数执行成功时返回string字符串右边n个字符,发生错误时返回空字符串(””)。如果任何参数的值为NULL,Right()函数返回NULL。如果n的值大于string字符串的长度,那么Right()函数返回整个string字符串,但并不增加其它字符。

例子:

String s,r1,r2

s = “春眠不觉晓”

r1 = rightw(s,1) //返回 ‘晓’

r2 = right(s,2) //返回 ‘晓’

55.rollback sql语句,使数据库回滚

用法:

rollback {using 事务名};

注意,分好不能省略,最好使用事务名

例子:

rollback using sqlca;

56.RowCount 返回数据窗口控件当前可用行数(当前主缓冲区中数据行数)

用法:

dw_name.rowcount()

数据窗口控件名.rowcount()

返回值: Long。函数执行成功时返回主缓冲区中数据行数,发生错误时返回-1。如果dwcontrol 的值为 NULL,则 RowCount()函数返回 NULL。

例子:

例 1. 下面的代码得到数据窗口控件 dw_Employee 中当前可用行的行数:

long NbrRowsNbrRows = dw_Employee.RowCount()

例 2. 下面的代码检测用户是否已经滚动到数据窗口控件的末尾。它通过将数据窗口主缓冲区中的行数与数据窗口对象的 LastRowOnPage 属性相比较来得到:

dw_1.ScrollNextPage()

IF dw_1.RowCount() = Integer(dw_1.Describe(“DataWindow.LastRowOnPage”)) THEN

. . . //  所需的其它处理

END IF

57.RowsCopy

用法:

dw_name.rowscopy(开始行,结束行,缓冲区,要复制到的另一窗口名,在哪一行前面插入,插入哪个缓冲区)

例子:

参考rowsmove

58.RowsMove

用法:

移动行rowsmove( )

dw_name.rowsmove(开始行,结束行,缓冲区,要移动到的另一窗口名,在哪一行前面插入,插入哪个缓冲区)

rowsmove还可以在同一数据窗口的不同缓冲区进行移动行

例子:

如从删除缓冲区移动行到主缓冲区实现恢复功能:

dw_name.rowsmove(1,dw_name.deletedcrount(),delete!,dw_name,1,primary!)

59.SaveAs 导出数据

用法:

dw_1.saveas(filename,saveastype, colheading ) 

参数:dw_1为datawindow控件名, 

filename为导出的文件名, 

saveastype为导出的文件类型,

colheading为是否保存标题。

例子:

将数据窗口中的数据保存到d盘,取名为cs的文件。要求带标题。

Dw_1.saveas(“d:\cs.txt”,text!,true) true为带标题。False为不带标题。

60.ScrollNextPage 向后滚动一页

用法:

dw_name.scrollnextpage() \\向后滚动一页

例子:

61.ScrollPriorPage 向前滚动一页

用法:

例子:

62.ScrollToRow
滚动到指定行

用法:

通常配合插入新行使用  

dw_name.scrolltorow(dw_name.insertrow(0)) \\滚动到插入行

例子:

int row

row = dw_1.insertrow(0)

dw_1.scrolltorow(row)

63.SelectRow 选中或者取消选中数据窗口、DataStore中的一行或者所有行数据。

用法:

integer dwcontrol.SelectRow ( long row, boolean select)

ldwcontrol:数据窗口、DataStore或者子数据窗口。

lrow:long类型,要选中或者取消选中的数据行行号。如果该参数为0,表示对所有的数据行进行操作。

lselect:Boolean类型,取值为True表示要选中指定的数据行(不管在执行函数之前是否是选中的);取值为False表示要取消选中指定的数据行(不管执行函数之前是否没有选中)。

返回值:函数执行成功返回1,执行错误返回-1,任何参数为空则返回Null。

注意:该函数的执行不会改变当前数据行。也就是说,如果第2行是当前数据行,执行完该函数,比如dw_1.SelectRow(5),第2行仍然是当前数据行。

例子:

选择多行的案例,按住ctrl则多行取消、选择,按住shift则选中开始和最后的行

int row

row = dw_1.insertrow(0)

//显示

dw_1.scrolltorow(row)

long ll_Start, ll_End, ll_index

if Row < 1 then return

if KeyDown(KeyControl!) then

if This.IsSelected(Row) then

This.SelectRow(Row,False)

else

This.SelectRow(Row,True)

end if

elseif KeyDown(KeyShift!) then

if Row <il_LastSelectedRow then

   ll_Start = Row

   ll_End =il_LastSelectedRow

else

   ll_Start =il_LastSelectedRow

   ll_End = Row

end if

end if

64.SetFilter 条件查询数据时,设置查询条件

用法:

dw_name.setfilter(string con)

参数:dw_name 数据窗口名称

con 过滤的条件,string类型,条件即为sql语句where后面的内容

例子:

dw_user.setfilter(var_condition)

65.SetFocus 使控件获得焦点

用法:

对象名.setfocus

例子:

sle_1.setfocus()

66.setitem 设置数据窗口的数据

用法:

dw_name.setitem(row,’要设置的控件名’,’要设置进去的数据’)

integer dwcontrol.SetItem (long row, integer column, any value )

dwcontrol:要设置数据的数据窗口控件、DataStore或者子数据窗口的名称。

row:要设置数据的行,为long类型。

column:要设置数据的列,可以是string类型的列名称,也可以是integer类型的列号。

lvalue:要设置的数据。类型根据数据列而定,两者的数据类型应该保持一致。

返 回 值:integer类型,1表示函数执行成功,-1表示函数执行失败。如果有任意一个参数为Null,则函数返回Null。

例子:

第一行的hire_date列中设置数据:

dw_order.SetItem(1, “hire_date”, 1993-06-07)

67.SetItemStatus 设置数据窗口状态

用法:

dw_name.setitemstatus(row\\第几行,哪一列,哪个缓冲区,设置为哪个状态)

integer dwcontrol.SetItemStatus ( long row, integer column, dwbuffer dwbuffer, dwitemstatus status )

例子:

设置主缓冲区第五行工资栏的状态为notmodified!

dw_history.SetItemStatus(5, “Salary”, Primary!, NotModified!)

68.SetSort 设置排序规则,通常和sort()函数配合使用

用法:

dw_1.setsort(ls_sort)

其中,dw_1为datawindow控件名.ls_sort为排序条件字符串。

例子:

Dw_1.setsort(“nl asc”);  //设置以n1列,按升序顺序排(升序用asc,降序用desc)

Dw_1.sort( );   //过滤

69.SetSqlSelect
设置数据窗口的sql语句

用法:

dw_name.setsqlselect()

注:重设sql语句的时候列与类型必须要与原来的一样,where与group by和order by可以不一样

例子:

ls_oldsql = dw_name.getsqlselect()

ls_newsql = left(ls_oldsql,pos(lower(ls_oldsql),’where’)) +’NewWhereSql’……

dw_name.setsqlselect(ls_newsql)

dw_name.retrieve()

70.SetTransObject 和retrieve配合使用,连接数据库

用法:

数据窗口名.settransobject

dw_name.settransobject(sqlca)

例子:

设置数据窗口dw_1与数据库连接

dw_1.settransobject(sqlca)

71.ShareData 共享数据

共享数据窗口的概念,共享数据窗口的实现非常简单,只需一条ShareData()。

例如在Window对象上的两个数据窗口dw-p和dw-s,则可以用dw-p.

ShareData(dw-s)实现二者的数据共享,dw-p称为主数据窗口,而dw-s称为从数据窗口。

从原理上讲,二者实际上所共享的是数据的缓冲区。

缓冲区中的数据首先要从数据库中检索(通过数据窗口Retrieve()函数),而数据库的检索是一种较为”昂贵”的操作,它会加重数据库和网络传输的负荷。

在共享数据窗口情况下,只有主数据窗口检索数据,而从数据窗口通过共享获得数据,无须再检索数据库,

用法:

dw_1.sharedate(dwObject)

例子:

CONNECT USING SQLCA;

dw_employee.SetTransObject(SQLCA)

dw_employee.Retrieve()

dw_employee.ShareData(dw_dept)

要结束共享数据用sharedataoff()

72.Sort 排序

用法:

与setsort()配合使用,在设置了排序格式后,使用此函数进行排序

例子:

Dw_1.setsort(“nl asc”);  //设置以n1列,按升序顺序排(升序用asc,降序用desc)

Dw_1.sort( );   //过滤

73.SQLCA 默认数据库链接变量

用法:

例子:

dw_name.settransobject(sqlca)链接数据库

sqlca.sqlcode = 0 有数据\\ = 100 无数据

74.String 转换为字符串

用法:

string( blob )

value要转换为string的数据

例子:

把日期按照设定格式转换为字符串

string(date,’yyyy-mm-dd’)

75.SyntaxFromSQL 创建一个动态sql

用法:

sqlca.syntaxfromsql(sqlselect一条sql语句,窗口风格,报错信息)

例子:

76.TriggerEvent 立即触发事件

用法:

对象名.triggerevent()

触发指定对象的指定事件,并且立即执行该事件中的脚本。注意该函数和PostEvent的区别。PostEvent不是立即执行,TriggerEvent是立即执行触发事件的脚本。

objectname.TriggerEvent ( event{, word, long } )

objectname:PB中任何对象或者控件,只要有可以触发的事件就可以。

event:要触发的事件。可以是枚举类型或者String类型。

word、long:这两个参数不是必须的,用来传递long或者string类型的数据。

返回值:Integer类型。如果返回1,表示该函数执行成功;如果指定事件中没有脚本或者函数执行错误,则返回-1。当任意参数为Null时,函数返回Null。

例子:

(1)cb_1.TriggerEvent(Clicked!)

等价于

TriggerEvent(“Clicked”)

(2)w_main.TriggerEvent(“ue_open”,0,’test’)

在用户自定义事件ue_open中接收数据:

string ls_msg

ls_msg = String(Message.LongParm,’address’)

77.Trim 去掉字符串首尾的空格

用法:

trim(string) //trimw()为有中英双字节输入的时候用的。

Trim ( string )

例子:

string s = ‘ 4abb  ‘ //前面一个空格,后面两个空格

string w = ‘ 你好  ‘ //前面一个空格,后面两个空格

trim(s) //返回’4abb’

trim(w) //返回’你好’

78.Update 数据窗口中数据的保存

用法:

Dw_1.update( ) 其中,dw_1为datawindow控件名

例子:

数据修改后,需要对数据进行保存。

Dw_1.update( ) //该语句有返回值,如果返回1表示更新成功,返回-1表示出错。

79.数据窗口中的if函数

用法:

例子:

80.数据窗口中的Lower函数

用法:

例子:

    原文作者:ljlsblog
    原文地址: https://blog.csdn.net/ljlsblog/article/details/81025327
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞