-
- 弹出窗口:messagebox()
- 基本写法:Messagebox('标题','内容')
- 完整写法: MessageBox ( '标题','内容',图标,按键,默认值)
(1)其中标题与内容为要显示的字符串,不可省略,但可以省略,即什么也不显示,例如Messagebox('','')这样也是正确的单里面的东西一样也不能少!
(2)图标可选值: Question!或None! 或Information!或 StopSign! 或 Exclamation!(默认图标)
(3)按键可选值: OK! (默认方式)或 OKCancel! 或 YesNo! 或YesNoCancel! 或RetryCancel! 或AbortRetryIgnore!
(4)默认值为可选: 1 (默认选择)或 2 或 3(即弹出消息框时的默认选择按钮)
该函数有返回值,1,2,3对选择的按键。
基本写法事例: MessageBox('此处为标题,'此处为内容')
完整写法事例:
if MessageBox('提示信息','是否删除?',&Question! ,OKCancel! , 1 ) = 1 then//选择确定
MessageBox('提示信息', '你选择了删除')
else//选择取消
MessageBox('提示信息','你选择了不删除')
end if
-
- 设置焦点:setfocus()
- 对象名.setfocus
sle_1.setfocus()
用format菜单下的tab order命令可以修改焦点顺序。把用户名和密码框分别设为10,20,确定按钮设为30就行了。也可以用控件的setfocus()方法设置焦点。
-
- 触发事件:triggerevent()
- 对象名.triggerevent()
(1)函数作用:触发指定对象的指定事件,并且立即执行该事件中的脚本。注意该函数和PostEvent的区别。PostEvent不是立即执行,TriggerEvent是立即执行触发事件的脚本。
(2)函数语法:objectname.TriggerEvent ( event{, word, long } )
z objectname:PB中任何对象或者控件,只要有可以触发的事件就可以。
z event:要触发的事件。可以是枚举类型或者String类型。PB提供的事件可以使用枚举或者String类型来表示,比如Clicked!或者‘Clicked’都可以代表Clicked事件;自定义的用户事件只能使用String来表示。需要注意的是,这里的事件应该提供了脚本。
z word:该参数不是必需的。当需要传递数据给被触发的事件时使用word和long参数。这两个参数都可以传递long类型的数据,但是参数long还可以传递string类型的数据,而该参数仅能传递long类型的。如果使用了该参数,在被触发的事件中使用Message.WordParm接收传递过去的数据。如果不使用该参数传递数据而是使用参数long进行传递,则将该参数设置为0。
z long:该参数也不是必须的,用来传递long或者string类型的数据。使用Message.LongParm接收传递的数据。当传递string类型的数据时,对象Message.LongParm中保存的是所传数据的存储地址,必须使用string(XX,’address’)来读取该地址中的string类型数据。
返回值:Integer类型。如果返回1,表示该函数执行成功;如果指定事件中没有脚本或者函数执行错误,则返回-1。当任意参数为Null时,函数返回Null。
代码实例:
例子1,触发缺省事件:
cb_1.TriggerEvent(Clicked!)
等价于:
cb_1.TriggerEvent(“Clicked”)
例子2,触发用户自定义事件:
w_main.TriggerEvent(“ue_open”)
例子3,传递信息和接收信息:
w_main.TriggerEvent(“ue_open”,0,’test’)
在用户自定义事件ue_open中接收数据:
string ls_msg
ls_msg = String(Message.LongParm,’address’)
例子4,传递long数据:
w_main.TriggerEvent(‘ue_open’,100,0)
在用户自定义事件ue_open中接收数据:
long ll_msg
ll_msg = Message.WordParm
- 关闭窗口:Close()和CloseQuery()
Close事件在触发Deconstructor之前所执行的最后一个事件,CloseQuery事件在Close事件触发之前发生。设置CloseQuery事件是为了增强可靠性。通常在CloseQuery事件中判断某些工作是否完成,并显示一个提示窗口询问用户,根据用户的确认,返回一个值来决定是否触发窗口的Close事件。返回值为1,表示取消关闭动作;返回值为0,表示继续执行Close事件。
比如,可以在CloseQuery事件中编写如下脚本,判断是否保存了数据窗口中的修改,并询问用户是否保存数据,根据用户的回答决定是否触发Close事件。在“关闭”按钮上编写脚本Close(parent),然后在CloseQuery中编写如下脚本:
Int li_flag
//如果数据窗口中没有修改,则允许执行Close,直接返回
If dw_1.ModifiedCount() <= 0 Anddw_1.DeletedCount() <= 0 Then Return 0
//如果数据窗口有修改,询问用户是否保存
li_flag = MessageBox("提示","数据已经修改,是否保存?",Question!,YesNoCancel!,1)
Choose Caseflag_i //根据用户选择执行
Case1 //用户选择要保存数据
If dw_1.Update() = 1 Then //如果修改数据成功
Commit; //提交
Return0 //继续执行Close事件
Else //修改数据不成功
rollback; //回退事务
li_flag= MessageBox("提示","数据错误,是否继续关闭!",&
Question!,YesNoCancel!,2) //显示错误
Ifli_flag = 1 Then
Return0 //允许关闭
Else
Return1 //不允许关闭
EndIf
EndIf
Case2 //用户选择不保存数据
Rollback; //回退事务
Return0 //允许执行Close事件
Case3 //用户选择取消
Return1 //不允许关闭
EndChoose //用户所有的选择情况处理完毕
另外,需要注意的是,在其他事件中调用或者触发(使用TriggerEvent函数、PostEvent函数或者是对象名称.Event 事件名称格式调用事件)Close事件,都只是执行该事件中的脚本,并不真正关闭窗口。也就是说,应该区别事件和事件处理脚本,这两者虽然有很多的联系但并不相同。 PB中的所有事件和事件处理脚本都是有区别的。
-
- 默认数据库链接变量:sqlca
- dw_name.settransobject(sqlca)链接数据库
- sqlca.sqlcode = 0 有数据\ = 100 无数据
- 链接数据库
connect;一般用于程序open的时候,跟在数据库链接代码后面
- 链接数据库
- 打开窗口:open( )
open(windowname)
- 打开窗口:open( )
在Application中联上数据库。。
// Profile djerp1
SQLCA.DBMS = "ODBC"
SQLCA.AutoCommit = False
SQLCA.DBParm = "ConnectString='DSN=djerp;UID=sa;PWD=djerp'"
connect;
if SQLCA.SQLCODE <> 0 then
MessageBox("提示","数据库连接错误!")
Return
Elseif SQLCA.sqlcode = 0 Then
Open(w_main) //打开主操作窗口
end if
- 关闭应用:halt close()
halt 直接结束应用程序
halt close 会执行application对象中的Close 事件的代码,会在结束应用程序,前释放所有的实例
从ini配置文件中提取string数据
profilestring('文件名,可以包含路径','主要字节','在主要字节下的关键字','如果找不到数据则返回的数据')
- 断开链接
disconnect;一般用于程序close的时候
- 断开链接
- 是否修改过:isrowmodified()
if dw_1.modifiedcount()+dw_1.deletedcount()>0 then
.......//数据窗口处于修改状态
end if
- 是否新增的:isrownew()
数据窗口中的if函数
if(true\false,'为true时返回的值','为false时返回的值',)
如:if(isrownew(),'新',if(isrowmodified(),'改','旧'))
- 插入空行:insertrow(0)
dw_name.insertrow(0)
通常配合插入行使用的是滚动行
dw_name.scrolltorow(dw_name.insertrow(0)) \滚动到插入行
- 插入空行:insertrow(0)
比如:int row
row = dw_1.insertrow(0)
//显示
dw_1.scrolltorow(row)
//使用
dw_1.object.column[row]
- 从数据窗口中提取数据:getitem( )
dw_name.getitem\\string\date\......(row,'数据来源控件名')
string dwcontrol.GetItemString ( long row,integer column {, DWBuffer dwbuffer, boolean originalvalue } )
String dwcontrol.GetItemString ( long row, string column {,DWBuffer dwbuffer, boolean originalvalue } )
getitem首先根据数据窗口不同的字段类型,有不同的函数。比如对于字符型使用getitemstring,对于数字,getitemnumber,对于日期gettiemdatetime。
-
- 设置数据窗口的数据:函数setItem()
(1).dw_name.setitem(row,'要设置的控件名','要设置进去的数据')
(2).函数作用:给指定的数据窗口或者Datastore中的、指定单元设置数据,通过行和列来确定哪个单元。该函数直接修改缓冲区中的数据,而不是针对显示界面进行修改,修改成功之后,数据窗口控件上会自动反映出最新的内容来。而函数SetText则针对显示界面进行修改,如果能够通过字段的校验规则,才能够进入到数据窗口对应的缓冲区中。注意这两个函数的区别。
(3).函数语法:integer dwcontrol.SetItem (long row, integer column, any value )
integer dwcontrol.SetItem ( long row, string column,any value )
dwcontrol:要设置数据的数据窗口控件、DataStore或者子数据窗口的名称。
row:要设置数据的行,为long类型。
column:要设置数据的列,可以是string类型的列名称,也可以是integer类型的列号。
lvalue:要设置的数据。类型根据数据列而定,两者的数据类型应该保持一致。
返 回 值:integer类型,1表示函数执行成功,-1表示函数执行失败。如果有任意一个参数为Null,则函数返回Null。
代码实例:
例子1,下面脚本在第一行的hire_date列中设置数据:
dw_order.SetItem(1, "hire_date", 1993-06-07)
例子2,当用户在数值类型的字段中输入内容,然后又删除后要离开该单元时,数据窗口尝试着将‘’赋值给该单元,这时会导致内容不能通过校验规则而产生错误。解决的办法就是在数据窗口控件的ItemError事件中编写下面的脚本:
integer li_Null
String ls_type
ls_type = This.Describe(dwo.name + '.ColType')
ls_type = Left(Lower(Trim(ls_type)),3)
choose case ls_type
case 'dec','int','lon','num','rea','ulo'
This.SetItem(Row,integer(dwo.ID),li_Null)
end choose
return 2
- 窗口与窗口之间的传值,子窗口
closewithreturn(主窗口,'返回给主窗口的值')
接收子窗口返回的值 = message.stringparm
- 窗口与窗口之间的传值,子窗口
string as_cpbh
long ll_row
ll_row=dw_1.getrow()
if ll_row>0 then
as_cpbh=dw_1.object.cpbh[ll_row]
openwithparm(w_ylxx,as_cpbh)
else
messagebox("系统提示","请选择记录!")
end if
接收窗口的open事件如下:
string as_cpbh
as_cpbh=message.StringParm
//is_cpbh=as_cpbh
DW_1.Settransobject(sqlca)
dw_1.retrieve(as_cpbh)
- 转换大小写:Lower()&Upper()
lower(string)转换为小写的;upper(string)转换为大写的;
(1)函数功能:将字符串中的大写字母转换为小写字母。
(2)函数语法Lower ( string )
参数string:要将其中的大写字母转换为小写字母的字符串返回值String。函数执行成功时返回将大写字母转换为小写字母后的字符串,发生错误时返回空字符串("")。如果string参数的值为NULL,Lower()函数返回NULL。
(1) 功能将字符串中的小写字母转换为大写字母。
(2) 语法Upper( string )
参数string:要将其中的小写字母转换为大写字母的字符串返回值String。函数执行成功时返回将小写字母转换为大写字母后的字符串,发生错误时返回空字符串("")。如果string参数的值为NULL,Upper()函数返回NULL。
- 为数据窗口设置事物对象
dw_name.settransobject(sqlca\也可以是自己定义的)
settrans():用指定的事务对象来设置数据窗口控件内部事务对象的值。
settransobject():给数据窗口控件设置事务对象,并提供控制事务的能力,包括程序中提交事务的能力
- 清零数据:reset()
dw_name.reset()
dw_1.reset(): 将数据窗口控件dw_1中的数据清除。
- 清零数据:reset()
- 检索数据:retrieve()
dw_name.retrieve(里面可以有参数变量不过要与数据窗口中定义的类型与顺序一样)
dw_1.retrieve():强制dw_1数据窗口控件从数据库读数据,即从数据库中检索数据。
- 检索数据:retrieve()
注:retrieve之前要settransobject()和reset()一下datawindow
过滤数据:setfilter(),filter()
dw_name.setfilter(string类型\"name ='"+ls_name+"'")
dw_name.filter()
(1)函数作用:为DataWindow或者DataStore指定数据过滤规则。通常在调用该函数前使用函数Retrieve将数据检索到客户端,该函数可以决定检索到客户端的这些数据哪些可以显示,哪些不能显示。该函数对客户端的数据进行操作,和后台数据库没有任何关系。在设置完过滤规则后使用函数Retrieve检索数据是不合理的,每次设置过滤规则后都检索数据,这样的执行效率很低。需要注意的是,该函数紧紧是设置过滤规则,并不进行过滤。函数Filter是进行过滤的,使用最近设置好的过滤规则对数据进行过滤。
(2)函数语法:integer dwcontrol.SetFilter ( stringformat )
(3)ldwcontrol:要为其设定过滤规则的DataWindow、DataStore或者下拉子数据窗口控件的名称;
lformat:作为过滤规则的表达式,该表达式的返回值应该是Boolean类型,或者是True、或者是False。如果表达式返回值为Null,则在执行函数Filter时自动弹出对话框让用户指定过滤规则。在表达式中可以使用数据窗口对象函数、列名、列号、数字、字符串等。如果用到了列号,则应该以‘#’开头、后面紧跟数字来表示。多个条件可以使用逻辑运算符进行联结,一个非常良好的习惯是每个条件都应该使用括号。这样既可以保证表达式的清晰,又可以避免一些Bug。后面的代码实例中会讲到。
返回值:数字类型,1表示执行成功,-1表示执行失败。该函数的返回值没有多大意义,很少在程序中使用该返回值。
代码实例:
例1:使用列名进行过滤。
string ls_filter
ls_filter ="cust_qty > 100 and cust_code >30"
dw_Employee.SetFilter(ls_filter)
dw_Employee.Filter( )
例2:必须使用括号的情况。下面的脚本在逻辑上看起来没有什么问题:
String ls_filter
ls_filter =“(name like ‘张%’) and (article_title like ‘%计算机%’)”
dw_1.SetFilter()
dw_1.Filter()
例3:取消过滤规则。下面两个语句都能实现:
语句1:dw_1.SetFilter(“”)
语句2:dw_1.SetFilter(“1=1”)
例4:下面的语句在运行时可以让用户自己指定过滤规则:
String ls_null
SetNull(ls_null)
dw_1.SetFilter(ls_null)
dw_1.Filter()
例5:下面脚本可以判断数据窗口中是否有主键重复的数据。假设数据窗口中的主键是dept_id:
string ls_fieldname//主键名称
long ll_rc//数据窗口中总的数据行数
ls_fieldname ="dept_id"
dw_1.SetFilter("1=1")//取消过滤规则,显示全部的数据
dw_1.Filter()//过滤
ll_rc = dw_1.RowCount()//保存数据行数
dw_1.SetSort(ls_fieldname + " A")//用主键进行排序
dw_1.Sort()
//下面语句是核心语句。该过滤规则的含义是:只显示相邻行不同的数据。
dw_1.SetFilter(ls_fieldname + " <> " + ls_fieldname +"[-1] or GetRow() =1")
dw_1.Filter()
if dw_1.RowCount() < ll_rc then
MessageBox("提示",ls_fieldname + "列中存在重复的数据!",StopSign!)
end if
注:取消过滤为dw_name.setfilter("1=1")
- 数据排序:setsort(),sort()
dw_name.setsort(string类型\"name a\d" :其中a为升序,的d为降序)
dw_name.sort()
- 数据排序:setsort(),sort()
(1)函数语法:dwcontrol.SetSort ( format )
z dwcontrol:数据窗口控件名
z format:string 类型,其值是有效的排序条件。排序条件中可以使用列名或列号,使用列号时,在列号前加上个#符号。如果 format 参数的值为 NULL,那么程序运行时 PowerBuilder 会提醒用户输入排序条件
返回值: Integer。函数执行成功时返回 1,发生错误时返回-1。
使用说明:在定义数据窗口对象时,可以同时定义排序条件。当使用函数 SetSort()定义新的
排序条件后,新的排序条件将取代原有的排序条件。但是,执行 SetSort()函数后,数据窗口并没有真正排序数据。要完成排序工作,需要执行数据窗口控件的对象函数 Sort()。
按某列排序时,在排序条件中放上列名或列号,后跟上“A”或“D”指明排序方式。其中“A”表示升序,“D”表示降序。要按多个列排序时,在每个列的排序条件之间用逗号(,)分隔。下面是两个排序条件示例:
"emp_lname A" "emp_lnameA, dept_id D" 如果想让用户在程序运行时指定排序条件,那么可以这样做:以空值作为
SetSort() 函数的参数来调用 SetSort() 。程序运行时, PowerBuilder 会显示“SpecifySortColumns”对话框,让用户指定排序方式。之后调用 Sort()函数完成实际排序。
例 1. 下面的语句为数据窗口控件 dw_employee 定义排序条件,该条件的意义为:按 emp_status 列升序排序,按 emp_salary 列降序排序:
dw_employee.SetSort("emp_status A,emp_salary D")
示例 2. 下面的语句为数据窗口控件 dw_emp 设置了按 emp_status 列升序排序、按 emp_salary 列降序排序的排序条件,然后调用 Sort()函数完成实际排序工作:
string ls_newsort
- 数据分组:groupcalc()
dw_name.groupcalc()重新分组一般都是在filter()或sort()后面,以确保分组的正确性
当应用程序使用FILTER()函数过滤带有分组的数据窗口后,如果想继续保持分组特性,那么需要执行FILTER()函数后调用GroupCalc() 函数。
当用户或者应用程序在数据窗口控件中增加了某些行或者修改了某些数据后,原有的分组情况可能不在符合现有的分组原则了,此时,应用程序可以调用GroupCalc () 函数来强制数据窗口重新分组。
GroupCalc () 函数在重新分组之前并不重新排序数据,因此,如果数据窗口没有定义排序方式,那么在执行GroupCalc () 函数之前应该首先执行数据窗口控件的Sort()对象函数进行排序。
如:
dw_stat.SetRedraw(false)
dw_stat.setsort("acptsiteid,mophonecode")
dw_stat.sort()
dw_stat.GroupCalc()//重新计算分组
dw_stat.SetRedraw(true)
- 防止刷新,提高效率
dw_name.setredraw(false)
dw_name.reset()\retrieve()\filter()\sort()\groupcalc():中间是数据操作
dw_name.setredraw(true)
- 防止刷新,提高效率
- 校验数据:accepttext()
dw_name.accepttext() = 1为通过检验 <>1为不通过
一般写在要对数据窗口进行操作取数的时候,写在这些动作前面
- 校验数据:accepttext()
原文链接:https://blog.csdn.net/qinyf2015/article/details/52160415