PowerBuilder 9.0 是由 Sybase 公司(后被 SAP 收购)发布的一款经典的、功能强大的快速应用程序开发工具,它以其强大的数据窗口(DataWindow)技术而闻名,在金融、电信、企业级应用开发领域曾占据重要地位。

(图片来源网络,侵删)
虽然现在 PowerBuilder 已非主流开发工具,但在许多遗留系统的维护和升级中,它仍然扮演着关键角色,学习 PowerBuilder 9.0 对于维护现有系统或理解 RAD(快速应用开发)思想非常有价值。
第一部分:基础入门
PowerBuilder 简介
- 核心思想:RAD(Rapid Application Development),通过可视化、事件驱化的方式快速构建企业级桌面/客户端-服务器应用。
- 核心组件:
- 数据窗口:PowerBuilder 的灵魂,一个强大的数据对象,能同时处理数据的检索、展示、编辑、验证、更新等多种操作,将数据库操作与UI展示完美结合。
- PowerScript:PowerBuilder 的编程语言,语法类似于 Pascal,结构清晰,易于上手。
- 可视化画布:用于拖放控件(如按钮、文本框、数据窗口控件)来设计用户界面。
- PBL (PowerBuilder Library):以
.pbl为扩展名的文件,用于存放所有对象,包括窗口、菜单、用户对象、函数等,一个应用通常由多个 PBL 文件组成。 - Application Object (应用对象):应用的入口点,负责定义应用的属性(如默认字体、图标)和启动时的脚本(通常用于打开主窗口)。
开发环境搭建
- 获取安装包:PowerBuilder 9.0 是较老的软件,您需要从合法渠道获取安装介质。
- 安装:运行安装程序,按照向导完成安装,建议安装在默认路径下。
- 配置数据库接口:
- PowerBuilder 通过 ODBC 或专用数据库接口(如 Oracle, Sybase ASE)连接数据库。
- 安装后,需要配置 ODBC 数据源,在 Windows 的“ODBC 数据源管理器”中创建一个系统 DSN,指向您的目标数据库(如 SQL Server, Oracle)。
- 在 PowerBuilder 中,通过
Database画笔,可以测试和管理这些数据库连接。
创建第一个应用
- 启动 PowerBuilder:打开 PowerBuilder 9.0。
- 创建新工作区:选择
File -> New,在Workspace标签页下创建一个新的 Workspace(工作区),它是一个容器,用于管理你的所有应用。 - 创建新应用:在工作区中,右键选择
New,在Target标签页下创建一个新的 Application,给应用命名(如my_first_app)。 - 创建主窗口:
- 在
System Tree中,找到你的应用,右键New -> Window。 - 在窗口画布上,从
PainterBar中拖入一个StaticText控件和一个CommandButton控件。 - 修改
StaticText的Text属性为 "Hello, PowerBuilder!"。 - 修改
CommandButton的Text属性为 "Close"。
- 在
- 编写脚本:
- 双击 "Close" 按钮,打开脚本编辑器。
- 在
Clicked事件(按钮被点击时触发)中输入一行代码:Close(parent)。parent指的是当前按钮所在的窗口。 - 关闭脚本编辑器。
- 运行应用:
- 右键点击你的应用对象,选择
Run my_first_app。 - 如果一切正常,你的第一个 PB 窗口应该会弹出来,点击按钮可以关闭它。
- 右键点击你的应用对象,选择
第二部分:核心概念与进阶
数据窗口 - 精华所在
数据窗口是 PB 的核心,也是最难掌握的部分。
- 创建数据窗口:
- 在
System Tree中,右键New -> DataWindow。 - 选择数据源(最常用的是
Quick Select或SQL Select)。 - 选择展示风格(如
Grid(网格)、Freeform(自由形式)、Tabular(列表)等)。 - 在画笔中,可以调整列的顺序、大小、字体、颜色等属性。
- 在
- 在窗口中使用数据窗口:
- 在窗口上拖入一个
DataWindow控件。 - 在该控件的
Properties窗口中,找到DataObject属性,选择你刚刚创建的数据窗口对象。
- 在窗口上拖入一个
- 常用 PowerScript 函数:
dw_1.Retrieve(): 从数据库中检索数据。dw_1.AcceptText(): 将用户在数据窗口控件中编辑的文本提交到数据缓冲区。dw_1.Update(): 将数据缓冲区中的修改(增、删、改)保存回数据库。dw_1.GetItemString(row_num, column_name): 获取指定行、列的数据。dw_1.SetItem(row_num, column_name, value): 设置指定行、列的值。
示例:一个简单的数据窗口增删改查
- 创建一个数据窗口对象
d_employee,连接到employee表,选择emp_id, emp_name, emp_salary等字段。 - 创建一个窗口
w_employee_mgt,包含一个DataWindow控件dw_employee,其DataObject为d_employee。 - 在窗口上添加四个按钮:
检索、新增、保存、删除。 - 检索按钮的 Clicked 事件:
dw_employee.Retrieve()
- 新增按钮的 Clicked 事件:
// 在数据窗口末尾插入一行 long ll_new_row ll_new_row = dw_employee.InsertRow(0) dw_employee.ScrollToRow(ll_new_row) dw_employee.SetColumn("emp_name") // 将焦点移动到姓名列 - 保存按钮的 Clicked 事件:
if dw_employee.Update() = 1 then // 更新成功,提交数据库事务 COMMIT; MessageBox("提示", "保存成功!") else // 更新失败,回滚事务 ROLLBACK; MessageBox("错误", "保存失败: " + dw_employee.GetSQLPreview()) end if - 删除按钮的 Clicked 事件:
long ll_current_row ll_current_row = dw_employee.GetRow() if ll_current_row > 0 then dw_employee.DeleteRow(ll_current_row) else MessageBox("提示", "请先选择一行要删除的数据!") end if
PowerScript 语言基础
- 数据类型:
Integer,Long,String,Date,DateTime,Boolean,Any(可以存储任何类型的数据)。 - 变量声明:
string ls_name integer li_age date ld_birthdate
- 控制流:
- If...Then...Else:
if li_age > 18 then ls_status = "Adult" else ls_status = "Minor" end if - For...Next:
for i = 1 to 10 ls_message += "Count: " + string(i) + "~n" next - Do...While / Do...Until:
do while li_counter < 100 // ... do something ... li_counter++ loop
- If...Then...Else:
- SQL 语句:PB 可以直接嵌入 SQL 语句。
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA; // SQLSA 是一个预定义的 SQL 语句对象 SQLSA = "SELECT emp_name FROM employee WHERE emp_salary > :min_salary" PREPARE SQLSA FROM :SQLSA; OPEN DYNAMIC my_cursor USING :ls_min_salary; // ... 使用 FETCH ... INTO 循环读取数据 ... CLOSE my_cursor;
窗口与菜单
- 窗口:应用的界面容器,可以设置其类型(主窗口、响应式窗口、弹出窗口、子窗口)、位置、大小、边框等。
- 菜单:通过
Menu画笔创建,菜单项可以关联到窗口,也可以通过OpenSheet()等函数动态打开。 - 事件:窗口和控件

(图片来源网络,侵删)
