在PowerScript脚本中访问数据窗口中的数据
张健姿
01-6-22 下午 03:50:25
在4.0 以 前 的 版 本, 如 果 您 想 在PowerScript 脚 本 中 访 问数 据 窗 口 中 的 数 据, 方 法 只 有 一 种, 那 就 是 使 用SetItem 和GetItem 系 列 的 函 数, 指 定 您 所 要 访 问 的 某 一 行 列 的 值, 这 一 方 法的 局 限 性 在 于 您 一 次 只 能 访 问 到 一 个 数 值。 而 在5.0 版 中,PowerBuilder 拓 展 了 数 据 窗 口 的 属 性, 使 数 据 窗 口 中 的 数 据 成 为 了 该对 象 的 一 个 属 性, 而 使 用 户 可 以 象 访 问 其 它 对 象 属 性 一样 直 接 访 问 数 据 窗 口 的 数 据 了。 这 样 我 们 就 有 了 两 种 访问 数 据 的 方 法 了。
1. 传 统 的 使 用SetItem 和GetItem 系 列 函 数, 如:
dw_1.SetItem(1, "empname", "Phillips")
ls_name = dw_1.GetItemString(1, "empname")
2. 表 达 式 的 方 法, 这 种 方 法 可 以 指 定 某 一 列、 某 一行、 某 一 块、 或 是 用 户 选 中 的 行 列、 甚 至 整 个 数 据 窗 口 控件 的 全 部 数 据, 如:
dw_1.Object.empname[1] = "Phillips"
dw_1.Object.Data[1,1] = "Phillips"
这 两 种 方 法 都 可 以 允 许 用 户 指 定 特 定 的 数 据 缓 冲区, 也 就 是 说 您 采 用 任 何 一 种 方 法 都 可 以 访 问 到 数 据 被修 改 前 的 原 始 值、 被 过 滤 掉 的 值、 被 删 去 的 值 及 当 前 值 等。
在 大 多 数 情 况 下, 您 可 以 采 用 这 两 种 方 法 中 的 任 一种, 但 这 两 种 方 法 在 使 用 时 也 是 各 有 利 弊 的。
如 果 您 只 是 要 访 问 某 行 某 列 的 一 个 数 值, 两 种 方 法在 执 行 效 率 上 是 基 本 相 同 的 的。
如 果 您 打 算 采 用 数 据 窗 口 的 列 名 而 不 是 数 值 来 表示 某 一 列, 而 这 一 列 的 列 名 在 运 行 前 又 不 知 道, 或 是 要 根据 用 户 的 不 同 输 入 来 决 定, 那 您 只 能 采 用 函 数 法, 因 为 这一 方 法 可 以 动 态 地 改 变 列 名。
如 果 您 需 要 访 问 的 数 据 不 止 一 列, 而 是 确 定 范 围 的多 行 多 列, 那 您 采 用 表 达 式 法 将 获 得 更 高 的 效 率。
表 达 式 法 是PowerBuilder5.0 新 增 加 的 功 能, 虽 说 这 种 方法 可 使 得 数 据 窗 口 的 面 向 对 象 的 特 性 更 为 明 显, 语 言 的表 达 也 更 为 直 观, 易 于 使 旁 观 者 阅 读 他 人 的 程 序 时 容 易看 懂, 但 是 这 种 方 法 的 语 法 形 式 却 是 很 复 杂 多 样, 使 用 起来 却 不 太 容 易。
总 体 上 讲, 表 达 式 的 语 法 可 以 分 成3 组:
直 接 指 定 列 名 称 法: 如 果 您 事 先 知 道 您 需 要 访 问 数 据的 列 名, 而 且 仅 访 问 这 一 列, 可 以 采 用 这 种 方 法。
选 择 这 一 控 件 中 一 条 记 录 或 多 条 记 录
dwcontrol.object.columnname {.buffer } {.datasource } { [ startrownum{, endrownum} ] }
我 们 在 前 面 的 专 题 中 曾 经 介 绍 过 关 于 数 据 窗 口 的四 个 缓 冲 区, 在 这 条 命 令 的 语 法 中buffer 选 项 就 可 以 选 择Primary,Filter 或Delete 这 三 个 缓 冲 区, 缺 省 为Primary;datasource 选 项 为Current 或Original, 缺 省 为Current。 如 果 您 选 择Original, 则 系 统 将 到数 据 窗 口 的Original 缓 冲 区 中 去 读 取 数 据, 显 然Original 缓 冲区 是 只 读 的, 您 不 能 对 其 赋 值。 在 后 面 的 方 括 号 中, 您 可以 指 定 您 打 算 访 问 的 这 一 列 中 的 起 止 记 录 数, 如 果 只 是一 条 记 录, 您 在StartRownum 中 指 定 行 号 就 可 以 了; 如 果 方 括号 中 两 个 参 数 全 部 缺 省, 则 指 这 一 列 的 全 部 记 录。
例 如:
string ls_name
ls_name = dw_1.Object.name[1]
又 如:
dw_1.Object.salary[8,12] = id_salary
id_salary 是 一 个 数 组, 如 果 其 中 只 有 四 个 元 素, 则 第12 行salary 的 值 为 空。
选 择 这 个 数 据 窗 口 控 件 中 加 亮 的 记 录
dwcontrol.Object.columnname {.Primary }{.datasource } .Selected
在 数 据 窗 口 中 加 亮 的 记 录 就 是 您 曾 经 使 用 过SelectRow 函 数 对 其 进 行 加 亮 表 示 这 一 行 选 中 的 记 录。 显 然, 对 这 一特 性 数 据 的 访 问 只 能 是Primary 缓 冲 区 中 的, 不 过 数 据 源 仍然 可 以 选 择 是 当 前 还 是 原 始 的。 如 果 选 择 原 始, 也 就 是 说您 得 到 的 数 据 是 从 数 据 库 中 查 到 的, 修 改 前 的 数 据。
例 如:
string ls_name
ls_name = dw_1.Object.name.Selected
使 用 数 值 来 表 示 列:
dwcontrol.Object.Data {.buffer } {.datasource } [ startrownum, startcolnum,
endrownum, endcolnum ]
我 们 知 道 在SetItem 和GetItem 系 列 的 函 数 中, 对 列 的 表达 既 可 以 用 列 名 也 可 以 采 用 数 值 指 示, 在 这 里 也 是 同 样。如 果 我 们 采 用 数 值 指 代 列 名 的 方 法, 同 上 一 种 比 较, 我 们要 将 列 名 换 成 了 关 键 词Data, 在 后 面 的 方 括 号 中, 参 数 变成 了 四 个。 这 一 表 达 式 的 返 回 值 将 是 一 个 结 构 数 组, 或 是一 个 用 户 对 象。 必 须 注 意, 您 所 定 义 的 结 构 或 用 户 对 象 必须 与 数 据 窗 口 的 这 几 列 的 数 据 类 型 相 匹 配, 否 则PowerBuilder 将 出 现 错 误。
对 整 行 记 录 的 操 纵:
dwcontrol.Object.Data {.buffer } {.datasource } { [ rownum ] }
这 一 种 方 法 是 上 一 种 方 法 的 特 例, 如 果rownum 中 的 数值 缺 省, 将 表 示 整 个 数 据 窗 口 的 全 部 数 据。
例 如 数 据 窗 口 中 的 列 名 及 数 据 类 型 是 这 样 的:
ID (number)
name (string)
retired_status (boolean)
birth_date (date)
首 先 我 们 要 在 结 构 画 笔 中 定 义 一 个str_empdata 的 数 据结 构。 它 包 括 四 个 元 素, 类 型 分 别 是:
integer, string, boolean 和date
执 行 下 列 代 码:
str_empdata lstr_currdata[]
lstr_currdata = dw_1.Object.Data
这 样lstr_currdata 结 构 中 数 组 的 上 界 将 用 数 据 窗 口 控件 中 记 录 的 行 数 相 等, 并 完 成 了 赋 值。
我 们 还 可 以 用 这 种 方 法 指 定 这 一 控 件 中 高 亮 度 的行
dwcontrol.Object.Data {.Primary } {.datasource } .Selected
这 三 种 形 式 的 功 能 比 较 如 下:
访 问 范 围
语 法
访 问 控 件 中 高 亮 度 的 行
1
一 列
dwcontrol.object.columnname{.buffer } {.datasource}
能
2
多 列
dwcontrol.object.data{.buffer } {.datasource}
不 能
3
一 条 记 录 的 全 部 列
dwcontrol.object.data{.buffer } {.datasource}
能 在 使 用 这 些 语 句 时 我 们 要 注 意 以 下 几 点:
同 使 用SetItem 和GetItem 系 列 函 数 一 样, 在 编 译 时PowerBuilder 将 不 检 查 您 所 指 示 的 列 的 有 效 性, 您 必 须 自 行 检 查 并 确保 引 用 的 有 效 性。
在 第 一 种 方 法 中 我 们 必 须 注 意 在 列 名 后 面 一 定 要有 所 后 缀, 例 如:
ld_salary[] = dw_1.object.emp_salary.primary
ld_salray = dw_1.object.emp_salary[5]
上 述 表 达 式 都 是 合 法 的, 但 是
ld_salary[] = dw_1.object.emp_salary
就 是 非 法 表 达 了。
因 为dw_1.object.emp_salary 指 代 的 是 这 个emp_salary 列 的DWObject 对 象, 而 不 是 在emp_salary 列 中 的 数 据。 我 们 可 以 用dw_1.object.emp_salary 来 指 代 数 据 窗 口 中 的 对 象, 如:
integer li_data
DWObject dwo_empsalary
dwo_empsalary = dw_1.Object.emp_salary
FOR li_cnt = 1 to 100
li_data = dwo_empsalary[li_cnt]
.........
NEXT
这 种 表 达 式 法 返 回 的 数 据 类 型 是ANY 型 的,PowerBuilder 将 根 据“ 兼 容” 原 则 转 换 数 据 库 与PowerBuilder 的 数 据 类 型,因 此 如 果 您 调 用 的 重 载 函 数 要 使 用 表 达 式 法 得 到 数 据 窗口 的 数 据 作 为 参 数, 建 议 您 一 定 使 用 一 个 强 制 转 换 数 据类 型 的 函 数。 例 如:
wf_overload(real(dw_1.object.dept_id[1]))