首页 > 开发 > 综合 > 正文

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

2024-07-21 02:09:56
字体:
来源:转载
供稿:网友
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;

 

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

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;                              //断开

 

5)从库中查询一行数据:(查询语句被固化)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中讲得很清楚,这里就不多讲了。

 

7)非固化的查询语句:这个对提高软件灵活性很重要,但很简单,只贴上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 &    <――这是分行连接符号,空格后一个&符号

where salary > 20000"

if deptid = 200 then

        prepare sqlsa from :sql1 using sqlca ;

else

        prepare sqlsa from :sql2 using sqlca ;

end if

open dynamic my_cursor ;

 

小结:

内容不多,但主要的东西都在这里了,其他的要在实践中领会,这些知识对上手和标准的mis系统等开发,知识面及深度已经足够了。sql语句帮助中的已够用,详细讲太多,恕不赘述。

2002-7-14
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表