HITSY 版 (精华区)
发信人: leave (网里), 信区: HITSY
标 题: PowerBuilder 7.0数据窗口技术详解
发信站: 哈工大紫丁香 (2002年04月06日13:18:22 星期六), 站内信件
书名:PowerBuilder 7.0数据窗口技术详解
作者:刘增进
页数:671页
开数:16开
字数:1710千字
出版日期:2000年3月第1次印刷
出版社:电子工业出版社
书号:ISBN 7-5053-5798-0
定价:70.00元
内容简介
PowerBuilser是目前比较流行的基于客户机/服务器的开发工具,它目前的版
本是PowerBuilder 7.0。本书主要介绍了PowerBuilder 7.0的核心DataWindow技术
,包括PowerBuilder DataWindow、DataWindow Java Edition、HTML DataWindow
和ActiveX的DataWindow技术。
全书分两篇进行介绍,第一篇为编程篇,主要介绍在应用程序中如何使用
DataWindow技术。第二篇为参考篇,介绍了DataWindow的参考信息及大量示例,包
括函数、属性以及存取属性的方法。
本书适合对DataWindow画板及开发环境下的编程语言有基本了解的
PowerBuilder开发人员使用。
前 言
一、PowerBuilder7.0与Sybase Internet产品的忧异性能
作为一种可视化的、面向对象的快速应用开发(RAD)工具,PowerBuilder已
被广大数据库应用开发人员所使用,并获得好评。相对于其他任何的应用开发工具
,PowerBuilder可以使开发速度更快、成本更低、质量更高、功能更强。
PowerBuilder提供对面向对象编程的全面支持,集成强大且易于使用的第四代
编程语言(4GL),内置包括数据窗口在内的多种对象类,可以方便地访问数据库
。1994年和1996年推出的PowerBuilder4.0 和5.0版非常适用于Client/Server结构
的应用系统。但是,随着应用系统结构的发展,对于目前的Web应用结构和瘦客户
端的应用模式来说,PowerBuilder4.0和5.0还有-些不足之处。PowerBuider 6.0有
了很大的改进,提供了强大的组件生成器,主要是提供了多种方式支持Web应用。
近年来,在Internet应用日益普及的推动下,应用开发技术又有了许多新的发展。
Sybase公司也在不断地丰富其应用开发产品以满足最新的应用开发技术的要求,这
使得PowerBuilder及Sybase Internet产品的功能日益增强,版本不断更新,性能
也日臻完善。Enterprise Application Studio是Sybase公司为用户提供的最新产
品,它是一整套为用户提供全面的企业级Web、分布式和客户/服务器解决方案的
应用开发和提交工具包,Sybase Enterprise Application Application Studio
3.0主要包括如下产品:
PowerBuilder 7.0
PowerSite 3.0
Power Dynamo 3.0
Jaguar CTS3.0
本套丛书将涵盖以上产品,致力于为读者提供一整套详尽的技术参考。
二、本套丛书的特色
1996年,电子工业出版社出版了由刘红岩主编的《PowerBuilder 5.0原理与应
用开发指南》一书。该书较全面地向读者介绍了PowerBuilder的基本概念和主要功
能,这本书成为许多开发人员和读者了解和使用PowerBuilder的主要参考书,曾先
后重印四次,深受读者欢迎。
应广大读者的热情要求,我们又于1999年编写了《PowerBuilder6.0/6.5技术
丛书》,该套丛书同样受到读者的欢迎,亦已重印多次。
面对功能如此丰富、内容博大精深的PowerBuilder 7.0及Sybase Internet应
用开发产品,广大应用开发人员迫切希望能有一套系统目更加全面地介绍
PowerBuilder 7.0及Sybase Internet的丛书。应广大用户和Sybase公司的热情要
求,我们再次组织人员编写了呈现在读者面前的这套《powerBuilder7.0与
Sybase Internet技术从书》。
这套丛书在内容的编写和结构的安排上作了更为精心的设计,将以崭新的面貌
、全新的内容、科学和合理的设计与安排为用户提供实用而全面的技术参考。如果
您对PowerBuilder及Sybase Internet产品根本不熟悉,那么,利用本套丛书能很
快入门并循序渐进;如果您对这些产品有所了解,那么,使用本套丛书能尽快提高
;如果您长期使用这些产品,那么,也能从本套从书中获得很多应用开发的高级技
巧和对Sybase产品的全面了解。
本丛书包括以下10本书:
1.《PowerBuilder 7.0原理与应用指南》是应用PowerBuilder开发应用程序或
学习如何使用PowerBuilder时所必读的入门书,该书全面介绍了PowerBuilder开发
应用的步骤、各种工具和使用方法。
2.《PowerScript语言、事件与函数大全》是一本利用PowerBuilder开发应用
程序时,使用PowerSsript语句、事件或函数所必备的参考书。
3.《PowerBuilder 7.0应用开发技术详解》本书针对那些已经掌握
PowerBuilder应用开发基本方法的用户,围绕着一组常用的应用实现技术,指导读
者进一步掌握开发、分发与维护PowerBuilder应用程序的技术。
4.《PowerBuilder 7.0数据窗口技术详解》一书全面详尽地介绍了开发人员常
常涉及到的数据窗口及有关技术。更重要的是,通过对数据窗口内部机制的深入剖
析和对大量程序片段的解释,可使开发人员快速而全面掌握数据窗口的各种技术。
5.《PowerBuilder对象与控制技术详解》一书介绍功能强大而略微复杂的控件
及其高级使用方法,并介绍如何使用PowerBuilder以外的应用程序所提供的控件,
如OLE、ActiveX等来丰富和增加PowerBuilder应用程序功能。
6.《PowerBuilder 7.0高级教程》一书针对没有PowerBuilder编程经验的应用
开发人员,介绍如何使用PowerBuilder创建、修改和发布一个两层的PowerBuilder
7.0应用。
7.《PowerBuilder基础类库技术详解》一书全面而详细地介绍PowerBuilder的
基础类库(PFC)。介绍了如何使用PFC设计类库:如何对PFC类库进行扩展;如何
定义新的服务类等一系列有关类库的使用、维护问题。
8. 《Sybase PowerSite与Internet应用开发技术详解》一书主要介绍
Enterprise Application Studio中的开发工具软件,重点介绍强大的Web应用开发
工具PowerSite 7.0。此外,还对PowerBuilder 7.0集成环境中的Internet开发工
具进行了介绍。
9.《Sybase应用服务器PowerDynamo技术详解》一书重点介绍了PowerDyuamo的
使用方法,包括利用PowerDynamo管理、配置Web网站;学习使用Dynamo标签和
DynmScript语言;在PowerDynamo中使用Java、XML;进行邮件处理、性能优化等内
容。
10.《Sybase组件事务服务器Jaguar技术详解》一书中介绍的Jaguar CTS是
Sybase新的适应性组件体系结构的中间层产品核心组成部分。本书全面讲述使用
Jaguar CTS创建企业级应用的过程。
三、编写人员简介
本套丛书由长期从事计算机教学与科研工作的清华大学刘红岩博士担任主编,
由她主持了全套丛书的写作和最后审核、定稿工作。
本套从书是征求了Sybase公司培训和技术支持专家的意见并进行了多次讨论后
,由丛书主编与电子工业出版社共同策划和组织的。参加编写的人员是国内应用和
开发PowerBuilder及Sybase Internet产品的专家,他们在研究、使用和开发
PowerBuilder及Sybase Internt产品中积累了丰富的经验。
四、致谢及其他
本套从书在编写过程中得到了PowerBuilder及Sybase Internet产品众多用户
的热情支持,他们是我们编写这套从本的动力:Sybase(中国)公司为我们提供了
所有的技术资料和软件产品,他们的帮助是高质量编写本套丛书的保证;电子工业
出版社的领导和编辑也对本丛书的编写给予了极大的关心和支持,并付出了艰辛的
劳动,在此一并表示感谢。
由于时间仓促,书中难免会有不足和错误之处,敬请广大读者提出宝贵意见,
以便我们在本丛书的下一版中修正。
《PowerBuilder 7.0与Sybase Internet技术丛书》编委会
本 书 序
随着数据库应用开发技术的发展,PowerBuilder越来越被广大应用开发人员所
喜爱,它所具有的高效性及简捷性已经被大家所认可。但纵观PowerBuilder技术,
DataWindow可以
说是其核心的核心,它使数据库开发变得简单、快捷。
本书分为两篇进行介绍,第一篇为编程篇,介绍了基于客户机/服务器(
Client/Server)方式的、分布式的以及Web应用程序中使用的DataWindow技术,描
述了如何在应用程序中定义DataWindow对象,以及如何编写代码来操纵
DataWindow对象。第二篇为参考篇,详尽介绍了DataWindow对象的参考信息,包括
DataWindow的函数和属性,以及访问这些属性的语法,以供编程者参考。
本书适合任何使用DataWindow技术进行编程的用户,但假定用户已经了解了如
下两方面的内容:
· 已经熟悉了如何使用DataWindow画板。如果不熟悉,请参阅本丛书的《
PowerBuilder7.0原理与应用指南》一书。
· 对开发环境下的编程语言有基本的了解,如:PowerScript,Java,
JavaScript,或
者DynaScript。如果不了解,请参阅本丛书的《PowerBuilder7.0原理与应用指南
》、《PowerScript语言事件与函数大全》、《Sybase PowerSite与Internet应用
开发技术详解》及《Sybase应用服务器PowerDynamo技术详解》。
本书在一些技术术语的使用上力求准确。对PowerBuilder的一些专用术语,保
留了其原文。
在此,感谢全伟、唐玉辉等朋友的帮助,同时也感谢家人对我的大力支持。
作 者
目 录
第一篇 编 程 篇
第1章 概述………………………………………………………………………………
……(2)
1.1 DataWindow对象、控件和组件 …………………………………………………
……(2)
1.2 选择DataWindow技术……………………………………………………………
……(4)
1.3 PowerBuilder DataWindow控件…………………………………………………
……(6)
1.4 DataWindow,Java Edition……………………………………………………
………(7)
本章小结 ………………………………………………………………………………
……(10)
第2章 使用Data Window对象……………………………………………………………
…(11)
2.1 简介………………………………………………………………………………
……(11)
2.2 把DataWindow对象放到控件中 …………………………………………………
…(11)
2.3 存取数据库………………………………………………………………………
……(17)
2.4 从外部数据源中导入数据………………………………………………………
……(22)
2.5 在DataWindow控件中操纵数据 …………………………………………………
…(22)
2.6 存取DataWindow对象的属性 ……………………………………………………
…(26)
2.7 DataWindow的出错处理 …………………………………………………………
…(27)
2.8 更新数据库………………………………………………………………………
……(30)
2.9 创建报表…………………………………………………………………………
……(32)
2.10 使用嵌套报表 …………………………………………………………………
……(33)
2.11 使用Crosstab …………………………………………………………………
……(34)
2.12 生成HTML ………………………………………………………………………
……(36)
本章小结 ………………………………………………………………………………
……(43)
第3章 动态修改DataWindow对象………………………………………………………
…(45)
3.1 简介………………………………………………………………………………
……(45)
3.2 修改DataWindow对象 ……………………………………………………………
…(45)
3.3 创建DataWindow对象 ……………………………………………………………
…(46)
3.4 增加查询功能……………………………………………………………………
……(47)
3.5 提供帮助按钮……………………………………………………………………
……(50)
3.6 DataWindow对象的重用 …………………………………………………………
…(50)
本章小结 ………………………………………………………………………………
……(51)
第4章 使用DataStore对象………………………………………………………………
…(52)
4.1 简介………………………………………………………………………………
……(52)
4.2 使用DataStore …………………………………………………………………
……(53)
4.3 使用定制的DataStore对象………………………………………………………
…(53)
4.4 在DataStore中存取和操纵数据…………………………………………………
…(57)
4.5 共享信息…………………………………………………………………………
……(58)
本章小结 ………………………………………………………………………………
……(61)
第5章 使用图表 …………………………………………………………………………
…(63)
5.1 简介………………………………………………………………………………
……(63)
5.2 修改图表属性……………………………………………………………………
……(63)
5.3 存取数据属性……………………………………………………………………
……(64)
5.4 使用鼠标的单击操作……………………………………………………………
……(69)
本章小结 ………………………………………………………………………………
……(70)
第6章 使用HTML DataWindow……………………………………………………………
…(71)
6.1 HTMI DataWindow简介 …………………………………………………………
……(71)
6.2 使用EAStudio配置HfML DataWindow……………………………………………
…(72)
6.3 其他的配置………………………………………………………………………
……(76)
6.4 开发HTML DataWindow应用程序…………………………………………………
…(77)
6.5 在Jaguar中使用定制的服务器组件 ……………………………………………
…(86)
6.6 服务器端的数据有效性校验……………………………………………………
……(90)
本章小结 ………………………………………………………………………………
……(91)
第7章 使用ActiveX的DataWindow Web控件……………………………………………
…(92)
7.1 简介………………………………………………………………………………
……(92)
7.2 在一个Web页上插入控件的HTML…………………………………………………
…(93)
7.3 在PowerSite中如何使用DataWindow Web控件…………………………………
…(94)
7.4 DataWindow Web控件的DataWindow对象 ………………………………………
…(95)
7.5 使用DataWindow事务对象控件 …………………………………………………
…(97)
7.6 数据库连接………………………………………………………………………
……(97)
7.7 DataWindow Web控件的编码……………………………………………………
……(98)
7.8 分发DataWindow Web控件………………………………………………………
……(99)
本章小结…………………………………………………………………………………
…(100)
第二篇 参考篇
第8章 DataWindow操作符与表达式……………………………………………………
…(102)
8.1 何处使用表达式 …………………………………………………………………
…(102)
8.2 用于表达式中的操作符 …………………………………………………………
…(104)
8.3 表达式中操作符的优先级 ………………………………………………………
…(107)
8.4 在脚本中计算DataWindow表达式………………………………………………
…(108)
本章小结…………………………………………………………………………………
…(109)
第9章 DataWindow表达式与InfoMaker函数……………………………………………
(110)
9.1 使用DATAWINDOW表达式与INFOMAKER函数………………………………………
(110)
9.2 按字母顺序详细介绍各函数 ……………………………………………………
…(116)
本章小结…………………………………………………………………………………
…(175)
第10章 DataWindow性……………………………………………………………………
(176)
10.1 DataWindow对象属性概述 ……………………………………………………
…(176)
10.2 DataWindow对象及属性 ………………………………………………………
…(176)
10.3 按字母顺序介绍各属性…………………………………………………………
…(195)
本章小结…………………………………………………………………………………
…(310)
第11章 在代码中存取数据 ……………………………………………………………
…(311)
11.1 在DataWindow编程环境下存取数据和属性 ……………………………………
(311)
11.2 Powerbuilder中存取数据的技术 ……………………………………………
…(311)
11.3 在PowerBuilder中的DataWindow数据表达式…………………………………
(312)
11.4 PowerBuilder中DataWindow数据表达式的语法 ……………………………
…(315)
11.5 Java中存取数据的技术 ………………………………………………………
…(324)
11.6 Java中DataWindow数据表达式的语法…………………………………………
(325)
本章小结…………………………………………………………………………………
…(329)
第12章 在代码中存取DataWindows对象属性…………………………………………
…(331)
12.1 DataWindow对象的属性及其控件 ……………………………………………
…(331)
12.2 PowerBuilder中属性的Modify和Describe函数………………………………
(337)
12.3 PowerBuilder中的DataWindow属性表达式 …………………………………
…(338)
12.4 Java属性的modify和describe函数……………………………………………
(347)
12.5 Java中的DataWindow属性表达式 ……………………………………………
…(348)
12.6 JavaScript中属性的Modify和Describe函数…………………………………
(355)
本章小结…………………………………………………………………………………
…(356)
第13章 常量 ……………………………………………………………………………
…(357)
13.1 简介………………………………………………………………………………
…(357)
13.2 常量列表…………………………………………………………………………
…(357)
本章小结…………………………………………………………………………………
…(365)
第14章 属性 ……………………………………………………………………………
…(366)
14.1 PowerBuilderDataWindow的属胜 ……………………………………………
…(366)
14.2 HTML DataWindow服务器组件的属性…………………………………………
…(368)
14.3 ActiveX的Web控件属性…………………………………………………………
(369)
14.4 DaraWindow,Java Edition的属性……………………………………………
…(370)
本章小结…………………………………………………………………………………
…(376)
第15章 DataWindow事件…………………………………………………………………
…(377)
15.1 事件返回值………………………………………………………………………
…(377)
15.2 事件的交叉索引表………………………………………………………………
…(377)
15.3 DataWindow事件 ………………………………………………………………
…(380)
15.4 DataWindow事件的Java类和接口………………………………………………
(412)
本章小结…………………………………………………………………………………
…(425)
第16章 DataWindow控件的函数…………………………………………………………
…(426)
本章小结…………………………………………………………………………………
…(626)
第17章 DataWindw控件中图表的函数…………………………………………………
…(627)
本章小结…………………………………………………………………………………
…(660)
第18章 DataWindow,Java Edition的附加类…………………………………………
…(661)
18.1 Arg类……………………………………………………………………………
…(661)
18.2 DataWindowObject类 …………………………………………………………
…(662)
18.3 DWRetrieveArgs类 ……………………………………………………………
…(664)
本章小结…………………………………………………………………………………
…(665)
第19章 DataWindow Web控件的事务对象控件…………………………………………
(666)
19.1 使用一个事务对象………………………………………………………………
…(666)
19.2 事务对象控件的属性……………………………………………………………
…(666)
19.3 事务对象控件的函数……………………………………………………………
…(667)
本章小结…………………………………………………………………………………
…(671)
第一篇 编 程 篇
本篇系统地介绍了在应用程序中如何使用DataWindow技术进行有效的数据管理
,描述了DataWindow的各种表现风格,还讨论了使用ActiveX控件的DataWindow应
用。
本篇由以下六章组成:
第1章 概述--介绍了什么是DataWindow对象,以及在各种应用程序框架和开
发环
境中如何使用DataWindow对象的方法。
第2章 使用DataWindow 对象--绍了在一个应用程序中如何使用DataWindow对
象。
第3章 动态修改DataWindow 对象--绍了在应用程序的执行过程中如何动态修
改和
创建DataWindow对象。
第4章 使用DataStore对象--描述了在一个应用程序中如何使用DataStore对
象。
第5章 使用图表--描述了在应用程序的执行过程中如何编写代码来访问和改
变-个
图表。
第6章 使用HTML DataWindow--描述了在基于数据的Web应用程序中如何使用
HTML
DataWindow以及如何配置服务器端程序。
第7章 使用ActiveX的DataWindowWeb控制--描述了如何使用ActiveX的
DataWindowWeb控件及如何分发DataWindowWeb控件。
第1章 概 述
1.1 DataWindow对象、控件和组件
DataWindow技术包括下面两部分:
· DataWindow对象,DataWindow对象定义了数据源和数据的表现风格。
· DataWindow控件和组件,控件和组件是应用程序中DataWindow对象的一个
容器,通过容器提供的方法可以编写代码来操纵DataWindow对象。
1.1.1 DataWindow对象是什么
DataWindow对象是用于从关系型数据库或其他数据源(例如一个Excel作表或
dBASE文件)中检索、显示和操纵数据的对象。在DataWindow对象中,可以指定是
否支持数据的更新操作。
DataWindow对象对所检索的数据可以指定显示格式、表现风格和其他一些数据
的属性以使检索的数据结果对用户更加有意义。
在DataWindow画板中,也可以制作Powersoft报表文件(PSR),此报表文件可
在DataWindow控件或组件中使用。一个PSR文件包含了一个报表的定义(其实是一
个无法更新的DataWindow对象),当报表文件创建时数据就已经包含在报表中了,
它不支持数据的检索。
注意:老版本的PowerBuilder有像DataWindow对象一样的报表对象。一个报表
对象可以检索数据但不能更新数据,它实际上是一个无法更新的DataWindow对象。
报表对象现在已经废止了。
1.1.2 在哪里定义DataWindow对象
在PowerBuilde或DataWindow Builder的DataWindow画板中定义DataWindow对
象。DataWindow Builder中包含了定义DataWindow对象和操纵数据库所需的所有画
板,且不需要安装PowerBuilder的所有部件。DataWindow Buildr对那些使用
PowerJ或者PowerSite作为开发工具的程序员来说是非常有用的。
在InfoMaker Report画板中,也可以定义不可更新的DataWindow对象。
1.1.3 DataWindoW控件和组件
DataWindow最初的设计是来为基于客户机/服务器方式的应用程序服务的,使
PowerBuilder能非常有效地对数据进行检索、操纵和更新处理,现在DataWindow已
经广泛地用于下列环境:
· PowerBuilder DataWindow,在PowerBuilder应用程序中使用的
PowerBuilder
控件。
· HTML DataWindow,基于Web应用中的瘦客户机的DataWindow,它提供了
PowerBuilder DataWindow的大部分操纵数据、数据表现及脚本的编程能
力,在服
务器端需要HTML DataWindow组件,但是在客户端不需要PowerBuilder的
动态连
接库。
· ActiveX的DataWindowWeb控件,用于PowerSite中的Web页上的ActiveX控
件。
· DataWindow,Java Bdition,用于PowerJ中的Java应用程序的JavaBeans
组件。
· DataWindow设计控件,PowerSite的设计控件,用于在瘦客户机的Web应用
程序中
定义服务器端的数据检索。
· DataWindow插件,用于显示Powersoft报表的浏览器插件。
在PowerBuilder和PowerJ中,也可以使用DataStore对象作为DataWindow对象
的容器。DataStore对象提供了DataWindow的检索和操纵数据的大部分功能,且并
不在屏幕上显示。DataStore对象的使用可以指定打印区域的边界和在分布式的应
用程序的服务器组件中管理数据。
1.1.4 表现风格和数据源
当定义一个DataWindow 对象时,可以选择一种表现风格和一种数据源。
1.表现风格
DataWindow 的表现风格定义了一种典型的报表风格和所有的记录行在页面上
是怎么分布的。在每一种表现风格中都可以自定义数据的显示方式,表1-1中列出
了所有的表现风格。
表1-1 所有的表现风格
表现风格 描述
Tabular 数据列并排显示且标签显示在每列上面,一次显示多行
Freeform 数据纵向向下显示且标签显示在每列左面,一次只显示一行
Grid 行列交叉像电子表格,且可以移动列的顺序和边界
Label 每页显示几个标签且每个标签只显示一行。用于邮寄标签和
其他标签
N-Up 两行或多行数据并列或几列显示在页面上。该风格对周期性
的数据显
示特别有用,如每天、每周或每月的数据
Groyo 一种多行分组显示的Tabular风格,含有对该组进行计算统
计的4个
字段
Composite 几个DataWindow组合成一个单一的表现风格
HTML DataWindow不支持此风格
Graph 数据的图表显示
DataWindow,Java编辑或HTML DataWindow不支持此风格
Crosstab 行列交叉统计表风格
RichText 内含数据列的段落式文本
DataWindow,Java编辑、ActiveX的Web控件或HTML
DataWindow不
支持此风格
OLE 一个连接或嵌入在DataWindow对象中且与检索到的数据有关
联的OLE
对象
如果想查看上面的几种表现风格的例子,请参阅《PowerBuilder原理与指南》
一书。
2.数据源
数据源指定了DataWindow中数据的来源和要显示的数据项。数据可以来源于数
据库的表,或者从一个文件中直接导入数据,或者在代码中指定数据。对数据库来
说,数据的指定存在一个SQL语句中。在所有情况下,DataWindow对象保存了要显
示的数据项的名字和它们的数据类型。各种不同的数据源及其描述见表1-2。
表1-2 各种数据原
数据源 描述
Quich Select 数据来源于SQL数据库中的一个或多个表。这些表必须通
过一个外
部键来关联,用户只需选择列,查询条件和排序
SQL Select 可以对产生的数据源进行更多的控制,如指定分组、计算域等
等
Query 已经对数据进行了检索,其SQL语句保存在Query画板中定
义好了
的Query对象中。当定义DataWindow对象时,Query对象已
经同
DataWindow对象结合在一起了,不必在运行应用程序时指
定
Stored Procedure 数据定义在一个数据库的存储过程中
External 数据库没有保存在数据库中,但是将从一个文件(例如一
个由Tab
符分隔的或dBASE文件)中导入或者从代码中产生
使用DataWindow包括以下两个主要步骤:
· 在DataWindow Builder或者PowerBuilder中,使用DataWindow画板创建或
编辑
一个DataWindow对象。在画板中,可以定义DataWindow的数据源、表现风
格和对
象的其他属性,例如显示格式、有效规则、排序和过滤条件以及图表等。
· 在开发环境中,把一个DataWindow控件或组件放在一个窗口、表单或Web
页中,
并使之与一个DateWindow对象关联。
应用程序是通过这个控件与在DataWindow画板中创建的DataWindow对象进行通
信的。用户可以编写代码来操纵这个DataWindow控制及其所关联的DataWindow对象
,并可以通过代码对数据进行检索和存取,也可以改变数据的显示形势、处理异常
情况及在DataWindow控件之间共享数据。
1.2 选择DataWindow技术
既然DataWindow技术可以应用于各种不同的环境中,那么应该采用什么方法来
实现数据应用程序呢?本节将描述在三个基本的应用程序结构中如何使用
DataWindow技术,以及每种结构下实现DataWindow技术的要求。
三种基本的应用程序结构是:
· 客户机/服务器方式。一个运行在客户端的应用程序对运行在服务器端的
数据库进
行访问。用户界面和商业逻辑运算都在客户端的计算机上。
· 分布式应用程序。在客户端计算机上的用户界面调用一个中间级服务器上
的组件,
该组件可以执行商业逻辑运算和访问数据库服务器。
· Web应用程序。客户端的Web 浏览器向Web服务器发送一个HTML文档的请求
,Web
服务器把控制交给应用程序服务器,应用程序服务器通过服务器端的脚本
访问组件
和其他的数据库服务器。
1.2.1 分布式的和客户机/服务器方式的应用程序的解决方案
PowerBuilder的DataWindow和PowerJ的DataWindow,Java Edition都可以应用
于分布式的和基本客户机/服务器方式下的应用程序。选择PowerBuilder的
DataWindow或PowerJ的DataWindow,Java Edition完全依赖于想使用哪一种开发环
境和编程语言。
下面分别介绍这几种分内容。
1.PowerBuilder DataWindow
用户可以像显示DataWindow对象的控件一样实现PowerBuilder DataWindow,
也可以像DataStore一样支持数据检索和更新而不显示数据。一套完整的用
PowerScript编程的用户事件和函数提供了对DataWindow所有访问数据的控制,包
括数据检索、显示、有效性验证和更新。
如果想获得更多的信息,请参阅第3节的PowerBuilder DataWindow控件。
2.DataWindow,Java Edition
DataWindow,Java Edition是Java应用程序中所使用的一系列JavaBeans组件
和相关的类。它实现了除RichText,Graph和OLE DataWindow以外所有
PowerBuilder DataWindow的属性,在JavaBeans,组件中,几乎支持所有的
PowerBuilder用户事件和函数。
如果想获得更多的信息,请参阅第4节的DataWindow,Java Edition。
1.2.2 Wed应用程序的解决方案
在Web应用程序中,可以使用如下DataWindow技术:
· HTML DataWindow。
· ActiveX的DataWindowWed控制。
· PowerSite DataWindow设计控件。
· DataWindow插件。
下面分别介绍这几种技术。
1. HTML DataWindow
HTML DataWindow是实现Web应用程序的瘦客户机DataWindow,它具有
PowerBuilder DataWindow的大部分数据操纵、数据表现和脚本编程能力,且客户
端不需要任何PowerBuilder的动态连接库。
HTML DataWindow支持PowerBuilder DataWindow的用户事件和函数的子集,包
括动态修改DataWindow对象,用户可以修改和更新数据,但不支持Graph、OLE和
RichText表现风格和控件。在任何浏览器中均可运行,但是所生成的HTML的外观在
Internet Explorer中表现最佳。生成的HTML可以在Netscape或Internet
Explorer中动态地优化,或者经过处理来适应老版本的浏览器。
对服务器端来说,组件服务器和应用程序服务器协同工作来控制客户端的数据
和网页,每次当用户请求新一页的数据、更新数据、插入或删除数据时,服务器会
得到一个产生新页的请求。根据状态管理的程度,组件会在每次调用时检索数据,
这就会造成服务器额外的负担。
PowerSite为开发HTML DataWindow应用程序提供了设计HTML DataWindow设计
的控件且不需要进行编程。用户可以使用PowerSite对象模板在PowerSite中编写自
己的脚本程序,同时在PowerDynamo或Microsoft ActiveServer Pages中,可以使
用服务器组件的API函数编写服务器端的脚本程序。
如果想了解更多的内容,请参看第6章"使用HTML DataWindow"。
2.ActiveX的DataWindowWeb控件
Web控件是Internet Explorer中使用的一种交互式的DataWindow控件,它实现
了除RichText风格以外的PowerBuilder DataWindow的所有属性。
功能:DataWindowWeb控件是完全可编程的并支持DataWindow的用户事件、函
数和对DataWindow对象的动态修改。用户可以修改和更新数据,但它不支持
RichTex表现风格。
客户端要求:Web控件使用了ActiveX技术,但只能在Microsoft Interne
EXplorer中运行。用户必须下载组件的CAB文件,文件大小为IM多。客户端经过连
接数据库软件进行配置后,通过JDBC与数据库进行连接,该软件可以从Web服务器
上下载。
有可能危及客户端安全的一些DataWindow行为,如SaveAS,将被禁止。
服务器端要求:通过JDBC的数据库连接可以访问远程服务器端的数据库。
开发工具:使用ActiveX组件和Powersite工具来开发Web应用程序。
如果想获得更多的信息,请参见第七章,"使用ActiveX的DataWindowWed控件
"。
3. PowerSite DataWindow设计控件
DataWindow设计控件使用一个DataWindow对象作为模板来产生HTML和
JavaScript,并使用服务器端的脚本程序检索数据且显示在一个Web页上,这就形
成了一个瘦客户机的Web应用程序。Web页中的DataWindow结果信息要比HTML
Datawindow简单。
DataWindow设计控件优化了其Tabular、Grid和Freeform的表现风格。HTML是
在JavaScript中产生的,而
不是通过DataWindow 对象的HTML属性产生的。用户可以修改和更新Freeform风格
的数据,DataWindow设计
控件没有用户事件也不需要客户端的编程,且对客户端无任何要求。
对服务器端来说,由设计控件产生的服务器端的脚本程序运行在应用程序服务
器中,对数据进行检索并产生HTML。每次用户请求新一页的数据、更新数据、插入
或删除数据时,服务器将得到产生新一页的请求。
开发工具使用PowerSite。有关使用PowerSite的内容,请参阅≤Sybose Power
Site与Internet应用开发技术详解≥。
4. DataWindow插件
DataWindow 插件是一个显示Powersoft报表(PSR)的浏览器插件。
PSR是一个固定的DataWindow,它不能被修改,其中的数据也不足最新的,但
是,PSR是DataWindow的一种压缩的表现形式,它可以被有效地下载。PSR是一种查
看批量报表的有效方法,用户不能在其中修改和更新数据。
对客户端来说,插件的执行程序必须安装在浏览器的plugin目录中,它不能自
动地下载和安装。插件既可 以运行在Netscape浏览器中,也可以运行在
Microsoft浏览器中。对可能会危及客户端安全的一些DataWindow的行为,如
SaveAs,没有被禁止。
DataWindow插件对服务器端无任何要求。
可使用InfoMaker,DataWindow Builder或PowerBuilder来创建PSR。在
PowerSite中可以开发含有报表的Web页。
如果想了解更多内容,请参见《Sybose Power Site与Internet应用开发技术
详解》一书。
1.3 PowerBuilder DataWindow控件
PowerBuilder DataWindow控件是PowerBuilder应用程序中DataWindow对象的
容器,可以在窗口中与用户交互数据,用户能够在DataWindow中查看和修改数据并
可把修改后的结果存入数据库中。
除了DataWindow控件外,DataStore对象提供了一个不可视的容器,它既可用
于服务器端的应用程序,也可用于其他不需要屏幕显示的地方。
DataWindow支持带取值参数的数据检索和数据更新,为了保证数据的一致性,
可以使用编辑风格、显示格式和有效性规则验证。
DataWindow控件提供了许多操纵DataWindow的函数,包括用于改变
DataWindow对象属性的函数--Modify。通过函数可以使几个DataWindow控件共享一
个结果集,也可以使服务器与客户机之间数据同步。
在PowerBuilder中,可以通过下面两个步骤来实现DataWindow:
· 使用DataWindow画板来定义DataWindow对象。
· 使用Window或User Object画板把DataWindow控件加入到窗口或可视的用
户对象
中。DataWindow控件是在画板的控件面板中。
在这些画板中,可以编写脚本来控制DataWindow的行为和操纵它所检索到的数
据,脚本也可以操纵DataStore对象。
在PowerBuilder Browser中,点击System标签页,可以检查DataStore对象和
DataWindow控件的属性、事件和函数。如果有一个包含DataWindow对象的
PowerBuilder库打开了,则可以在Browser的DataWindow标签页中检查DataWindow
的内部属性。Browser对话框如图l-l所示。
图1-1 PowerBuilder Browser对话框
1. DataWindow对象
DataWindow控件和DataStore对象使用了一个DataWindow对象或报表对象,它
决定了要检索的数据和如何显示数据。控件也可以显示Powersoft报表(PSR),它
不需要检索数据。PowerBuilder应用程序中的DataWindow对象可以具有任何表现风
格。
2. 数据库连接
PowerBuilder DataWindow可以使用ODBC、JDBC和专用数据库接口驱动程序来
连接数据库。用户可以连接到任何有访问权限的服务器上的数据源,包括数据库和
Internet上的中间级服务器。
连接数据库可以使用DataWindow内部的事务对象或使用独立的PowerBuilder事
务对象。
PowerBuilder应用程序提供了一个默认的事务对象,SQLCA。如果想做另外的
连接,则须定义另外的一个事务对象、当使用一个独立的事务对象进行连接时,可
以控制何时使用SQL语句COMMIT和ROLLBACK,且可以使用相同的连接进行多种控制
。
如果想获得更多的关于使用事务对象的信息,请参阅第2章,"使用
DataWindow对象"。
3. 编码
通过在Window或User Object画板中编写脚本来实现数据库的连接、检索数据
、处理用户输入信息和对数据进行更新。
在PowerBuilder中,可以利用对象继承技术,定义一个从DataWindow控件继承
过来的用户对象,并在用户对象中添加自定义的功能,这样在应用程序中就可以重
复使用自定义的DataWindow控件。
通过脚本程序可以创建DataStore对象--DataWindow控件的不可视版本,也可
以调用该对象的函数。脚本程序也可以定义一个从DataStore继承过来的用户对象
并使其用户化。
如果想获得更多的关于DataStore的信息,请参阅第4章,"使用DataStore对象
"。
4.库和应用程序
在开发过程中,通过PowerBuilder库(PBL)来存储DataWinow对象和报表对象
,PowerBuilder动态连接库(PBD)和可执行程序中都可以包含DataWindow对象。
1.4 DataWindow,Java Edition
DataWindow,Java Edition是Java应用程序中所使用的一系列JavaBeans组件
和相关联的类。它实现了除RichText、Graph和OLE表现风格以外的所有
DataWindow的特性。
它支持带取值参数的数据检索和数据更新,并可以使用编辑风格、显示格式和
有效性规则。大部分操纵DataWindow的PowerBuilder函数是可以运行的,包括修改
DataWindow对象属性的函数--Modify,另外几个包含在系统剪贴板中的函数是不能
运行的。
DataWindow包含下列组件:
· DataWindowJavaBeans组件。一个完整的DataWindow,它支持数据的检索
和管理、
数据的显示和版面安排以及用户交互化和数据更新能力。
· DataStore JavaBeans组件。一个具有数据检索和更新但没有屏幕显示和
用户交互
化的DataWindow。它可以用来管理数据以及同其他组件进行数据共享且不
显示数
据,例如在一个服务器端的应用程序中或作为其他DataWindow组件的数据
源。它
也可以提供数据打印的可选版面格式。
DataWindow类存放在路径\PowerJ30\java\lib\DataWindow.jar中,它是安装
路径的子目录。(默认的安装路径是drive:\Program Files\Sybase。)
在安装PowerJ时,安装程序会安装使用DataWindoww组件所必须的所有类。
组件会显现在组件面板的Database标签上,可以把它们插入到窗体上并编写代
码来连接数据库和检索、操纵及更新数据。
DataWindow被集成到PowerJHelp系统中,因此可以PowerJReferece Card检查
DataWindow的属性、函数和事件。
在本书的第二篇"参考篇"中,提供了JavaBeans组件和Java类的关于属性、函
数和事件的完整文档。欲了解更多的信息,可以参见第二篇。
1.DataWindoW对象
DataWindow和DataStore JavaBeans组件使用了一个DataWindow对象或报表对
象,它定义了要检索的数据和数据显示的格式。DataWindow组件也可以显示
Powersoft报表(PSR),但不需要检索数据。
JavaBeans组件中的DataWindow对象具有除了RichText、Graph或OLE风格以外
的任何表现风格。如果DataWindow对象包含了Gragh或OLE控件,则它们将不起任何
作用。
使用DataWindow Builder创建DataWindow对象,如果安装了PowerBuilder,也
可以使用PowerBuilder DataWindow画板创建。
DataWindow对象和报表对象存储在PowerBuilder库(PBL)中,在分发应用程
序之前,可以将PBL转换为PowerBuilder动态连接库(PBD),它提供了
DataWindow对象运行时的版本。
在DataWindow组件中,可以使用URL或文件路径来指向PowerBuilder库,一个
URL可以是相对的,也可以是绝对的。它使用任何支持的协议,如http,ftp和
file协议等。
2.数据库连接
DataWindow组件使用JDBC 来连接数据库,用户和以连接任何有访问权限的数
据源,包括数据库和Internet上的中间级服务器。
3.编码
DataWindow和DataStore JavaBeans组件支持PowerBuilder DataWindow中的大
部分功能。具体信息可参见后面的"对DataWindowJavaBeans组件进行编程"。
4.分发
在创建完Java的程序或目标应用程序后,可以在PowerJ中创建一个目标集,包
括Project和DataWindowJAR文件。
1.4.1 DataWindow JavaBeans组件中的DataWindow对象
DataWindow和DataStore JavaBeans组件需要:
· 存储在PowerBuilder库中的DataWindow对象或报表对象。
· 以前保存的连同数据的Powersoft报表(PSR)。
组件的属性能够识别要使用的库和DataWindow对象,本节将描述如下几个因素
:
· 定义DataWindow对象。
· 建立库。
· 通过设置属性来识别DataWindow对象、报表对象或Powersoft报表(PSR)
。
1. DataWindow对象包含什么
在PowerBuilder或DataWindow Builder中可以定义DataWindow对象或报表对象
(报表对象是一个不具备数据更新能力的DataWindow)。DataWindow,Java
Edition支持DataWindow的大部分表现风格,但它不支持RichText、Graph或OLE风
格。如果在表现风格中包含一个OLE或Graph控件,则它将不起任何作用。
在DataWindow,Java Edition中可以使用所有的编辑风格,包括
DropDownDataWindow。其属性中可以设置条件表达式,计算域可以使用任何
PowerBuilder中关于DataWindow的函数。
2.在PowerBuilder库中管理DataWindow对象
DataWindow或DataStore JavaBeans组件使用存储在PowerBuilder库(PBL)或
动态连接库(PBD)中的DataWindow对象。
DataWindow对象库必须由应用程序来释放或存储在可访问的服务器上。对于
Java应用程序来说,库通过HTTP来访问且通过Web浏览器进行下载并存储在一个临
时缓冲区;对于客户端应用程序来说,库可以安装在用户的计算机上或存储在服务
器上。
如果不想让用户看到DataWindow对象的源程序代码,则应该在分发应用程序之
前把PBL转换成PBD,这也是对库进行的一种压缩,并使下载变得更加有效。
注意:DataWindow和DataStore JavaBeans组件支持版本6和版本7的库。如果
有老版本的库,应使用DataWindow Builde7或PowerBuilder7把它们移植到版本7中
去。
当PBL或PBD从Web服务器上进行下载时,应该确信库中包括了应用程序所必需
的对象。在开始时,可以创建一个单一的库,它包括了应用程序所使用的所有
DataWindow对象,如果要下载这个库,可以考虑根据DataWindow。对象在应用程序
中使用不同而把它们分组成不同的库,这样,用户就不必下载那些他们不需要的对
象。
DataWindow对象可以使用外部资源,如位图或光标等。当创建一个PBD来把这
些资源包含到库中时,可以使用PowerBuilder资源文件(PSR),也可以把这些资
源存储在服务器上或安装到用户的计算机上。
DataWindow对象可以使用其他的DataWindow和报表对象,但应确保这些对象包
含在库中。
3.为控件指定一个DataWindow对象
为了标识在组件中要显示的DataWindow对象,可以指定下面两个属性的值:
· SourceFileName。
· DataWindowObject。
在定制属性对话框中General标签页中,可以指定这两个属性的值。
(l)属性SourceFileName
属性SourceFileName的值是包含组件的DataWindow对象的库名,它可以是一个
URL或一个文件路径。下面的例子说明了一些典型的用法:
· 绝对的URL
http://WWW,domain,com/dwlibraries/financedws.pbd。
· 相对的URL或文件路径
financedws.pbd,
dwlibraries/financedws.pbd。
· 绝对的文件路径
d:web project/dwlibraries/financedws.pbd。
在定制属性对话框中,当使用Browse按钮来查找库时,浏览的是文件系统,而
不是URL。在完整的路径插入到对话框的属性域中后,可以对插入的路径进行编辑
以使其在分发的应用程序中是有效的路径。
如果使库保存在目标文件夹中且在分发时和类文件放在同一个目录中,则属性
SourceFileName中的值可以是相对的路径,该路径在设计和分发环境中都是有效的
。
在程序中可以通过调用函数setSourceFileName来改变。SourceFileName属性
的值,但也必须为属性DataWindowObject指定一个值,该值在新库中须是有效的。
如果已经建立了需要使用事务对象的组件,则必须重新调用函数SetTransObject或
SetTrans。
(2)属性DataWindowObject
属性DataWindowObject的值是在SourceFileName中指定的库中所包含的
DataWindow的名字。
在PowerJ的开发环境中,如果库是可以访问的,则属性对话框将显示库中的
DataWindow对象的下拉列表框,从下拉列表框中,可直接选择要使用的
DataWindow对象。
注意:要想显示一个PSR文件而不是DataWindow对象,则指定它的URL作为
SourceFileName的值,并指定属性DataWindowObject为空值。
1.4.2 数据库连接
数据库连接是通过使用PowerJ事务对象进行处理的。JavaBeans组件可以使用
一个用户创建的事务对象,或通过指定参数来建立自己的连接。在组件的定制属性
对话框中可以决定使用哪种方法进行数据库连接。
在指定数据库连接时,可以使用内部的事务属性,也可以使用一个独立的
PowerJ事务对象,当使用独立的事务对象时,可以控制何时使用SQL语句COMMIT和
ROLLBACK且可让多个DataWindow组件使用同一个连接。
1.4.3 对DataWindowJavaBeans组件进行编程
一般来说,JavaBeans组件可以使用PowerBuilder应用程序中的相同的函数,
但是有一些不同:
· 不支持一些用系统剪贴板和操纵Graph、RichTeXt和OLE的函数。
· PowerBuilder有几个日期和时间的数据类型,但是在Java中,这些数据类
型全都
映射到Date对象中。
· PowerBuilder中列举的数据类型的值是作为域来实现的,在程序中可以指
定域名
或相关联的数字值。
域、属性、函数、事件以及DataWindow对象的属性和表达式函数在第二篇的"
参考篇"中有详细说明。
(1)设置事件的返回代码
通过使用函数setActionCode来指定事件的行为代码胜于指定一个返回值。例
如,当用户输入的数据没有通过有效性规则验证时,onltelmError事件的返回代码
可以决定DataWindow下一步的行为方式。如通过指定返回代码3可以使DataWindow
组件拒绝接受数据但是允许焦点发生变化,该语句将放在onltemError事件脚本中
的最后一行:
This.SetActionCode(3)。
(2)数据绑定
DataWindowJavaBeans组件实现Powersoftpowerj.db.DataSource用户界面,它
允许把基于数据的组件绑定到DataWindow上,就像绑定那些组件到一个
PowerJQuery对象上一样。
1.4.4 分发应用程序
在创建完Java程序或目标应用程序后,须定义一个Power目标集来收集目标应
用程序或相关的组件。目标集建立了一个包含所有对象和组件的JAR文件。
目标集中可包含DataWindowJAR文件或依靠PowerJ来检查应用程序中所用到的
DataWindow对象以及如果必要可包含DataWindow类。
目标集中包含的JDBC类依赖于如何使用JDBC来连接数据库。
DataWindow对象库没有包含在JAR文件中且必须单独分发。库在分发的服务器
或用户计算机的存放路径是由应用程序中SourceFileName指定的URL或文件路径所
决定的。
本 章 小 结
本章共分四节,简单介绍了一些DataWindow的基本概念和基本使用过程。
第1节介绍了DataWindow对象、控件和组件所使用的几种环境以及什么是
DataWindow和DataWindow的几种表现风格和数据源,最后介绍了使用DataWindow的
两个基本过程。
第2节介绍了在三种应用程序结构中使用DataWindow的技术,这三种应用程序
结构分别是客户机/服务器方式、分布式应用程序和Web应用程序,其中在分布式和
客户机/服务器方式下,简单介绍了PowerBuilderDataWindow和DataWindow,
Java Edition;在Web应用程序中重点介绍了HTML Datawindow,ActiveX的
DataWindow Web控件,PowerSite DataWindow设计控件和DataWindow插件以及它们
各自的功能、客户端要求、服务端要求和开发工具。
第3节和第4节着重介绍了PowerBuilde DataWindow控件和DataWindow,Java
Edition的特性、开发环境、DataWindow对象、数据库连接、编码、库和应用程序
及最后的分发。
总之,本章涉及的概念和术语较多,希望读者能继续往下读一些具体的介绍。
第2章 使用DataWindow对象
2.1 简 介
在应用程序中使用DataWindow对象之前,必须先建立它。既可以在
PowerBuilder中建立和编辑DataWindow对象,也可以在DataWindow Builder中建立
和编辑DataWindow对象。
这两种开发工具都是由画板组成的,这些画板可以用来管理数据库、定义
DataWindow对象和管理库。
在DataWindow画板中可以定义和编辑DataWindow对象,并可指定它的数据源和
表现风格,以及更进一步指定其显示格式和编辑风格等。
DataWindow画板也是制作Powersoft报表(PSR)文件的地方,PSR文件可以在
程序中使用,它包含了报表的定义(其实是一个不具备更新能力的DataWindow对象
),同时也包含了PSR文件在创建时其中的数据。
几个画板都可以管理和包装DataWindow对象,以供应用程序使用。特别的,可
以在一个或多个库(PBL文件)中管理DataWindow对象。当准备在应用程序中使用
DataWindow对象时,可以把它们打包进压缩的运行库(PBD)中。
在DataWindow画板中建立DataWindow对象(或PSR文件)后,就可以使用它来
显示和处理从相关数据源中取得的信息。
下面的章节中将探索如何使用DataWindow的一些细节。
2.2 把DataWindow对象放到控件中
DataWindow 控件是应用程序中DataWindow 对象的容器,它提供了操纵数据
和DataWindow 对象外观的属性、函数和事件。DataWindow 控件是应用程序中的部
分用户界面。 在不可视的DataStote和子DataWindow中也可以使用DataWindoW
对象,例如下拉式DataWindow和Composite表现风格的DataWindow。
要在应用程序中使用DataWindow 对象,则在窗体中增加一个DataWindow 控件
,接着与之关联一个DataWindow对象,它们之间的关系如图2-l所示。
图2-1 DataWindows对象、控件和窗体之间的关系
本节将描述如下的信息:
· DataWindow控件和对象的名称。
· 在PowerBuilder和PowerJ中,插入一个控件和为控件指定一个DataWndow
对象的
过程。
· 在运行时指定DataWindow对象。
如果想获得关于HTML DataWindow和Web控制的相同的信息请参看第六章"使用
HTML DataWindow"和第七章"使用ActivX的DataWindow Web 控制"。
2.2.1 DataWindow控作和对象的名称。
当使用DataWindow时应了解它的两个名称的含义:
· DataWindow控件的名称。
· 为控件指定的DataWindow对象的名称。
1. DataWindow控件名称
当把一个DataWindow控件放到一个窗体中时,它会得到一个系统默认的名称。
设计者应该修改这个名字以使它变得有意义,便于在应用程序中识别。
在PowerBuilder中,DataWindow控件的名称习惯上有一个前缀dw_,这在任何
开发环境中都是一个非常好的习惯。例如,如果一个DataWindow控件中列出的是客
户的信息,则可以对控件命名dW_customer,这样在程序中便一目了然。
在程序代码中,总是通过控件的名称(如dW_customer)来指定一个
DataWindow,而不是指控件中的DataWindow 对象。
2. DataWindow对象名称
为避免混淆,应使用不同的前缀来命名DataWindow对象和Datawindow控件,前
缀d_一般用于命名DataWindow对象,例如,如果DataWindow控件的名称是
dW_customer则应为它相关的DataWindow 对象命名d_ customer
2.2.2 在PowerBuilder中使用DataWindow控件
1.添力DataWindow控件的步骤
(1)把DataWindow控件放到窗体中
a. 打开将包含DataWindow控件的窗体。
b.单击PainterBar上的DataWindow按钮或从菜单条上选取
Insert->Cotrol-
>DataWindow。
c. 在窗体上点击所要显示控件的位置。
d.(可选)选中控件并通过拖拉其宽和高以调整控件的大小。放置完
DataWindow控
件后(如图2-2所示),就可以使之与一个DataWindow对象关联。
图2-2 把DataWindow控件放到窗体中
(2)使控件关联一个DataWindow对象
a.在DataWindow控件的属性对话框中,单击DataObject属性的浏览按钮,这
时会弹
出如图2-3所示的SelectDataWindow对话框。
b. 选择要放入控件中的DataWindow 对象并单击OK按钮,这时DataWindow对
象的名
字就显示在DataWindow属性对话框中的DataObject框中。
c.(可选)如果需要可改变DataWindow控件的其他属性。
图2-3 Select DataWindow对话框
如果想让用户在运行时能够移动DataWindow控件,则在DataWindow属性对话框
中选中TitleBar复选框,这样用户就可以拖拉标题框来移动控件了。
2.定义可重用的DataWindow控件
应用程序可能要求所有的DataWindow控件都具有相同的外观和行为,例如可能
要求它们具有相同的错误处理。
为了能够一次定义这些行为并能在每个窗体中重复使用它们,应该创建-个基
于DataWindow控件的标准用户对象:定义用户对象的属性和编写脚本来执行一般的
处理,如错误处理,接着把定义好的用户对象(取代一个新的DataWindow控件)放
在窗体中,DataWindow用户对象就具有了所有预先定义的预期功能,而不必再重新
指定它
3.编辑控件中的DataWindow对象
一旦在窗体中对DataWindow控件关联了一个DataWindow对象后,就可以直接到
DataWindow画板中编辑所关联的DataWindow对象。
要编辑控件所关联的DataWindow对象,可以从DataWindow控件的弹出菜单中选
择DataWindow,PowerBuilder会在DataWindow画板中直接打开这个关联的
DataWindow对象,这时就可以对它进行编辑。
2.2.3 在PowerJ中使用DataWindow控件
1.步骤
(1)把DataWindow控件加到PowerJ中的窗体上
a.在窗体设计窗口中,打开要包含DataWindow控件的窗体。
b.在组件板的DataWindow标签上,单击代表DataWindow控件的按钮。
c.在窗体设计窗口中,通过单击和拖拉来设置DataWindow控件的位置。如图
2.4所示。
d. (可选)通过拖拉DataWindow控件的宽和高来调整控件的大小。
c. 用鼠标右键单击控件,在弹出菜单中选择Properties。在弹出的属性框中
,可以改
变控件的名称和其它想要改的属性。
如果显示了Object Inspector,则可选择菜单条ToolS->Options,在
Enviroment标签页中,选择Property作为属性的默认显示。
图2-4 将DataWindow 控件加到PowerJ的窗体中
(2)对控件关联一个DataWindow对象
a. 在DataWindow属性对话框中(看上面的步骤 e),选择DataWindow
Source标签,
如图 2-5所示。
图2-5 DataWindow属性对话框
b. 单击Browse按钮,弹出Open对话框(如图2-6所示),可以选择包含要使
用的
DataWindow对象的库(PBL文件)和运行库(PBD文件)。
如果要把一个PSR(Powersoft报表)文件而不是DataWindow对象加入到
DataWindow控件中,则在图2-6的Open对话框中选择PSR文件而不选择一个库或运行
库。
图2-6 选择库的Open对话框
c. 单击List按钮并从库中选择一个DataWindow对象(如果在步骤b中选择的
是PSR
文件,则可跳过这一步),如图2-7所示。
图2-7 从库中选择Data indow对象
d. (可选)改变DataWindow控件的其它要改变的属性。
e. 单击OK按钮。
至此,DataWindow对象或PSR文件就显示在控件中了。
2.编辑DataWindow对象
在把DataWindow对象加到PowerJ窗体后,就可以在DataWindow Builder中编辑
这个DataWindow对象。要在PowerJ中显示所作的修改,则先关闭窗体再重新打开它
即可。
3.在运行时指定DataWindow对象
改变DataWindow 对象的方法依赖于开发环境。
· PowerBuilder:设置DataDbject属性,把它的值指定为已经在应用程序中
建好的
Dat对象。
· Web控件和JavaBeans组件:设置SomeeFileName和DataWindowDbject属性
,把
它们的值指定为一个新的库文件和DataWindoW。
注意:当在运行时改变DataWindow对象时,应该重新调用函数SetTrans或
SetTransObject。在运行期间也可以创建一个新的DataWindow 对象并把它指定到
一个控件上。
如果想了解更多信息,请参看第三章"动态修改DataWindow对象"。
4.在PowerBuilder中修改DataWindow
当在窗体中对一个控件指定DataWindow对象时,实际上就是在指定
DataWindow控件的DataObject属性的初始值。在运行时,它将通知应用程序创建一
个在控件的DataObjeCt属性中指定的DataWindow对象的一个实例,并在控件中使用
这个实例。
除了在Window画报中指定DataWindow对象外,也可以在运行时改变控件中显示
的对象,主要通过在代码中改变DataObject属性的值来实现。
例子:要在DataWindow控件dw_emp中显示库emp.pbl中的DataWindoW对象
d_emp_hist,可以编程如下:
dw_emP.DataObject="d_emp_hist"
DataWindow对象d_emp_hist是在DataWindow画板中创建的并序储在应用程序所
在的路径下的一个库中,控件dw_emp是包含在窗体中并作为窗体定义的一部分而存
储的。
可以使用SetRedraw函数关闭控件的重画以避免窗口的闪烁,并在改变对象或
控件的属性时减少重画时间。在运行时DataWindow 对象的动态修改将自动打开重
画功能,刷新屏幕。要关闭重画功能,不让屏幕刷新,则须在每次修改
DataWindow对象时调用函数SetRedraw:
dw_emp.DataObject="d_emp_hist"
dw_emp.setRedraw(FALSE)
要在运行时把一个PSR文件加到DataWindow控件中,可以修改控件的
DataObject属性以指定那个PSR文件名。
5.在Web控件和JavaBeans组件中修改DataWindow
当在DataWindow 控件中指定一个Datawindows对象时,实际上是设置
DataWindow控件的SourceFileName和DataWindowObject属性的初始值。
在运行时,它们将通知应用程序:
a.在库(PBL文件)和运行库(PBD文件)中查找在控件的SourceFileName属
性中指
定的DataWidow对象。
b.创建一个在控件的DataWindowObject属性中指定的DataWindow对象(它必
须在指
定的库中)的实例,并在控件中使用这个实例。
除了在Window画板中指定DalaWindow对象外,也可以在运行时改变控件中显示
的对象,主要通过在代码中修改SourceFileName和DataWindowObject属性的值来实
现。
在相同的库中使用不同的DataWindow对象仅仅通过修改DataWindowObject属性
即可,或者通过修改两个属性的值以使用不同库中的DataWindow对象。
如果想在运行时把一个PSR文件动态地加入到DataWindow控件中,则修改控件
的SourceFileName属性来指定PSR文件名。
当SourceFileName属性指定为一个PSR文件时,控件的DataWindowObject属性
将不起作用。
例子:下面的例子展示了在JavaScript和Java中设置属性的代码,这些代码是
修改窗体或web页的DataWindow控件dw_emp中的DataWindow对像,dw_emp是作为窗
体或web体或Web页中的DataWindow控件dw_emp的DataWindow对象。Dw_emp是作为窗
体或Web页定义的一部分而存储的。DataWindowObject属性的值是d_emp_hist,它足
在DataWindow画板中创建的并存储在库名为emp.pbl的库中,该库就是
SourceFileName属性的值。
PowerJ:在Java中,DataWindow控件提供了用程序修改这些属性值的函数。
· Set SourceFileName
· Set DataWindowObject
要在DataWindow控件dw_emp中显示库emp.pbl中的DataWindow对象d_emp_hist
,可以编程如下:
dw_emp.setSourceFileName("dwlibs/emp.pbl");
dw_emp.setDataWindowObject("d_emp_hist");
Web控件:在Web页的Web控件中,可以直接设置SourceFileName和
DataWindowObject属性的值。
要在DataWindow控件dw_emp中显示库emp.pbl中的DataWindow对象d_emp_hist,
可以编程如下:
dw_emp.SourecFileName="dwlibs/elmp.pbl":
dw_emp.DataWindowObject="d_emp_hist";
2.3 存取数据库
在DataWindow控件显示数据之前,必须使数据源中的数据存储到控件中,获得
数据的最普通的方法是存取数据库。
应用程序是通过如下几个步骤来存取数据库的:
a.设置事务对象确切的值。
b.连接到数据库。
C.设置DataWindow控件的事务对象。
d.检索和更新数据。
e.与数据库断开连接。
本节提供了如何设置DataWindow控件的事务对象和使用DataWindow对象来检索
和更新数据的一些信息。
2.3.1 设置DataWindoW控件的事务对象
有两种方法来处理DataWindow控件的事务对象和数据库连接,它们是:
· 内部的事务管理
· 独立的事务对象
注意:如果在DataWindow控件中显示一个PSR文件,则不必使用事务对象或进
行数据库连接。如果在运行时修改一个与DataWindow控件相关联的DataWindow对象
,则必须重新调用函数SetTrans或SetTransObject。
上述两种方法为数据库事务提供了不同的控制级别。
PowerBuilder:总是要调用其中的一个函数来设置事务对象。
Web控件:当使用一个独立的事务对象时,只须重新调用函数SetRansObject。
JavaBeans组件:如果选择了连接选项Make an explicit call to setTrans
orsetTransObject,则须重新调用指定选项中的函数。
这些选项将在本节的下面进行描述。
1.内部的事务管理
当DataWindow控件使用内部的事务管理时,它可以处理数据库的连接、断开、
提交和撤消。如果需要可以自动地执行数据库的连接和断开,任何发生的错误都会
导致事务管理自动执行RollBack。
在每次DataWindow需要存取数据库(如执行函数Retrieve或Update)时,
DataWindow会发出一个内部的CONNECT语句进行数据库的连接,然后执行适当的数
据存取,最后发出内部的DISCONNECT语句,断开数据库的连接。
在下面两种情况下,可以不使用内部的事务管理:
· 应用程序要求最好的性能。
内部的事务管理会降低运行速度并使用大量的系统资源,因为它在每次数据存
取时都会执行数据库的连接和断开操作。
· 应用程序控制事务何时提交和撤消。
因为内部的事务管理在每次数据存取之后都会自动断开数据库的连接,所以任
何对数据的修改都会立即提交。
如果在某个节点中可行的连接数是有限的,则可以使用内部的事务管理,因为
使用内部的事务管理后,连接在每次调用后会自动断开,不会影响连接的数量。
内部的事务管理适用于简单的状态管理,如执行单纯的数据检索(如在报表中
)和不需要控制数据库锁(应用程序不必控制事务的提交和撤消)。
下面介绍内部的事务管理是如何工作的。
(1)在PowerBuider中
要使用内部的事务管理,须指定事务对象(SQLCA)连接参数的值,接着调用
函数SetTrans,它把该值从一个指定的事务对象拷贝到DataWindow控件的内部事务
对象中:
SQLCA.DBMS=ProfileString("myapp.ini",&
"database","DBMS"," ")
…//设置更多的连接参数
dw_employee.SetTrans(SQLCA)
dw_employee.Retrieve()
注意:如果使用函数SetTrans,则不必在脚本中显式地调用CONNECT和
DISCONNECT语句,它们会在需要时自动执行。
(2)在Web控件中
要使用内部的事务管理,则设置DataWindow Web控件的事务属性而不是使用一
个DataWindow TransachonObject控件,在脚本中可通过参数来设置属性,下面的
例子是在脚本中设置dbParm属性和op函数Retrieve:
dw_employee.dbParm=
"Driver='com.sybase.jdbc.SybDriver',
URL='jdbc:sybase:Tds:www.domain.com:7373'";
dw_employee.Retrieve();
对于内部的事务管理,不需调用setTransObject。如果在运行时修改了
DataWindow对象,连接息仍然可用,且DataWindow在需要时也可以连接数据库,连
接信息的修改是通过dbParm属性的值来实现的。
(3)在JavaBeans组件中
有两种方法可以建立内部的事务管理,它们是:
· 使用定制属性对话框来选择Connect using property settings和指定数
据库连
接属性。这将导致函数SetTrans被自动调用,因此不须为它编写代码。
· 增加一个事务对象到窗体中并建立它的连接信息,在DataWindow控件的定
制属性
对话框中选择"Explicit
call to SetTrans or SetTransObject",接着使用如下的代码来调用
SetTrsns:
dw_employee.setTrans(trans_I);
dw_employee.retrieve();
如果选择了该选项并在运行时修改了控件中的DataWindow对象,则应该重新调
用函数SetTrans。
2.使用一个独立的事务对象进行事务管理
使用一个独立的事务对象可以控制数据库事务的持续时间。脚本程序将显式地
调用connect和disconnect进行数据库的连接和断开操作,如果事务对象的
Autocommit属性被设为False,则程序必须对数据的修改进行提交或撤消。
数据检索或更新操作包含如卜的几个典型的语句:
Connect
SetTransObject
Retrieve或Update
Commit或RollBack
Disconnect
在Power Builder中,使用嵌入式SQL语句进行数据库的连接和提交,而在Web
控件和Java Beans组件中,事务对象有执行这些动作的函数支持。
事务对象在它的属性中存储了从数据库返回的错误信息,程序可以根据这错误
信息来决定是否对数据库的变化进行提交和撤消。
当DataWindow控件使用一个独立的事务对象时,就可以对数据库处理有更多的
控制且有责任来管理数据库事务。
下面说明了几点使用独立的事务对象的理由:
· 有几个连接到相同数据库的DataWindow控件并想对所有的控件只进行一次
数据库
连接。
· 要控制事务处理。
· 要求使数据库连接处于打开状态以提高程序运行的性能。
下面详细介绍独立的事务对象是如何工作的。
(l)在Power Builder中
SetTransObject函数对DataWindow控件关联了一个事务对象,Power Builder
内部有一个称为SQLCA的默认事务对象,它能够自动创建实例和设置其连接属性并
指定到DataWindow控件上。
下面的语句通过默认的事务对象(SQLCA),使用SetTransObject函数来关联
DataWindow控件dw_emp:
//设置事务对象的连接参数
SQLCADBMS=…
SQLCA.database=…
CONNECTUSINGSQLCA;
dw_emp.SetTransObject(SQLCA)
dw_emp.Retrieve()
除了便用预定义的SQLCA事务对象外,还可以在程序中定义自己的事务对象,
这在程序同时连接多个数据库时是非常有必要的。
下面的语句通过程序员自定义的事务对象(Emp_TransObj)来使用
SetTransObject函数关联DataWindow控件dw_emp:
transaction trans_customer
trans_customer=CREATE transaction
//设置事务对象的连接参数
trans_customer.DBMS=…
trans_ customer.database=…
CONNECTUSING trans_customer;
dw_customer.SetTransObject(trans_customer)
dw_customer.Retrieve()
(2)在Web中
要对Web ActiveX 使用独立的事务对象,须增加Sybase DataWindow事务对象
控件的OBJECT单元到Web页中,并可以在程序中或使用Param单元来设置它的连接属
性。
下面的语句展示了如何连接和检索数据:
trans_l.Connect();
dw_employee.SetTransObject(trans_l);
dw_employee.Retrieve();
trans_l.Disconnect():
(3)在JavaBeans组件中
要使用一个独立的事务对象,须增加一个事务对象到窗体中井设置它的连接属
性,事务对象是在Compent面板中的Database 标签上。
有两种方法使用事务对象,可以在DataWindow控件的定制属性对话框中选择要
使用哪一种;
· 选择Use an existing transtion object并从列表中选择已经创建的事务
对象。这就使SetTransObject函数
自动调用,不必在程序中为它编写代码。
· 选择Make an exPlicit call to setTrams or SetTransObject,接着调用
SetTransObject,代码如下:
trans_l.connect();
dw_employee.setTransObject(trans_l);
dw_employee.retrieve();
tlans_l.disconnect();
如果选择了该选项并在运行时修改了控件中的DataWindow对象,则必须重新调
用SetransObject函数。
2.3.2 检索和更新数据
通过DataWindow控件调用下面的两个函数来存取数据库:
Retrieve
UPda
1.基本的数据检索
在为DataWindow控件设置了事务对象后,就可以使用Retrieve函数把数据从数
据库中检索到控件中,下面
是具体的例于:
PowerBuilder:dw_emp.Retrie()
Web控件:dw_emp.Retrieve();
JavaBeans组件:dw_emp.retrieve();
2.使用取值参数
取值参数限制了同DataWindoW对象相关联的SELECT语句,它通过某些条件减少
了检索到的数据行。例如,在下面的SELECT语句中,Salary是一个在DataWindow画
板中定义的取值参数:
SELECT Name,emp.sal FROM Employee
WHERE emp.sal>:Salary
当程序调用Retrieve函数时,须为Salary指定一个值,在PowerBuilder中,代
码如下所示:
dw_emp.Retrieve(50000)
当调用带取值参数的Retrieve时,必须按照它们在DatWindow对象中定义的顺
序指定参数的值。Retrieve函数能够提供多个参数来操作DataWindow对象,任何多
余的参数将被忽略。
如果DataWindow对象中包含了取值参数,但是在调用Retrieve函数时没有指定
参数的值,则DataWindow控件会弹出一个对话框来让用户输入取值参数的值。
Retrieve函数在某些环境下最多可有16个取值参数:
PowerBuilder:可以指定任何数量的取值参数。
Web控件:最多可以为Retrieve指定16个参数,如果要指定更多的参数,请使
用RetrieveEx函数并传递给它一个数组作为参数,其中数组中每个元素都是一个取
值参数。
JavaBeans组件:如果Retrieve使用Arg类作为独立的参数,则最多可指定16个
参数。要指定更多的参数,使用DWRetrieveArgs类定义一个数组,具体描述如下:
对于DataWindow JavaBeans组件,DWRetriveArgS类能够处理取值参数的各种
数据类型,取值参数的类型可以是下面类型中的任意一种,不管是作为数组或单一
的值。
· 数值型:short,int,double,float,long
· 字符型:java.lang.String
· 日期型:Java.sql.Date,java.sql.Time,java.sql.Timesmp
下面介绍两种指定取值参数的技术:
· 使用DWRetrieveArgs类建立一个数组,其中数组中的每个值都对应一个
取值参
数。
· 使用Arg类建立独立的参数。
(1)使用DWRetrieveArge类
DWRetrieveArgs是一个无界的混和类型的数组参数值,可以对数组增加足够的
元素来处理在DataWindow对象中定义的取值参数。
在程序中使用setArgumnet函数来增加数组元素,其中可以指定取值参数的顺
序和它的值,下面的例子创建了一个带三个取值参数的数组,并接着调用
Retrieve:
import powersoftdataWindow.DWRetrieveArgs;
DWRetrieveArgs args=new DWRetrieveArgs();
argasetArgument(1,400);
args.setArgumnet(2,10300.50);
args.setArgumnet(3,"Smith" );
dw_l.retrieve(args);
(2)使用Arg类
当调用Retrieve函数时,Arg类提供了一个简单的使用参数的方法,不过该方
法只能支持最多16个取值参数。
下面的例于使用Arg类建立了如上所示的三个取值参数:
import Powersoft.datawindow.Arg;
dw_l.retrieve(new Arg(400),new Arg(10300.50),
new Arg("Sndth"));
3.更新数据
在DataWindow控件中,如果用户对数据进行了修改,可以调用update函数来保
存对数据库作的修改。在PowerBuilder中,代码如下:
dw_emp.UPdate()
Update把DataWindow控件中自上次Update后的所有插入、修改和删除都传送给
数据库,如果正在使用一个外部的事务对象,可以紧接着进行提交(或撤消)那些
数据库的更新。在PowerBuilder中,使用SQL语句进行提交(撤消),在Web控件和
PowerJ中,使用事务对象的属性和函数。
如果要获得关于DataWindow控件如何更新数据库的更多信息,请参看本章第八
节"更新数据库"。
例子:下面的例子展示了数据库的连接、检索、更新、提交或撤消,及数据库
的断开连接。第一个例子是PowerBuilder中的,第二个是Java的。
虽然下面的例子展示了在一个单一的脚本或函数中的所有数据库操作,但是大
部分应用程序都是独立地进行这些操作。例如,在PowerBuilder应用程序中,应用
程序是在其Oped事件中进行数据库的连接,在一个或多个窗口的脚本中进行数据检
索和更新,在应用程序的Close事件中进行数据库的断开连接。
PowerBuilder:下面的语句描述了在PowerBuilder中使用事务对象EmpSQL和
DataWindow控件dw_emp进行数据库的检索和更新:
//使用事务对象EmpSQL进行数据库的连接
CONNECT USING EmpSQL;
//设置EmpSQL作为dw_emp的事务对象
dw_emp.SetTransObject(EmpSQL)
//检索数据
dw_emp.Retrieve()
//修改数据…
…
//更新数据库
IF dw_empUpdate()>O THEN
COMMIT USING EmpSQL;
ELSE
ROLLBACK USING EmpSQL;
ENDIF
//断开数据库的连接
DISCONNECT USING EmpSQL;
JavaBcans组件:下面的Java语句描述了在Java中使用事务对象EmpSQL和
DataWindow控件dw_emp进行数据库的检索和更新。
下面是Java中的相同的例子:
//使事务对象EmpSQL进行数据库的连接
EmPSQL.connect();
//设置EmpSQL作为dw_emp的事务对象
dw_emp.SetTransObject(EmpSQL);
//检索数据
dw_emp.retrieve();
//修改数据…
…
//更新数据库
if(dw_emp.update>0){
EmpSQL.comnit();
}else{
EmpSQL.rollback();
}
//断开数据库的连接
EInPSQL.disconnect();
对于Web控件,例子代码是相同的,最主要的区别是函数名字是以大写字母开
头的。
一个产品的应用程序应该在每次数据库操作之后进行错误测试,要获得更多的关于
检测错误的信息,请参看本章第七节"DataWindoW的出错处理"。
2.4 从外部数据源中导入数据
如果DataWindow中的数据不是来源于数据库(即在Datawindow画板中定义的
数据源是External),则可以使用下面的函数来把数据导入到DataWindow控件中:
ImportClipboard
ImportFile
lmportString
也可以通过
SetItem函数或DataWindow表达式来把数据加到DataWindow中。
要获得更多的关于
SetItem函数和DataWindow表达式的信息,请参看下一节"在DataWindow控件中操纵
数据'。
2.5 在DataWindow控件中操纵数据
为了处理用户的要求,在DataWindow控件中增加、修改和删除数据,可以编写代码
来实现这些操作,但是首先必须要清楚DataWindow控件是如何管理数据的。
2.5.1 DataWindow控件如何管理数据
当用户增加或修改数据时,数据首先是在编辑控件中作为文本进行处理的,如
果数据被接受,则它就作为缓冲区中的数据项被存储起来。
DataWindow使用三个缓冲区存储数据,具体如表2-1所示。
表2-1 DataWindow的三个缓冲区
缓冲区 内容
Primary 没有删除或过滤的数据(即在DataWindow中能看到的数据
)
Filter 过滤的数据
Delete 被用户或在代码中删除的数据
当用户操作DataWindow控件中的数据时,DataWindow会把一个编辑控件放在当前的
单元上,如图表2-1所示。
图2-8 在DataWindow控件中操纵数据
编辑控件中的内容称为文本,文本是没有被DataWindow控件所接受的数据,在
编辑控件中输入的数据还没有存在DataWindow的缓冲区内,它仅仅是编辑控件中的
文本而己。
当用户改变了编辑控件中的内容并按下Enter键或使焦点离开该单元(通过按
Tab键、使用鼠标、按上下箭头键)时,DataWindow会处理此数据并根据是否满足
该列的要求而决定接受或拒绝这些数据。如果数据被接受,则文本被移到
DataWindow的Primary缓区中的当前行和列中,在Primary缓冲区中特定列的数据被
称为一个数据项。
当编辑控件中的数据发生变化时,会触发几个事件,事件的名字在每种开发环
境中都不相同,具体如表2-2所示,本章中所指的事件使用的是PowerBuilder中的
名字。
表2-2 在各种环境下数据发生变化所触发的事件
事件 描述
PowerBuilder Web ActiveX JavaBeans组件
EditChanged onEditChange editChanged 用户在编辑控件
中每编辑一次便触发该事件
ItemChanged tefoleItemChange itemchanged 当一个单元被修改
和失焦点时触发该事件
ItemError onItemErrr itemError 当新的数据不满
足列的要求时触发该事件
ltemFocusChanged onItemFocusChange itemFocusChanged 当列的焦点发生
变化时触发该事件
在DataWindow中,当某列的数据被修改并且该列失去焦点(例如用户用Tab键
跳到下一列)时,事件触发的顺序为:
1). DataWindow控件把编辑控件中的文本转换为列的正确的数据类型。例如,如
果用
户在一个数值型的列中输入文本,则DataWindow控件会把输入的字符转换成数字,
如果不能转换,则触发ItemError事件。
2). 如果数据成功地转换为正确的类型,则DatawWindoW会使用列的有效性规则对
数据进行验证,如果数据没有通过有效性规则验证,则触发ItemError事件。
3).如果数据通过了验证,则ltemChanged事件被触发,如果在ItemChanged事件
中设
置了行为/返回代码1,则DataWindow控件拒绝接受数据且不允许焦点发生变化
,
这种情况下,将触发ItemError事件。
4).如果ltemChanged事件接受了数据,则接着触发ItemFocusChanged事件目
数据
作为数据项存入缓冲区中。
图2-9说明了这一过程。
图2-9 编辑控件中的事件触发过程
通过在事件的程序代码中指定行为/返回代码可以影响事件的结果。例如,上
面的步骤3描述了如何在ItemChanged事件中通过指定代码1来拒绝接受数据。
要指定行为返回代码:
· PowerBuilder:使用Return语句。
· Web控件和JavaBeans组件:调用SetActionCode或setActionCede函数。
2.5.2 存取编辑控件中的文本
下面的函数允许在编辑控件中存取文本:
· GetText(JavaBeans组件中为getText)一获得编辑控件中的文本。
· SetTxt(JavaBeans组件为setText)一设置编辑控件中的文本。
除了上面的函数外,下面的事件也提供了在编辑控件中对文本的存取:
EditChanged
ltemChanged
ItemError
存取编辑控件中的文本的方法依赖于开发环境:
· PowerBuilder和Web控件:使用Data参数,它被传递到事件中。
· JavaBeans组件:调用ItemEvent类的getData函数。
在这些事件的代码中,可以测试文本值并根据这些值来作特殊的处理。
2.5.3 操纵编辑控作中的文本
如果想要对Data Window控件中的编辑控件的内容作进一步的操纵,可以使用表
2-3的函数。
表2-3 操纵编辑控件内容的函数
PowerBuilder和Web 控件 JavaBeans 组件
CanUndo SCroll clear
Clear SelectedLength replaceText
Copy SelectedLine selectedLength
Cut SelectedStart selectedLine
LineCount SelectedText selectedStart
Paste SelectText selectedText
Position TextLine selectText
ReplaceText Undo
要获得这些函数的具体信息,请参见第二篇"参考篇"。
2.5.4 对ItemChanged事件编程
如果数据通过了转换和验证,则ItemChanged事件被触发。默认情况下,
ItemChanged事件接受数据值和允许焦点发生变化,但可以对ItemChanged事件编写
代码来做一些额外的处理。例如,可以执行一些测试,设置一个代码拒绝接受数据
,使列重新获得焦点和触发ItemError事件。
下面的例子代码是在DataWindow控件dw_Employee中的ItemChanged事件中设置
返回代码,以拒绝接受那些小于雇员年龄的数据,雇员年龄的值是在窗体的
SingleLineEdit或TextBox控件中指定的。
下面是PowerBuilder中的代码:
int a,age
age=Integer(sle_age.text)
a=Integer(data)
//在ItemChanged事件中设置返回代码为1,
//以告知PowerBuilder拒绝接受数据且不改变当前的焦点
IFa<age THEN RETURN 1
2.5.5 对ItemError事件编程
如果录入的数据有问题则会触发ItemError事件。默认情况下,它拒绝接受数
据并显示一个消息对话框,但可以对ItemError事件编写代码来作一些其他的处理
。例如,可以设置一个代码来接受数据,或不接受数据但允许焦点发生变化。
要获得关于DataWindow控件的事件的更多信息,请参见第二篇"参考篇"。
2.5.6 存取DataWindow中的数据项
可以通过使用函数或DataWindow数据表达式来存取DataWindow中的数据值。这
两种方法都可以存取任何缓冲区中的数据和获得其原始的或现在的值。
具体使用哪种方法根据要存取多少数据和在编译时是否知道DataWindow列的名字。
1.使用函数
下面列出了在DataWindow控件中操纵数据的几个函数,它们都是在指定的缓冲
区中获得指定的行和列的数据。
· PowerBuilder: GetItemDate, GetItemDateTime, GetItemDecimal,
GetItemNumber, GetItemString,GetItemTime。
· Web控件:GetItemDate,GetItemNumber,GetItemString。
· JavaBeans组件:getItemDate,getItemDecimal,getItemNumber,
getItemString。
下面的函数用来设置指定的行和列的值。
· PowerBuilder和Web控件:SetItem
· JavaBeans组件:setItem
例如,下面的语句使用PowerBuilder语法,获得第一行的empname列的值并赋
给变量IS_Name:
Is_Name=dw_l,GetItemString(1,"empname")
下面的PowerBuilder语句设置第一行的empname列的值为字符"Waters":
dw_1.SetItem(1,"empname","Waters")
GetItem函数用来获得指定的行和列的数据(该数据己经被接受),也可以在更新
数据库之前检查指定的缓冲区中的数据。在使用GetItem时,须根据列的数据类型
正确使用,否则会发生类型不匹配的错误。
2.使用表达式
DataWindow数据表达式可以指单一数据项、列、数据集、选中的数据或整个
DataWindow。
建立表达式的方法依赖于如下的开发环境:
· PowerBuilder使用符号"."。
· Web控件 不支持数据表达式。
· JavaBeans组件 使用getObject和getProperty函数。
(1)PowerBuilder中的表达式
DataWindow控件的Object属性可以指定表达式,且可以直接指定控件中
DataWindow对象的数据,这种直接的数据操作仅使用一条语句就可以存取少量或大
量的数据,且不需调用函数。
dw_1.Object.jobtitle[3]="Programme"
下面的语句设置DataWindow中第一行和第一列的值为"Smith":
dw_1.Object.Data[1,1]="Smith"
(2) JavaBeans组件中的表达式
getObject和getProperty函数可以用来获得或设置数据值。例如,可以获得
一列的所有值或该列中被选中的行的值。数据是以一维或二维数组返回的。例如,
下面的表达式获得DataWindow中所有的数据:
Object dwdata[] []=
dw_1.getObject("Data").getProperty("Primary");
要获得关于如何建立DataWindow数据表达式的完整信息,请参见"参考篇"。
3.使用其它的DataWindow函数
表2-4列出了一些DataWindow控件中经常使用的一些操纵数据的函数。
表2-4 DataWindow控件中操纵数据的函数
函数(PowerBuilder和Web控件;
JavaBeans组件) 目的
AcceptText;acceptText 将编辑控件中的内容应用于
DataWindow控件中的当前数据项
DeleteRow;deleteRow 从DataWindow控件中移走指定的行
(把它放在Delete缓冲区中,并不从数据库中删除这些行)
Filter;filter 基于当前的过滤条件来显示满足条
件的行
GetRow;getRow 返回当前行的数值
InsertRow;insertRow 插入一个新行
Reset;reset 清除DataWindow控件中的所有行
Retrieve;retrieve 从数据库存中检索数据
RowsCopy,RowsMove; 从一个DataWindow控件中拷贝或移
动行到另一个
rowsCopy,rowsMove DataWindow控件
ScrollToRow;scrollToRow 滚动到指定的行
SelectRow;selectRow 加亮显示指定的行
ShareData;shareData 在不同的DataWindow控件中共享数
据
Update;update 把DataWindow控件中所作的所有插
人、修改和删除都发送到数据库
每种开发环境都提供一个函数的参考列表,要查看完整的DataWindow函数列表
,可参见
· PowerBuilder: Browser
· PowerSite: 系统的Components标签
· PowerJ: Reference Card
要查看完整的DataWindow函数信息,请参见本书第二篇"参考篇"。
2.6 存取DataWindow对象的属性
2.6.1 DataWindow对象属性
DataWindow对象属性存储着控制DataWindow对象的行为的信息,它们不是
DataWindow控件的属性,而是显示在控件中的DataWindow对像的属性。
在DataWindow画板中,设计者创建了DataWindow对象属性的初始值,但也可以
通过代码在运行期间获取或设置这些属性的值。
通过使用Describe和Modify函数或者DataWindow属性表达式来存取一个
DataWindow对象的属性。具体使用哪种方法根据提供的错误检测类型和编译时是否
知道对象和属性的名字。
注意:在Web控件中,只支持Describe和Modify函数(不支持属性表达式)。
2.6.2 使用函数存取对象属性
可以使用下面的函数来存取DataWindow对象的属性。
· Describe:描述DataWindow对象的属性值和在DataWindow对象内的对象
的属性值。
· Modify:通过指定修改DataWindow对象定义的指令列表来修改DataWindow
对象。
PowerBuilder例如,下面的语句获得empname列的Border属性的值并赋给一个
字符变量ls_Border:
string ls_border
ls_border=dw_1.Describe("empname.Border")
下面的语句修改empname列的Border属性值为1:
dw_emp.Modify("empname.Border=1")
Web控件 JavaScript代码同PowerScript代码几乎是相同的。下面的语句获得
empname列的Border属性值:
string ls_border
ls_border=dw_1.Describe("empname.Border");
下面的语句修改empname列的Border属性值为1:
dw_emP.Modify("empname.Border=1");
JavaBeans组件 除了大小写和行的结尾不同外,Java代码同PowerBuilder是
基本相同的。下面的语句获得empname列的Border属性值:
String S_border;
s_border=dw_1.describe("empname.Border");
下面的代码empname列的Border属性值为1:
dw_emp.modify("empname.Border=1");
可以使用Describe和Modify,在运行时提供给用户一个修改DataWindow对象的界面
。例如,可以修改DataWindow对象的外观或允许用户创建报表。
2.6.3 使用表达式
DataWindow属性表达式提供了用较少的嵌套字符对属性进行存取的方法,在
PowerBuilder中,可以在Error事件中用正确的对象和属性名字来处理问题:
PowerBuilder使用对象属性和"."符号,举例如下:
integer li_border
li_border=Integer(dw_1.Object.empname.Border)
dw_1.Object.empname.Border=1
JavaBeans组件 使用getObject和getProperty函数。举例如下:
String s_border_old;
s_border_old=
dw_1.getObject("empname").getProperty("Border");
dW_1.getObject("empname").getProperty("Border")="1";
2.7 DataWindow的出错处理
在DataWindow的处理过程中,可能会发生下面几种类型的错误。
· 数据项是无效的(已经在2.5节中讨论过)。
· 当检索或更新数据失败时。
· 试图存取无效的或者不存在的属性或数据。
本节将描述如何处理最后两种类型的错误。
当在DataWindow控件中使用Retrieve或Update函数时,应该测试函数的返回
代码以得知函数是否成功执行。
在执行一个SQL语句(如CONNECT、COMMIT或DISCONNECT)或事务对像的同等的
函数后,应该总是测试成功/失败的代码(事务对像中的SQLCode属性)。但是,在
DataWindow使用了检索或更新函数时,则不应该使用SQLCode进行错误检测。因为
Retrieve和Update函数本身都有返回代码,如表2-5所示。
表 2-5 Retrieve和Update函数的返回代码
函数 返回代码 意义
Retrieve >=1 检索成功,返回检索到的数据行数
-l 检索失败。触发DBError事件
0 没有检索到任何数据
Update 1 更新成功
-l 更新失败,触发DBError事件
例子
如果仅在更新成功时才提交数据库所作的修改,则在PowerBuilder中可编程如
下:
IF dw_emp.Update()>0 THEN
COMMIT USING EmpSQL;
ELSE
ROLLBACK USING EmpSQL;
END IF
在Web控件中可编程如下:
number rtn;
rtn=dw_emp.Update();
if(rtn=1){
trams_a.commit();
}else{
trans_a.Rollback();
}
在JavaBeans组件中可编程如下:
long rtn;
rtn=dw_emp.update();
if(rtn=l){
trans_1.commit();
}else{
trans_1.rollback();
}
只要在检索或更新之后发生错误,即Retrieve或Update函数返回-1,则
DataWindow控件就会触发它的DBError事件。例如,如果插入一行均无值的数据但
所有列又被定义为不能为空时,DBMS会不接受插入的行且触发了
DBError事件。默认情况下,DataWindow控件会显示一个消息对话框,描述了从
DBMS返回的错误信息,如图2-10所示。
图2-10 DataWindow Error对话框
在很多情况下可以在DBError事件中编写自己的处理过程和禁止默认的消息对话
框出现。表2-6是做这种处理的一些技巧。
理的一些技巧。
表2-6 处理DBError事件的技巧
如果要 可以
获取DBMS的错误代码 使用DBError事件的SQLDBCode参数
获取DBMS的错误信息 使用DBError事件的SQLErrText参数
禁止对话框的出现 指定一个行为/返回代码为1
DataWindow控件的一些事件具有行为/返回代码,当事件触发时,可以设置代
码来取代默认的行为发生。代码和它们的意义依赖于事件。在PowerBuilder中,使
用RETURN语句设置代码;在Web控件和JavaBeans组件中,调用SetActionCode或
setActionCode函数来设置代码。
例子
PowerBuilder下面是DBError事件的一个例子程序:
//数据库错误-195意味着某些必须的值没有输入
IF sqldbcode=195THEN
MessageBox("Missing Information",&
"You have not supplied values for all"&
+"the required fields.")
END IF
//返回代码1,禁止默认消息对话框出现
RETURN 1
在运行时,如果出错则用户可以看到如图2-11所示的消息对话框。
图2-11 Missing Information对话框
Web控件 在JavaScript中,DBError事件的代码如下:
//数据库错误-195意味着某些必须的值没有输入
if(sqldbcode=-195){
alert("Missing information:/n"+
"You have not supplied values for all"+
"the required fields.");
}
//设置行为代码1,禁止默认消息对话框出现
dw_1.SetActionCode(1);
JavaBeans组件在Java中,DBError事件的代码如下:
//数据库错误-195意味着某些必须的值没有输入
if(event.getSQLDBCode=-195){
System.out.println("Missing information:\n"+
"You have not supplied values for all"+
"the required fields.");
}
//设置行为代码1,禁止默认消息对话框出现
dw_1.setActionCode(1);
2.7.2 属性和数据表达式中的错误及Error事件
Error事件在Web控件中是不可用的,因为它不支持属性和数据表达式。
JavaBeans组件不触发Error事件,但可以得到一个NullPointerException。
只要在运行时,数据或属性表达式发生错误,就会触发DataWindow控件的
Error事件。这些特指数据或DataWindow对象属性的表达式在某些运行条件下是有
效的,但在其它条件下是无效的。当一个表达式无效时,Error事件叮以对错误恢
复逻辑做出反应。
在PowerBuilder中,当使用数据或属性表达式时,PowerScript编译器只检查
对象属性前的语法,任何在对象属性之后的语句都是在运行时进行检验的。例如,
在下面的表达式中,列名emp_name和属性Visible直到运行时才进行检查:
dw_1.Object.emp-name.Vesible="0"
如果DataWindow中不存在列emp_name,或属性名字拼写有误,编译器在编译时
不会发现错误,但是在运行时PowerBuilder将触发DataWindow控件的Error事件。
Error事件的几个参数提供了关于错误情况的信息,可以检查参数值来决定错
误的原因。例如,可以获得内部的错误代码和错误信息、造成错误的对象名字,以
及导致错误发生的完整语句。由Error事件的参数提供的信息对调试编译器查不出
错误的表达式非常有帮助。要获得Error事件的参数的完整的描述,请参见本书的
DataWindow的"参考篇"。
当Error事件触发时,可以使应用程序忽略错误并继续处理、替代一个不同的返回
值,或通过触发SystemError事件来升级错误。在Error事件中,可以设置两个引用
参数(参见表2-7)来控制事件的结果。
表2-7 Error事件中的引用参数
参数 描述
Action 用来控制作为错误结果的应用程序的行为过程,它
的值是:
ExceptionIgnore!
4 ExceptionSubstituteReturn Value!
ExceptionFail!
要获得更多的信息,请看本书第二篇"参考篇"
ReturnValue 它的数据类型同DataWindow将要返回的值相匹配,
如果参数
Action的值是ExceptionSubstituteReturn
Value!,则使用
该值
当一个表达式的最后一个元素发生错误时,参数值
ExceptionSubstituteReturn Value!允许替代一个返回值。当表达式中间的元素发
生错误时,请不要使用ExceptionSubstituteReturn Value!替代返回值。
ExceptionSubstituteReturn Value!在数据表达式的错误处理中是最有用的。
2.8 更新数据库
在用户对DataWindow控件中的数据进行修改后,可以使用Update函数来保存对
数据库作的修改。
Update把自上一次Update或Retrieve函数执行后的所有对DataWindow做的插入、修
改和删除都发送给数据库。
2.8.1 DataWindow控件如何更新数据库
在更新数据库时,DataWindow控件通过查看DataWindow缓冲区每一行的状态来
决定要产生的SQL语句的类型。
表2-8列出了四种DataWindow数据项的状态,其中有两种只适合于行。
表2-8 DataWindow数据项的状态
状态 适用于
PowerBuilder名字 Java域名 数字值
New! New 2 行
NewModified! NewModified 3 行
NotModified! NotModified 0 行和列
DataModified! DataModified 1 行和列
上表所示的常量在不同的环境中使用有所不同。
在PowerBuilder中,命名的值是枚举数据类型dwItemStatus的值。在程序中必
须使用命名的值,它以感叹号结尾;在Web控件中没有定义命名值,只能使用数字
值;在JavaBeans组件中可以使用命名的域,它是作为DataWindow控件的一部分而
定义的,或者使用数字值,其中域名没有以感叹号结尾。
本节采用PowerBuilder名字进行讨论。
当数据检索到Data Window中时,所有的行和列都有初始的状态值:
NotModified。
在特定行中的某一列的数据发生变化后,无论是由于用户改变了数据,还是程
序改变了数据(如通过SetItem函数)则列的状态值变为DataModified。一旦任何
一列的状态值变为DataModified,则该列所在的行的状态也变为DataModified!。
当Data Window中插入一新行时,该新行的初始状态值为New!,且该行中所有
列的初始状态值均为NotModified。当该行中的某列数据发生变化后,无论是由于
用户改变了数据还是程序改变数据(如使用SetItem函数),则该列的状态值变为
DataModified!。一旦插入的行中的任何一列的状态值变为DataModified!,则该
行的状态值变为NewModified!。
如果DataWindow的某列有初始值,则直到用户在那一行中对该列做了实际的修
改后,该列的状态值才变为DataModified!。
当调用 Update函数时,DataWindow控件将为 Primary和/或 Filter缓冲区中
的数据产生 SQL INSERT和UPDATE语句。具体产生哪个语句依赖于如表2-9所示的行
状态值。
表 2-9 根据状态值所产生的SQL语句
行状态值 产生的SQL语句
NewModifiedd INSERT
DataModified! UPDATE
仅当遇到下面两种状态时,UPDATE语句才包含某一个列:
· 列在由DataWindow对象维护的可更新列的列表中。
· 列的状态值为DataModified!。
DataWindow在它产生的INSERT语句中包含了所有的列。如果某一列没有值,则
DataWindow为该列插入一个NULL值,而如果数据库不允许该列为NULL值,则会产生
一个数据库错误。
DataWindow控件为任何被移到Delete缓冲区(使用DeleteRow函数)中的数据
产生SQL DELETE语句。但是,如果在调用DeleteRow之前,某一行的状态值为New!
或NewModified!,则DataWindow控件不会为该行产生DELETE语句。
2.8.2 用程序改变行或列的状态
在程序中,可能需要编程来改变行或列的状态。特别是要阻止默认行为的发生
,例如,从一个DataWindow拷贝一行到另一个DataWindow;且当用户修改了行后,
想产生一个UPDATE语句而不是INSERT语句。
可以使用SetItemStatus函数来改变DataWindow的行或列的状态信息。使用
GetItemStatus函数来确定指定的行或列的状态。
可以使用SetItemStatus改变列的状态值,从DataModified!到NotModified!
反之亦然。
注意:修改行状态会改变该行中所有列的状态为NotModified!,因此如果要
调用Update函数,不会产生SQLUpdate语句。这就要求在修改行状态之后必须修改
要更新的列的状态值。
修改行状态有一点复杂,表2-10列出了修改一行的某一状态到另一状态的结果
。
表2-10修改行状态的结果
初始状态 指定状态
New! NewModified DataModified!
NotModified!
New! - Yes Yes No
NewModified! No - Yes New!
DataModified! NewModified! Yes - Yes
NotModified! Yes Yes Yes -
在表2-10中,Yes意味着修改是有效的。例如使用SetltemstatuS来修改具有
NotModified!状态的行为NeW状态,Yes意味着修改后的状态为New!,而No意味着
修改是无效的,且状态没有发生变化,还是NotModified。
使用SetItemStatus修改某行的状态从NewModified!到NotModified!,实际
修改后的状态为New!。使用SetItemStatus修改行状态从DataModified!,实际修
改后的状态为NewModified!。
改变一行的状态为NotModified!或New!,会造成该行中所有列的状态值为
NotModified!。为了确保调用Update时会产生一个SQL Update语句,则须改变列
的状态为 DataModified!。
如果不能直接地改变为希望的状态,通常可以间接地改变。例如,直接改变状
态New!为NotModified!是无效的,但可以间接地改变,即先改变状态New!为
DataModified!,再改变DataModified为NotModified!即可。
2.9创建报表
可以使用DataWindow对象创建标准的商业报表,如金融状态、销售定单、雇员
列表或存货清单等。
要创建一个报表,应该:
· 决定要产生的报表类型。
· 建立一个DateWindow对象以显示报表中的数据。
· 把DataWindow对象放到窗体的DataWindow控件中。
· 编写代码执行相应的处理过程并打印报表中的内容。
如果用户己经安装了InfoMaker(PowerSoft报表产品),可以从程序中调用
InfoMaker。这种方式可以让用户创建和保存他们自己的报表,在PowerBuilder中
使用Run函数来调用。
2.9.1 设计和建立DataWindow对象
要设计报表,先建立一个DataWindow对象,选择数据源和表现风格并接着:
· 对数据进行排序。
· 在DataWindow对象中创建分组以组织报表中的数据。
· 并当分组值发生变化时强行分页。
· 增强DataWindow对象,使之更像一个报表(例如增加一个标题、列标签和
计算
域来计算页数等)。
注意:在使用字体时,打印机字体通常比屏幕显示的字体要短和宽,所以打印
在报表中的文本不会像它在DataWindow画板中显示的那么精确,设计者应在文本域
中增加空格来解决这种矛盾。因此在打印包含大量数据
的报衰之前,应用少量的数据对报表进行测试,以查看打印出来的报表是否符合要
求。
2.9.2 打印报表
在建立完DataWindow对象和填写完打印说明后,就可以把它放在窗体的
DataWindow控件中,具体描述可参见本章第二节"把DataWindow对象放到控件中"。
要允许用户打印报表,应用程序应该编写代码来执行打印操作,例如,可以在
窗体中放置一个按钮,接着编写用户点击该按钮时应运行的代码。
要打印一个单一的DataWindow 控件或DataStore中的内容,应调用Print函数
。例如,下面的PowerBuilder语句打印DataWindow控件dw_Sales中的报表:
dw_Sales.Print(TRUE)
要获得Prin函数的详细信息,可参见第二篇"参考篇"。
在PowerBuilder应用程序中,如果窗体有多个DataWindow控件,可以在一个打
印任务中,调用多个PrintDataWindow函数来打印所有DataWindow控件中的内容。
下面的语句是在一个打印任务中打印三个DataWindow控件中的内容:
intjob
job= PrintOpen("Employee Reports")
//每个DataWindow都在一个新页上开始打印
PrintDataWindow(job,dw_EmpHeader)
PrintDataWindow(job,dw_EmpDetail)
PrintDataWindow(job,dw_EmpDptSum)
PrintClose(job)
2.10 使用嵌套报表
当设计一个报表(或一个DataWindow对象)时,可以选择嵌套其他的报表。在
应用程序中使用嵌套报表的基本步骤同使用其他类型报表是一样的,但是还应该了
解有关嵌套报表的一些其他信息。
2.10.1 在一页中打印多个DataWindow
Composite风格的报表有一个优点,就是能在一页中打印多个报表,但也有一
个限制,就是它们是不能更新
的DataWindow;但是可以使用如下的间接的方法来实现更新。
可以使用GeChild函数在Composite报表中获取一个己经命名的嵌套报表的句柄
,在获得嵌套报表的句柄后,就可以在运行时像操作其他DataWindow一样来操作嵌
套报表。
使用该技术,可以在Composite报表内的多个可更新的DataWindow和嵌套报表
之间通过调用ShareData函数来共享数据,它允许在一页中通过composite报表打印
多个可更新的DataWindow。
要使用Composite风格的DataWindow在一页中打印多个DataWindow,应该:
· 建立一个窗体,包含可更新的DataWindow。
· 定义一个Composite风格的报表,包含了在窗体中要打印的每一个
DataWindow,
且一定要为Composite报表内的每一个嵌套报表命名。
· 要对一个嵌套报表使用GetChild,则该嵌套报表必须要有一个名字,要在
DataWindow画板中命名一个嵌套报表,应在工作台中用鼠标双击它并在
Generas
属性页的Name文本框中输入嵌套报表的名字。
· 把Composite报表加到窗体中(它可以被隐藏)。
· 在应用程序中,执行如下的步骤:
a. 检索数据到报表中。
b. 使用GetChild函数来获得Composite报表内的嵌套报表的句柄。
C. 使用ShareData在可更新的DataWindow对象和嵌套报表之间共享数据。
d. 在适当时候,打印Composite报表。
该报表包含了可更新的DataWindow对象的信息。
注意:每次检索数据到Composite报表中时,所有的嵌套报表的句柄都变为无
效,且同嵌套报表的数据共享也终止。因此,在每次检索数据后,一定要重新调用
GetChild和ShareData,以恢复嵌套报表的句柄和数据共享。
2.10.2 在运行时创建和删除嵌套报表
可以使用相同技术在DataWindow对象内创建和删除其他对象,在运行时动态地
创建和删除报表内的嵌套报表。
要创建一个嵌套报表,应使用 Modify函数的 CREATE关键字,并赋给嵌套报表
属性的相应的值。
查看动创建嵌套报表的语法的最简单的方法是导出一个现有的包含嵌套报表的
Datawindow的语法,该导出的文件中就包含了所需的语法。
当创建一个嵌套报表时,需要重新检索数据以查看报表。在一个Composite报
表中,既可以检索所有报表的数据,也可以使用GetChild获得嵌套报表的句柄并利
用该句柄直接检索它的数据。
对于其他类型报表中的嵌套报表,应该检索基本报表的数据。
要删除一个嵌套报表,使用Modify函数的DESTROY关键字,嵌套报表会立即消
失。
要获得在DataWindow对象或报表内创建和删除对象的更多的信息,请看第三章
"动态修改DataWindow对象"。
要获得嵌套报表的详细属性列表,请参见本书的"参考篇"。
2.11 使用Crosstab
要执行某种数据分析,可以在Crosstab表现风格中设计DataWindow对象。在应
用程序中使用Crosstab的基本步骤同使用其他类型Data Window是一样的,但是还
应该了解有关Crosstab的其他信息。
2.11.1 查看原始数据
如果要使用户能看到原始的数据和交叉统计的数据,可以选择下面的任一种方
法
· 把两个DataWindow控件放在窗体中:一个同Crosstab相关联,另一个同显
示所检
索到的数据的DataWindow对象相关联。
· 创建一个Composite报表,它包含两个报表:一个显示原始数据,另一个显
示
Crosstab。
注意:当两个DataWindow对象或报表具有相同的SQL SELECT数据定义,但却有
不同的结果集时.不能在这两个DataWindow对象或报表之间共享数据。
2.11.2 让用户重新定义 Crosstab
这项技术在DataWindow JavaBeans组件中是不可行的。
利用CrosstabDialog函数,可以让用户在运行时重新定义Crosstab的列、行和
值。
CrosstabThalog函数显示了Crosstab定义对话框,用户可在其中定义
Crosstab的列、行和值(使用在DataWindow画板中所用的相同技术,如图2-12所示
)。当用户单击对话框中的OK按钮时,DataWindow控件会根据新的定义来重新建立
Crosstab。
图2-12 DataWindow画板中的Crosstab定义对话框
当在运行时调用CrosstabDialog重新建立一个Crosstab时,可以显示提示信息
(该信息同在DataWindow画 板中建立一个Crosstab时所看到的信息是相同的,如
"Retrieving data"和"Building Crosstab")。当对大量的数 据进行统计分析或
重建Crosstab需要很长时间时,显示提示信息是很重要的,因为这样可以使用户了
解当前正运行的状态。
在PowerBuilder中,使用用户事件来显示Crosstab的提示信息。
当建立一个Crosstab时显示提示信息的步骤为:
a.为包含Crosstab的DataWindow 控件定义一个用户事件,其事件的ID为
pbm_dwnmessagetext。
b.在用户事件的脚本中,取得teXt参数的值并显示给用户,text参数中保存了
在
DataWindpw画板中建立Crosstab时PowerBuilder将显示的信息。
在Web控件的Web页中,使用DataWindow的onMessageText事件来处理提示信息
。
当重新建立Crosstab时显示提示信息的步骤为:
a. 在DataWindow控件的onMessageText事件中编写代码。
b. 取得Text参数的值并显示给用户。
例子 (PowerBuilder)
在该例子中,通过在DataWindow控件的用户自定义事件(ID为
pbm_dwnmessagetext)中的代码,把提示信息显示在包含Crosstab的窗体的表态文
本框控件st_message中:
St_message.Text= text
利用上面的脚本,在调用CrosstabDialog和用户重新定义Crosstab之后,当
Crosstah重新建立时,应用程序会动态地把提示信息显示在静态文本框控件
st_message中(在调用CrosstabDialog之后,应该把st_message.Text设为空字符
串)。
在下面的例子中,用户自定义事件(ID为pbm_dwnmessagetext)中的代码提示
信息显示为MDI应用程序状态栏的微帮助(W_crosstab是一个MDI窗体):
w_crosstab.SetMicroHelp(text)
当Crosstab重新建立时,提示信息显示在MDI应用程序的微帮助中。
2.11.3 在运行时修改Crosstab的属性
像其他DataWindow对象一样,可以在运行时通过Modify函数来修改Crosstab的属性
。其中,一些属性的修改需要DataWindow控件动态地重建Crostab,而另一些属性
的修改不需要(如果最初的Crosstab是静态的,则当它重新建立时就变为一个动态
的Crosstab)。
这-技术适合所有的DataWindow环境。
表2-11所列的属性,在修改时不需要DataWindow控件重新建立Crosstab。
表2-11 在修改时不需要重新建立Crosstab的属性
属性 适用对象
Alignment Column,Compute,Text
Background Column,Compute,Line,Oval,
Rectangle,RoundRectangle,Text
Border Column,Compute,Text
Brush Line,Oval,Rectangle,RoundRectangle
Color Column,Compute,Text
Edit styles(dddw,ddlb,checkbox, Column
edit,deitmask,radiobutton
Font Column,Compute,Text
Format Column,Compute
Pen Column,Compute,Line,Oval,Rectangle,
Pointer Column,Compute,Line,Oval,Rectangle,
RoundRectangle,Text
如果修改了除上表中所列的任何其他属性,DataWindow控件会在Modify调用时
重新建立Crosstab的结构。为避免Crosstab在属性修改时的多次重建,应该在一次
调用Modify时把所有必须的表达式都写进去,这样DataWindow控件就只重建
Crosstab一次。
由于计算结果是来源于现有的列,所以DataWindow控件在默认情况下使用的是
现有列的属性,对于完全新的列来说,像字体、颜色等的属性默认是先前存在的
Crosstab的第一列的属性。在标题区中的文本的属性默认是先前存在的Crosstab的
第一个标题线上的第一个文本对象的属性。
2.12 生成HTML
2.12.1 概述
可以使用DataWindow对象内的数据生成超文本标识语言(HTML)语法,一旦生
成HTML,则可以在Web浏览器中显示它。
本章不描述HTML DatatWindow Web应用程序。HTML DataWindow使用
DataWindow对象属性,它们将在第六章"HTML DataWindow"和第二篇"参考篇"中描
述。特别是参见DataHTML和HTMLGen属性。
可以使用任何几种技术,从一个DataWindow对象或DataStore生成HTML。
在画板中:不论是在DataWindow画板中还是在数据管理画板中,都可以把检索
到的数据保存成HTML格式。只要从菜单中选择 Fil->Save Rows As,并指定文件
的格式为HTML Table即可。
在应用程序代码中:可以获得DataWinow 表现风格的HTML字符串和从Data.
HTMLTable中获得数据。程序中可把这个字符串保存在一个变量中。并通过字符串
运算操作符来修改HTML。在PowerBuilder中,也可以使用 FileOpen和 FileWrite
函数把HTML存为一个文件。
HTMLTable有它自己的属性,利用这些属性可以控制HTML属性和与之关联的
Table HTML元素的表单风格。
在PowerBuilder中,有两种可行的方法如下:
· 调用SaveAS函数把DataWindow中的内容直接保存到一个文件中,要以
HTML格式
保存数据,只须在调用SaveAS时指定文件类型为HTMLTable即可。
· 调用GenerateHTMLForm函数,把DataWindow控件或DataStore(其
DataWindow
对象使用了FreeForm或Tabular表现风格)中的数据生成一个HTML窗体。
一些DataWindow表现风格更容易转成HTML,下面的表现风格在转成HTML时会有
较好的效果:
Tabular
Group
Freeform
Crosstab
Grid
Composite、 Graph、 RichText和 OLE 2.0表现风格及嵌套报表所产生的
HTML,只基于它们的结果而不是表现风格。具有重叠对象的DataWindow不会产生重
叠的效果。
下面的例子展示了在应用程序中如何使用由DataWindow生成的HTML。
代码中的关键行是指定DataWindow的HTMLTable属性来获得它的HTML,下面列
出了在每种环境下的不同代码,在PowerBuilder和 JavaBeans组件中,可以使用
Describc函数或属性表达式,而Web控件只能使用Describe。
PowerBuilder:
ls_htmlstring=dw_1.Object.DataWindow.Data.HTMLTable
Web控件:
str_html=dw_1.Describe("DataWindow.Data.HTMLTable")
JavaBeans组件:
str_html=dw_1.getObject("DataWindow")
getObject("Data").getProperty(HTMLTable");
下面完整的例子是在PowerBuilder中实现的。
图2-13的窗体在一个Tabular表现风格的DataWindow对象内显示了客户信息的
数据,通过按Browse按钮, 用户可以把DataWindow对象内的内容转换成HTML格式
,并调用一个Wed浏览器来查看HTML结果;通过按SelectBrowser按钮,用户可以告
知应用程序使用哪个web浏览器来查看结果。
图2-13 显示Tabular风格的HTML
下面详细讨论各按钮的功能和脚本程序:
Select Browser按钮:该按钮的脚本显示一个对话框,用户可以在其中选择一
个Wed浏览器的可执行文件。可执行文件的路径存在变量is_Browser中,它是在窗
体中定义的一个实例变量。具体脚本如下:
Stringls_BrowserName
Integer li_Result
// 打开对话框选择一个浏览器
li_Result=GetFileopenName(SelectBrowser"), &
is_Rrowser,ls_BrowserName,&
"exe","Executable Files(*.EXE,*.EXE")
IF li_Result=-1THEN
MessageBox("No Browser","No Browser selected")
ENDIF
Browse按钮:该按钮的脚本通过赋值Data.HTMLTable属性,把DataWindow中的
数据生成了一个HTML字符串并保存到一个字符串变量中。建立完HTML字符串后,脚
本增加了一个标题到HTML字符串中。接着脚本把HTML保存到一个文件中并运行指定
的浏览器来显示结果。具体的脚本如下:
String ls_HTML,ls_FileName ls_BrowserPath
Integer li_FileNumber,li_Bytes,
Integer li_RunResult,li_Result
// 生成HTML
ls_HTML=dw_1.Object.DataWindow.Data.HTMLTable
IF IsNull(ls_HTML)OrLen(ls_HTML) <=1 THEN
MessageBox("Error","Error generating HTML!")
Retum
ELSE
ls_HTML="〈H1〉HTML Generated From a Data Window"&
+"〈/H1><P>"+lS_HTML
END IF
// 创建文件
ls_FileName="custlist.htm"
li_FileNumber=FileOpen(ls_FileName,StreamMode!,&
Write!, LockReadWrite!,Replace!)
IF(li_FileNumber >= 0)THEN
li_Bytes=FileWrite(li_FilerNumber,ls_HTML)
FileClose(li_FileNumber)
IF li_Bytes=Len(ls_HTML) THEN
// 运行浏览器,并打开HTML文件
IF Not FileExists(is_Browser) THEN
cb_selbrowser.Trigger Event ClicKed()
IF NOT FileExistts(is_Browser)THEN
MessageBox("Selet Browser","Could not&
find thebrowser.")
RETURN
END IF
END IF
li_RunResult=Run(is_Browser+"file://"+&
IS_FileName)
IFli_RunResult=-1THEN
MessageBox("Error running browser!")
END IF
ELSE
MessageBox("Write Error,",&
" File Write Unsuccessful")
END IF
ELSE
MessageBox("File Error","Could not open file")
END IF
2.12.2 控制显示
通过HTMLTable.GenerateCSS属性,可以控制表的显示和表单风格的使用。
HTMLTable.GenerateSS属性控制着HTMLTable属性中指定的 HTML的向下兼容性。如
果 HTMLTable.GenerateCSS值为 FALSE,则格式(表单风格的引用)不会在
HTMLTable属性中指定;如果它为TRUE,则HTMLTable属性包括引用叠加表单风格(
保存在HTML.StyleSheet中)的元素。
图2-14显示了在浏览器中使用定制显示特色的HTML表。
图2-14 使用定制显示风格的HTML
如果HTMLTable.GenerateCSS属性值为TRUE,则HTMLTable属性中的HTMLTable
元素使用附加的属性来定制表的显示。例如,假定指定如下的属性:
HTMLTable.NoWrap=Yes
HTMLTable.Border=5
HTMLTable.Windth=5
HTMLTable.CellPadding=2
HTMLTable.CellSpacing=2
通过使用Modify和PowerScript Describe函数或使用"."符号,可以存取这些属
性。
在HTMLTable属性中的HTML语法包括表格信息和使用表单风格的类的引用。
<table cellspacing=2 border=5 width=5>
<tr>
<td CLASS=O ALIGN=center>Employee ID
<td CLASS=O ALIGN=center>First Name
<td CLASS=O ALIGN=center>Last Name
<tr>
<td CLASS=6 ALIGN=right>l02
<td CLASS=7>Fram
<td CLASS=7>Whitney
</table>
如果HTMLTable.GenerateCSS属性值为FALSE,则DataWindow不使用HTMLTable
属性来创建表元素。例如,如果GenerateCSS为FALSE,则HTMLWTable属性的HTML语
法如下所示:
<table>
<tr>
<th ALIGN=center>Employee ID
<th ALIGN=center>First Name
<th ALIGN=Center>Last Name
<tr>
<td ALIGN=right>l02
<td>Fran
<td>Whitney
</table>
HTMLTable属性中包含的HTML语法是不完整的。它没有打包在<HTML><
/HTML>元素中,且不包含表单风格,可以在程序中编写代码来建立一个完整的
HTML页。
PowerBuilder例子:Web.PB是PowerBuilder应用程序服务器,它允许编写建立
Web页的分布式对象。在Web.PB应用程序中的PowerBuilder代码充分地利用
HTMLTable来建立Web页。下面的Web.PB例子设置了DataWindow属性,创建了HTML,
并把它返回到浏览器:
String ls_html
ds_l.Modify &
("datawindow.HTMLTable.GenerateCSS='yes'")
ds_l.Modif("datawindow.HTMLTable.NoWrap='yes'")
ds_l.Modify("datawindow.HTMLTable.width=5'")
ds_l.Modify("datawindowindow.HTMLTable.border=5")
ds_l.Modify("datawindow.HTMLTable.CellSpacing=2")
ds_l.Modify("datawindow.HTMLTable.CellPadding=2")
Is_html="<HTML>"
Is_html+=&
ds_1.object.datawindow.HTMLTable.Stylesheet
ls_html+="<BODY>"
Is_html+="<Hl>DataWindow with StyleSheet</Hl>"
Is_html+=ds_l.object.DataWindow.data.HTMLTable
Is_html+="</BODY>"
Is_html+="</HRML>"
return ls_html
这项技术可以控制HTML页的内容。在Web.PB中使用该技术来动态地创建HTML或
可选择地用参数值HTMLTable!来调用SaveAS函数。
2.12.3 调用SaveAS函数
SaveAs函数在Web控件和JavaBeans组件中是不可用的,它只适用于
PowerBuilder。
作为一种选择,可以用参数值HTMLTable!来调用SaveAS函数以动态创建HTML页
:
ds_l.SaveAs &
("C:\TEMR\HTMITemp.htm",HTMLTable!,TRUE)
下面的语句利用上面的元素创建了一个HTML文件,并包含表单风格:
<STYLE TYPE="text/CSS">
<!--
.2{COLOR:#000000;BACKGROUND:#ffffff;FONT-STYLE:normal;
FONT-WEIGHT:normal;FONT:9pt
"Arial", sans-serif:TEXT-DECORATION:none}
.3{COLOR:#000000;BACKGROUND:#ffffff;FONT-STYLE:normal;
FONT-WEIGHT:normal;FONT:8pt "MS
Sans Serif"sans-serif;TEXT-DECORATION:none}
.3{COLOR:#000000;BACKGROUND:#ffffff;FONT-STYLE:normal;
FONT-WEIGHT:normal;FONT:8pt"MS
Sans Serif",sans-serif;TEXT-DECORATION:none}
-->
</STYLE>
<TABLE nowrap cellspacing=2 cellpadding=2 birder=5 width=5>
<tr>
<td CLASS=2 ALIGN=right>Employee ID:
<td CLASS=3 ALIGN=right>501
<tr>
<td CLASS=2 ALIGN=right>Last Name:
<td CLASS=3>Scott
<tr>
<td CLASS=2 ALIGN=right>First Name:
<td CLASS=3>David
<tr>
<td CLASS=2 ALIGN=right>Status:
<td CLASS=3>Active
</TABLE>
2.12.4 以HTML窗体显示DataWindow对象
GenerateHTMLForm函数在Web控件和JavaBeans组件中是不可用的,它只适用于
PowerBuilder。
PowerBuilder可以为使用FreeForm或Tabular表现风格的DataWindow对象创建
HTML窗体,也可以创建一个显示指定数量的列和指定数量的行的HTML窗体,但须注
意:
· 通过调用GenerateHTMLForm函数为DataWindow控件或DataStore创建HTML
窗体语法。
· GenerateHTMLForm函数只为DataWindow的Detail带创建HTML窗体语法。
· 嵌入的嵌套DataWindow是作为窗体中的HTML表显示的。
当使用Web.PB时,可以动态地创建HTML窗体,虽然GenerateHTMLForm函数为所
有表现风格的DataWindow生成语法,但是只有Freeform和Tabular表现风格的
DataWindow才能创建成可用的窗体。
图2-15的HTML页显示了一个由Freeform风格的DataWindow对象转换成的HTML窗体。
图2-15 Freeform风络的HTML
GenerateHTMLForm函数把列的编辑风格转换成相对应的HTML元素,具体如表
2-12所示。
表2-12 列编辑风格和相对应的HTML元素
列编辑风格 HTML元素
CheckBox 输入元素,指定TYPE=CHECKBOX
DropDownDataWindow 一个单选项元素的选择元素
DropDownListBox 在下拉列表框中每一项为一个选项元素的选
择元素
Edit 输入元素,指定TYPE=TEXT输入元素
RadioButton 指定TYPE=RADIO
要产生HTML窗体语法,应调用函数GenerateHTMLForm,其语法为:
instancename.GenerateHTMLForm(syntax,style,
action{,startrow,endrow,startcolumn,endcolumn{,buffer}})
函数把窗体元素语法放到Syntax参数中,把HTML表单风格放到Style参数中,
两个参数都是通过引用进行传递的。
注意:在Detail带的所有静态文本都被传递到生成的HTML窗体语法中。如果通
过Startcolumn和endcolumn参数来限制转换的列的数量,则删掉从Detail带删除的
列的标题。
下面是一个GenerateHTMLForm函数的例子:
String ls_syntax,ls_style,ls_action
String ls_htrnl
Integer li_return
ls_action=&
"/cgi-bin/pbcgi60.exe/myapp/uo_webtest/f_emplist"
li_peturn=ds_l.GenerateHTMLForm&
(ls_syntax,ls_style,ls_action)
IF li_return=-1 THEN
MessageBox("HTML","GenerateHTMLForm failed")
ELSE
//of_MakeHTMLPage是一个对象函数,在下一节中将描述
lS_html=this.of_MakeHTMLPage &
(ls_syntax,ls_style)
END IF
在调用GenerateHTMLForm函数后,ls_syntax变量包含了一个窗体元素。下面
是一个例子:
<FORMACTION=
"/cgi-bin/pbcgi60.exe/myapp/uo_webtest/f_emplist"
METHOD=POST>
<P>
<P><FONT CLASS=2>Employee ID:</FONT>
<INPUT TYPE=TEXT NAME="emp_id_1"VALUE="501">
<P><FONT CLASS=2>Last Name:</FONT>
<INPUT TYPE=TEXT NAME="emp_lname_1"MAXLENGTH=20
VALUE="Scott">
<P><FONT CLASS=2>First Name:</FONT>
<INPUT TYPE=TEXT NAME="emp_fname_1"MAXLENGTH=20
VALUE="David">
<P><FONT CLASS=2>Status:</FONT>
<INPUT TYPE="RADIO"NAME="status_1"CHECKED CLASS=5><FONT
CLASS=5>Active
<P>
<INPUT TYPE="RADIO" NAME="Status_l"CLASS=5>
<FONT CLASS=5 >Terminated
<P>
<INPUTTYPE="RADO"NAME="status_l"CLASS=5>
<FONT CLASS=5>On Leave
<P>
<P>
<BP>
<INPUTTYPE=SUBMIT NAME=SAMPLE VALUE="OK">
</FORM>
上面例子中的ls_styleshett变量中包含了一个风格元素,它的一个例子如下
所示:
<STYLETYPE="text/css">
<!-
.2{COLOR;#000000;BACKGROUND:#ffffff;FONT-STYLE:normal;
FONT-WEIGHT;normal;FONT:9pt"Arial",sans-serif;TEXT-DECORATION:none}
.3{COLOR:#000000;BACKGROUND;#ffffff;FONT-STYLE:normal;
FONT-WEIGHT:normal;FONT:8pt"MSSans Serif",sans-serif;TEXT-DECORATION
:none}
.5{COLOR:#000000;BACKGROUND:#fffff;FONT-STYLE:normal;
FONT-WEIGHT:normal;FONT;8pt"MSSars Serif,sans-serif;TEXT-DECORATION:
none}
-->
</STYLE>
GenerateHTMLForm函数通过增加一个_nextsequentialnumber后缀为窗体中的
所有元素都创建一个唯一的名字。(即便在一个窗体中显示多行)。
为了使用由GeneratenHTMLForm)函数返回的语法和表单风格,必须编写代码
来把它们合并到一个HTML页中,一个完整的HTML页需要<HTML>和<BODY>元素来包含
表单风格和语法。
一种实现方法是创建一个全局变量或一个返回完整的HTML页的对象函数,它把
由GenerateHTMLForm函数产生的窗体和风格元素作为参数。该函数可包如下的代码
:
//函数名:of_MakeHTMLPage
//参数:String as_syntax,String as_style
//返回值:String
//***********************************
Sting ls_html
IF as_syntax=""THEN
RETURN""
END IF
IF as_style="" THEN
RETURN""
ENDIF
ls_html="<HTML>"
ls_html+=as_style
Is_html+="<BODY>"
ls_html+="<Hl>Employee Information</Hl>"
ls_html+=as_syntax
ls_html+=</BODY></HTML>"
RETURN ls_html
本章小结
本章详细介绍了使用DataWindow对象的一些技术,从如何建立DataWindow到如
何使用它以及它的出错处理,都有详细的介绍。
第1节介绍了如何建立DataWindow,重点介绍了DalaWindow画板的概念。
第2节介绍了DataWindow控件和DataWindow对象的含义,并举例说明了如何把
DataWindow对象放到DataWindow控件中的详细步骤,并介绍了如何编辑和修改
DataWindow对象以及如何在运行时指定DataWindow对象。
第31节介绍了在三种开发环境卜如何通过事务管理来存取数据库,并分别举例
说明了两种事务对象(内部的和独立的事务对象)的使用,最后介绍了如何检索和
更新数据。
第4节介绍了如何从外部数据源导入数据的一些函数。
第5节介绍了如何在DataWindow控件中操纵数据。首先介绍了DataWindow控件
管理数据的三个缓冲区,接着介绍了用户在编辑数据时所触发的事件的顺序,并说
明了如何对这些事件进行编程来存取和操纵编辑控件中的文本,最后介绍了如何通
过函数来保存DataWindow中的数据项。
第6节介绍了如何通过函数和表达式来存取Datawidow对象的属性。
第7节介绍了DataWindow何时触发错误事件及如何获得发生错误时的错误信息
,如错误代码、错误信息等。
第8节介绍了DataWindow控件是如何更新数据库的和DataWindow控件中数据项
的几种状态及这几种状态之间的相互转化的过程。
第9节介绍了如何创建和打印报表的过程。
第10节介绍了如何使用嵌套报表在一页中打印多个DataWindow以及如何在运行
时创建和删除嵌套报表。
第11节介绍了如何使用Crosstab及如何让用户在运行时重新指定Crosstab的行
和列并在运行时修改Crossstab的属性。
第12节介绍了如何生成HTML DataWindow,并附有详细的例于说明了使用的过
程。
总之,本章详细介绍了使用DataWindow的一些基本的技术,其中有关具体某一
技术的论述在随后的章节中将陆续进行专题讲解。
--
我要吃烤鸡
※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.226.245]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:835.686毫秒