DataWindow的数据缓冲区

阅读更多
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! 状 态。

你可能感兴趣的:(PowerBuilder,SQL)