PB常用程序汇总3

来源:互联网 发布:java经典代码大全例子 编辑:程序博客网 时间:2024/04/28 01:07
//exit,continue,return
1.exit(退出循环):
DO...LOOP和FOR...NEXT语句的循环体中,当我们想在中途退出循环时,EXIT语句后,程序的控制权
转至循环语句后的语句,在嵌套循环的情况下,EXIT语句退出当前层循环,而不是所有循环.
2.CONTINUE(继续循环):
在DO...LOOP和FOR...NEXT语句的循环体中,遇到CONTINUE语句后,将不执行CONTINUE语句后与循环结束
前的所有语句,而开始新一轮循环.
3.RETURN 语句:
返回控制给用户或调用函数的地方.(当希望终止应用程序的运行时,使用HALT语句),立即终止事件处理
程序或函数的执行,把控制返回到调用程序.当RETURN语句位于事件处理程序中且用户操作触发了该事件
处理程序后,执行到RETURN语句时,该语句立即终止事件处理程序的执行并等待用户的下次操作.当程序
中调用函数或事件处理程序时,执行到RETURN语句后,该语句立即终止事件处理程序或函数的执行,并把
控制返回到调用程序.
4.HALT {CLOSE} 语句:
HALT语句用于终止应用程序的运行.当HALT语句不带CLOSE选项时,该语句立即终止应用程序的运行;
当HALT语句带CLOSE选项时,执行到该语句后,应用程序先执行应用对象的Close事件处理程序,之后再
终止应用程序的运行.


//缓冲区
primary buffer,filter buffer,delete buffer,original buffer
当我们从数据库中读取数据时,所有数据会放在主要缓冲区(primary buffer),并且会复制一份放到原始
缓冲区(original buffer)内.在数据窗口中我们只能看到主要缓冲区(primary buffer)内的数据,任何
数据的处理也都是针对主要缓冲区的数据做处理.但是要记住,不管我们对缓冲区内的数据做任何处理,
除非我们运行update()这个函数,否则缓冲区内任何数据的改变,对于后端数据库是没有任何影响的.


//如何生成固定长度的前面加零的数字编号,例如:12生成"00012",1234生成"01234"。方法很简单:
String(ll_number, "00000")


//row表示行数,col表示字段名,val表示值
dw_1.setItem(row,'col',val)
dw_1.getItemX(row,'col') //读取单笔数据比点状表示法更快
dw_1.object.data //读取多笔数据函数表示法更快
dw_1.object.data[1]
dw_1.object.data[1,2]
dwc.object.data[1,1]
dw_1.object.data[1,1,2,2]
dw_1.object.col[1]
dw_1.object.col.current
dw_2.object.data = dw_1.object.data
dw_2.object.data = dw_1.object.data.select
//例子1(只用执行一次)
string ls_name[]
ls_name = dw_1.object.col.current //读取列col所有数据
//例子2(得执行dw_1.rowCount()次)
string ls_name[]
for li_row = dw_1.rowCount() to 1 step -1
ls_name[li_row] = dw_1.getItemString(li_row,'col')
next


//读取数据
retrieve()
>= 1 //实际从数据库中所读取的数据数目
= 0 //找不到任何符合条件的数据
= -1 //读取数据失败
//增加数据
dw_1.insertRow(row)
dw_1.insertRow(0) //增加到最后一笔
//删除数据:primary! => delete!
dw_1.deleteRow(row)
dw_1.deleteRow(0) //删除当前所有行数数据
//过滤数据:primary! => filter!
dw_1.setFilter('kind < 1000')
dw_1.filter()
//数据排序
dw_1.setSort('kind d')
dw_1.sort()
//数据清除
dw_1.reset() //将数据从所有的缓冲区中清除,但是对于数据库中的数据并不会有任何影响
//数据计算
dw_1.rowCount()
dw_1.filteredCount()
dw_1.deletedCount()
dw_1.modifiedCount() //计算所有行数状态为DataModified!或是NewModified!的总和
//数据状态
notModified!
dataModified!
new! //rows only
newModified! //rows only
//数据拷贝
dw_1.rowsCopy(startRow,endRow,sourceBuffer!,destDW,beforeRow,destBuffer!)
dw_1.RowsCopy(dw_1.GetRow(),dw_1.RowCount(),Primary!,dw_2,1,Primary!)
//数据移动
dw_1.rowsMove(startRow,endRow,sourceBuffer!,destDW,beforeRow,destBuffer!)
dw_1.RowsMove(1,dw_1.DeletedCount(),Delete!,dw_1,1,Primary!)
//数据滚动
dw_1.scrollToRow(row)
//dw参数
dwo.name
//describe()函数
ll_color = dw_1.describe('dataWindow.color') //ll_color = dw_1.dataWindow.color
ll_color = dw_1.describe('kind_t.color') //ll_color = dw_1.kind_t.color
//modify()函数
dw_1.modify("dataWindow.color='255'")
dw_1.modify("kind_t.color='255'")
dw_1.modify("kind_t.color='0~tif(kind>1000,255,0)'") //~t前面的0为默认值
//操作外部数据
fileExists()
fileRead()
fileLength()
fileClose()
fileSeek()
fileOpen()
fileWrite()
//将dbf格式的文件,或是以tab键区隔字段的文字文件,直接引入放在数据窗口缓冲区中
importFile(fileName,startRow,endRow,startCol,endCol,dwStartCol)


//如何将Grid型的datawindow改成Tabular型的
导出数据窗成 .srd 文件, 用记事本打开把 processing=1 改成 processing=0

//Yield()函数的作用
Yield()是一个不常用到的PowerBuilder函数。可是,在一个大的循环过程中,如果用户想在执行到一半时
通过单击按钮或菜单来退出的话,就一定要用到Yield()函数了,否则程序只会在执行完成整个循环后才会
响应按钮或菜单的Click事件。将Yield()函数放在循环体的中间。那么在循环执行的过程中发现有新的事
件消息在消息队列中就回立即去响应。


//sqlca.SQLCode
在利用Embedded SQL 的时候,每运行一次SQL指令就应该检查一次交易对象中的属性SQLCode,而不是等到
所有的SQL指令运行完毕后再去运行检查交易对象中的SQLCode属性.当我们使用数据窗口所提供的函数时,
要记住不要检查SQLCode来判断是否运行成功.而是要依照每一个函数运行后所返回的值来判断是否运行
成功.
update tab_test set col1 = 'test'
if sqlca.sqlCode = -1 then
rollback using sqlca;
if sqlca.sqlCode = -1 then
messageBox('错误','连接失败!')
end if
messageBox('错误','连接失败!')
else
commit using sqlca;
end if


//确保数据保存的成功
if dw_1.update() = -1 then
RollBack Using SQLCA;
MessageBox("警告!","数据保存失败!")
else
Commit Using SQLCA;
End if


//在PB中如何打开一个文件(如.txt,.doc),就像在资源管理器中双击打开文件一样?
答:可以通过API函数来实现。
在应用程序的Global External Functions中定义:
Function long ShellExecuteA(ulong hwnd, string lpOperation, string lpFile, & string
lpParameters, string lpDirectory, long nShowCmd) library "shell32.dll”
调用如下:
String ls_null
SetNull(ls_null)
ShellExecuteA(Handle(Parent), ls_null, "c:dochello.txt”, ls_null, ls_null, 1)


//插入一行后给了默认值但又没有对默认值进行修改时,CloseQuery事件不激发方法
long 1_Row
1_Row = dw_1,InsertRow(dw_1,GetRow())
dw_1.SetItem(1_Row,"discount_pct",0,10)
dw_1.SetItemStatus(1_Row,0,Primary!,New!)


//同一个数据窗口某列的值是根据另一列的值进行检索(放在DW的itemchanged事件中)
dataWindowChild dwc
if dwo.name = "vw_type_type1" then //省的字段名
s_type1 = data
this.getChild("vw_type_type2",dwc) //县的字段名
this.setItem(this.getRow(),"vw_type_type2","")
this.setItem(this.getRow(),"vw_type_type3","")
this.setItem(this.getRow(),"type",i_null)
s_sql = "Select distinct type2 From vw_type Where type1_code = " + "'" + s_type1 + "'" //动态生成SQL语句
dwc.setTransObject(sqlca)
dwc.SetSQLSelect(s_sql)
dwc.retrieve()
end if


//DW的DBError事件
string error_text
CHOOSE CASE sqlDBCode
case 1 error_text = '违反唯一索引!'
case 1400 error_text = '字段不能为空!'
case 1407 error_text = '字段不能为空!'
case 1401 error_text = '字段太长!'
case 1438 error_text = '数值大于列允许的最大精度!'
case 2291 error_text = '出现非法字段!'
case 1031 error_text = '权限不足!'
case 911 error_text = '注册名无效!' //权限专用
case 922 error_text = '特殊字符无效!' //权限专用
CASE 1017 error_text = '非法的用户名或口令,拒绝登录!'
CASE 12154 error_text = '不能分解服务名称!'
CASE 01005 error_text = '未给出口令或口令错误,拒绝登录!'
CASE 01935 error_text = '注册名项输入的名称为系统关键字,禁止作为注册名使用!'
CASE 540 error_text = '数据表或视图不存在!'
CASE 942 error_text = '数据表或视图不存在!'
CASE 903 error_text = '非法列名!'
CASE 1403 error_text = '未查找到符合条件的数据!'
CASE -3 error_text = '在您读入数据和存盘操作过程中,服务器中的数据已被别的用户或窗口改变,请重新读取数据后再试!'
CASE 6 error_text = '网络同数据库服务器的连接已经中断,请关闭应用程序然后重新打开.'
CASE 50 error_text = '网络同数据库服务器的连接已经中断,请关闭应用程序然后重新打开.'
case 1920 error_text = '用户名称与另外的用户或角色名称冲突'
case 988 error_text = '缺少口令或其非法!'
case 1918 error_text = '该ORACLE用户不存在!'
case 1940 error_text = '不能放弃一个当前被连接的操作员,即当前删除的操作员正在使用!'
CASE ELSE
if isnull(sqlca.sqlErrText) or sqlca.sqlErrText = '' then
error_text = '数据操作失败!'
else
error_text = sqlca.sqlErrText
end if
END CHOOSE
return MessageBox('错误',error_text,RetrYCancel!,1)
//DBError参数
Buffer 发生错误所在的缓冲区
Row 发生第一笔错误的行数
SqlDBCode 数据库错误代码
SqlErrText 数据库错误信息


//MessageBox(title,text,icon,button,default)
icon参数:
information! 提示(缺省)
stopSign! 中止
exclamation! 警告
question! 询问
none! 没有
button参数:
ok! 确定(缺省)
okCancel! 确定,取消
yesNo! 是,否
yesNoCancel! 是,否,取消
retryCancel! 重试,取消
abortRetryIgnore! 终止,重试,忽略


//如何在DBError event中处理多笔数据的错误
Rollback Using SQLCA;
If buffer = primary! Then
Messagebox("error in row:" + string(row),"Code:" + string(sqldbcode) + "," + sqlerrtext)
This.scrollToRow(row)
return 1 //避免显示PB缺省的错误信息
end if


//数据窗口的规则检查
当用户在编辑控件中输入数据时,数据并不会立即写入数据窗口的缓冲区中,直到发生下面任何一种情况,
PowerBuilder才会把数据从编辑控件写入数据窗口的缓冲区中.
1.用户按下Enter键
2.用户按下Tab键跳到下一个字段
3.用户按下鼠标键跳到其它字段
4.运行AcceptText()函数
在完全通过4个步骤的规则检查后,才会真正把数据从编辑控件写入数据窗口缓冲区.任何一个步骤的错误
都会产生数据窗口的ItemError Event.数据窗口的数据规则检查步骤如下:
1.数据是否改变?
2.数据类型是否符合?
3.是否符合用户自定字段规则?
4.是否符合ItemChanged Event的程序?


//编辑控件函数
AcceptText():将编辑控件中的数据写入数据窗口缓冲区中.
不要在Itemchanged或ItemError event中编写Acceptext()函数,因为Acceptext()函数有可能驱动
ItemChanged或ItemError event,这将造成死循环的出现.
GetText():读取编辑控件的文字.


//每一个事件event和函数Function类似,会有参数argument和返回值return value.
ItemChanged Event返回值:
0.接受数据的值(缺省)
1.拒绝数据的值
2.拒绝数据的值并改变焦点
ItemError Event返回值:
0.拒绝数据的值,并且显示系统错误信息(缺省)
1.拒绝数据的值,但是不显示系统错误信息
2.接受数据的值
3.拒绝数据的值并改变焦点


原创粉丝点击