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毫秒