PB常用程序汇总2

//调用过程通用脚本
if dw_wp.rowcount() <= 0 then return 
//变量定义
string ls_sql,ls_err_info
string ls_register_number,ls_accept_city,ls_department,ls_oper_person
integer li_err_code,li_apply_event
//变量赋值
ls_register_number = dw_wp.getitemstring(1,'register_number')
ls_accept_city = gs_citycode
li_apply_event = dw_wp.getitemnumber(1,'apply_event')
ls_department = gl_dealerid
ls_oper_person = gs_workerid
//连接数据库
af_connect()
//调用配号撤单过程
ls_sql = "execute bb_pstn_assign_no_repeal_p(?,?,?,?,?)"
declare proc_assign_no_repeal dynamic cursor for sqlsa ;
prepare sqlsa from :ls_sql ;
open dynamic proc_assign_no_repeal using :ls_register_number,:ls_accept_city,:li_apply_event,:ls_department,:ls_oper_person;
if sqlca.sqlcode = -1 then 
ls_err_info = sqlca.sqlErrText
close proc_assign_no_repeal ;
Rollback; 
Messagebox("错误信息1","执行异常!" + ls_err_info,stopSign!)
af_disconnect()
return
End if
fetch proc_assign_no_repeal into :li_err_code,:ls_err_info;
if li_err_code < 0 then
close proc_assign_no_repeal ;
Rollback; 
Messagebox("错误信息2","执行异常!" + ls_err_info,stopSign!)
af_disconnect()
return
end if 
close proc_assign_no_repeal ;
commit ;
//断开数据库
af_disconnect()
//撤单成功后打印工单
dw_wp.print()


//PB某些控件的中文显示问题
假如 PB 的 ListView 不能正常显示中文,则应该将ListView 的 FontCharSet 属性设置成其他类型。将
ListView 所在的对象 Export 成源码。在源码中找到ListView 定义部分,将 FontCharSet 属性该成 
DefaultCharSet! 如果 PB 的其他控件也发生相应的现象时,同样调整一下它的FontCharSet 属性。一般
来说对于简体中文字体,在中文 WINDOWS 环境中应该设置成DefaultCharSet!。对显示中文有问题的控件
将它的 FontChatSet 属性强制设置成 DefaultCharSet! 应该没有问题。或者改变字体!!!


//PB6.5运行时动态连接库(Runtime Library) 
PBVM60.DLL(PowerBuilder 虚拟机)(必需)
PBDWE60.DLL(DataWindow 引擎)(可选)
PBRTC60.DLL(Rich Text Control)(可选)
PBTRA60.DLL(DLL used for tracing db calls)(可选)
与所需连接的数据库的直连接口(Native Driver) 或 ODBC接口(ODBC Driver)
PBSYC60.DLL(连接Sybase 的直连接口)
PBO7360.DLL(连接Oracle7.3的直连接口)
所需连接的数据库的Client端(如Sybase的Open Client, Oracle 的SQL Net)
以上是Sybase公司的建议。 
我的经验是,编译好的程序必须有pbdwe60.dll和pbvm60.dll才行。
另外,如果使用ODBC联结数据库则还需pbodb60.dll,如果使用的专用接口,则需对应数据库的DLL,
如Oracle7.3用PBO7360.DLL,Sybase用PBSYC60.DLL


//pb6.5升级到6.5.1后exe文件执行可能出现问题
重新拷贝SybaseShared下的pbvm60.dll(3.24M)代替未升级时pbvm60.dll(3.25M)就ok了!


//几个常用颜色
红:rgb(255,0,0) 醒目或改变作用
蓝:rgb(0,0,255) 注意作用
深绿:rgb(0,128,0) 提示作用


//SQL AnyWhere安装方法:
在安装PB65时的自定义安装中组件ODBC Databases Drives里的Sybase SQL anywhere 5.5.04 ,这只是
安装了PB组件的ODBC驱动程序,并未安装SQL ANYWHERE,如果你需要使用SQL Anywhere的管理工具,你
还得进行如下的操作:在正版PB6.5的第六张盘里,有一目录名是SQLANY5504,这里面就是SQL ANYWHERE
的安装盘了,运行SETUP即可。如果是盗版,那只好靠你自已去找了。 在安装目录下有一个SETUP.BMP,
上面有SQL ANHWERE字样。


//很多书上讲到FILE菜单中点CREATE DATABASE,怎么能让这个选项出来?
在pb第六张光碟(或使用D版第二张碟6sqlany5504),进入sqlany5504目录,安装sql anywhere 5.5,
默认安装路径为: C:Program FilesSybaseSQL Anywhere 5.0win32,安装完成以后,修改
autoexec.bat, 增加一行,用于将sqlanywhere的文件放到系统搜索路径中: 
path %PATH%;C:Progra~1SybaseSQLAny~1.0win32 
这样重新启动后,你就可以看到File菜单下多出了Create Database这一项。 
特别说明:在...win32此目录下有一个很重要的文件,dbtl50t.dll,你可以做一个实验,进入
PB DataBase画板(不需要退出),然后切换到文件管理器中将dbtl50t.dll文件给改名,再切换回PB中,
点File菜单,你将会发现Create Database这一项又消失了。将dbtl50t.dll改名回来,回到PB中再点此
File菜单,一切又恢复正常。不过没有Create DataBase这一项都不是很重要,您还可以使用
Sybase Central来管理数据库,它才是Sql anywhere数据库的全面管理工具,可以建存贮过程,触发器。
(在"开始"->"程序"->"Sybase"->"Sql anywhere 5.0"下面,在硬盘中的执行文件名是scview.exe).

//不安装Oracle客户连接Oracle 8的方法
请将以下文件拷贝到运行文件所在目录 
一、ODBC动态库 :
ctl3d32.dll msvcrt40.dll odbc16gt.dll odbc32.dll odbc32gt.dll odbccp32.dll odbccr32.dll odbcint.dll 
二、建立EXTRA子目录,将MSVCRT.DLL文件拷贝到该子目录下
EXTRAMSVCRT.DLL 
三、ORACLE动态库及配置文件 
Tnsnames.ora CORE35O.DLL NASNSNT.DLL NAUNTSNT.DLL NCRNT.DLL Nlnt.dll NLSRTL32.DLL Nnfdnt.dll 
NNFNNT.DLL NSNT.DLL NTNT.DLL NTTNT.DLL CIW32.DLL Ora73.dll OTRACE73.DLL Sqlnet.ora 
Sqltnsnt.dll CORE35.DLL 
四、PB动态库 
pbvm70.dll pbdwe70.dll Pbo7370.dll PBO8470.DLL pbodb70.dll libjcc.dll


//不安装SQL7客户端,连接SQL7的方法:
只需要将SQL的DBNMPNTW.DLL、NTWDBLIB.DLL以及PB的PBVM60.DLL、PBDWE60.DLL拷贝到EXE文件所在目录
即可!


//设置对象的缺省属性
在用户界面的设计中,每添加一个对象如按钮,文本框等,PowerBuilder都会用缺省的字体,大小,颜色
等属性来定义对象。如果这不是我们所需要的属性,那么就需要逐个地去修改属性。可以通过将缺省的
属性修改为所需要的来简化这一操作。打开应用画笔,在属性中可以将缺省的字体,大小,颜色等属性
改成所需要的缺省属性。


//数据类型转换
数值类型之间的转换由系统自动完成,通常根据操作符转换到高一级精度参加运算.
数值类型精度优先级自高到低依次为:
double ← real ← decimal ← UnsignedLong,long ← UnsignedInteger
字符串到数值类型的转换函数:
integer(str),long(str),real(str),double(str),dec(str)
数值型到字符串的转换函数为:
string(number,format),number是任意一种数值类型,format指示转换后的格式,通常可以省略.


//代词
this:This代表窗口、用户对象、菜单、应用对象或控件本身,即代表正在为之编写事件处理程序的对象。
parent:Parent指当前控件所在的窗口。
ParentWindow:ParentWindow代表运行时菜单所在的窗口,该代词只能在菜单的事件处理程序中使用。
super:在编写控件或对象的子对象时,子对象中可以调用父对象的事件处理程序,程序中既可直接利用
父对象的名称调用它们,也可以使用Super代词来引用。例如,想调用父对象的Clicked事件处理程序时,
子对象中可以这样写: CALL Super::Clicked


//系统预定义的五个全局变量
sqlca,sqlda,sqlsa,error,message


//PowerBuilder中的颜色值和RGB值之间的关系如下:
color = R*256*256+G*256+B


//标准数据类型共有十四种
blob 二进制大对象,用于存储大量数据,例如图像、大文本等,如: blob{100} ib_test //长度100
boolean 布尔型,布尔型变量只有两个可能的值:TRUE或FALSE
char 或character,单个ASCII字符
date 日期,包括年(1000-3000)、月(01-12)、日(01-31)
datetime 日期及时间,仅用于访问数据库的DateTime型数据
dec 或decimal,带符号十进制数,最大18位精度,如: dec{2} ld_test //2位精度
double 带符号浮点数,15位有效数字
int 或integer,16位带符号整数
long 32位带符号整数
real 带符号浮点数,精度6位
string 字符串类型,用于存储任意的ASCII字符,长度为0到60,000(16位环境中),32位环境中长度
只受系统能力的限制。程序中直接写字符串时,用单引号(')或双引号(")将字符串括起来
缺省值空串("")
time 24小时制时间,包括小时(00~23)、分(00~59)、秒(00~59)以及秒的小数位(最多六位),
范围从00:00:00到23:59:59:999999
uint 或unsignedInteger,unsignedInt,16位无符号整数,范围从0到65535
ulong 或unsignedLong,32位无符号整数,范围从0到4,294,976,295
any 要想知道Any类型变量中保存数据的类型,可以使用函数ClassName()


//如何将照片存入数据库之中
定义一个Bolb 变量lb_file,将文件读到 lb_file,用 insertblob 或updateblob 就 OK 了


//变量的作用域
全局变量:在整个应用程序中都可访问,它的作用域是整个应用程序
实例变量:与对象相关联,只有在该对象的事件处理程序或函数中才能使用为该对象定义的实例变量。
实例变量在它所关联的对象被打开时创建,被关闭时消失
共享变量:是一种静态变量,这不仅意味着它所在的对象关闭后再次打开时共享变量依然保持对象关闭时
的值,而且还意味着同一个类多个实例中的同名共享变量保持相同的值
局部变量:在使用它的事件处理程序或函数中说明,其作用域仅限于说明它的程序段,在该程序段的任何
地方均可访问局部变量,但其它程序段都不能访问本程序段中的局部变量。运行程序后,进入
某个程序段时,系统自动为局部变量分配内存,退出程序段时,局部变量占用的内存被释放。

//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.拒绝数据的值并改变焦点


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值