Database 版 (精华区)
发信人: wodeji (西西), 信区: Database
标 题: [转载] PowerBuilder 开 发 系 列 谈 (9)
发信站: 紫 丁 香 (Tue Sep 29 17:51:08 1998), 站内信件
【 以下文字转载自 Programming 讨论区 】
【 原文由 two 所发表 】
DATAWINDOW 的 四 个 缓 站 区
---- 在PowerBuilder 中,DataWindow 是 用 户 前 端 用 来 存 储、 操 纵 数 据 的 对 象。
在 每 一 个Data Window 对 象 中 有4 个 二 维 表 作 为 数 据 缓 冲 区, 用 来 存 储 查 询
到 的 数 据。 用 户 在DataWindow 中 对 数 据 处 理 系 统 内 部 的 操 作 实 际 上 都 是
将 数 据 在 这 几 个 缓 冲 区 中 进 行 的 修 改 和 移 动, 最 后 在 用 户 提 交 数 据 库
时, 系 统 根 据 这 四 个 缓 冲 区 中 的 信 息 形 成SQL 的IN-SERT,UPDATE,DELETE 等
语 句 。 这 四 个 缓 冲 区 是:
----
Primary Buffer
---- 这 个 缓 冲 区 是 存 放 填 充 窗 口 中DataWindow 控 件 中 数 据 的, 调
用DataWindow 的Retrieve() 函 数 和InsertRow() 函 数 可 以 将 数 据 填 入 这 个 缓 冲 区
中。 当 使 用 有 关DataWindow 删 除 和 过 滤 函 数 时, 相 应 记 录 将 从 这 一 缓 冲 区
中 删 除。 而 在 执 行DataWindow 的Update() 函 数 时,PowerBu ilder 将 查 看 这 一 缓 冲
区 中 的 记 录, 以 形 成SQL INSERT 和UPDATE 语 句。
----
Delete Buffer
---- 这 个 缓 冲 区 保 存 的 是 用DeleteRow() 函 数 从Primary Buffer 中 删 除 的 记 录, 执
行Update( ) 函 数 时, 系 统 根 据 这 一 缓 冲 区 的 记 录 形 成DELETE 语 句。
----
Filter Buffer
---- 这 个 缓 冲 区 存 储 的 是 从Original Buffer 使 用Filter() 函 数 过 滤 到Primary Buffer
中 后 剩 余 的 记 录。
----
Original Buffer
---- 这 一 缓 冲 区 存 储 的 是DataWindow 最 初 执 行retrieve() 函 数 时 得 到 的 全 部 记
录。 当 提 交 数 据 库 时, 根 据Primary Buffer 生 成 的UPDATE 语 句 和 根 据Delete
Buffer 生 成 的DELETE 语 句 都 要 依 据 这 一 缓 冲 区 来 构 造 这 些SQL 语 句 中
的Where 子 句。
----Original Buffer 由PowerBuilder 内 部 维 护,Power-Builder 所 提 供 的 任 何 函 数 都 无
法 改 变 它 的 值, 不 过 通 过PowerBuilder 所 提 供 的GetItem … 系 列 的 函 数 可 以 读
出DataWindow 最 初 从 数 据 库 中 查 到 的 原 始 值。 通 过 这 些 函 数 我 们 可 以 编
程 实 现 所 谓 的"Undo" 功 能, 并 且 得 到 在 使 用 乐 观 锁 时 形 成 提 交 数 据 库
的WHERE 子 句。
---- 如 果 您 当 前 使 用 的DataWindow 没 有 设 置 修 改 的 权 力, 您 将 不 能 对Delete
缓 冲 区 和Origin al 缓 冲 进 行 操 作, 而 且 当 调 用Update() 时 也 将 引 起 系 统 错
误。
----
数 据 缓 冲 区 的 状 态 值
----Primary Buffer 和Delete Buffer 都 有 行 级 和 列 级 的 状 态 值, 这 个 状 态 值 是 一 个
枚 举 类 型 。 在 提 交 时 由 该 行 的 状 态 值 来 决 定 是 否 要 产 生SQL 语 句, 其
中Primary Buffer 产 生 的 是IN-SE RT 和UPDATE 语 句, 而Delete Buffer 产 生 的
是DELETE 语 句。 我 们 用GetItemStatus() 函 数 和Se tItemStatus() 函 数 可 以 对 这 一
状 态 值 作 操 纵。 这 一 枚 举 状 态 有 以 下 四 种:
---- ·NotModified! — — — 该 行 或 行 的 值 为 查 询 所 得, 没 有 发 生 改 变。
---- ·DataModified! — — — 该 行 或 列 的 值 为 查 询 所 得, 发 生 了 改 变。
---- ·New! — — — 该 行 或 列 为 一 插 入 的 新 行, 数 据 没 有 发 生 改 变( 数 据 为
空 或 缺 省 值)。
---- ·NewModified! — — — 该 行 或 列 为 一 插 入 的 新 行, 数 据 发 生 改 变。 改 变
是 通 过 用 户 键 盘 输 入 或 调 用 了SetItem() 函 数。
---- 让 我 们 来 看 下 面 这 一 实 例:
---- 我 们 有 这 样 一 张 表, 表 中 有 三 个 字 段, 其 中ITEM 是 主 键。
----ITEM CHAR(5);
----NAME CHAR(20);
----QUANTITY INT。
---- 在Script 中 我 们 查 询 这 张 表 的 记 录, 得 到 以 下 这 些 信 息 存 储 了 在Primary
和Origianal B uffer 中, 其 中 的 行 号 是 缓 冲 区 加 上 的。
---- 在 窗 口 中, 我 们 编 程 过 滤 掉 数 量 为0 的 行, 并 且 加 上 一 个 空 行:
----dw_1.SetFilter("quantity=0")
----dw_1.Filter()
----dw_1.InsertRow()
---- 这 时Primary Buffer 的 状 态 为:
---- 在Filter Buffer 中 的 记 录 为:
---- 用 户 在 新 插 入 行 中 输 入 数 据, 删 除 了 第3 行 数 据, 并 修 改 了 第2 行 数
据。 当 他 离 开 这 个Dat aWindow 时,Primary 和Delete 缓 冲 区 的 状 态 如 下:
---- 这 时 执 行dw_1.update() 函 数, 系 统 将 基 于 这 两 个 缓 冲 区 生 成SQL 语 句。
---- 在Primary Buffer 中, 状 态 为NotModified 和New! 的 行 将 被 忽 略 而 不 产 生SQL 语
句。 状 态 为DataModified 的 行 将 产 生UPDATE 语 句, 状 态 为NewModified 的 行 将
产 生INSERT 语 句, 在Dele te 缓 冲 区 中 的 行 将 产 生DELETE 语 句。
----
四 个 缓 冲 区 在 编 程 中 的 运 用
---- 某 些DataWindow 控 件 的 函 数 有 指 定DataWindow 缓 冲 区 的 功 能。 如 果 缺
省, 则 表 示Primar y 缓 冲 区。 下 列 是 可 以 指 定 缓 冲 区 的 函 数:
---- ·GetItemStatus()
---- ·GetNextModified()
---- ·GetUpdateStatus()
---- ·SetItemStatus()
---- 此 外 还 有GetItem … 系 列 的 函 数, 用 以 查 询DataWindow 中 的 值。 这 些 函 数
有:
---- ·GetItemDate()
---- ·GetItemDataTime()
---- ·GetItemDecimal()
---- ·GetItemNumber()
---- ·GetItemString()
---- ·GetItemTime()
----GetItem … 系 列 函 数 也 可 以 指 定 缓 冲 区, 而 且 可 以 允 许 您 指 定 查 询 的 是
当 前 值 还 是 原 始 值 ( 最 初 从 数 据 库 中 查 到 的 值)。 如:
----dw_1.GetItemString(1,"name",Primary!,TRUE)
---- 使 用DataWindow 的Reset() 函 数 和Retrieve() 函 数 以 及 改 变DataObject 属 性 时,
系 统 将 重 置 这 几 个 缓 冲 区。
---- 当 用 户 插 入 一 个 新 行 时, 编 程 者 往 往 要 自 动 在 新 插 入 行 中 的 某 些 列
中 插 入 一 些 缺 省 的 数 据 值。 这 时, 用 户 并 没 有 对 数 据 作 任 何 修 改。 可 是
在 用 户 要 关 闭 这 一 窗 口 时, 如 果 在CloseQu ery 事 件 中 用ModifiedCount() 函 数 查
看 数 据 是 否 修 改, 得 到 的 结 果 显 然 是 有 所 改 变。 用 户 将 得 到 一 个 提 示 信
息 框:" 是 否 打 算 保 存 所 作 的 修 改? 是/ 否/ 取 消" — — — 这 显 然 是 不 适 合 的:
而 且 如 果 用 户 选 择 的 是 保 存 时, 这 些 原 应 是 空 记 录 的 行 也 成 为 了 有 内 容
的 行, 系 统 将 其 形 成SQL 的INSERT 语 句 提 交 数 据 库, 这 样 的 结 果 更 为 恶
劣。 为 改 变 这 一 状 况, 我 们 可 以 用SetItemStat us() 函 数 将 该 行 的 状 态 改
为New!。 即 当 有 新 行 插 入 并 且 设 置 了 缺 省 值 之 后, 该 行 的 状 态 值 为
New!。 下 面 的 程 序 就 可 以 得 到 如 上 的 功 能。
---- ∥Insert a new row in dw_1
----long 1_Row
----1_Row=dw_1,InsertRow(dw_1,GetRow())
----dw_1,SetItem(1_Row,"discount_pct",0,10)
---- ∥Set th row status to New! so that the CloseQuery check will only detect u ser entries.
----dw_1.SetItemStatus(1_Row,0,Primary!,New!)
---- 使 用SetItemStatus 函 数 时 有 一 些 状 态 转 换 的 限 制, 下 表 中 显 示 的 是 将 原
来 的 状 态 改 变 为 另 一 状 态 时, 会 产 生 的 影 响。 若 表 中 为No, 则 说 明 用 这 一
函 数 进 行 这 样 的 设 置 无 效; 若 表 中 给 出 了 不 同 的 状 态, 则 该 状 态 是 对 您
指 定 的 状 态 的 替 代。
---- 当 一 个 状 态 的 改 变 不 能 允 许 时, 可 以 多 次 调 用SetItemStatus 以 得 到 期 望
的 状 态。 例 如, 从New! 状 态 不 能 改 成NotModified! 状 态, 可 将 其 改
成DataModified! 状 态, 然 后 再 改 成NotMod ified! 状 态。
中国计算机世界出版服务公司版权
--
※ 来源:.紫 丁 香 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)
页面执行时间:208.117毫秒