標准數據類型 p30 頁
Blob - 大對象,例如圖像
Boolean – true / false
Character – a, b
Date - mm-dd-yyyy
DateTime – 2000-13-02 19:30:30
Decimal – 123.45 ( 共18 位,不算小數點的位數 )
Double - 精度為15位的小數
Integer – int
Long - 大整數
Real - 精度為6的小數
String – “” 可以存在 ASCII 中的
Time – 12:12:12
Unsigned integer - 無符號 int
Unsigned long - 無符號大整數
Ang 數據類型
Ang c = a + b ; // c 可以是任何數據類型,基本類型,結構,對象,數組等
系統數據類型
例如 window 類型
枚舉類型
常量
constant int CI_abc = 20
數組
int a[10] // 從 1 開始, integer li_stats[-3 to 5], 這樣都可以, // 只能有 1 維數組
邏輯判斷
and or not
控制
if then
endif
choose case 表達式 // choose 用法十分靈活,有點過分,可以不check 同一個表達式,如下例子 :
case 表達式
語句
case else
end choose
choose case num
case 6
num = 7
case IS > 36 // 太靈活了
num = 36
case else
num = 56
end case
循環
for 變量名 = 初值 to 終值 [step 步長]
語句塊
next
for i = 1 to 15 setp 2
num++;
next
do while 條件
語句塊
loop
也有 continue , exit ( 等於 break )
do
語句塊
loop while 條件
提供很多方便的函數 p39頁
- 數組函數
- blob函數
- 數據類型轉換函數
- 日期,時間函數
- 文件操作函數 ( 重要 )
FileClose(fileno), FileDelete(filename), FileOpen, FileWrite, GetFileOpenName
- 數值計算函數
- 打印函數
- 字符串操作函數
創建自定義函數 new function
-- 注意, function 不是 event
其中有個Pass By 的選項,其中,如果是 value 傳值, reference 傳地址, read only 也是傳地址,只不過不准許修改
如果是定義全局函數, 那么在 new –> pb object –> function , 此時創建的函數為全局函數,並且有提示你保存位置,一般要保存在一起。
也可以創建對象函數,對象函數與對象保存在一起,比如 你打開一個窗體,然后在上邊菜單中找到 insert –> function, 這時的 function就和該窗體創建在一起了,不會提示你該 function 的保存位置。
函數可以重載 ( 提供不同數量的參數,就可以重載 )
創建結構 structure
類似 struct
全局結構 : new –> pb object –> structure , 全局都可以使用該結構
對象結構 : 一般在對象內部使用,例如一個窗體內的所有對象使用,同樣也是使用 insert –> structure, 這樣,該 structure 就和這個對象保存在一起,點擊該對象前邊的 + 號,就可以找到對象的 structure.
在腳本和用於定義的函數中使用結構的方法 :
1. 聲明結構變量
2. 在程序中引用該結構的成員變量
例如 : Man 這個結構
Man lp_man // 聲明了結構變量
lp_man.firstname = “haha” // 給該結構變量賦值
常用函數 p45 頁
- messagebox
- Is ( isNumber, isDate, isTime 等等 ) 用來判斷一個字符串是否符合某種數據類型的格式(類型轉換前先進行判斷是一個比較好的選擇)
- Trigger, Post
trigger : 用來激活一個函數或事件,它的返回值可以在 script 中使用
post : 它被加入到對象隊列中並且按順序執行,一般情況下,它在當前 script 完成之后執行, 無返回值。
一般情況下,如果需要將所在 script 執行完畢后再調用其他函數或事件,則應該使用 post.
- 文件操作函數
當打開文件時,powerbuilder分給打開的文件一個獨特的整數,並且將該指針定位在文件中所規定的位置,可以用這個整數來標識文件以便讀寫或關閉文件。文件指針規定了下一次文件讀寫的起始位置並且在每次讀寫完后由 powerbuilder 自動更改。
- RGB 函數
- 其他函數 ( Open, Close, Create, Destory )
使用 SQL 語句
CONNECT {USING TransactionObject}; // 只有先連接了,其他的 SQL 語句啊,datawindow 啊等等 才可以使用
其中 TransactionObject 事務對象必須先設置正確,默認的事務對象是 SQLCA ( 一般只要使用這一個事務對象就可以了 )
DISCONNECT{USING TransactionObject} 斷開 // 之前已經連接的事務對象,斷開
例如: CONNECT USING SQLCA , DISCONNECT USING SQLCA
其實,所有的事務 (SQL語句) 都需要SQLCA,所以,如果是默認的就不需要特殊說明,例如 INSERT zhppexp05 [USING SQLCA]; 所以,一般只要使用 SQLCA 就可以了。懶的麻煩。
SQL 執行結果
0 : 執行成功
-1 : 最近一次執行失敗
100 : 最近一次執行沒有返回數據
當執行失敗,即 –1 時,事務對象一些屬性可以存放數據庫所提示的錯誤信息, SQLDBCode, SQLErrText
游標的使用
1. declare
2. open
3. fetch
4. 處理數據
5. 判斷是否返程,否則繼續 3-5
6. close
- declare cur_aa FOR SELECT STATEMENT
- open cur_aa
- fetch cur_aa into :變量名1, 變量名2;
- close cur_aa
動態 SQL p53 頁
上面的內容,不能執行 DDL 語句,例如創建表啊,等等,也不能動態執行一些帶參數的 SELECT 語句。所以。。。
1. 無輸入參數也無結果集 EXECUTE IMMEDIATE SQLStatement
常用, 執行DDL, PLSQL 等等
例如 : String mysql = “ CREATE TABLE Employee” &
+ “( employee_id integer not null, “ &
……
+ “emp_lname char(20) not null ) “
EXECUTE IMMEDIATE mysql ; // 執行 DDL 創建了 table
2. 有輸入參數,無結果 ( 這里有個默認的動態變量, SQLSA, 注意:這是默認動態變量,而不是那個 SQLCA )
個人感覺不常使用這種情況
int emp_id_var = 56
PREPARE SQLSA FROM “ DELETE FROM employee WHERE emp_id + ? “; // ? 代表所需要的參數
EXECUTE SQLSA USING emp_id_var;
為什么不常使用 : 因為直接可以寫 DELETE FROM employee WHERE employee_id = :emp_id_var;
3. 編譯時已經知道了參數和結果集的列
個人感覺更不常使用這種情況
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;
int emp_id_var
String emp_state_var = “北京” // 參數
String Sqlstatement
Sqlstatement = “ SELECT emp_id FROM employee WHERE emp_state = ? “
PREPARE SQLSA FROM : Sqlstatement
OPEN DYNAMIC my_cursor using: emp_state_var;
FETCH my_cursor INTO :emp_id_var;
CLOSE my_cursor;
4. 最復雜,功能最強大,開發時尚不知道參數和結果集
可以讓用戶自己輸入 SQL 語句,執行,只要寫在 MultlineEidt 多行編輯框就可以了
string Stringvar, Sqlstatement
int Intvar
Sqlstatement = “ SELECT emp_id FROM employee “ // 沒有 ? 號
PREPARE SQLSA FROM : Sqlstatement;
DESCRIBE SQLSA INTO SQLDA ;
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA;
OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA;
FETCH my_cursor USING DESCRIPTOR SQLDA;
// 當 FETCH 語句執行成功時, 動態描述區 SQLDA 中包含了結果集的第一行,反復執行 FETCH 語句即可得到其余數據
// SQLDA.NumOutputs中包含了輸出參數的個數
// SQLDA.OutParmType 數組中包含了各參數的數據類型 例如 TypeInteger!, TypeString! 等
// 使用 choose case 語句針對不同的輸出參數類型調用不同的對象函數得到相應的參數的值
CHOOSE CASE SQLDA.OutParmType[1]
CASE TypeString!
Stringvar = GetDynamicString(SQLDA, 1)
CASE TypeInteger!
Intvar = GetDynamicNumber(SQLDA, 1)
END CHOOSE
CLOSE my_cursor;
注: 以上內容4種動態貌似新版本有不同的解決方法,例如: 如下例子執行存儲過程
推薦 如下寫法
DECLARE proc_update PROCEDURE FOR P_AUTO_CREATE_EMP_ATTENDANCE (
a_work_date => :ls_date,
a_ot_rate => :lr_ot_time,
a_team => :ls_team,
a_emp_id => :ls_emp_id,
a_change_user => '[' ||:gs_user_id ||']' ||:gs_user_name
)
USING SQLCA;
EXECUTE proc_update;