分享一下自己整理的pb常用函数

1 篇文章 0 订阅
CSDN这个账号是我今年6月1号注册的,也就前几天的事,以前在学校虽说也上技术论坛,不过那都是路过看看,打打酱油。今年出来实习啦,公司是用pb开发的,在此之前我都不知道还有pb这门开发工具。没办法硬着头皮上,准备自己买本书慢慢啃,跑去市中心(广州市天河体育中心)看看,谁知道竟然没有pb方面的书,只好网购了。初步接触pb发现和vb很像,真不是一般的像,需要写代码的地方特别少。特别在公司开发的时候,只需要继承一个公司写好的窗口,只要在open,new,del,add,mod,retrieve,print这几方面写代码就可以了。工作很轻松,也就做做报表,维护,接口。工资也不是很高,也就3000左右。

在我看来,pb可分为四大块:
1:数据窗口,这不必多说了,pb就是靠他吃饭的
2:pb的函数不少,不过掌握了常用的一百多个就够日常开发用了
3:事件触发的时机,在这方面,网上的很多前辈,提供了两个办法,一是debug,二是写messagebox
4:pfc类库,个人认为这个是很重要的,他大大的加快了开发速度,
  一般大型系统的开发都要用到,而且都是进行二次开发的
ps:其实主要还没在csdn发过贴,发一贴试试,
  下面是学习pb以来,自己积累的pb函数,
  可能不是很全面,也不是很准确,不过还是分享一下,希望不要误人子弟,^_^


--pb常用函数 create by amu on 20120529
1.弹出窗口
messagebox('系统提示','数据错误',question!,yesno!2)
2.设置焦点
对象名.setfocus
3.触发事件
对象名.triggerevent() 另postevent也是触发功能,用法一样,不过却不是立即触发
4.关闭窗口
close(parent\windowname)
5.默认数据库链接变量:sqlca
dw_name.settransobject(sqlca)链接数据库
sqlca.sqlcode = 0 有数据\\ = 100 无数据
6.链接数据库
connect;一般用于程序open的时候,跟在数据库链接代码后面
7.打开窗口
open(windowname)
8.关闭应用
halt close
9.从ini配置文件中提取string数据
profilestring('文件名,可以包含路径','主要字节','在主要字节下的关键字','如果找不到数据则返回的数据')
10.断开链接
disconnect;一般用于程序close的时候
11.是否修改过 --数据窗口函数
isrowmodified()
12.是否新增的 --数据窗口函数
isrownew()
13.数据窗口中的if函数 --数据窗口函数
if(true\false,'为true时返回的值','为false时返回的值',)
如:if(isrownew(),'新',if(isrowmodified(),'改','旧'))
14.插入空行
dw_name.insertrow(0)  
通常配合插入行使用的是滚动行 
dw_name.scrolltorow(dw_name.insertrow(0)) \\滚动到插入行
15.从数据窗口中提取数据
dw_name.getitem\\string\date\......(row,'数据来源控件名')
16.设置数据窗口的数据
dw_name.setitem(row,'要设置的控件名','要设置进去的数据')
17.窗口与窗口之间的传值,主窗口
openwithparm(子窗口,'传给子窗口的值')
接收子窗口返回的值 = message.stringparm
18.窗口与窗口之间的传值,子窗口
closewithreturn(主窗口,'返回给主窗口的值')
19.转换大小写
lower(string)转换为小写的;upper(string)转换为大写的;
20.为数据窗口设置事物对象
dw_name.settransobject(sqlca\也可以是自己定义的)
21.清零数据
dw_name.reset()
22.检索数据
dw_name.retrieve(里面可以有参数变量不过要与数据窗口中定义的类型与顺序一样)
注:retrieve之前要settransobject()和reset()一下datawindow
23.过滤数据
dw_name.setfilter(string类型\\"name = '"+ls_name+"'")
dw_name.filter()
注:取消过滤为dw_name.setfilter("1=1")
24.数据排序
dw_name.setsort(string类型\\"name a\d" :其中a为升序,的d为降序)
dw_name.sort()
25.数据分组
dw_name.groupcalc()重新分组一般都是在filter()或sort()后面,以确保分组的正确性
26.防止刷新,提高效率
dw_name.setredraw(false)
dw_name.reset()\retrieve()\filter()\sort()\groupcalc():中间是数据操作
dw_name.setredraw(true)
27.校验数据
dw_name.accepttext() = 1为通过检验 <>1为不通过
一般写在要对数据窗口进行操作取数的时候,写在这些动作前面
28.修改的行数
dw_name.modifiedcount()
29.删除的行数
dw_name.deletedcount()
如果deletedcount()+modifiedcount() > 0 则表明数据窗口有操作
30.统计行数
dw_name.rowcount()
31.保存数据
if dw_name.update()=1 then \\= 1为成功
  commit using sqlca; --提交数据
else
  rollback using sqlca; --回滚数据
end if  
32.选择行
dw_name.selectrow(row,true\false)
33.已选择行
dw_name.isselected(用循环语句检查每一行是否被选择li_row)
实例:
integer li_currow
boolean lb_result

li_currow = dw_name.getrow()
lb_result = dw_name.isselected(li_currow)
if lb_result then
  dw_name.selectrow(li_currow,false)
else
  dw_name.selectrow(li_currow,true)
end if
34.当前行
dw_name.getrow()
35.删除行
dw_name.deleterow(row\\当前行的话为0,其它的为行数)
36.去掉数据两边的空格
trim(string) //trimw()为有中英双字节输入的时候用的
37.获得字符长度
len(string)
38.获得指定字符--string
mid('string//为要从获取数据的来源','从第几个字符开始','要获得的字符长度')
midw()为有中英双字节输入的时候用的
39.替换指定字符
replace('string//被替换的','开始的地方','替换的长度','string//要替换的内容')
注:如果开始的地方大于被替换的字符,则在被替换的字符后面加上要替换的内容
40.从左边获得指定字符--string
left('string\\来源','长度')
leftw()为有中英双字节输入的时候用的
41.从右边获得指定字符--string
right('string\\来源','长度')
rightw()为有中英双字节输入的时候用的
42.在一字符中找另一字符的位置 --long
pos('string\\要从这个字符中寻找','stirng\\这个字符是要寻找的内容',long\\起始位置从第几个字符开始找)
43.在规定的时间内触发某事件
idle(60) \\如果60秒没有操作的话就触发application对象的idle事件
timer(60) \\每隔60秒就触发一次窗口的timer事件
44.判断是否为空
isnull(any) \\为空 not isnull(any)\\不为空 setnull(any)\\设置为空
45.类型转换
要转换类型(被转换的类型) 如string(any)
还可以定义格式 如string(date,'yyyy-mm-dd')
46.滚动页
dw_name.scrollpriorpage() \\向前滚动一页
dw_name.scrollnextpage() \\向后滚动一页
47.获得数据窗口有多少个列
dw_name.object.datawindow.column.count
实例:获得数据窗口的列名
integer li_index

for li_index = 1 to integer(dw_name.object.datawindow.column.count)
  messagebox(stirng(li_index),dw_name.describe("#"+string(li_index)+".name"))
next
48.获得数据窗口的对象描述
dw_name.describe(datawindow.table.select) \\获得数据窗口的sql语句
dw_name.Describe( "Evaluate( 'LookupDisplay(列名) ', 行数) " ) //获得下拉数据窗口的显示值
......
49.获得与数据窗口中列相对应的数据表中的字段名称dbname
integer li_index

for li_index = 1 to integer(dw_name.object.datawindow.column.count)
  messagebox(stirng(li_index),dw_name.describe("#"+string(li_index)+".dbname"))
next
50.获得数据窗口的sql语句
dw_name.getsqlselect()
51.设置数据窗口的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()
52.另存为
dw_name.saveas(名字可含路径,另存为的类型,是否显示列标题)
53.动态数据窗口syntaxfromsql
sqlca.syntaxfromsql(sqlselect一条sql语句,窗口风格,报错信息)
54.创建create
动态创建数据窗口对象:
ls_syntax = 动态数据窗口syntaxfromsql
dw_name.create(ls_syntax,自定义报错信息)
创建非可视系统对象类型:
transaction dbtrans
dbtrans = create transaction
dbtrans.dbms = 'odbc'
55.释放destroy
由create创建非可视系统对象类型用完以后要及时释放,让内存资源得到更好的使用
destroy dbtrans
56.修改数据窗口
dw_name.modify(string\\"name = '"+Tom+"'") \\更多例子请看pb帮助
57.移动行rowsmove
dw_name.rowsmove(开始行,结束行,缓冲区,要移动到的另一窗口名,在哪一行前面插入,插入哪个缓冲区)
rowsmove还可以在同一数据窗口的不同缓冲区进行移动行
如从删除缓冲区移动行到主缓冲区实现恢复功能:
dw_name.rowsmove(1,dw_name.deletedcrount(),delete!,dw_name,1,primary!)
58.复制行rowscopy --基本用法和移动行差不多
dw_name.rowscopy(开始行,结束行,缓冲区,要复制到的另一窗口名,在哪一行前面插入,插入哪个缓冲区)
59.获得数据窗口的状态getitemstatus
dw_name.getitemstatus(row\\第几行,哪一列,哪个缓冲区)
缓冲区有三种:应该有四种的,不过另一种原始缓冲区不常用
primary! delete! filter!
状态有四种:
datamodified! new! newmodified! notmodified!
60.设置数据窗口状态setitemstatus
dw_name.setitemstatus(row\\第几行,哪一列,哪个缓冲区,设置为哪个状态)
61.获得数据窗口单击或双击行数
dw_name.getclickedrow()
62.热键keydowm
if keydown(key键盘按键) then
  //按下这个按键会发生的事件
end if
63.共享数据sharedata
CONNECT USING SQLCA;
dw_employee.SetTransObject(SQLCA)
dw_employee.Retrieve()
dw_employee.ShareData(dw_dept)
要结束共享数据用sharedataoff()
64.测试是否为有效值
isdate(),isnumber()......有效的话返回true
65.查找数据窗口中第一个被选中的行getselectedrow()
dw_name.getselectedrow(row\\从第几行开始找,第一行开始的话设为0)
66.dwo对象
dwo是一个泛指对象,包括文本对象,按钮对象等等
如:
数据窗口即写即现
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
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值