在PowerBuilder的应用程序开发过程中对数据库中数据进行操作的对象是数据窗口对象(DataWindow)利用数据窗口对象我们可以十分方便地完成对数据库中已经存在的表中数据进行检索查询插入删除和更新但是在实际问题中我们常常遇到数据库中的一些表是用户在程序运行期间动态生成的若要对这样表中的数据进行操作就要运用动态数据窗口对象值得提到的一点是在动态数据窗口对象生成时其标题区(Header Band)中的文本不能直接显示成汉字这的确是一点遗憾不过这个问题可以通过映射的方法得到解决
一问题的提出
设有如下两张表
A表中的记录是用户可以在程序运行期间进行自由增加修改删除和更新的B表中的属性(即字段)由A表中的记录决定并动态创建而且能够方便地对B表中的数据提供汉化的操作界面当然将B表创建为下表
也是可以的但是在动态生成数据窗口对象时其标题区(Header Band)中的文本不会显示成汉字而是一些乱码反而不利于问题的解决
二问题的解决
动态创建B表的解决
我们要动态创建B表就要构建动态SQL语句何谓动态SQL语句?数据库应用程序通常进行确定的工作因此在编写和编译时就可以确定完整的SQL语句但当需要使用PowerBuilder不支持的嵌入SQL语句(如DDL语句)或者在编译时不知道语句的具体格式或参数则在运行时构成SQL语句这类语句被称为动态SQL语句
动态SQL语句的格式
EXECUTE IMMEDIATE SQL statement [Using Transation Object];
参数说明
SQL statement 包含一条有SQL语句的字符串
Transation Object 事务对象
动态数据窗口对象创建及标题区(Header Band)中文本汉化的解决
()在程序运行时我们可以调用Create函数动态生成数据窗口对象格式如下
DataWindowControlCreate(Syntax{Errorbuffer})
参数说明
DataWindowControl 将在其中创建数据窗口对象的数据窗口控件名
Syntax 数据窗口对象源代码
Errorbuffer 用于保存错误信息的字符串
()由于标题区(Header Band)中文本框的名称是对应细目区(Detail Band)中相应列的名称加上_t构成的而细目区(Detail Band)中列的名称又是相应表的属性的名称因此我们能够使用游标(Cursor)取出A表中的ywm和zwm的值然后使用映射的方式替换标题区(Header Band)中文本框的文本(Text)属性从而使标题区(Header Band)中文本框的文本显示为相应的汉字
三一个简单的例子
在PowerBuilder 和MS SQL Server 的环境下使用一个简单的例子实现上述的观点限于篇幅只列出主要界面及关键程序
动态创建B表按钮对应的代码是
int li_i=li_count
string ywm[]zdlx[]ls_templs_sql
//使用游标(Cursor)从数据库的表中获取ywm和zdlx的值并存储于数组ywm[]和zdlx[]中
select count(*) into :li_count from a;
DECLARE a_cur CURSOR FOR SELECT ywmzdlx FROM a order by ywm;
OPEN a_cur ;
FETCH a_cur INTO :ywm[li_i] :zdlx[li_i] ;
do while sqlcasqlcode=
ls_temp=trim(zdlx[li_i])
choose case ls_temp
case
ls_temp=char()
case
ls_temp=numeric()
end choose
zdlx[li_i]=ls_temp
ywm[li_i]=trim(ywm[li_i])
li_i++
FETCH a_cur INTO :ywm[li_i] :zdlx[li_i] ;
loop
close a_cur;
//创建B表和主键(Primary Key)
ls_sql=create table b+(+ywm[]+ +zdlx[]+ not null&
+constraint pk_b primary key (+ywm[]+))
execute immediate:ls_sql;
//增加B表的列
for li_i= to li_count
ls_sql=alter table b add +ywm[li_i]+ +zdlx[li_i]
execute immediate:ls_sql;
end for
动态创建数据窗口对象按钮对应的代码是
string syntaxsqlselecterrmsgls_colls_colls_namels_b;
//动态创建数据窗口对象DataWindow
ls_b=b
sqlselect=select * from +ls_b;
syntax=sqlcasyntaxfromsql(sqlselectstyle(type=grid)errmsg)
dw_create(syntax)
//汉化标题区(Header Band)文本
DECLARE v_cur CURSOR FOR SELECT ywmzwm FROM a order by ywm;
OPEN v_cur ;
FETCH v_cur INTO :ls_col :ls_col ;
do while sqlcasqlcode=
ls_name=ls_col+_+t++text+=++ls_col+
dw_modify(ls_name)
FETCH v_cur INTO :ls_col :ls_col ;
loop
close v_cur;
dw_settransobject(sqlca)
dw_retrieve()
四结束语
利用PowerBuilder的动态数据窗口对象的技术应用可以解决实际中数据库的动态数据处理问题从而使应用程序具有更好的交互性和适应性若稍加变动用途是十分广泛的