----------------------------------------------------------------
数据库画板:
一张表定义了主键或者唯一索引,则能够在Results视窗中改动、添加、删除数据。
使用SQL语句创建数据表是最快捷的方式。可是,PB在创建数据表的同一时候,要在系统数据表中加入关于数据表的信息,表和字段的扩展属性都保存在系统表中。所以,直接使用SQL语句创建系统表将使系统表中的信息不完整。使用窗体菜单Design下的Synch Extended Attributes命令能够纠正这些不完整。实际上,系统表的不完整没有太多的副作用,尤其在不使用系统表编敲代码时。
表的扩展属性:
在相关的属性页中设置相关的属性。在General属性页中能够设置表的凝视信息,能够使用汉字。Data Font属性页用来定义从数据库中检索出来的数据的显示属性,在Database画板中操作数据或在数据窗体执行检索数据时。Heading Font属性页用来设置grid、tabular和n-up显示样式的数据窗体中Header的显示样式。Label Font属性页用来设置freeform显示样式的数据窗体中Label的显示样式。
字段的扩展属性:
在对应的属性页中设置相关的属性。General属性页用来设置字段的凝视信息(出如今表的字段说明处,数据窗体对象的tag处)。Headers属性页用来设置freeform,显示样式的数据窗体中的Label,tabular,grid和n-up显示样式的数据窗体中的Header(在设置好label和heading两处的内容后,如填写字段的中文信息,在制作数据窗体对象后在对应的label或header中显示中文信息)。Display属性页用来设置字段的显示样式,包含字段中数据显示的宽度、高度、是否显示为图片、是否加入一定的标记(比方,是否加入¥表示当前数据为人民币)。Validation属性页用来设置校验规则,在数据窗体中录入的数据必须能够通过该校验规则才干被接收。比方,能够规定用户在Salary(工资)字段上输入的数据应该在某个范围内,假设不在该范围内,则不被接收。EditStyle属性页用来设置数据窗体中编辑该字段时的编辑风格,比方能够使用Radio button让用户编辑该字段的数据。
能够同一时候打开两个Columns(View->Columns),在不同的数据之间拷贝、粘贴字段的定义。
打印数据表的定义:Print Definition
输出数据表的定义语法:Export Syntax
查看数据表操作的SQL语法:Pending Syntax
打开相关表
在包括键的数据表中,常常须要打开全部和该键有依赖关系的数据表,在Objects Layout视窗中、数据表的键(主键或者外部键)图标上单击鼠标右键,使用弹出菜单中的Open Dependant Table(s)命令就可以显示全部和该键有依赖关系的数据表。有依赖关系的数据窗体打开后,有依赖关系的键之间有线段联接,表示它们之间的依赖关系。当打开的数据表比較多时,能够在该视窗空白处单击鼠标右键,使用弹出菜单中的Arrange Tables来排列数据窗体的布局。
定义外部键时,注意在Ruels属性页选择删除策略
Results页面中右键Save Rows As...保存数据到外部
Rows->Import从外部导入数据
----------------------------------------------------------------
一个事务对象一次仅仅能连接一个数据库,定义多个事务对象能够同一时候和对个数据库建立连接。
Transaction gt_sqlca
gt_sqlca = create transaction
----------------------------------------------------------------
事务
在PB中,对事务的操作是这样进行的:先定义開始一个事务(默觉得SQLCA),然后对数据进行改动操作,这时假设提交(commit),这些改动就永久地保存下来;假设回退(rollback),数据库管理系统将放弃全部改动,回到開始事务时的状态。
----------------------------------------------------------------
事务对象包含15个參数:(5个用来返回操作的状态信息,其它10个用于设置和数据库连接时的參数)
SQLCode 是否成功标志,有三个可能的取值:0-成功,100-无数据,-1-错误(long)
SQLDBCode 数据库的错误代码(long)
SQLErrText 数据库的错误信息(string)
SQLNRows 涉及到的行数-不同的DBMS有所不同(long)
SQLReturnData DBMS指定的信息(string)
DBMS
Database
LogID
LogPass
ServerName
UserID
DBPass
Lock
DBParm
connect {using sqlca}; //连接数据库,连接后,能够依据sqlca.sqlcode的返回值推断是否正确连接了数据库
----------------------------------------------------------------
数据库操作:
选取:
select 字段名集合 into :变量集合 from 表名 where 条件表达式 {using 事务对象名};
select salary,name into :li_salary,:ls_name from salarys where name = :ls_nameusing sqlca;
插入:
insert into 表名(字段列表) values (值列表) {using 事务对象};
insert into dept(deptno,deptname,workers) values (:ls_deptno,"销售部",10);
删除:
delete from 表名 where 条件表达式{using 事务对象};
delete from 表名 where current of 游标名称;
delete from dept where workers = 10;
delete form dept where current of dept_cur;
改动:
update 表名 set 字段名 = :变量名(或常数)[,字段名 = :变量名(或常数)] where 条件{using 事务对象};
update 表名 set 字段名 = :变量名(或常数)[,字段名 = :变量名(或常数)] where current of 游标;
----------------------------------------------------------------
能够用execute immediate指令来运行随意的数据库操作。——动态SQL语句
将数据库指令编辑成一个字符串,您能够运行不论什么的数据定义语句如建表、建主键、存储过程等
eg.
string ls_sql
ls_sql = "delete from customers where customerid = '1'"
execute immediate :ls_sql;
if sqlca.sqlcode = 0 then
commit;
else
rollback;
end if
注意:ls_sql能够包含变量等,仅仅要终于是一条SQL语句就可以
注意:若,sqlca.autocommit = true,即自己主动提交事务,则不须要后面的if……
----------------------------------------------------------------
动态SQL语句有四种类型:
既无输入參数,也无结果集;
有输入參数,但没有结果集;
编译时已经知道參数和结果集;
开发程序时尚不知道參数和结果集。
类型一
这样的类型的动态SQL语句经经常使用来运行DLL或者数据库专用的其它SQL语句。语法格式是:
EXECUTE IMMEDIATE SQLStatement {USING TransactionObject};
当中SQLStatement是个字符串,其内容是有效的SQL语句;TransactionObject是事务对象名,大括号表示该子句能够省略,省略时使用SQLCA。以下是个创建删除数据表的样例:
string MySQL = "drop table employee"
EXECUTE IMMEDIATE :MySQL USING SQLCA;
*最好使用例如以下代码
string ls_sql = 'drop table employee'
execute immediate :ls_sql using sqlca;
if sqlca.sqlcode = 0 then
commit;
else
rollback;
end if
类型二
执行之前已知參数个数而且没有返回值时使用这样的类型的动态SQL语句。这样的类型的动态SQL语句也可以处理须要在执行时定义參数的数据操作语句。其语法格式是:
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
EXECUTE DynamicStagingArea USING {ParameterList};
当中DynamicStagingArea是个DynamicStagingArea类型的变量,该类型的缺省全局变量是SQLSA;SQLStatement是个String类型的常量或者变量,其内容是有效的SQL语句,SQL语句中使用问号代表所需參数,执行时问号被EXECUTE语句中的SQL语句中的USING子句所代表的值代替;TransactionObject是事务对象名,大括号表示该子句能够省略,省略时使用SQLCA;ParamenterList是參数列表,能够是变量、常量或者控件的属性,各參数相应于SQLStatement中的问号。动态策略区用于准备SQL语句及所需參数个数,它的属性在执行时应用程序不能訪问,SQLSA是缺省的动态策略区变量。
eg:
int emp_id_var = 56
PREPARE SQLSA FROM "DELETE FROM employee WHERE emp_id = ?";
EXECUTE SQLSA USING :emp_id_var;
eg:
prepare sqlsa from "insert into employee (emp_id,manager_id) value(?,?)";
execute SQLSA using :ls_empid,:sle_manager.text;
类型三
这样的类型的动态SQL语句的使用频率可能是仅次于第一种类型,它经常使用来处理參数个数和结果集在编译时已知的情况,又分为游标和存储过程两种情况。使用游标形式的语法与程序中出现的次序为:
DECLARE Cursor DYNAMIC CURSOR FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
OPEN DYNAMIC Cursor{USING ParameterList};
FETCH Cursor INTO HostVaribaleList;
close Cursor;
使用存储过程的第三类动态SQL语句的格式和次序与上面的语法形式类似,仅仅是使用EXECUTE语句来取代上面的OPEN语句,其语法格式为:
DECLARE Procedure DYNAMIC PROCEDURE FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
EXECTUE DYNAMIC Procedure{USING ParameterList};
FETCH Procedure INTO HostVariableList;
CLOSE Procedure;
当中,Cursor和Procedure各自是游标名和过程名;DynamicStagingArea是动态策略区变量,通常使用系统提前定义的全局变量SQLSA;SQLStatement是个字符串(常量或变量均可,变量时变量名前面加上冒号),起内容是有效的SQL语句,并使用问号代表參数;ParameterList是相应于SQLStatement中问号的參数列表;HostVariableList是PowerScript主变量(即在其前面加上冒号的PowerScript变量);TransactionObject是事务对象名,缺省时使用SQLCA。
DECLARE语句说明动态游标或动态过程,PREPARE语句准备动态策略区,OPEN或EXECUTE语句打开动态游标或运行动态过程,FETCH语句读取一行数据,假设须要读取多行数据,那么须要重复运行FETCH语句。最后,CLOSE语句关闭动态游标或动态过程。FETCH语句和CLOSE语句的使用方法与上节介绍的方法同样。以下是第三类动态SQL语句的一个应用演示样例,他得到籍贯是“北京”的雇员:
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA;
int emp_id_var
string sqlstatement,emp_state_var = "北京"
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;
该演示样例中省略了必要的SQL语句运行状态检查工作,在实际编敲代码时,除DECLARE语句外,运行了其它SQL语句后,都应该检查事务对象的SQLCode属性,以推断SQL语句的运行是否成功。
使用这样的类型的动态SQL语句能够创建比較通用的向列表框或者下拉列表框中加入数据的脚本。
//////////////////////////////////
//函数名:wf_addItem(dropdownlistbox fo_obj,string fs_sql)
//參数:fo_obj为下拉列表框,fs_sql为SQL语句
//返回值:无
//功能:使用參数指定的SQL语句向指定的下拉列表框中加入数据
////////////////////////////////////
string ls_item
declare item_cur dynamic cursor for sqlsa; //定义动态光标
prepare sqlsa from :fs_sql using sqlca;
open dynamic item_cur; //打开动态光标
fetch item_cur into :ls_item; //取数据
fo_obj.setredraw(false) //禁止下拉列表框刷新
do while sqlca.sqlcode = 0
fo_obj.additem(ls_item) //向下拉列表框中加入项目
fetch item_cur into :ls_item;
loop
fo_obj.setredraw(true) //刷新下拉列表框
close item_cur; //关闭动态光标
类型四
第四类动态SQL语句最复杂,功能也最强,它可以处理编程时尚不知道參数和结果集的SQL语句。与第三类动态SQL语句相似,第四类动态SQL语句也有两种形式:一种针对游标处理,还有一种则针对存储过程而言,差别在于游标处理时使用OPEN语句而不使用EXECUTE语句,而运用存储过程时则使用EXECUTE语句但不使用OPEN语句。以下给出第四类动态SQL语句的语法,当中Cursor针对游标,Procedure针对存储过程:
DECLARE Cursor|Procedure DYNAMIC CURSOR|PROCEDURE FOR DynamicStagingArea;
PREPARE DynamicStagingArea FROM SQLStatement{USING TransactionObject};
DESCRIBE DynamicStagingArea INTO DynamicDescriptionArea;
OPEN DYNAMIC Cursor USING DESCRIPTOR DynamicDescroptionArea;|
EXECUTE DYNAMIC Procedure USING DESCRIPTOR DynamicDescriptionArea;
FETCH Cursor|Procedure USING DESCRIPTOR DynamicDescriptionArea;
CLOSE Cursor|Procedure;
当中,Cursor和Procedure各自是游标名和过程名;DynamicStagingArea是动态策略区变量,通常使用系统提前定义的全局变量SQLSA;SQLStatement是个字符串(常量或变量均可,变量时变量名前面加上冒号),其内容是有效的SQL语句,并使用问号代表參数;DynamicDescriptionArea是动态描写叙述区变量,这样的类型的变量专门用来描写叙述第四类动态SQL语句中的输入和输出參数,通常使用系统提前定义的全局变量SQLDA;TransactionObject是事务对象名,缺省时使用SQLCA。第四类动态SQL语句使用了动态描写叙述区对象变量,通过该变量的四个属性NumInputs,InParmType、NumOutputs和OutParmType可以得到输入參数个数、输入參数类型、输出參数个数和输出參数类型的信息,当中InParmType是个数组,每一个元素依次相应于SQL语句中的一个问号;OutParmType也是个数组,每一个元素相应于一个输出參数。InParmType和OutParmType的数据类型是枚举类型ParmType,其取值范围为以下“适用的參数类型”栏列出的各个值:
函数名 适用的參数类型
GetDynamicNumber() TypeInteger!、TypeDecimal!、TypeDouble!、
TypeLong!、TypeTeal!、TypeBoolean!、
TypeUnsingedInteger!、TypeUnsignedLong!
GetDynamicString() TypeString!
GetDynamicDate() TypeDate!
GetDynamicTime() TypeTime!
GetDynamicDateTime() TypeDateTime!
通过使用该对象变量的函数SetDynamicParm()设置详细的输入參数值。通过上面的对象函数得到输出參数(实际上就是SQL语句的返回数据)的值,每一个函数都针对特定的数据类型。
第四类动态SQL语句语法格式中各语句的运行次序十分重要,仅仅有在前一条语句运行成功时,后一条语句的运行才有意义,因此,除DECLARE语句外,其它语句运行后都应该检查事务对象的SQLCode属性,以推断当前SQL语句的运行是否成功。通过对次调用FETCH语句,可以读取多条数据,每读出一条数据后,通常在循环语句中使用CHOOSE CASE确定输出參数的类型后再用上面的相应函数得到其值。以下是第四类动态SQL语句的一个应用演示样例,当中省略了实际编程中必须具备的检查事务对象SQLCode属性的过程(即检查SQL语句运行是否成功):
string ls_sqlstatement
integer li_count = 0
ls_sqlstatement = "select emp_id from employee"
prepare SQLSA from :ls_sqlstatement;
Descrobe SQLSA InTo SQLDA;
Declare my_cursor Dynamic Cursor For SQLSA;
Open Dynamic my_cursor Using Descriptor SQLDA;
Fetch my_cursor Using DescripTor SQLDA;
If SQLCA.sqlcode = 100 then
messagebox("提示","没有找到指定的数据!")
close my_cursor;
return
end if
do
li_count ++
//当FETCH语句运行成功时,动态描写叙述区SQLDA中包括了结果集的第一行数据
//,重复运行FETCH语句就可以得到其余数据。
//SQLDA.NumOutputs中包括了输出參数的个数。
//SQLDA.OutParmType数组中包括了各參数的数据类型,如TypeInteger!等
//使用choose case语句针对不同的输出參数类型调用不同的对象函数得到
//对应參数的值。
choose case SQLDA.OutParmType[1]
case TypeString!
stringvar = GetDynamicString(SQLDA,1)
case TypeInteger!
intvar = GetDynamicNumber(SQLDA,1)
end choose
loop while li_count <> SQLDA.NumOutPuts
close my_cursor;
*详细见帮助
----------------------------------------------------------------
使用游标步骤:
1)定义游标
declare cursor 游标名 for
select 字段名 from 表名
where 条件表达式 {using 事务对象};
2)打开游标
open 游标名称;
打开游标后游标中就保存了对应的返回结果
3)读取数据
fetch 游标名称 into :变量列表;
4)关闭游标
close 游标名称;
循环处理游标时,通过推断事务对象的參数能够知道是否处理全然部的数据。即通过事务对象的參数SQLcode来推断是否处理全然部的数据。
fetch……;
do while salca.sqlcode = 0
//
fetch……;
loop
for li_index = 1 to sqlca.sqlnrows
//
fetch……;
next
----------------------------------------------------------------
事务对象相当于一个联络员,专门用于PowerBuilder应用程序和数据库之间的通信。在訪问数据库之前,必须首先建立一个事务对象,通过事务对象和数据库建立联结,之后才干和数据库打交道,全部和数据的相关操作都是通过这个联络员进行的。事务是和事务对象紧密相关的一个概念,是事务对象进行工作时的最小单位,由一个或者多个SQL语句组成的。一个事务中的全部SQL语句都正确运行,整个事务才干顺利提交,仅仅要有一个SQL语句失败,该事务中前面已经做的操作都要被撤消,又一次回到该事务開始的状态。事务处理就是通过事务对象和相关SQL语句进行的。
PowerBuilder中,有4个SQL语句专门进行事务处理,它们是connect,disconnect,commit和rollback,分别负责和数据库建立联接、断开联接、提交事务和回退事务等。在进行数据窗体检索或者运行SQL语句之前,首先应该使用connect语句和数据库建立正确的联接;当全部和数据库相关的操作完毕后,能够使用disconnect语句和数据库断开联接。commit用来提交一个事务,rollback用来回退一个事务。这四个事务管理语句的格式相类似,例如以下所看到的:
statement {using transaction};
当中,statement代表四个单词中的随意一个,transaction是事务对象的名称,假设省略,则使用缺省的全局事务对象SQLCA。程序猿也能够声明自己的事务对象类型的变量。若使用自己声明的事务对象,应该在声明之后使用create语句创建对象,使用完成后运行destroy语句销毁自己定义的事务对象。而且在涉及事务对象的SQL语句中都要加上using transaction子句。以下是一个使用自己定义事务对象的完整样例:
(1)声明全局变量:transaction my_SQLCA。
(2)在应用对象的Open事件中编写例如以下脚本:
my_Sqlca = Create transaction //创建事务对象
//以下语句给事务对象中的成员变量赋值
my_Sqlca.DBMS =ProfileString("PB.INI","Database","DBMS", "")
my_Sqlca.Database =ProfileString("PB.INI","Database","DataBase"," ")
…………. //设置事务对象my_SQLCA的其它參数
connect using my_Sqlca; //联接数据库
If my_Sqlca.Sqlcode=0 Then //推断是否正确联接
Open(w_main) //正确联接则打开主窗体
Else //否则
MessageBox(String(my_Sqlca.Sqlcode),"不能和数据库联接!")//显示错误信息
Halt Close; //关闭应用
End If
(3)在应用对象的Close事件中释放事务对象,编写例如以下脚本:
Disconnect Using my_Sqlca; //断开和数据库的联结
destroy my_Sqlca; //释放事务对象
和数据库建立联接后,能够完毕操作数据库的工作并运行commit或rollback。在每一个commit或rollback之后关闭旧的事务处理,并開始新的事务处理。在一个事务处理过程中,应用程序控制着数据库,并由DBMS依据一定的机制对数据库中的数据加锁。假设一个事务的持续时间过长,就会导致很多的问题。比如,对于一个典型的生产系统,每天将自己主动或者人工进行事务日志转储。假设该系统的某类client应用程序整天运行而且仅仅进行仅仅读查询,那么在使用connect语句启动事务之后事务总是处于激活状态,不论什么转储或者截断日志的企图都不会生效,终于将导致日志爆满而引起整个数据库的问题。所以,PowerBuilder给事务对象提供了一个能够选择自己主动提交事务的成员变量,即AuToCommit,将该參数设置为True能够在事务对象所包括的每一个语句运行完后自己主动运行commit,从而结束一个事务。第二种解决方法是由开发者在脚本中使用事务管理语句显式地管理事务,这须要更好地理解事务。
数据窗体是和数据库打交道的一个主要控件,在运行数据窗体的功能之前必须首先给数据窗体控件正确设置事务对象。一般在数据检索之前使用函数SetTrans或SetTransObject设置事务对象。使用不同的函数,数据窗体的事务处理方式就不同。函数SetTrans的语法格式例如以下所看到的:
dwcontrol.SetTrans( transaction )
当中,dwcontrol是要设置的事务对象的数据窗体控件名称,transaction是事务对象名称。若函数正确运行,则返回1,否则返回-1;随意參数为NULL则返回NULL。函数SetTransObject和该函数的格式、參数与返回值全然同样。
函数SetTrans设置事务对象后,数据窗体能够自己主动管理事务的处理,事务中所包括的每一个功能或者语句运行完后都自己主动进行事务管理。而函数 SetTransObject设置事务对象后,数据窗体的事务处理得由脚本控制,除非在和数据库建立联接之前将事务对象的AuToCommit成员变量设置成了True。尽管数据窗体自己主动进行事务处理能够省去一些关于事务处理的脚本,可是也带来了非常多的潜在危急。每次运行检索或改动等操作之前自己主动联接数据库,运行完后自己主动运行disconnect,无需再运行connect,commit,rollback或disconnect了。运行过程中的不论什么错误都会导致自己主动运行rollback,脚本对事务处理别无选择,无法控制事务的处理。在应用系统中和数据库的联接非常少时,能够由系统自己主动进行事务处理,这时使用函数SetTrans给数据窗体控件设置事务对象。通常情况下,使用SetTransObject设置事务对象能够使数据窗体有更高的运行效率。建议使用SetTransObject给数据窗体控件设置事务对象。
另外,函数SetTransPool能够设置事务对象共享,也影响着事务的处理。使用该函数不仅能够将数据库的吞吐量最大化,还能够控制同一时候打开的数据库联接的最大个数。假设在应用程序中设置了事务对象共享,当使用一个事务对象进行数据库联接时,系统首先检查是否存在和要使用的事务对象成员变量取值全然同样的事务对象。假设存在,就没有必要再又一次创建事务对象,利用已经存在的事务对象就可以,而且在有事务对象共享时,运行commit语句也不会真正从物理上终止一个事务,而仅仅是在逻辑上终止该事务。当有新的同样取值的事务建立时,又一次启用该事务对象。该函数的语法格式是:
applicationname.SetTransPool ( minimum, maximum, timeout )
当中,applicationname是应用对象名称;minimum和maximum是在事务对象池中要保证打开的事务对象的最少个数和最多个数,minimum必须小于或者等于maximum;timeout是建立数据库联接时的最长等待时间,超过该时间还不能成功建立联接就返回错误信息。若函数正确运行,则返回1,否则返回-1。以下是该函数的一个实例:
GetApplication().SetTransPool(12,16,10)
上面的语句首先使用函数GetApplication获取当前的应用对象,然后给该应用对象设置事务对象共享,最少打开事务对象12个,最多16个,联接时最长等待时间是10秒。
建议在进行数据库联接之前使用该函数,一般是在应用对象的Open事件中首先使用该函数建立事务对象共享,然后再创建要使用的事务对象,进行和数据库的联接。当在应用中须要维护多个联接,而且包括大量訪问同样数据源的简短事务时,使用该函数创建事务对象共享能够提高应用程序的运行效率。以下是一个在应用对象的Open事件中创建事务对象共享的脚本:
If GetApplication().SetTransPool(12,16,10) <> 1 Then
MessageBox("提示","错误!")
Halt Close;
Else
SQLCA.DBMS=ProfileString("PB.INI","Database","DBMS", "")
SQLCA.Database=ProfileString("PB.INI","Database","DataBase"," ")
… //设置其它的SQLCA成员变量取值
Connect; //使用SQLCA事务对象进行联接
If SQLCA.SQLcode = 0 Then //联接成功则
Open(w_main) //打开主操作窗体
Else //联结不成功则显示错误信息
Messagebox("错误!",String(SQLCA.SQLDBCode) +"~r~n" + SQLCA.SQLErrText)
Halt Close; //关闭应用软件
End If
End If
在上面的脚本中,假设正确建立了事务对象共享,而且运行connect也正确,则系统自己主动打开12个事务对象。
----------------------------------------------------------------
在PowerBuilder的数据库中有5个表,用来记录数据库中其它表的有关信息,而且这5
个表由PowerBuilder自己主动维护,通常把这5个表称为PowerBuilder的仓库。这个仓库同意收
集和维护扩展列属性。
PBCatTbl 记录当前数据库中表的信息
PBCatCol 记录各个表中的列的相关信息
PBCatEdt 编辑样式
PBCatFmt 显示样式
PBCatVld 有效性验证规则
当使用PowerBuilder创建数据表时,PowerBuilder能够自己主动维护这5个表。当使用PB以外的工具创建数据表时,新建数据表的信息不会自己主动加入到仓库中,这时非常多开发者的错误是将信息手工输入到仓库中。正确的操作应该是运行database画板的Design菜单下的Synch Extended Attributes菜单项的功能,这样仓库能够自己主动更新。在编程时常常使用的有两个表,即存放表信息的PBCatTbl和存放字段信息的PBCatCol。
PBCatTbl:当中pbt_tname用来存放其它表名,pbt_ownr用来存放表的拥有者,pbt_cmnt用来存放表的凝视,这三个字段在编程时常常使用,其它字段非常少使用。使用这三个字段能够提取系统中的全部表,为了构造比較友好的界面,显示给用户的通常是字段pbt_cmnt中的内容,该表的索引基于字段pbt_tnam和pbt_ownr。
PBCatCol:当中,pbc_tnam用来存放表名,pbc_ownr用来存放表的拥有者,pbc_cid是记录字段创建顺序的,pbc_cnam用来存放字段名称,pbc_labl用来存放字段的标号,pbc_cmnt用来存放字段的凝视。这些字段在编程时常常使用,当中pbc_cmnt常常显示在用户界面中。
----------------------------------------------------------------