Your Ad Here
首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > 浅谈PB中动态DataWindow的技术应用
【标  题】:浅谈PB中动态DataWindow的技术应用
【关键字】:in,动态,应用,at,Win,Window,Data,PB,do,DataWindow,Wi,PB,DataWindow
【来  源】:网络

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

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

  设有如下两张表:

  A表中的记录是用户可以在程序运行期间进行自由增加、修改、删除和更新的,B表中的属性(即:字段)由A表中的记录决定并动态创建,而且,能够方便地对B表中的数据提供汉化的操作界面。当然,将B表创建为下表

  也是可以的,但是,在动态生成数据窗口对象时,其标题区(Header Band)中的文本不会显示成汉字,而是一些乱码,反而不利于问题的解决。

  二、 问题的解决

  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 将在其中创建数据窗口对象的数据窗口控件名

  Syntax 数据窗口对象源代码

  Errorbuffer 用于保存错误信息的字符串

  (2) 由于标题区(Header Band)中文本框的名称是对应细目区(Detail Band)中相应列的名称加上"_t"构成的,而细目区(Detail Band)中列的名称又是相应表的属性的名称。因此,我们能够使用游标(Cursor)取出A表中的ywm和zwm的值,然后使用映射的方式替换标题区(Header Band)中文本框的文本(Text)属性,从而使标题区(Header Band)中文本框的文本显示为相应的汉字。

  三、 一个简单的例子

  在PowerBuilder 6.5和MS SQL Server 6.5的环境下,使用一个简单的例子实现上述的观点,限于篇幅,只列出主要界面及关键程序。

  1、"动态创建B表"按钮对应的代码是:

  int li_i=1,li_count
  string ywm[],zdlx[],ls_temp,ls_sql
  //使用游标(Cursor)从数据库的表中获取ywm和zdlx的值并存储于数组ywm[]和zdlx[]中
  select count(*) into :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 case ls_temp
  case "1"
  ls_temp="char(10)"
  case "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,"&
  +"constraint 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、"动态创建数据窗口对象"按钮对应的代码是:
  string 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.modify(ls_name)
  FETCH v_cur INTO :ls_col1, :ls_col2 ;
  loop
  close v_cur;
  dw_1.settransobject(sqlca);
  dw_1.retrieve()

  四、 结束语

  利用PowerBuilder的动态数据窗口对象的技术应用,可以解决实际中数据库的动态数据处理问题,从而使应用程序具有更好的交互性和适应性,若稍加变动,用途是十分广泛的。
PB中打印预览的实现:【上一篇】
如何在PB中同时“继承”多个用户自定义数据窗口对象:【下一篇】
【相关文章】
  • PB中打印预览的实现
  • PB中协调多数据窗口数据操纵的一种解决方法
  • PB数据窗口中按钮的封装
  • 在PB中实现分段打印功能
  • PB中表的修改对数据窗口和报表的影响的解决办法
  • PB8.0应用程序编译发布技术研究
  • 升级到PB9.0的10个理由
  • 判断Windows OS 版本类型的方法
  • PB所支持的Oracle 的版本
  • 不同版本的PB所需要的运行时动态链接库
  • 【随机文章】
  • 广告片或自己制作短片
  • 各种操作系统平台开发GUI程序使用的库的介绍 (转)
  • 9.5.2 Pre-processing expressions
  • Google正在开发实时环境声音辨认技术
  • ITIL失败的十大理由[转]
  • grub 出错时手动进入linux和修复grub
  • 动手加固OpenSSH服务器
  • 应用程序图标更换器 (非明码比较)
  • Delphi 类的静态属性
  • 自定义用于ASP Web站点的 SQL 7.0 数据库(2)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.