PB编程通俗快速入手(自己2002年教别人PB时随手写的,很多年了,放上来送给新手们)

PB 编程通俗快速入手

张金柱

** 第一章 ** ** 一般使用 ** ** **


1、 程序的开始, application 的 open 事件。

退出程序例程: halt 为退出函数

int SureQuit

SureQuit = 2

SureQuit=Messagebox(" 退出系统 "," 退出前请确认已保存好数据 ",Question!,OKCancel!, 2)

if SureQuit = 1 then halt

2、 变量定义有效范围:

◎ declare - globe 全局变量,整个程序均有效

◎ declare - instance 局部变量,可在一个对象中有效(如:窗体, APP 等)

◎ 模块中定义的变量,可在当前模块中有效

定义: ** ( ** ** PB ** ** 中大小写不敏感) **

constant string LS_HOMECITY = "Boston" 常量

int a 整型

char c 字符型

Boolean b 布尔型

String a 字符串型

String a[1000] 1000 的数组, 0 ~ 1000

String a[3 to 30] 数组元素为 3 到 30 ,最初一个为 a[3] ,最后一个为 a[30]

String a [100,3to 30] 二维数组,一维为 0~100, 二维为 3 到 30

String a[] 变长数组,赋值时(如 a[30]=333 )自动分配内存。

得到上界 UPPERBOUND, 下界 LOWERBOUND 。

操作:

a=”aaaa”+”vvvbb”+b+c

string(b) 将 B 转换成字符串型

integer(“333333333333”) 将 “333333333333” 字符串转换成数 333333333333

a=a+b*c^d/e\f%g

◎注意:减号前后要空格,用于避免 PB7.0 之前版本的 BUG 。

3、 函数定义:

第一行是返回类型和函数名,第二行是变量类型和变量名, tab 键加形参。

Return 是函数的返回,同时如 C 语言一样, return 则函数运行结束

4、 打开窗口

open( 窗口名 )

openwithparm( 窗口名 , 参数,父窗口 < 仅对子窗体和弹出窗体有效 >)

5、 MDI 窗体中打开子窗体

层叠样式打开 opensheet( 子窗体 , 父窗体名 ,1,layered!)

平铺样式打开 opensheet( 子窗体 , 父窗体名 ,1, Original!)

如果在父窗体的窗体级函数下编写,可用 opensheet( 子窗体 , this ,1, Original!)

第三个参数表示新开窗体在父窗体菜单中的位置。

6、 控件基本属性

控件名 .x x 坐标

控件名 .y Y 坐标

控件名 .width 宽

控件名 .height 高 …… (其他可参见编辑器中的属性窗口)

7、 调整窗体模式

this.windowstate=maximized!

窗体 .windowstate=maximized! 窗体最大化(其他可参见编辑器中的属性窗口)

8、 INI 文件读取及写入

【举例】有名为“ MNR.INI ”的 ini 文件,(路径在程序所在目录)有数据如下:

[ACTION]

PRELOAD=YES

可以用如下语句读取:

a=ProfileString("MNR.INI","ACTION","PRELOAD","aaa")

a 为变量, ”aaa” 为无此数据项时默认数据

可以用如下语句写入 ( 写入值为 yes):

setprofilestring("MNR.INI","ACTION","PRELOAD","YES")

9、 对于整个程序中都要用到的变量

可以先定义一个结构,再在 globe declare 中定义该结构类型变量,管理起来方便些

10、 主要语法单元

条件判断

** if ** ** 怎样 then **

** ** ** 怎样做 **

** else if ** ** 怎样 then **

** ** ** 怎样做 **

** end if **

|

** choose case ** ** 变量 **

** case is <3 **

** … **

** case 4 to 7 **

** … **

** case else **

** … **

** end choose **

---|---

循环到 A 大于 5

** DO **

** A=a+1 **

** LOOP UNTIL A > 5 **

|

** DO WHILE A <= 5 **

** A = A + 1 **

** LOOP **

|

** DO **

** A=a+1 **

** LOOP UNTIL A > 5 **

|

** DO UNTIL A > 5 **

** A = A + 1 **

** LOOP **

---|---|---|---


** 跳出循环 EXIT, ** ** 继续下一轮循环 CONTINUE **

11、 消息框

messagebox( 标题,信息 ) 其他看帮助,查索引 messagebox

12 、取得当前时间 now()

sle_begintime.text=string(now(),"yyyy-mm-dd 10:00:00")

如现在是 2002-7-14 17:22:21 秒,则输出为 2002-7-14 10:00:00

13、 列表框应用

DDLB_BSC.RESET() 清空列表框内容

I=1

DO WHILE I<=UpperBound(WINBSC)

IF WINBSC[I]="" THEN EXIT;

DDLB_BSC.ADDITEM(WINBSC[I]) 增加内容项到列表框

I=I+1

LOOP

** 第二章 ** ** 应用数据库 ** ** **


1、 datawindow 控件的使用

先创建一个 datawindow 对象 dw_hwtj ,再在窗体中添加一个 datawindow 控件 dw_rep ,最后将 datawindow 的 dataobject 属性设置成 dw_hwtj 。

a) 我写的选行函数, datawindow 控件的 click 事件上用

if row=0 then return

if nowrow<>row and nowrow>=0 then

THIS.SELECTROW(nowROW,false)

end if

THIS.SELECTROW(ROW,TRUE)

nowrow=row

b) 我写的排序函数,在 datawindow 控件的双击事件上用

IF dwo.Type = "column" THEN

ls_columnname = dwo.Name

END IF

if nowstate='A' then

THIS.SETSORT(ls_columnname+" D")

NOWSTATE='D'

ELSE

THIS.SETSORT(ls_columnname+" A")

NOWSTATE='A'

END IF

THIS.SORT()

( 效果,在某一列上双击一次,正向排序,再一次,反向排序 )

c) 规定排序

dw_rep.setsort("BSCMC A,XQH A,xqmc A")

dw_rep.sort()

(先按 BSCMC ,再按 XQH, 再按 xqmc 正向排序)

d) 保存到 xls 文件

dw_rep.saveas('',Excel5!,true)

e) 读写:

写 w_netrep_cell.dw_rep.object.tchpzzs[I] =a

读 a=w_netrep_cell.dw_rep.object.tchpzzs[I]

2、 建立与数据库的连接

1 )定义

transaction localdb

2 )设置

MyTrans.DBMS=”as”

MyTrans.Database=”sda”

MyTrans.LogPass=”def”

MyTrans.ServerName=”dbo”

MyTrans.LogID=”abc”

MyTrans.DBParm=””

MyTrans.Lock=””

MyTrans.UserID=”abc”

MyTrans.AutoCommit =true

3 )连接

连接 connect using localdb;

断开 disconnect using localdb;

  1. 从库中查询多行数据:(查询语句被固化)

connect using localdb; // 连接

if localdb.SQLCODE<0 then

Messagebox(" 连接本地数据库失败 ...",localdb.sqlerrtext)

return 1

end if

DECLARE MY_CURSOR CURSOR FOR // 定义游标

SELECT BSC from BSC ORDER BY BSC USING LOCALDB; // 执行查询

I=1;

OPEN MY_CURSOR; // 打开游标

DO WHILE NOT LOCALDB.SQLCODE = 100 // 直到结束

IF I>UpperBound(WINBSC) THEN EXIT

FETCH MY_CURSOR INTO :WINBSC[I]; // 提取数据项

I=I+1

LOOP

CLOSE MY_CURSOR; // 关闭游标

disconnect using localdb; // 断开

  1. 从库中查询一行数据:(查询语句被固化) HELP 中例程,“ : “后加一个字符串是指标志为该字符串的变量

SELECT employee.Emp_LName, employee.Emp_FName

INTO :Emp_lname, :Emp_fname

FROM Employee

WHERE Employee.Emp_nbr = :Emp_num

USING Emp_tran ;

6 )在数据更新,删除,增加,建表等操作中使用的:

注意查阅: Dynamic SQL Format 1 statement ……Dynamic SQL Format 4 statement ,其中讲得很清楚(看 sample )

直接执行一条语句:

EXECUTE IMMEDIATE SQLStatement {USING TransactionObject} ;

HELP 中讲得很清楚,这里就不多讲了。

  1. 非固化的查询语句:这个对提高软件灵活性很重要,但很简单,只贴上 HELP 中的 SAMPLE 一个:

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA

string sql1, sql2

sql1 = "SELECT emp_id FROM department WHERE salary > 90000"

sql2 = "SELECT emp_id FROM department & <――这是分行连接符号,空格后一个&符号

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus