本书全面、系统地介绍了PowerBuilder 9.0的开发环境、技巧以及笔者多年来的PowerBuilder开发经验。全书共分3部分,第1~19章为C/S开发,第20~24章为B/S应用开发,其余内容为PowerBuilder扩展功能。其中,第1~4章介绍PowerBuilder 的基础知识;第5~9章介绍PowerBuilder的编程知识,并融会了笔者多年来的开发经验;第10~19章和第28章紧密结合软件项目设计思想,介绍了PowerBuilder 项目开发的实用知识;其他章节侧重于PowerBuilder 9.0新增知识和B/S开发的介绍。
本书涵盖了PowerBuilder 9.0的所有内容,知识点系统、全面和实用,适用于从事或准备从事使用PowerBuilder 进行开发的各层次的工程技术人员以及大中专院校师生。
第1章 PowerBuilder基础 1
1.1 新增功能 1
1.1.1 改进综述 1
1.1.2 PowerBuilder 9.0的主要特征 3
1.1.3 PowerBuilder 9.0的主要改进 4
1.2 什么是PowerBuilder 12
1.2.1 画笔 13
1.2.2 事件和脚本 13
1.2.3 函数 14
1.2.4 库文件 14
1.2.5 创建执行文件 14
1.3 PowerBuilder工作环境 15
1.3.1 关于PowerBar 15
1.4 使用工具条 17
1.4.1 下拉工具条 17
1.4.2 控制工具条的显示 17
1.4.3 移动工具条 18
1.4.4 配置工具条 18
1.4.5 创建新的工具条 20
1.5 弹出菜单和属性窗口 21
1.5.1 弹出菜单 21
1.5.2 选择对象 21
1.5.3 属性窗口 21
1.6 使用文件编辑器 22
1.6.1 文字的查找和替换 23
1.6.2 增加或取消行注释 23
1.6.3 输入、输出文件 24
1.6.4 选中文字的拖放 24
1.7 使用在线帮助 24
1.8 理解PowerBuilder对象 24
1.8.1 属性 25
1.8.2 函数 25
1.8.3 事件 26
1.9 理解配置文件 26
1.10 配置PowerBuilder的启动参数 28
1.11 开发应用程序的步骤 29
第2章 Application对象 31
2.1 应用对象操作 31
2.1.1 创建Application 31
2.1.2 打开Application 32
2.1.3 设置库搜索路径 33
2.2 Application画板 34
2.2.1 定义变量 35
2.2.2 编写脚本 35
2.2.3 定义函数 36
2.2.4 定义事件 37
2.2.5 设置属性 37
2.2.6 编辑环境 38
2.3 显示应用对象树 38
2.4 应用对象概述 39
2.5 应用对象事件 41
2.5.1 Open事件 41
2.5.2 Close事件 43
2.5.3 Idle事件 43
2.5.4 SystemError事件 43
2.5.5 ConnectionBegin事件 49
2.5.6 ConnectionEnd事件 49
2.6 应用对象函数 49
2.7 应用对象的属性 50
2.7.1 General属性 50
2.7.2 附加属性 52
2.7.3 Toolbar属性 52
第3章 窗口和窗口画板 53
3.1 窗口画板 53
3.1.1 Window画板的组成 53
3.1.2 定制窗口画板 56
3.1.3 打开和创建窗口 58
3.1.4 保存窗口 59
3.1.5 窗口画板中的快捷操作 60
3.2 关于窗口 60
3.2.1 窗口的组成 60
3.2.2 窗口的类型 61
3.3 设置窗口属性 62
3.3.1 开发时设置属性 63
3.3.2 运行时的属性 65
3.4 使用控件 66
3.4.1 控件简介 66
3.4.2 放置控件 67
3.4.3 选中控件 68
3.4.4 控件的对齐和大小调整 68
3.5 窗口对象事件 69
3.5.1 Activate和Deactivate事件 70
3.5.2 Open事件 70
3.5.3 Close和CloseQuery事件 70
3.5.4 Resize事件 72
3.6 窗口的常用函数 72
3.6.1 Open函数 73
3.6.2 Close函数 73
3.6.3 MessageBox函数 73
第4章 数据库 76
4.1 数据库概述 76
4.1.1 表和列 76
4.1.2 主键 76
4.1.3 外部键 77
4.1.4 索引 77
4.1.5 视图 77
4.1.6 扩展属性 77
4.2 Database画板 77
4.2.1 数据库画板概述 78
4.2.2 画板组成 79
4.2.3 画板中的操作 79
4.2.4 定制画板 83
4.3 本地数据库操作 84
4.3.1 创建本地库 84
4.3.2 删除本地库 85
4.4 数据表操作 86
4.4.1 创建数据表 86
4.4.2 定义字段 87
4.4.3 指定表和字段的扩展属性 88
4.4.4 替换表 89
4.4.5 拷贝、剪切、粘贴字段 90
4.4.6 删除表 90
4.4.7 表的其他操作 91
4.4.8 关于系统表 92
4.5 键操作 92
4.5.1 查看键 93
4.5.2 打开相关表 93
4.5.3 定义主键 93
4.5.4 定义外部键 94
4.5.5 修改、删除键 95
4.6 索引操作 96
4.6.1 创建索引 96
4.6.2 修改索引 97
4.6.3 删除索引 97
4.7 视图操作 97
4.7.1 使用视图 97
4.7.2 打开已存在视图 98
4.7.3 创建视图 98
4.7.4 连接表 98
4.7.5 显示视图的SQL语句 100
4.7.6 删除视图 100
4.7.7 输出视图的语句 100
第5章 编写脚本 101
5.1 PowerScript画板 101
5.1.1 熟悉环境 101
5.1.2 配置Script视窗 102
5.2 编写脚本 102
5.2.1 粘贴语句 102
5.2.2 添加注释 103
5.2.3 查找替换 104
5.2.4 编译脚本 105
5.3 PowerScript语言基础 106
5.3.1 注释 106
5.3.2 标识符 106
5.3.3 特殊ASCII字符 107
5.3.4 标号 108
5.3.5 Null值 108
5.3.6 保留字 109
5.3.7 指代词 110
5.3.8 续行和断句 112
5.3.9 空白 113
5.4 数据类型和变量声明 113
5.4.1 变量的作用域 113
5.4.2 变量声明 114
5.4.3 变量的存取权限 116
5.4.4 数据类型 116
5.5 运算符和表达式 120
5.5.1 算术运算符 121
5.5.2 关系运算符 122
5.5.3 逻辑运算符 123
5.5.4 连接运算符 123
5.5.5 运算符的优先级 124
5.5.6 表达式和赋值 124
5.6 基本语句 125
5.6.1 分支语句 125
5.6.2 循环 127
5.6.3 Call语句 130
5.6.4 Continue语句 131
5.6.5 Exit语句 132
5.6.6 Goto语句 132
5.6.7 Halt语句 133
5.6.8 Return语句 133
5.7 定制事件 133
5.8 函数和结构 134
5.8.1 编写函数 135
5.8.2 定义结构 136
5.9 数组 136
5.9.1 定义数组 137
5.9.2 给数组赋值 138
5.9.3 使用数组 139
5.10 在脚本中嵌入SQL语句 140
5.10.1 事务 141
5.10.2 在Power Builder中使用SQL语句的格式 141
5.10.3 连接和断开数据库 142
5.10.4 选取单行数据 143
5.10.5 判断事务对象的返回信息 143
5.10.6 插入、删除和修改数据 145
第6章 数据窗口对象 147
6.1 数据窗口画板 147
6.1.1 设置DataWindow画板 147
6.1.2 Design视窗 148
6.1.3 Preview视窗 150
6.1.4 Control List视窗 151
6.1.5 Data视窗 152
6.1.6 Properties视窗 152
6.1.7 Column Specification视窗 152
6.2 创建数据窗口 153
6.3 数据窗口的数据源 155
6.3.1 Quick Select数据源 155
6.3.2 SQL Select数据源 156
6.3.3 Query数据源 160
6.3.4 External数据源 160
6.3.5 Stored Procedure(存储过程) 161
6.4 显示样式 162
6.4.1 Grid显示样式 162
6.4.2 Tabular显示样式 163
6.4.3 Group显示样式 163
6.4.4 Freedom显示样式 165
6.4.5 Label显示样式 166
6.4.6 N-up显示样式 166
6.4.7 CrossTab显示样式 167
6.4.8 Graph显示样式 168
6.4.9 Composite显示样式 169
6.4.10 RichText显示样式 169
6.4.11 OLE 2.0显示样式 170
6.5 数据窗口对象 171
6.5.1 报表级格式 172
6.5.2 数据窗口的层次 172
6.6 数据窗口的修改属性 173
6.7 字段操作 177
6.7.1 选择编辑类型 178
6.7.2 设置字段编辑格式 178
6.7.3 重要属性设定 182
6.7.4 增加和删除字段 183
6.7.5 调整字段的显示顺序 184
6.8 计算域和计算字段 184
6.8.1 条件判断 186
6.8.2 累积 187
6.8.3 百分比 187
6.8.4 引用不同行的数据 187
6.8.5 数据行的修改状态 188
6.9 排序、过滤和分组 189
6.9.1 排序 189
6.9.2 过滤 190
6.9.3 分组 191
6.10 数据操作 193
第7章 使用控件 195
7.1 命令按钮和图形按钮 195
7.1.1 概述 195
7.1.2 常用属性 195
7.1.3 事件和脚本 196
7.1.4 典型实例 196
7.2 列表框和图形列表框 198
7.2.1 使用概述 199
7.2.2 常用属性 199
7.2.3 事件和脚本 200
7.2.4 常用函数 200
7.2.5 典型实例 204
7.3 条状控件 206
7.3.1 滚动条 206
7.3.2 轨迹条 209
7.3.3 进度条 209
7.4 文本的显示和编辑 210
7.4.1 单行编辑器 211
7.4.2 多行编辑器 213
7.4.3 屏蔽编辑器 214
7.4.4 富文本编辑器 216
7.4.5 静态文本 219
7.4.6 静态链接 219
7.5 下拉列表框和图形下拉列表框 220
7.5.1 属性 220
7.5.2 事件 221
7.5.3 函数 221
第8章 数据窗口控件 223
8.1 例述数据窗口编程 223
8.2 数据窗口控件属性 228
8.3 数据窗口事件 230
8.4 数据窗口事件综述 234
8.4.1 脚本执行效率 234
8.4.2 dwo参数的使用 235
8.5 数据缓冲区 236
8.5.1 缓冲区 236
8.5.2 应用实例 237
8.6 编辑控件 239
8.7 读取和设置数据 240
8.8 查询和排序 243
8.9 数据打印 247
8.9.1 启动打印作业 248
8.9.2 关闭打印作业 248
8.9.3 PrintDatawindow函数 248
8.9.4 Print函数 249
第9章 菜单和MDI 251
9.1 设计菜单 251
9.1.1 设计菜单项 253
9.1.2 修改菜单项的属性 253
9.2 关于菜单的编程 254
9.2.1 为“退出”菜单项编写脚本 254
9.2.2 选中某个菜单项 254
9.2.3 隐含某个菜单项 255
9.2.4 使某个菜单项失效 255
9.2.5 调整工具条的位置 255
9.2.6 修改工具条上鼠标右键弹出菜单中的内容 257
9.2.7 动态设置MicroHelp 257
9.2.8 使用右键弹出菜单 257
9.2.9 改变窗口中的菜单 258
9.2.10 设计一个通用工具条配置窗口 258
9.3 什么是MDI应用 260
9.3.1 菜单条和工具条 260
9.3.2 客户区 261
9.4 菜单和MDI 262
9.4.1 打开Sheet 262
9.4.2 获取当前Sheet 263
9.4.3 安排Sheet的布局 264
9.4.4 维护菜单 264
9.4.5 获取工具条的信息 265
9.4.6 保存和恢复工具条的设置 266
9.4.7 遍历菜单项 270
9.5 一个MDI应用实例 270
9.5.1 打开和关闭MDI时 271
9.5.2 打开文件时 276
9.5.3 w_edit 的打开和关闭 279
9.5.4 窗口w_edit中的其他脚本 281
9.5.5 其他菜单项的编程 283
第10章 高级SQL语句 294
10.1 SQL语句 294
10.1.1 where子句 294
10.1.2 order by子句 297
10.1.3 表达式 297
10.1.4 分组 300
10.2 动态SQL语句 300
10.2.1 类型一 301
10.2.2 类型二 301
10.2.3 类型三 302
10.2.4 类型四 303
10.3 高级查询 305
10.3.1 表的连接 305
10.3.2 子查询 307
10.4 游标 308
10.5 事务处理 310
第11章 窗口使用技巧 314
11.1 窗口间的协作 314
11.1.1 在打开和关闭窗口时进行数据传递 314
11.1.2 不同窗口之间的变量或函数调用 317
11.1.3 信号灯概念的使用 318
11.2 创建窗口实例 320
11.3 使用窗口属性编程 322
11.4 增强窗口显示效果 323
11.4.1 窗口最小化时设置动态图标 323
11.4.2 放置闪烁文字 324
11.4.3 提高窗口的打开速度 324
11.4.4 移动不带标题栏的窗口 325
11.4.5 闪烁窗口标题栏 325
11.4.6 给窗口添加自动滚动条功能 325
11.5 自动调整窗口 327
第12章 数据窗口使用技巧 330
12.1 标识当前行 330
12.1.1 使用SelectRow函数 330
12.1.2 使用函数SetRowFocusIndicaTor 331
12.1.3 使用CurrentRow和GetRow两个函数 332
12.1.4 改变背景或者前景 333
12.2 显示指定条件的数据 334
12.2.1 通过修改前景、背景颜色 334
12.2.2 通过修改设置位图 335
12.2.3 通过修改边框类型 335
12.2.4 通过选中标记来标识符合条件的行 336
12.3 动态数据窗口 336
12.3.1 动态创建数据窗口 336
12.3.2 动态关联数据窗口对象 340
12.3.3 获得数据窗口的SQL语句 342
12.3.4 修改数据窗口的SQL语句 343
12.4 用回车键代替Tab键 345
12.5 拷贝数据 346
12.5.1 使用GetItem()和SetItem()函数 346
12.5.2 使用剪贴板 346
12.5.3 使用结构类型的数组进行赋值 346
12.5.4 直接赋值 347
12.5.5 使用行拷贝的方法 347
12.6 灵活运用External类型数据窗口 348
12.7 数据保护 349
12.7.1 无条件修改部分字段 349
12.7.2 已有数据不允许修改,只能修改新数据 350
12.7.3 有条件修改 351
12.8 数据操作的安全性 351
12.8.1 通过弹出窗口让用户确认 351
12.8.2 设立删除数据恢复功能 351
12.8.3 恢复到打开窗口时的最初状态 353
12.8.4 窗口关闭时让用户确认对没有保存的数据如何处理 353
12.9 数据窗口用做下拉列表框 355
12.10 数据窗口用做列表框 356
12.10.1 如何选中和取消一行 357
12.10.2 如何选中多行 357
12.10.3 如何处理选中的数据 358
12.11 一个数据窗口修改多个表 359
第13章 通用查询 361
13.1 PowerBuilder仓库的构成 361
13.2 通用查询系统的分析 362
13.2.1 读取数据库中某用户的所有表 363
13.2.2 显示选中表中的所有字段 363
13.2.3 查询条件的指定 364
13.2.4 显示数据 365
13.2.5 保存用户组合的查询条件 365
13.3 界面设计 366
13.4 查询条件窗口的编程 368
13.4.1 定义实例变量 368
13.4.2 窗口的Open事件 368
13.4.3 查询条件的组合 369
13.4.4 其他功能 377
13.5 数据显示窗口的编程 378
第14章 数据窗口对象 386
14.1 数据窗口对象概述 386
14.2 获取数据窗口信息 387
14.2.1 函数Describe 387
14.2.2 对列的引用 387
14.2.3 函数Evaluate 388
14.2.4 函数LookUpDisplay 388
14.3 修改数据窗口信息 389
14.3.1 创建对象 389
14.3.2 删除对象 390
14.3.3 特性修改 390
14.4 字段和计算域的重要属性 391
14.4.1 获取字段的类型(Coltype属性) 391
14.4.2 背景属性(Background.property) 391
14.4.3 指定检索规则(Criteria.property属性) 392
14.4.4 Edit风格的字段属性(Edit.property属性) 392
14.4.5 字段的显示格式(Format属性) 393
14.4.6 设置数据窗口修改时的主键(Key属性) 394
14.4.7 字段名称(Name属性) 394
14.4.8 字段中的数据保护(Protect属性) 394
14.4.9 字段的滑动属性(SlideLeft和SlideUp) 395
14.4.10 字段的TabOrder值(TabSequence属性) 395
14.4.11 用户是否可以保存字段内容(Update属性) 395
14.4.12 字段校验(Validation和ValidationMsg属性) 396
14.4.13 计算域的属性 396
14.5 Button的重要属性 397
14.5.1 Action属性 397
14.5.2 SuppressEventProcessing属性 398
14.5.3 Text属性 398
第15章 子数据窗口 399
15.1 子数据窗口的一般用法 399
15.1.1 子数据窗口和父数据窗口的关系 399
15.1.2 获取子数据窗口的引用 400
15.1.3 保证子数据窗口中的数据更新 400
15.2 检索子数据窗口 401
15.2.1 子数据窗口和父数据窗口共享事务对象 402
15.2.2 检索子数据窗口的数据 402
15.2.3 使用带参数检索 403
15.3 共享子数据窗口 403
15.4 子数据窗口的灵活运用 404
第16章 大文本对象的处理 406
16.1 Blob对象处理方法 406
16.2 使用OLE处理Blob对象 407
16.3 一个图像处理的实例 408
第17章 数据管道 412
17.1 数据管道 412
17.1.1 数据管道对象 412
17.1.2 数据管道画板 413
17.2 管道用户对象 417
17.2.1 管道属性 417
17.2.2 管道事件 419
17.2.3 管道方法 419
17.3 运行数据管道 421
17.4 在程序中执行管道 422
第18章 高级控件 427
18.1 图形列表框和下拉图形列表框 427
18.1.1 快速入门 427
18.1.2 典型编程 428
18.1.3 相关属性 429
18.2 Tab控件 429
18.2.1 快速入门 430
18.2.2 典型编程 430
18.2.3 标签属性 431
18.2.4 标签控件的事件 433
18.3 ListView控件 433
18.3.1 控件显示方式 433
18.3.2 快速入门 434
18.3.3 典型编程 435
18.3.4 属性 437
18.3.5 函数 438
18.3.6 事件 441
18.4 LreeView控件 442
18.4.1 快速入门 443
18.4.2 典型编程 443
18.4.3 属性 445
18.4.4 函数 446
18.4.5 事件 448
18.5 图形控件的使用 449
18.5.1 基础知识 449
18.5.2 图形外观 450
18.5.3 快速入门 452
18.5.4 属性 453
18.5.5 开发环境 454
18.5.6 Graph控件函数 458
18.5.7 数据窗口中的Graph控件 463
18.5.8 应用实例 463
第19章 PFC编程 468
19.1 PFC概述 468
19.1.1 理解PFC 468
19.1.2 PFC的构成 469
19.1.3 PFC的体系结构 470
19.2 PFC编程基础 471
19.2.1 设置Application管理 471
19.2.2 创建应用 474
19.2.3 使用属性对象 475
19.2.4 使用PFC常量 475
19.2.5 消息路由 476
19.2.6 PFC的事务管理 476
19.2.7 调用父函数和事件 477
19.2.8 为应用添加在线帮助 478
19.2.9 安装PFC的最新版本 478
19.3 Application服务 478
19.3.1 建立Application Manager 479
19.3.2 Application Manager服务 480
19.3.3 标准类用户对象 482
19.4 菜单 482
19.5 窗口和窗口服务 483
19.5.1 基窗口服务 484
19.5.2 pfc_w_master 484
19.5.3 其他窗口服务 486
19.6 数据窗口服务 488
19.6.1 Sort服务 488
19.6.2 查找和替换服务 489
19.6.3 DropDown Search服务 489
19.6.4 Required Column服务 490
19.6.5 Linkage服务 490
19.6.6 MultiTable Update服务 492
19.6.7 Row Management 服务 492
19.7 可视化控件 493
19.7.1 标准可视用户对象的基本函数 494
19.7.2 数据窗口控件u_dw 496
第20章 开发Web应用 499
20.1 PowerBuilder 9.0对Web应用支持的增加 499
20.1.1 Web Target 499
20.1.2 4GL Web页面 499
20.1.3 Web数据窗口编程 500
20.1.4 Web数据窗口容器部件 500
20.1.5 按钮图片 500
20.1.6 生成HTML 501
20.1.7 EAServer的整合 501
20.2 使用Web Target 503
20.2.1 关于Web Target 503
20.2.2 关于Web Target的开发环境 504
20.2.3 在集成的Web分发环境中工作 507
20.2.4 将PowerSite的工程迁移到Web Target 509
20.3 开发Web应用 510
20.3.1 设置Web Target 510
20.3.2 操作Web Target中的单个文件 513
20.3.3 添加内容 514
20.3.4 使用系统树 515
20.3.5 创建Web页面 517
20.4 操作HTML页面 518
20.4.1 HTML编辑器 518
20.4.2 打开和设置HTML编辑器 520
20.4.3 页面和HTML源码的基本操作 523
20.4.4 重要页面要素 527
20.4.5 页面布局 531
20.5 使用样式表和框架结构 532
20.5.1 关于样式表 532
20.5.2 样式表编辑器 533
20.5.3 样式表的基本编辑 535
20.5.4 编辑框架和框架设置 539
20.6 使用图片和其他媒体部件 541
20.6.1 插入图片 541
20.6.2 创建电子地图 542
20.6.3 多媒体 543
20.6.4 可用部件 543
20.6.5 插入部件 543
20.6.6 设计时部件 543
20.6.7 Java类路径 544
20.7 编写脚本 545
20.7.1 关于脚本 545
20.7.2 编辑脚本 548
20.7.3 编程技术和技巧 551
20.8 使用应用服务器和事务服务器 553
20.8.1 和应用服务器的结合 553
20.8.2 使用服务器端脚本 554
20.8.3 关于Web Target对象模型 556
20.8.4 访问数据库连接 558
20.8.5 管理页面数据 559
20.8.6 和EAServer的结合 566
20.9 开发4GL页面 569
20.9.1 关于4GL Web页面 569
20.9.2 开发页面 570
20.9.3 使用参数和变量 573
20.9.4 访问EAServer服务器部件 575
20.9.5 添加控件 578
20.9.6 设置页面导航 581
20.9.7 编写服务器端脚本 586
20.9.8 页面如何请求处理工作 590
20.9.9 关闭4GL页面模式 591
20.10 关于Web数据窗口设计时控件 591
20.10.1 使用Web数据窗口DTC 591
20.10.2 将页面和数据窗口集成 593
20.10.3 数据窗口显示样式和属性设置 598
20.10.4 数据和数据窗口检索参数绑定 599
20.10.5 定义数据窗口中的链接 602
20.11 编译和部署Web Target 604
20.11.1 概述 604
20.11.2 编译Web target 604
20.11.3 部署 606
20.11.4 设置部署配置 607
20.11.5 修改Web Site的部署配置 608
20.11.6 部署到远程PowerDynamo服务器上的配置 610
20.11.7 编辑JSP部署配置 610
20.11.8 部署Web target 616
20.11.9 运行Web target 616
第21章 数据窗口对XML的支持 617
21.1 关于XML 617
21.1.1 XML快速入门 617
21.1.2 XML的概念 622
21.1.3 XML的术语 626
21.1.4 XML语法 630
21.1.5 XML实例解析 635
21.1.6 XML相关资源 637
21.2 数据窗口对XML的支持 638
21.3 输出XML 639
21.3.1 输出模板 639
21.4 Export Template视窗 640
21.4.1 创建模板 641
21.4.2 保存模板 642
21.4.3 Header和Detail节 643
21.4.4 编辑输出模板 646
21.4.5 输入模板 651
21.5 保存为XSL-FO 656
21.6 PowerScript对XML支持的增强 657
21.6.1 新增SaveAsType取值 657
21.6.2 Import方法对XML的支持 658
21.6.3 Data.XML 659
21.6.4 Data.XMLDTD 660
21.6.5 Data.XMLSchema 660
21.6.6 Data.XSLFO 660
21.6.7 Export.XML.HeadGroups 661
21.6.8 Export.XML.MetaDataType 661
26.6.9 Export.XML.SaveMetaData 662
21.6.10 Export.XML.TemplateCount 662
21.6.11 Export.XML.Template[ ].Name 663
21.6.12 Export.XML.UseTemplate 663
21.6.13 Import.XML.UseTemplate 663
第22章 JSP目标 665
22.1 关于JSP 665
22.1.1 JSP是怎样工作的 666
22.1.2 JSP构成 666
22.1.3 JSP中的应用逻辑 666
22.2 JSP Web目标向导 667
22.2.1 添加标记库 667
22.2.2 指定服务器类型 667
22.3 JSP页面设计 668
22.3.1 JSP指令 669
22.3.2 JSP宏指令 671
22.3.3 程序元素 673
22.3.4 定制标记 675
22.3.5 为Web Service定制标记 675
22.3.6 注释 676
22.3.7 错误处理 677
22.4 JSP Web目标对象模型 678
22.5 JSP部署配置 680
22.5.1 常规部署配置 680
22.5.2 JSP部署选项 682
22.6 定制Web数据窗口标记库 687
22.6.1 DataWindow 687
22.6.2 DWColumnLink 688
22.6.3 使用DataWindow标记的例子 688
第23章 创建EJB客户端 692
23.1 概述 692
23.1.1 关于pbejbclient90.dll 692
23.1.2 关于EJB代理对象 692
23.1.3 处理过程概述 692
23.1.4 Path和ClassPath的设置 693
23.2 设置搜索路径 693
23.3 生成EJB代理对象 694
23.3.1 使用EJB Proxy project 694
23.3.2 使用EJB2PB90工具 695
23.3.3 浏览生成的代理 696
23.3.4 实例 696
23.3.5 数据类型映射 697
23.4 创建Java虚拟机 697
23.5 连接服务器 698
23.5.1 ClassPath的设置 699
23.6 调用组件方法 700
23.6.1 使用lookup方法 700
23.6.2 创建或者查找EJB实例 701
23.6.3 调用EJB方法 701
23.6.4 断开和服务器的连接 702
23.7 异常处理 702
23.7.1 捕获异常 702
23.7.2 不处理的异常 703
23.8 事务管理 703
23.8.1 开始和结束事务 703
23.8.2 获取事务的信息 704
23.8.3 设置事务的超时 704
23.9 调试客户端 704
23.10 类和对象详解 704
23.10.1 EJBConnection 705
23.10.2 EJBHandle 708
23.10.3 EJBHome 708
23.10.4 EJBHomeHandle 708
23.10.5 EJBMetaData 708
23.10.6 EJBObject 709
23.10.7 EJBTransaction 710
23.10.8 JavaVM 713
第24章 创建Web Service客户端 715
24.1 关于Web Service 715
24.1.1 XML和XSD 715
24.2 把PBSoapClient90.pbd放在搜索路径中 717
24.3 生成Web Service的代理对象 717
24.3.1 创建代理对象 717
24.3.2 XML方法别名 719
24.3.3 数据类型映射 719
24.3.4 关于数组 719
24.4 连接SOAP服务器 719
24.5 调用Web Service方法 720
24.6 生成Web Service 720
24.7 异常处理 721
24.7.1 捕获错误 721
24.7.2 不可处理的错误 721
24.8 相关类 721
24.8.1 SoapConnection类 721
24.8.2 SoapException类 722
第25章 PB的文档对象模型 724
25.1 关于PBDOM 724
25.1.1 PBDOM_OBJECT 726
25.1.2 PBDOM_DOCUMENT 727
25.1.3 PBDOM_DOCTYPE 727
25.1.4 PBDOM_ELEMENT 727
25.1.5 PBDOM_ATTRIBUTE 727
25.1.6 PBDOM_NAMESPACE 728
25.1.7 PBDOM_CHARACTERDATA 728
25.1.8 PBDOM_TEXT 728
25.1.9 PBDOM_CDATA 728
25.1.10 PBDOM_COMMENT 728
25.1.11 PBDOM_PROCESSINGINSTRUCTION 728
25.1.12 PBDOM_BUILDER 728
25.2 使用PBDOM 729
25.2.1 装载XML文件 729
25.2.2 加载纯XML 729
25.2.3 创建XML文件 729
25.2.4 创建 730
25.2.5 访问节点数据 731
25.2.6 使用数组改变节点内容 732
25.2.7 操作节点数层次 732
第26章 PBNI概述 733
26.1 关于PBNI和PB扩展 733
26.1.1 PBNI元素 733
26.1.2 PBNI SDK 734
26.1.3 PBNI和JNI比较 735
26.2 建立PB扩展 735
26.2.1 创建PB扩展 735
26.2.2 使用PB扩展 740
26.2.3 PB扩展实例 741
26.2.4 使用Visual C++向导 745
26.3 使用PBNI 746
26.3.1 PBNI和PowerBuilder进行数据交换 746
26.3.2 调用PowerBuilder函数 748
26.3.3 异常处理 752
26.3.4 创建Marshaler扩展 752
26.4 PBNI工具介绍 758
26.4.1 pbsig90 758
26.4.2 pbx2pbd90 759
第27章 OrcaScript语言 761
27.1 关于OrcaScript 761
27.2 OrcaScript命令 762
27.3 OrcaScript命令参数 764
第28章 PB编码规范 766
28.1 综述 766
28.1.1 编程对象的分类 766
28.1.2 编程对象的组织 766
28.2 团队开发 767
28.3 版本说明 767
28.4 对象命名规范 768
28.4.1 命名约定 768
28.4.2 具体命名规则 768
28.5 变量命名规范 771
28.5.1 变量类型约定 772
28.5.2 变量范围命名约定 772
28.6 编程规范 773
28.6.1 书写格式 773
28.6.2 流控制 773
28.6.3 注释及格式要求 774
28.6.4 PowerBuilder脚本编程规范 776
28.7 控件编程规范 779
28.7.1 公共部分 779
28.7.2 控件细则 780
28.8 用户反馈 783
28.8.1 使用反馈的场合 783
28.8.2 提供反馈的几种技术手段 783
28.9 提高程序的健壮性 784
28.9.1 安全的应用软件 784
28.9.2 什么是安全的应用 784
28.9.3 使用数据窗口中应注意的问题 785
28.10 文档标准 786
28.10.1 注释 786
28.10.2 联机帮助 787
28.11 错误处理标准 787
28.12 其他 788
4GL plus开发平台充分支持Web Services等特性,标志着PowerBuilder 9.0是PowerBuilder发展历程上的又一次飞跃。
PowerBuilder 9.0的开发环境比起以往版本有了大的改进,提供了全新的集成开发环境 ——4GL plus,是业界第一个集设计、建模、开发、部署和管理等各项功能为一体的下一代RAD工具。在该环境中,开发者可利用Wizards和其他的RAD工具,快速开发、部署一套JSP网络应用系统;还包含一个优秀的代码基础、许多新的增强特性及与Web和N层应用开发的进一步整合。同时,它还提供了与Sybase 应用服务器Enterprise Application Server (EAServer)更为紧密的集成,能够在EAServer中调用Enterprise JavaBeans(EJB),并能够将现有的组件连接到EAServer。PowerBuilder 9.0的出现将会帮助开发者在更为开放、高度集成的开发环境中利用PowerBuilder 9.0的强大功能轻松工作。
通过与Sybase EAServer的紧密结合,PowerBuilder能支持J2EE的开发与配置。在最新版本中,PowerBuilder创建的应用程序既能够访问任何一台J2EETM兼容应用服务器(包括IBM WebSphere® Application Server,BEA WebLogicTM Server及其他J2EE应用程序服务器)的Enterprise JavaBeans,也可以同时使用PowerBuilder Web服务。您也能够使用PowerBuilder创建RAD类型的JavaServer PagesTM(JSP)应用程序。
PowerBuilder和PowerDesigner以前是比较松散的集成,只是通过PowerDesigner生成PowerBuilder框架。在PowerBuilder 9.0中,实现了模型(PowerDesigner)与代码(PowerBuilder)的对应转换。它重新设计了现有的应用程序逻辑,在PowerDesigner内将之改变以支持新的业务需求,并将这些变化反映到PowerBuilder应用程序中。这就降低了维护和扩展客户机/服务器应用程序所需的时间与成本。PowerDesigner提供的全新功能可以从PowerBuilder 9.0中提取所有的对象与代码,而不再仅仅是NVO。这大大简化了现有应用程序的维护,哪怕最初的开发人员已经离开公司,也无须顾虑。更有意义的是,PowerDesigner允许您将旧的PB应用程序扩展到新的架构中去,哪怕那些程序不是按照面向对象的原则编写的。PowerBuilder与PowerDesigner配合得越顺畅,4GL plus发展就会越长远。
对于开发人员来说,4GL plus开发平台的意义更为重大。对企业和商业应用程序开发人员的底线要求是无法降低的,您需要一个高效的集成开发环境,它能够提供最高的效率、可靠性、功能性和灵活性。除此以外,它还能够支持各种客户端选择、变化的业务流程和迅速发展中的技术平台。尽管目前基于3GL的开发工具使用起来非常复杂,要求开发者具有极强的专业知识和技术能力,但开发人员对于3GL开发工具仍有很强的依赖性。但是,由于目前应用环境的复杂性,基于3GL的开发也导致了许多应用系统生产力低下。这时,就产生了对4GL工具的强烈需求,也对4GL工具提出了新的要求: 简单应用。举个例子,当我们推广企业门户的时候,客户说,他们只有5个技术人员,并希望通过一个简单的应用界面就能做出来。如果做一个企业门户,要求每个程序都用JSP写,那他们就不做了,没有这个资源。所以说,“简单应用”是根本,否则就没有生存空间。
另外一个飞跃性的发展就是对Web Services的全面支持,标志着PowerBuilder首次对Microsoft .NET的支持,也是与强大的J2EE在更高级别上的集成。作为与.NET整合的第一阶段,PowerBuilder 9.0可以生成并使用Web服务,这使得.NET程序员能够充分利用DataWindow与DataStore模式的优势。在未来,与.NET的整合计划包括编译成MSIL代码的能力,并使程序员能够利用.NET的自带控件,如预览、选项卡等建立.NET应用程序。
“今天,开放性所包含的含义更加广泛。例如,与各种(以各种不同语言编写的)应用和信息处理系统的通信能力,在任何情况下接入数据的能力,以及为用户提供操纵各种应用的能力”,Sybase 企业解决方案部门高级副总裁和总经理Raj Nathan博士说,“开放性还意味着能够很好地支持企业中的各种开发环境——包括J2EE和.NET平台。”
Sybase计划采用一个四阶段的方案,来实现PowerBuilder组件及应用与那些Microsoft .NET构架中的应用的互操作。PowerBuilder.NET战略的第一阶段将采用支持Web服务的形式,包括对PowerBuilder 9.0的XML业务增强。
第二阶段将包括DataWindow.NET和DataStore.NET特性。利用PowerBuilder在数据存取、DataWindow.NET和DataStore.NET等方面的独家专利可以支持从非PowerBuilder应用的接入,并可以被任何.NET语言所采用。
有经验的PowerBuilder 开发人员如果使用.NET,无须学习新的、冗长的、复杂的方法来实现与DataWindow和DataStore的集成。
在第三阶段,封装业务逻辑的不可视对象(NVO)将被迁移到.NET结构中,使PowerBuilder开发人员能够合理利用目前的代码,并将其移至.NET环境中。开发人员在相似的PowerBuilder集成开发环境(IDE)中仍能获得高生产率。他们还能够继续在PowerBuilder中创建应用,开发组件,并能够将这些应用和组件部署到企业的平台和环境中。
PowerBuilder的.NET支持的最后阶段包括了将.NET构架中的组件带入到PowerBuilder IDE中。这个阶段将改变PowerBuilder本身的外观,以便使它看起来像在.NET中创建的用户界面一样。它还能让开发人员调用.NET的系统组件,使他们能够在PowerBuilder中创建基于.NET的对象。
借助PowerBuilder,应用开发人员能够选择他们所需的开发平台和环境,包括Windows DNA、.NET构架、Web和J2EE平台。它将继续简化软件开发结构、协议和标准的复杂性,使开发人员能够集中精力于编写软件应用,来解决复杂的业务需要。对于新出现的标准和开发趋势,PowerBuilder开发人员能够根据公司选择的方向立即做出反应,为现有产品增添价值。
笔者认为,以上两点是PowerBuilder 9.0飞跃性发展中最为突出的两点。除此之外,PowerBuilder 9.0的新增功能还是很丰富的,在本书中都做了详细的介绍。以下是PowerBuilder 9.0的新增功能:
RAD JavaSever Page(JSP) Targets——开发者可利用Wizards和其他的RAD工具,快速开发、部署一套JSP网络应用系统。
Web Services——开发者无须具备深厚的SOAP协议或WSDL的背景,即可在Microsoft .NET或其他架构环境下,创建、发布、完成网络服务系统。
XML DataWindow——可直接从一个XML文档中输入数据,或把从任何数据来源中恢复的数据存储为完全的用户化XML文档,也可存储为PDF或XSL的格式化对象。
PoweBuilder Native Interface——通过捆绑了一个C++标准的补充部分,极大地扩展了PowerBuilder应用开发的功能,在系统中调用其方法,并且通过JNI和Java应用程序,也可与PBVM相互交流。
Third-Party Application Servers——除了对现有的Sybase EAServer的支持,PowerBuilder还可实现对BEA Weblogic Server TM,IBM WebSphere和其他的J2EE应用开发服务器的支持。
The PowerBuilder Document Object Model——Sybase产品执行可存储或操作XML文件的文档对象模块(DOM)。这项功能(PBDOM)用于从PowerScript源码中读取、编写并操作标准格式的XML。
PDF Report Generaton——提供两种保存DataWindow对象的方法,以使其能够直接生成PDF格式的报告。此类提取方法以默认的方式加以应用,并可保存所有类型的DataWindow对象。
Source Control Enhancements——帮助开发者更有效地管理大型的PowerBuilder项目,并实现与Rational ClearCase及Merant PVCS的更紧密结合。
OrcaScript Utility——可以用类似英文的自然语言调用Orca应用程序。新的源码控制集成能根据源控件直接生成目标对象。
对这样一种优秀、庞大的开发体系进行全面介绍是非常复杂的工程。照本宣科、全面罗列并不困难,难就难在如何将该开发工具的方方面面融合成一个整体,从开发项目的角度介绍,并且将该写作思路贯彻始终。对于读者的学习也是如此。
鹦鹉学习语言的本领在动物界是最好的,但和人有天壤之别,因为它不能用学来的语言自由地表达思想。再好的工具,如果不能灵活运用和融会贯通,即使学习得再好也只能如鹦鹉学舌。本人学生时期也有过定理、命题都能熟记但却不能解答习题的困惑,学习一种开发工具也是同样的道理。所以,本书不仅仅追求将PowerBuilder全面地介绍给读者,更多的是想通过学习方法的介绍、实例的讲解及项目开发过程中遇到的典型问题的解决来向读者展示如何灵活运用这些知识。同时为读者留有完善这些解决方法的余地,以便读者掌握后还有一定的拓展空间。另外,本人也不主张将PowerBuilder各种对象和函数分开讲解,分别讲述虽然清楚,但对于灵活掌握没有益处,因为它们毕竟是一个有机的整体。
本书划分为基础知识、实用技巧和高级话题3部分;在书中没有明显标出,以避免人为地给读者制造心理障碍。第1章介绍的是全局性的基础知识,以便读者有个全局的感性认识。第2章介绍应用对象。因为应用对象是PowerBuilder应用程序执行的入口点,所以首先介绍该对象。第3章介绍最常用的窗口,介绍过程中穿插了Windows界面应用程序设计的思想,以便开发人员对PB应用程序界面设计有章可循。第4章介绍数据库的相关知识和操作。这4章的内容是非常基础性的,是初学者感兴趣的几个方面,所以都放在前面介绍。但考虑到学习的阶梯性,这4章的讲解并没有穿插太多的实用性、技巧性的内容。先界面,后编程,这也是初学者的一般学习规律。
第5章开始介绍编程的相关知识。介绍基础知识的同时贯穿了编程风格的培养,这是团队开发人员之间进行编程交流的基本素质之所在,并且从本章开始贯穿实用性的知识。第6章到第9章分别介绍数据窗口对象、常用控件、数据窗口控件、菜单和MDI应用,并介绍了一个非常容易让学习者感兴趣的实例。相信通过对这些内容的学习,读者可以由一名初学者转变为开发者。所以,从第10章到第18章介绍各种对象的同时,还贯穿了和它们相关的一些实用技巧和开发疑难的解决方法。相信通过对这些内容的学习,读者应该会成为一名熟练的开发者,完全可以从事商品软件的开发了。
但是,项目开发需要的不仅仅是对开发工具的熟练应用,更重要的是应具备一些高层的开发思想和编程风格。这些将决定一名程序员是否具有良好的逻辑抽象能力,以便能够编写出重用性比较好的程序。编程风格决定了团队成员之间是否能容易地交流,所以作者又用了两章的篇幅介绍了PFC编程和PB的编码规范。在介绍PFC时,作者的着眼点并不仅仅是将PFC的用法告诉读者,而是强调PFC的设计思想,以便开发者可以从中体会到一种可以重用的程序设计思路。
第20到27章介绍PowerBuilder 9.0的新增内容和扩展功能。
本书编写过程中,得到了清华大学计算机系朱义、冀东油田信息中心王者云、北京中关村科技软件公司吴武林等的支持,在此一并表示感谢。
因水平有限,书中难免存在疏漏,欢迎提出宝贵的意见和建议,以便我们互相学习。
郭宝利:gb188@sohu.com