PB中动态DataWindow的技术应用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PB中动态DataWindow的技术应用相关的知识,希望对你有一定的参考价值。
参考技术A在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函数动态生成数据窗口对象 格式如下
DataWindowControl Create(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_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=
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 syntax sqlselect errmsg ls_col ls_col ls_name ls_b;
//动态创建数据窗口对象DataWindow
ls_b= b
sqlselect= select * from +ls_b;
syntax=sqlca syntaxfromsql(sqlselect style(type=grid) errmsg)
dw_ 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_col :ls_col ;
do while sqlca sqlcode=
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()
四 结束语
lishixinzhi/Article/program/PB/201311/24646
PB中的Datawindow按页行滚动的应用设计转载
在Powerbuilder中,当Datawindow所显示的数据超过一个数据窗口时,常常通过单击滚动条控件使Datawindow中的容上下滚动,这样有时带来许多不便,如从某行开始滚动到现在过去了几行或几页,往上或往下滚动几行或几页都不好掌握,Powerbuilder中提供了几种方法可以解决这些问题,例如,按Pageup、Pagedown、↑、↓。这里主要介绍通过定义按钮、使用滚动函数来解决这些问题。常用的滚动函数和语法。
用户在使用滚动条控件使数据滚动时,消息的传输由用户单击滚动条控件实现,使用函数和按钮使数据滚动时,消息的传输由用户单击按钮实现。常用的函数如下:
ScrollNextPage() 滚动到下一页
ScrollNextRow() 滚动到下一行
ScrollPriorPage() 滚动到前一页
ScrollPriorRow() 滚动到前一行
ScrollToRow() 滚动到某一行
语法:
Datawindowname. ScrollNextPage()
Datawindowname.ScrollNextRow()
Datawindowname.ScrollPriorPage()
Datawindowname.ScrollPriorRow()
Datawindowname.ScrollToRow()
其中:Datawindowname为Datawindow在Powerbuilder的window下的控制名。如每按一次按钮cb_1,将数据窗口dw_1中的数据往下翻一页,在命令按钮cb_1的click描述中的输入:dw_1. ScrollNextPage() 等等。
实例程序
1、 建立一个应用库app.pbl。
2、 在这个应用库下建立一个应用app。在应用app的script中输入open(w_testscroll)。
3、 建立一个Datawindow:d_itemdata(选DataSouece为QuickSelect,PresentationStyle为Grid,数据表为前面提到的w_itemdata).
4、 按window按钮,新建window: w_testscroll。
5、 按window下Datawindow图标,选择新建的Datawindow:dw_itemdata,用鼠标把它置为适当大小;按OK(命令)按钮,建立两个命令按钮,其控制名分别为cb_1和cb_2。
6、 在按钮cb_1上击左键,选择name选项,将text后的none修改为下一页,击Script按钮,选择click事件,在编辑框输入:dw_1.ScrollNextPage()。同理在按钮cb_2上击左键,选择name选项,将text后的none修改为前一页,击Script按钮,选择click事件,在编辑框输入:dw_1.ScrollPriorPage()。
上述工作就绪后,按RUN图标出现所要的屏幕。当你按下一页按钮时数据向上滚动,当你按前一页按钮时,数据向下滚动。如果需要知道目前显示的是第几页,可以定义一个实例变量Ii_Count,初始值为1,每按一次按钮cb_1,Ii_Count = Ii_Count + 1,每按一次按钮cb_2,Ii_Count = Ii_Count - 1。
以上是关于PB中动态DataWindow的技术应用的主要内容,如果未能解决你的问题,请参考以下文章
PB 怎么动态(用代码)改变数据窗口的属性(例如窗体的字体大小,字体颜色,背景颜色)