`

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

阅读更多

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

 

摘 要:文章描述了PowerBuilder中数据窗口缓冲区,详细介绍了数据窗口中行与列的修改状态以及PowerBuilder提供的相关函数,并给出了几则应用实例。 关键词:PowerBuilder 数据窗口 缓冲区

中图分类号:TP311.131
文献标识码:A
  PowerBuilder是当今最先进的数据库开发工具之一,它以 开放性、可移植性以及易用性而闻名于世。PowerBuilder的突出特点是给应用开发人员提供了非常方便的开发环境和工具,而数据窗口技术则是其中最 耀眼的闪光点。利用数据窗口,开发人员可以完成绝大多数数据操作任务。本文从数据窗口中数据的修改状态的角度出发,介绍利用数据窗口进行应用开发的一些技 巧。   1 数据窗口缓冲区
在应用中,每个数据窗口控件都要检索4个内存缓冲区,它们是:
  ·主缓冲区(PrimaryBuffer):存放检索出来的数据,但不包括过滤掉和删除掉的数据。
  ·过滤缓冲区(FilterBuffer):存放从主缓冲区中过滤掉的数据。
  ·删除缓冲区(DeleteBuffer):存放从主缓冲区中删除掉的数据。
  ·原始缓冲区(OriginalBuffer):存放从数据库里检索到的原始数据,它由PowerBuild在内部维护,可以利用该缓冲区中的数据进行数据恢复,在应用程序中实现Undo功能。
  2 行与列的修改状态
行与列的修改状态在PowerBuilder中为dwItemStatus枚举类型值,它们包含: ·NotModified!:指定行或列处的信息与最初检索出的相同。 ·DataModified!:指定列或行中某列处的信息在检索出后发生了改变。
  ·New!:指定行是新行,但此行的列并未赋值。本状态只适用于行,不适用于单个列。
  ·NewModified!:指定行是新行且行中的列已经赋值。新行的状态成为NewModified!,既可能是用户输入或使用SetItem函数造成的,也可能是由于它的某列具有缺省值。本状态只适用于行,不适用于单个列。
  数据窗口中行或列的修改状态决定Update()函数将为该行或该列产生何种类型的SQL语句。 对主缓冲区和过滤缓冲区中的行,Update为状态是NewModified!的行产生Insert语句,为状态是DateModified!的行产生 Update语句,只有状态是DataModified!的列才会包含在Update语句中。对删除缓冲区中的行,若其状态是New!或 NewModified!,则Update语句不会为其产生Update语句。
  利用函数GetItemStatus可获得某行或某列的修改状态,利用函数SetItemStatus可改变某行或某列的修改状态。
  语法:
  dwcontrol.GetItemStatus(row,column,dwbuffer)
  dwcontrol.SetItemStatus(row,column,dwbuffer,status)
  对于如何改变状态,PowerBuilder有一些限制,表1给出了这种限制,其中Yes表示可把初始状态改变为指定状态,No则表示不可以。

表1数据修改状态设置约束

初始状态指定状态New!NewModified!DataModified!NotModified!New!——YesYesNoNewModified!No——YesNew!DataModified!NewModified!Yes——YesNotModified!YesYesYes——  通过观察表1,我们可以发现这样一种情况:假设某个记录的状态为New!,那么不能直接改为NotModified!但可先将它改为DataModified!,然后再改为NotModified!。
  利用函数RowsCopy、RowsMove可以在不同DataWindow控件(或DataStore对象)之间或同一DataWindow控件(或DataStore对象)的不同缓冲区之间复制、移动数据行。
  语法:
  dwcontrol.RowsCopy(startrow,endrow,copybuffer,targetdw,beforerow,targetbuffer)
dwcontrol.RowsMove(startrow,endrow,movebuffer,targetdw,beforerow,targetbuffer)

  当某行在删除缓冲区中时,或者在主缓冲区或过滤缓冲区中,并且状态为NewModified!或 DataModified!时,其更新标志被设置。函数ResetUpdate清除DataWindow或DataStore中主缓冲区和过滤缓冲区中的 更新标志并清空其删除缓冲区。清除更新标志后,所有行的状态为NotModified!或New!。
  语法:dwcontrol.ResetUpdate()
  3 应用举例
(1)在数据窗口中,某些列常具有缺省值,或我们在执行了InsertRow操作后立即使用 SetItem函数为某些列赋值。如果用户执行了一个插入操作后立即关闭窗口会触发closequery事件,这时会提示用户记录已经被修改,但用户并没 有感觉到对数据的修改。为避免出现这种情况,可作如下处理:
  intli_new_row
li_new_row=dw_l.InsertRow(0)
//通过SetItem函数为列赋值
dw_l.SetItem(……)
//将新行的修改状态置为NotModified!
dw_l.SetItemStatus(li_new_row,0,primary!,NotModified!)

  (2)在应用程序中提供Undo功能,将实现很好的用户友好效果。本例中将数据窗口dw_l中的当前行、当前列的显示值置为从数据库中检索出的原始值:
string ls_ori_val
ls_ori_val=dw_l.GetItemString(dw_l.GetRow(),dw_l.GetColumn(),
&Primary!,True)
dw_l.SetText(ls_ori_val)

  (3)在协调两个DataWindow对象dw_l、dw_2的更新时,若其中一个更新失败,应阻止重设更新标志,以便回滚事务,一旦所有数据窗口都已成功更新,就可使用COMMIT结束该事务,并使用ReSetUpdate重新设置数据窗口的状态标志。
Int li_ret_code
li_ret_code=dw_l.Update(True,False)//阻止重设更新标志
If li_ret_code=l then
li_ret_code=dw_2.Update(True,False)//阻止重设更新标志
lf li_ret_code=l then
dw_l.ResetUpdate()//清除更新标志
dw_2.ResetUpdate()//清除更新标志
COMMIT;
Else
ROLLBACK;
Endif
Endif
(4)将数据行从删除缓冲区移到主缓冲区,实现取消删除的功能。
dw_l.RowsMove(l,dw_l.DeletedCount(),Delete!,dw_l,l,Primary!)

分享到:
评论

相关推荐

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

    PB 中数据窗口缓冲区与数据修改状态浅议 数据窗口缓冲区是 PowerBuilder 中的核心概念,它提供了非常方便的开发环境和工具,给应用开发人员提供了绝大多数数据操作任务的解决方案。在 PowerBuilder 中,数据窗口...

    基于PB数据窗口生成SQL语句原理的使用技巧.pdf

    数据窗口生成SQL语句主要和数据窗口缓冲区、行与列的修改状态有关。数据窗口有四个内存缓冲区: 1. 主缓冲区(Primary Buffer):存放检索出来的数据,但不包括过滤掉和删除掉的数据。 2. 过滤缓冲区(Filter ...

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

    在PB的数据窗口组件中,DWItemStatus作为一项描述数据行与列状态的关键属性,在实际开发过程中扮演着重要角色。然而,在日常编程中,这一属性往往被忽视,未能充分发挥其潜在价值。本文旨在深入探讨DWItemStatus的...

    解析PowerBuilder的数据处理机制

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

    PB开发工具下SendMessage函数完全使用手册

    11. WM_GETTEXT: 应用程序发送此消息来复制对应窗口的文本到缓冲区 12. WM_GETTEXTLENGTH: 得到与一个窗口有关的文本的长度(不包含空字符) 13. WM_PAINT: 要求一个窗口重画自己 14. WM_CLOSE: 当一个窗口或应用...

    pb 6.0

    - 对数据进行操作,修改时会加锁,并将更改记录到重做日志缓冲区。 - 结果返回给用户,关闭游标。 8. **启动和关闭数据库**: - 启动数据库通常通过SVRMGRL工具,首先连接内部模式,然后执行STARTUP命令启动实例...

    PowerBuilder28个属性、35个默认事件、162个函数

    在PowerBuilder开发过程中,合理利用各种事件和数据窗口缓冲区对于提高应用程序的性能至关重要。通过遵循上述原则,开发者可以有效地优化应用程序的性能,提升用户的使用体验。同时,对于数据窗口中不同事件的脚本...

    PB_串口通讯例子.rar_COM端口通讯_PB串口_PB串口通讯_pb COM端口通讯_pb9. com

    7. **LineStatus**: 返回串口状态信息,如数据准备好、缓冲区溢出等。 8. **Open** 和 **Close**: 打开或关闭串口连接。 9. **SetCommState**: 设置串口的通信状态。 10. **GetCommState**: 获取当前串口的通信状态...

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

    - `accepttext()`:此函数用于接受用户在数据窗口中的更改并将其存入缓冲区。 - `update()`:更新数据到数据库,返回值为1表示成功。 - `commit` 和 `rollback`:分别用于提交事务和回滚事务。 - `insertrow(0)`...

    JAVA上百实例源码以及开源项目源代码

    Java数据压缩与传输实例 1个目标文件 摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、...

    winrar3.7 Beta8

    这些文件 可以被正确解压,但是在列表窗口中显示的大小不正确。 <br> 版本 3.70 beta 5 <br> 1. 错误修正: <br> a) 当解压 TAR 压缩文件时, 如果解压的文件名长度超过 100 个字符 WinRAR 3.70 ...

Global site tag (gtag.js) - Google Analytics