在PB 中更新由多个表生成的数据窗口
### 在PowerBuilder中实现多表数据窗口的更新 #### 一、引言 在PowerBuilder (PB) 的应用开发中,通常情况下一个数据窗口对象仅能更新一个数据表。但在实际项目开发过程中,经常会遇到一个数据窗口需要同时展示并更新多个表中的数据的情况。为了解决这一问题,本文将详细介绍如何在PB环境中实现一个数据窗口对象更新多个表的操作。 #### 二、基础知识介绍 **1. PowerBuilder简介** - PowerBuilder 是一款快速应用开发 (RAD) 工具,由Sybase公司(后被SAP收购)开发,用于构建复杂的业务应用程序。 - 它支持多种数据库,并提供丰富的图形用户界面组件,方便开发者快速搭建应用程序。 **2. 数据窗口的概念** - 数据窗口是PowerBuilder中的一个重要组件,用于展示和操作数据库中的数据。 - 默认情况下,一个数据窗口对象只能绑定到一个表或者视图,并对该表进行增删改查等操作。 **3. 多表更新的需求** - 在实际应用中,往往需要一个数据窗口同时展示来自多个表的数据,并且能够实现这些表数据的同步更新。 - 例如,在教育管理系统中,可能需要在一个界面中同时查看学生的基本信息(如姓名、性别、所在院系等)以及学生的成绩信息,并允许用户直接在这个界面上更新这些信息。 #### 三、实现步骤 **1. 创建数据窗口对象** - **选择数据来源**:首先创建数据窗口对象,选择显示风格(例如Grid风格),并将数据来源设置为需要更新的两个表(本例中为`stud`表和`grade`表)。 - **主键列与非空列的选择**:确保两张表的主键列和非空列都已选择。对于`stud`表,选择`sid`为主键;对于`grade`表,选择`sid`和`cid`作为复合主键。 **2. 设置表的更新属性** - **设置TabOrder**:通过`Format`菜单下的`TabOrder`选项,将需要修改的列的`TabOrder`值设置为非0值,以便在应用程序运行时,这些可更新字段可以获得焦点。 - **启用更新属性**:选择`Rows`菜单下的`Update Properties`,勾选`Allow Updates`复选框,并在`Table to Update`中选择要更新的表。 - **选择可更新列**:在弹出的对话框中选择可更新表的可更新列,并确保选中了`Unique Key Column(s)`或`Primary Key`,这是设置可更新表的前提条件。 **3. 编写更新代码** - **创建Windows窗体**:建立Windows窗体,并添加数据窗口控件,设置其`DataObject`属性。 - **编写“更新”按钮的Clicked事件**: - 首先尝试更新数据窗口。 - 如果更新成功,则通过一系列`modify`方法设置`grade`表的相关属性,并提交事务。 - 如果更新失败,则恢复之前的状态,并回滚事务。 **示例代码**: ```powerbuilder if dw_1.update() = 1 then dw_1.modify("stud_sname.update=no") dw_1.modify("stud_ssex.update=no") dw_1.modify("stud_sdept.update=no") dw_1.modify("datawindow.table.updatable='grade'") dw_1.modify("grade_cid.key=yes") dw_1.modify("grade_cid.update=yes") dw_1.modify("grade_grade.update=yes") if dw_1.update() = 1 then commit using sqlca; dw_1.retrieve() messagebox('提示信息', '更新成功!!!') else dw_1.modify("grade_cid.key=no") dw_1.modify("grade_cid.update=no") dw_1.modify("grade_grade.update=no") dw_1.modify("datawindow.table.updatable='stud'") dw_1.modify("stud_sname.update=yes") dw_1.modify("stud_ssex.update=yes") dw_1.modify("stud_sdept.update=yes") endif else rollback using sqlca; messagebox('提示信息', '更新失败!!!') endif ``` **4. 使用函数实现多表更新** - **创建函数**:除了直接在“更新”按钮的Clicked事件中编写代码外,还可以创建一个通用函数`f_updatetable()`来处理多表更新。 - **函数参数**:该函数接收5个参数,包括数据窗口对象、两个表名以及这两个表的主键名。 - **调用函数**:在“更新”按钮的Clicked事件中调用该函数。 **示例函数定义**: ```powerbuilder function string f_updatetable(dw DataWindow, table1 String, table2 String, pk1 String, pk2 String) { // 函数实现代码 } ``` #### 四、总结 通过上述步骤,我们可以在PowerBuilder中实现一个数据窗口对象对多个表的同步更新操作。这种方法不仅解决了默认情况下一个数据窗口只能更新一个表的问题,还提高了应用程序的灵活性和用户体验。需要注意的是,在实际开发过程中,还需要根据具体的应用场景调整代码逻辑,以满足不同业务需求。
- 粉丝: 18
- 资源: 32
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助