、 问题提出
设有如下两张表:
A表中记录是用户可以在运行期间进行自由增加、修改、删除和更新B表中属性(即:字段)由A表中记录决定并动态创建而且能够方便地对B表中数据提供汉化操作界面当然将B表创建为下表
也是可以但是在动态生成数据窗口对象时其标题区(Header Band)中文本不会显示成汉字而是些乱码反而不利于问题解决
2、 问题解决
1、 动态创建B表解决
我们要动态创建B表就要构建动态SQL语句何谓动态SQL语句?数据库应用通常进行确定工作因此在编写和编译时就可以确定完整SQL语句但当需要使用PowerBuilder不支持嵌入SQL语句(如DDL语句)或者在编译时不知道语句具体格式或参数则在运行时构成SQL语句这类语句被称为动态SQL语句
动态SQL语句格式:
EXECUTE IMMEDIATE SQL statement [Using Transation Object];
参数介绍说明:
SQL statement 包含条有SQL语句串
Transation Object 事务对象
2、 动态数据窗口对象创建及标题区(Header Band)中文本汉化解决
(1) 在运行时我们可以Create动态生成数据窗口对象格式如下:
DataWindowControl.Create(Syntax{,Errorbuffer})
参数介绍说明:
DataWindowControl 将在其中创建数据窗口对象数据窗口Control控件名
Syntax 数据窗口对象源代码
Errorbuffer 用于保存信息串
(2) 由于标题区(Header Band)中文本框名称是对应细目区(Detail Band)中相应列名称加上"_t"构成而细目区(Detail Band)中列名称又是相应表属性名称因此我们能够使用游标(Cursor)取出A表中ywm和zwm值然后使用映射方式替换标题区(Header Band)中文本框文本(Text)属性从而使标题区(Header Band)中文本框文本显示为相应汉字
3、 个简单例子
在PowerBuilder 6.5和MS SQL Server 6.5环境下使用个简单例子实现上述观点限于篇幅只列出主要界面及关键
1、"动态创建B表"按钮对应代码是:
li_i=1,li_count
ywm,zdlx,ls_temp,ls_sql
//使用游标(Cursor)从数据库表中获取ywm和zdlx值并存储于ywm和zdlx中
select count(*) o :li_count from a;
DECLARE a_cur CURSOR FOR SELECT ywm,zdlx FROM a order by ywm;
OPEN a_cur ;
FETCH a_cur INTO :ywm[li_i], :zdlx[li_i] ;
do while sqlca.sqlcode=0
ls_temp=trim(zdlx[li_i])
choose ls_temp
"1"
ls_temp="char(10)"
"2"
ls_temp="numeric(7,2)"
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[1]+" "+zdlx[1]+" not null,"&
+"constra pk_b primary key ("+ywm[1]+"))"
execute immediate:ls_sql;
//增加B表列
for li_i=2 to li_count
ls_sql="alter table b add "+ywm[li_i]+" "+zdlx[li_i]
execute immediate:ls_sql;
end for
2、"动态创建数据窗口对象"按钮对应代码是:
syntax,sqlselect,errmsg,ls_col1,ls_col2,ls_name,ls_b;
//动态创建数据窗口对象DataWindow
ls_b="b"
sqlselect="select * from "+ls_b;
syntax=sqlca.syntaxfromsql(sqlselect,"style(type=grid)",errmsg);
dw_1.create(syntax)
//汉化标题区(Header Band)文本
DECLARE v_cur CURSOR FOR SELECT ywm,zwm FROM a order by ywm;
OPEN v_cur ;
FETCH v_cur INTO :ls_col1, :ls_col2 ;
do while sqlca.sqlcode=0
ls_name=ls_col1+'_'+'t'+'.'+'text'+'='+'"'+ls_col2+'"'
dw_1.mody(ls_name)
FETCH v_cur INTO :ls_col1, :ls_col2 ;
loop
close v_cur;
dw_1.transobject(sqlca);
dw_1.retrieve
4、 结束语
利用PowerBuilder动态数据窗口对象技术应用可以解决实际中数据库动态数据处理问题从而使应用具有更好交互性和适应性若稍加变动用途是十分广泛
最新评论