北 京----刘增 进
PowerBuilder 作 为 目前 比 较 流 行 的 一 种 开 发 工 具, 有 其 独 到 之 处, 那 就 是数 据 窗 口(DataWindow)。 可 以 说, 数 据 窗 口 是PowerBuilder 的 核心, 在 对 数 据 库 的 开 发 过 程 中, 无 论 是 录 入、 查 询、统 计 还 是 报 表, 都 离 不 开 数 据 窗 口。 但 是, 除 了 数 据窗 口,PB 还 提 供 了 下 拉 数 据 窗 口(DropDown DataWindow), 下 拉 数据 窗 口 的 使 用, 使 数 据 窗 口 更 灵 活, 更 方 便, 下 面 举例 介 绍 在 数 据 窗 口 中 使 用 下 拉 数 据 窗 口 的 一 些 技 巧。
在 用 数 据 窗 口作 数 据 录 入 时, 经 常 用 到 代 码 录 入, 即 对 经 常 输 入 的某 些 值 设 置 代 码, 录 入 时 直 接 录 入 代 码 即 可。 例 如,有 两 个 表, 主 表main_table 和 代 码 表code_table, 结 构 如 下:
main_table
字段名
类型
长度
描述
id
integer
标识号
name
char
8
姓名
sex
char
4
性别
city
Varchar
30
城市
unit
Varchar
40
单位
下 面, 详 细 讨论 如 何 使 用 下 拉 数 据 窗 口:
一、 静 态 设 计 下 拉 数 据 窗 口
首 先 对 主 表 和代 码 表 设 计 两 个 数 据 窗 口dw_main 和dw_code, 其 中dw_main 包 括字 段id,name,sex,city 和unit;dw_code 包 括 字 段code 和data。 假 设unit 字 段 有 几 个 常 用 值 可 使 用 代 码 录 入, 则 在 设 计dw_main 时, 用 鼠 标 右 键 点 击 字 段unit, 在 下 拉 菜 单 中 选 择Properties...(属 性), 则 系 统 会 弹 出unit 列 的 属 性 对 话 框, 在 其 中 选择Edit( 编 辑) 项, 并 在Style( 风 格) 下 拉 列 表 框 中 选 择DropDownDW 项, 然 后 在 下 面 的Options( 选 项) 框 中 作 具 体 的 选 项 配置: 在DataWindow 下 拉 框 中 选 择 已 设 计 好 的 代 码 数 据 窗 口dw_code 作 为 下 拉 数 据 窗 口; 在DisplayColumn( 显 示 列) 下 拉 框 中 选择code 字 段; 在Data Column( 数 据 列) 下 拉 框 中 选 择data 字 段, 这 表 示 显 示 的 是code 字 段 的 内 容, 而 实 际 存 于 表main_table 中 的 是data 字 段 的 内 容。 至 此, 数 据 窗 口 设 计 完 毕。
设 计 完 数 据 窗口 后, 需 要 建 立 一 个 数 据 录 入 的 窗 口(window), 名 字 为w_input,在 窗 口w_input 上 建 立 一 个 数 据 窗 口 的 控 件dw_1, 其 属 性DataWindow Object Name 为dw_main。 并 在w_input 的open 事 件 中 写 入 下 列 语 句:
dw_1.SetTransObject(SQLCA)
dw_1.Retrieve()
这 样, 在 执 行此 窗 口 时, 在unit 字 段 上 就 会 出 现 一 个 下 拉 列 表 框, 列出 了 表code_table 中 所 有 的 内 容, 用 户 可 以 用 鼠 标 选 择 录入。
二、 动 态 改 变SQL 语 句
在 上 面 的 例 子中, 如 果 表main_table 中 的 字 段city 也 需 要 代 码 录 入, 则 还需 为city 字 段 新 建 一 个 表, 这 样 很 麻 烦, 因 为 有 几 个 字段 需 要 代 码, 就 须 有 几 个 表 与 之 对 应。 我 们 可 利 用 下拉 数 据 窗 口 的 一 些 特 点 减 少 麻 烦。 对 此, 可 以 相 应 地修 改 表code_table 的 结 构, 加 一 个 字 段field(char(30)), 以 存 储 需要 代 码 的 字 段 名, 这 样, 就 可 利 用SQL 语 句 对 之 进 行 检索, 以 得 到 某 字 段 的 所 有 代 码。 具 体 实 现 如 下: 重 新设 计 数 据 窗 口dw_code, 把field 字 段 加 上 并 使 它 不 可 见( 因为 用 户 不 需 要 见 到 该 字 段 的 内 容), 数 据 窗 口dw_main 和窗 口w_input 的 设 置 如 上, 只 是 在 数 据 窗 口dw_1 中 需 要 进 行一 些 编 程, 具 体 是 在ItemFocusChanged 事 件 中, 加 入 如 下 的 代码:
String ls_sql
Integer rtncode
DataWindowChild field_child
//dwo为该事件的参数,
其name属性的值表示获得焦点的字段名
Choose Case lower(dwo.name)
Case 'city' //city字段获得焦点
//获得city字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("city",field_child)
If rtncode = -1 Then MessageBox( "Error", "Not a DataWindowChild")
//设置事务对象
field_child.SetTransObject(SQLCA)
//获得下拉数据窗口的SQL语句
ls_sql = field_child.GetSQLSelect()
//重新设置SQL语句,加上Where条件
ls_sql = ls_sql + " Where field = '" + dwo.name + "'"
field_child.SetSQLSelect(ls_sql)
//取得满足条件的数据
field_child.Retrieve()
Case 'unit' //unit字段获得焦点
//获得unit字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("unit",field_child)
......(此处编程同上一样)
End Choose
三、 动 态 设 置 取 值 参 数
上 例 中, 是 采用 动 态 改 变SQL 语 句 实 现 的, 其 实, 下 拉 数 据 窗 口 有 一种 更 简 单 的 方 法 就 是 设 置 取 值 参 数(Retrieval Arguments) 但这 种 方 法 适 合 从 固 定 表 中 取 数 据, 如 果 是 从 动 态 表(即 表 名 不 固 定) 中 取 数 据, 则 只 能 通 过 改 变SQL 语 句 来实 现。
修 改 数 据 窗 口dw_code,在 图 形 方 式 下, 选 择Design 菜 单 下 的Retrieval Arguments..., 设 置取 值 参 数 的 类 型 为String, 名 字 可 任 取, 假 设 为field_data,然 后 在 窗 口 下 面 的Where 标 签 中 选 择Column 为"code_table.field",Operator 为" =",Value 为 取 值 参 数 的 值:field_data( 变 量 名 前 加冒 号 表 示 该 变 量 的 值), 至 此, 取 值 参 数 设 置 完 毕。 同上 例, 也 需 要 在 窗 口w_input 中 的 数 据 窗 口 控 件dw_1 中 的ItemFocusChanged 事 件 中 进 行 如 下 的 编 程:
Integer rtncode
DataWindowChild field_child
//dwo为该事件的参数,
其name属性的值表示获得焦点的字段名
Choose Case lower(dwo.name)
Case 'city' //city字段获得焦点
//获得city字段下拉数据窗口的句柄
rtncode = dw_1.GetChild("city",field_child)
If rtncode = -1 Then MessageBox
( "Error", "Not a DataWindowChild")
//设置事务对象
field_child.SetTransObject(SQLCA)
// 利 用 取 值 参数 取 得 满 足 条 件 的 数 据, 如 果 没 有 数 据, 则 插 入 一 空记 录,// 否 则 系 统 会 提 示 一 个 英 文 对 话 框, 要 求 输 入取 值 参 数 的 值。
If field_child.Retrieve(dwo.name) <1 Then field_child.InsertRow(0) Case 'unit' //unit字段获得焦点 //获得unit字段下拉数据窗口的句柄 rtncode="dw_1.GetChild("unit",field_child)" ......(此处编程同上一样) End Choose
至 此, 已 介 绍了 使 用 下 拉 数 据 窗 口 的 一 些 技 巧, 希 望 能 给 读 者 提 供一 些 帮 助。
|