日期:2013-09-22  浏览次数:20383 次

在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_namels_name = dw_1.Object.name[1]又 如:dw_1.Object.salary[8,12] = id_salaryid_salary 是 一 个 数 组, 如 果 其 中 只 有 四 个 元 素, 则 第12 行salary 的 值 为 空。 选 择 这 个 数 据 窗 口 控 件 中 加 亮 的 记 录 dwcontrol.Object.columnname {.Primary }{.datasource } .Selected 在 数 据 窗 口 中 加 亮 的 记 录 就 是 您 曾 经 使 用 过SelectRow 函 数 对 其 进 行 加 亮 表 示 这 一 行 选 中 的 记 录。 显 然, 对 这 一特 性 数 据 的 访 问 只 能 是Primary 缓 冲 区 中 的, 不 过 数 据 源 仍然 可 以 选 择 是 当 前 还 是 原 始 的。 如 果 选 择 原 始, 也 就 是 说您 得 到 的 数 据 是 从 数 据 库 中 查 到 的, 修 改 前 的 数 据。 例 如:string ls_namels_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 } {.