转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 常用软件 >> 正文
PowerBuilder应用开发系列讲座(9)         

PowerBuilder应用开发系列讲座(9)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:672 更新时间:2009/4/24 21:43:38
DATAWINDOW的四个缓站区

  在PowerBuilder中,DataWindow是用户前端用来存储、操纵数据的对象。在每一个DataWindow对象中有4个二维表作为数据缓冲区,用来存储查询到的数据。用户在DataWindow中对数据处理系统内部的操作实际上都是将数据在这几个缓冲区中进行的修改和移动,最后在用户提交数据库时,系统根据这四个缓冲区中的信息形成SQL的INSERT,UPDATE,DELETE等语句。这四个缓冲区是: 

PrimaryBuffer

  这个缓冲区是存放填充窗口中DataWindow控件中数据的,调用DataWindow的Retrieve()函数和InsertRow()函数可以将数据填入这个缓冲区中。当使用有关DataWindow删除和过滤函数时,相应记录将从这一缓冲区中删除。而在执行DataWindow的Update()函数时,PowerBuilder将查看这一缓冲区中的记录,以形成SQLINSERT和UPDATE语句。

DeleteBuffer

  这个缓冲区保存的是用DeleteRow()函数从PrimaryBuffer中删除的记录,执行Update()函数时,系统根据这一缓冲区的记录形成DELETE语句。

FilterBuffer

  这个缓冲区存储的是从OriginalBuffer使用Filter()函数过滤到PrimaryBuffer中后剩余的记录。

OriginalBuffer

  这一缓冲区存储的是DataWindow最初执行retrieve()函数时得到的全部记录。当提交数据库时,根据PrimaryBuff er生成的UPDATE语句和根据DeleteBuffer生成的DELETE语句都要依据这一缓冲区来构造这些SQL语句中的Where子句。

  OriginalBuffer由PowerBuilder内部维护,Power-Builder所提供的任何函数都无法改变它的值,不过通过PowerBuilder所提供的GetItem…系列的函数可以读出DataWindow最初从数据库中查到的原始值。通过这些函数我们可以编程实现所谓的"Undo"功能,并且得到在使用乐观锁时形成提交数据库的WHERE子句。

  如果您当前使用的DataWindow没有设置修改的权力,您将不能对Delete缓冲区和Original缓冲进行操作,而且当调用Update()时也将引起系统错误。

  

数据缓冲区的状态值

  PrimaryBuffer和DeleteBuffer都有行级和列级的状态值,这个状态值是一个枚举类型。在提交时由该行的状态值来决定是否要产生SQL语句,其中PrimaryBuffer产生的是IN-SERT和UPDATE语句,而DeleteBuffer产生的是DELETE语句。我们用GetItemStatus()函数和SetItemStatus()函数可以对这一状态值作操纵。这一枚? 态有以下四种:

  • NotModified!—该行或行的值为查询所得,没有发生改变。
  • DataModified!—该行或列的值为查询所得,发生了改变。
  • New!—该行或列为一插入的新行,数据没有发生改变(数据为空或缺省值)。
  • NewModified!—该行或列为一插入的新行,数据发生改变。改变是通过用户键盘输入或调用了SetItem()函数。

  让我们来看下面这一实例:

  我们有这样一张表,表中有三个字段,其中ITEM是主键。

  ITEMCHAR(5);

  NAMECHAR(20);

  QUANTITYINT。

  在Script中我们查询这张表的记录,得到以下这些信息存储了在Primary和OrigianalBuffer中,其中的行号是缓冲区加上的。

  在窗口中,我们编程过滤掉数量为0的行,并且加上一个空行:

  dw_1.SetFilter("quantity=0")

  dw_1.Filter()

  dw_1.InsertRow()

  这时PrimaryBuffer的状态为:

  在FilterBuffer中的记录为:

  用户在新插入行中输入数据,删除了第3行数据,并修改了第2行数据。当他离开这个DataWindow时,Primary和Delete缓冲区的状态如下:

  这时执行dw_1.update()函数,系统将基于这两个缓冲区生成SQL语句。

  在PrimaryBuffer中,状态为NotModified和New!的行将被忽略而不产生SQL语句。状态为DataModified的行将产生UPDATE语句,状态为NewModified的行将产生INSERT语句,在Delete缓冲区中的行将产生DELETE语句。

四个缓冲区在编程中的运用

  某些DataWindow控件的函数有指定DataWindow缓冲区的功能。如果缺省,则表示Primary缓冲区。下列是可以指定缓冲区的函数:

  ?GetItemStatus()

  ?GetNextModified()

  ?GetUpdateStatus()

  ?SetItemStatus()

  此外还有GetItem…系列的函数,用以查询DataWindow中的值。

这些函数有:

  ?GetItemDate()

  ?GetItemDataTime()

  ?GetItemDecimal()

  ?GetItemNumber()

  ?GetItemString()

  ?GetItemTime()

  GetItem…系列函数也可以指定缓冲区,而且可以允许您指定查询的是当前值还是原始值(最初从数据库中查到的值)。

如:

  dw_1.GetItemString(1,"name",Primary!,TRUE)

  使用DataWindow的Reset()函数和Retrieve()函数以及改变DataObject属性时,系统将重置这几个缓冲区。

  当用户插入一个新行时,编程者往往要自动在新插入行中的某些列中插入一些缺省的数据值。这时,用户并没有对数据作任何修改。可是在用户要关闭这一窗口时,如果在CloseQuery事件中用ModifiedCount()函数查看数据是否修改,得到的结果显然是有所改变。用户将得到一个提示信息框:"是否打算保存所作的修改?是/否/取消"———这显然是不适合的:而且如果用户选择的是保存时,这些原应是空记录的行也成为了有内容的行,系统将其形成SQL的INSERT语句提交数据库,这样的结果更为恶劣。为改变这一状况,我们可以用SetItemStatus()函数将该行的状态改为New!。即当有新行插入并且设置了缺省值之后,该行的状态值为New!。下面的程序就可以得到如上的功能。

  ∥Insertanewrowindw_1

  long1_Row

  1_Row=dw_1,InsertRow(dw_1,GetRow())

  dw_1,SetItem(1_Row,"discount_pct",0,10)

  ∥SetthrowstatustoNew!sothattheCloseQuerycheckwillonlydete

ctuserentries.

  dw_1.SetItemStatus(1_Row,0,Primary!,New!)

  使用SetItemStatus函数时有一些状态转换的限制,下表中显示的是将原来的状态改变为另一状态时,会产生的影响。若表中为No,则说明用这一函数进行这样的设置无效;若表中给出了不同的状态,则该状态是对您指定的状态的替代。

  当一个状态的改变不能允许时,可以多次调用SetItemStatus以得到期望的状态。例如,从New!状态不能改成NotModified!状态,可将其改成DataModified!状态,然后再改成NotModified!状态。


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台