标准数据类型 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;