pbfindwindow:浅谈PB中动态DataWindow的技术应用

在PowerBuilder应用开发过程中对数据库中数据进行操作对象是数据窗口对象(DataWindow)利用数据窗口对象我们可以十分方便地完成对数据库中已经存在表中数据进行检索、查询、插入、删除和更新但是在实际问题中我们常常遇到数据库中些表是用户在运行期间动态生成若要对这样表中数据进行操作就要运用动态数据窗口对象值得提到点是在动态数据窗口对象生成时其标题区(Header Band)中文本不能直接显示成汉字确是点遗憾不过这个问题可以通过映射思路方法得到解决
  、 问题提出

  设有如下两张表:

  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动态数据窗口对象技术应用可以解决实际中数据库动态数据处理问题从而使应用具有更好交互性和适应性若稍加变动用途是十分广泛
Tags:  datawindowerror datawindow.net datawindow pbfindwindow

延伸阅读

最新评论

发表评论