PB程式設計通俗快速入手(自己2002年教別人PB時隨手寫的,很多年了,放上來送給新手們)
PB程式設計通俗快速入手
張金柱
第一章一般使用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
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整型
charc字元型
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座標
控制元件名.yY座標
控制元件名.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