Database 版 (精华区)

发信人: lizhenguo (夸父·追日), 信区: Database
标  题: 27
发信站: 哈工大紫丁香 (2001年09月26日18:46:17 星期三), 站内信件

 bbs.hit.edu.cn
PowerBuilder专栏
[回到开始][上一层][下一篇]
----------------------------------------------------------------------------
----
发信人: carsam (独自偷...), 信区: Database
标 题: PowerBuilder应用开发系列讲座(27)
发信站: 逸仙时空 Yat-sen Channel (Wed Jan 5 12:33:29 2000), 站内信件
PowerBuilder应用开发系列讲座(27)
----------------------------------------------------------------------------

----
在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 缓 冲区 是 只 读 的

, 您 不 能 对 其 赋 值。 在 后 面 的 方 括 号 中, 您 可以 指 定 您 打 算 访

问 的 这 一 列 中 的 起 止 记 录 数, 如 果 只 是一 条 记 录, 您 在StartRo
wnum 中 指 定 行 号 就 可 以 了; 如 果 方 括号 中 两 个 参 数 全 部 缺 省,

则 指 这 一 列 的 全 部 记 录。
例 如:
string ls_name
ls_name = dw_1.Object.name[1]
又 如:
dw_1.Object.salary[8,12] = id_salary
   id_salary 是 一 个 数 组, 如 果 其 中 只 有 四 个 元 素, 则 第12 行sa

lary 的 值 为 空。
   选 择 这 个 数 据 窗 口 控 件 中 加 亮 的 记 录
   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_s
alary 来 指 代 数 据 窗 口 中 的 对 象, 如:
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]))
)
--
我想自由自在地飞......
飞过大海...
飞过沙漠...
飞翔在星的夜空......
※ 来源:.逸仙时空 Yat-sen Channel bbs.zsu.edu.cn.[FROM: 202.116.90.29]
----------------------------------------------------------------------------
----
[回到开始][上一层][下一篇]
欢迎访问Cterm主页

--
《列子·汤问》:“夸父不量力,欲追日影,逐之于隅谷之际。渴欲 得饮,赴饮河渭
。河渭不足,将走北饮大泽。未至,道渴而死。”

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.229.154]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:204.657毫秒