Database 版 (精华区)
发信人: wodeji (西西), 信区: Database
标 题: [转载] werBuilder开 发 系 列 谈(27)
发信站: 紫 丁 香 (Tue Sep 29 17:52:58 1998), 站内信件
【 以下文字转载自 Programming 讨论区 】
【 原文由 two 所发表 】
在PowerScript 脚 本 中 访 问 数 据 窗 口 中 的 数 据
在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]))
)
--
※ 来源:.紫 丁 香 bbs.hit.edu.cn.[FROM: 202.97.236.132]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: whs.hit.edu.cn]
--
※ 转载:.紫 丁 香 bbs.hit.edu.cn.[FROM: cadcam.hit.edu.c]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:205.988毫秒