`

DataWindow的数据缓冲区

    博客分类:
  • pb
阅读更多
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 DataWindow的数据更新技术及应用.doc

    DataWindow的数据缓冲机制包括三个主要缓冲区:主记录缓冲区(Primary)、删除记录缓冲区(Deleted)和过滤记录缓冲区(Filter)。主记录缓冲区存储初始从数据库获取的数据,删除缓冲区保存被标记为删除的记录,而过滤缓冲...

    PowerBuild数据窗口(DataWindow)缓冲区详解

    介绍PowerBuild数据窗口几个缓冲区含义及区别,及相关方法简介。初学者可以参考。

    pb中DataWindow的数据缓冲区.doc

    pb中DataWindow的数据缓冲区 在PowerBuilder 中,DataWindow 是 用 户 前 端 用 来 存 储、 操 纵 数 据 的 对 象。 在每 一 个Data Window 对 象 中 有4 个 二 维 表 作 为 数 据 缓 冲 区, 用来 存 储 查 询 到 的 ...

    浅议PB中数据窗口缓冲区与数据修改状态

    此外,PowerBuilder 还提供了函数 RowsCopy 和 RowsMove,可以在不同 DataWindow 控件(或 DataStore 对象)之间或同一 DataWindow 控件(或 DataStore 对象)的不同缓冲区之间复制、移动数据行。 PowerBuilder 中...

    PB资料网站(pb12下载,pb12资源)

    本文将围绕“PB资料网站(pb12下载,pb12资源)”这一主题,深入探讨PowerBuilder 12的相关知识点,包括资源下载、关键技术专栏以及DataWindow数据缓冲区的概念。 #### PowerBuilder 12资源下载与资料获取 Power...

    DataWindow.NET Control原理与应用

    DataWindow.NET Control中的数据缓冲区类似于PowerBuilder中的数据窗口,用于存储和管理数据。每个WebFormDataWindowControl对象中包含了四个二维表作为数据缓冲区,分别是主缓冲区、删除缓冲区、过滤缓冲区和原始...

    DataWindow Buffers

    DataWindow Buffer,顾名思义,就像是一个内存中的数据缓冲区,用于存储和管理从数据库中检索到的数据。每当我们在PowerBuilder中执行SQL查询时,查询结果会被加载到DataWindow Buffer中。这个Buffer不仅是数据的...

    解析PowerBuilder的数据处理机制

    为了高效地处理数据,数据窗口在客户端内存中使用多个缓冲区来存储数据的不同状态,主要包括: - **主缓冲区**:用于存放从数据库加载的数据以及用户修改后的数据。 - **删除缓冲区**:记录已经被用户标记为删除的...

    解析PowerBuilder的数据处理机制.pdf

    数据窗口在使用时会在客户机的本地内存中开辟四个缓冲区:主缓冲区、删除缓冲区、过滤缓冲区和原始缓冲区。这些缓冲区协作完成数据的增加、删除、修改,并最终将处理结果提交给数据库管理系统。 编辑控件,又称为...

    数据窗口查询程序

    8. **性能优化**:通过预定义的数据缓冲区和智能查询技术,提高数据检索和显示的速度。 使用PowerBuilder的DataWindow,开发者能够轻松实现复杂的业务逻辑,同时保持代码的简洁和可维护性。在实际应用中,数据窗口...

    PB怎样得到下拉数据窗显示列的值

    这个事件是处理用户交互的关键,因为它意味着用户的选择已经完成并且新的值已经存储在了相应的缓冲区中。 2. **使用Describe()方法**:接下来,我们需要使用`Describe()`方法来获取具体的值。`Describe()`方法可以...

    PB 数据窗口中 udpdate() 和 乐观锁

    也说明了 数据窗口 中的数据,是如何在 4 个缓冲区中流动的 PB 虽老,但他的 数据窗口 还有技术专利,确实操作很快捷方便, 现在还没有能比得上 PB 的数据窗口 操作更快捷的 将此图分享给学 PB 的同

    对数据窗口的DWItemStatus研究及应用

    此方法接受行号、列号或列名以及缓冲区作为参数,返回对应的DWItemStatus枚举值。 **2. 改变行或列状态** SetItemStatus方法允许开发者手动更改数据窗口中行或列的状态。此方法同样接受行号、列号或列名、缓冲区...

    PB培训教程(提高篇).ppt

    数据窗口章节深入探讨了数据窗口的常见问题、函数事件、缓冲区管理、状态位、并发控制以及数据拷贝等。数据窗口是PB的核心组件,它允许开发者创建、显示和操作数据库中的数据。常见的问题包括如何处理数据输入、错误...

    在powerbuilder中自定义报表,自由查询。

    在处理大量数据时,可以使用数据窗口的缓冲区(CacheSize)和分页(FetchMode)属性来优化性能。通过设置合适的缓冲区大小,可以减少对数据库的访问次数;而分页则可以降低内存占用,提高响应速度。 8. 高级特性 ...

    PB(powerbuilder)初学教程--笔记

    11. **数据缓冲区**: - 数据窗口编辑时,数据存于悬浮窗,变化只有在焦点转移或调用`accepttext()`后才反映到主缓冲区。 12. **消息对象**: - `message`对象用于接收窗口参数,`powerobjectparm`属性用于传递...

    pb技术精髓,不用不要后悔

    * 第七讲: 利用SetActionCode函数控制DataWindow * 第八讲: 分布式PowerBuilder设计 * 第九讲: DataWindow的数据缓冲区 * 第十讲: 用DataWindow实现对多表的修改 * 第十一讲:游标的使用 * ...

    外部数据和数据库数据的相互转换及 PB实现 (2000年)

    在数据更新之前,需要调用Retrieve()函数确保数据窗口中的数据被正确地存入缓冲区。 当遇到格式不一致的情况时,需要创建两个数据窗口:一个连接到外部数据文件,另一个连接到内部数据库。数据先被读入第一个数据...

Global site tag (gtag.js) - Google Analytics