Database 版 (精华区)

发信人: pine.bbs@sun20.nuaa.edu.cn (杆杆), 信区: cndatabase
标  题: [转载] DataWindow的数据缓冲区
发信站: nuaabbs (Fri Apr 17 19:10:38 1998)
转信站: Lilac!ustcnews!nuaabbs

【 以下文字转载自 Program 讨论区 】
【 原文由 pipishi.bbs@bbs.nju.edu.cn 所发表 】
  DATAWINDOW的四个缓站区
    在PowerBuilder中,DataWindow是用户前端用来存储、操纵数据
的对象。在每一个Data Window对象中有4个二维表作为数据缓冲区,
用来存储查询到的数据。用户在DataWindow中对数据处理系统内部的
操作实际上都是将数据在这几个缓冲区中进行的修改和移动,最后在
用户提交数据库时,系统根据这四个缓冲区中的信息形成SQL的IN-SER
T,UPDATE,DELETE等语句。这四个缓冲区是:

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

    Delete Buffer
    这个缓冲区保存的是用DeleteRow()函数从Primary Buffer中删
除的记录,执行Update( )函数时,系统根据这一缓冲区的记录形成DEL
ETE语句。
    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所提供的Get
Item…系列的函数可以读出DataWindow最初从数据库中查到的原始值
。通过这些函数我们可以编程实现所谓的"Undo"功能,并且得到在使
用乐观锁时形成提交数据库的WHERE子句。
    如果您当前使用的DataWindow没有设置修改的权力,您将不能对D
elete缓冲区和Origin al缓冲进行操作,而且当调用Update()时也将
引起系统错误。
    数据缓冲区的状态值
    Primary Buffer和Delete Buffer都有行级和列级的状态值,这个
状态值是一个枚举类型。在提交时由该行的状态值来决定是否要产生
SQL语句,其中Primary Buffer产生的是IN-SE RT和UPDATE语句,而Del
ete Buffer产生的是DELETE语句。我们用GetItemStatus()函数和Se 
tItemStatus()函数可以对这一状态值作操纵。这一枚举状态有以下
四种:
    ·NotModified!———该行或行的值为查询所得,没有发生改变

    ·DataModified!———该行或列的值为查询所得,发生了改变。
    ·New!———该行或列为一插入的新行,数据没有发生改变(数据
为空或缺省值)。
    ·NewModified!———该行或列为一插入的新行,数据发生改变
。改变是通过用户键盘输入或调用了SetItem()函数。
    让我们来看下面这一实例:
    我们有这样一张表,表中有三个字段,其中ITEM是主键。
    ITEM CHAR(5);
    NAME CHAR(20);
    QUANTITY INT。
    在Script中我们查询这张表的记录,得到以下这些信息存储了在P
rimary和OrigianalBu ffer中,其中的行号是缓冲区加上的。
表1
    在窗口中,我们编程过滤掉数量为0的行,并且加上一个空行:
    dw_1.SetFilter("quantity=0")
    dw_1.Filter()
    dw_1.InsertRow()
      这时Primary Buffer的状态为:
表2
    在Filter Buffer中的记录为:
表3
    用户在新插入行中输入数据,删除了第3行数据,并修改了第2行数
据。当他离开这个Dat aWindow时,Primary和Delete缓冲区的状态如
下:
表4
    这时执行dw_1.update()函数,系统将基于这两个缓冲区生成SQL
语句。表5
    在Primary Buffer中,状态为NotModified和New!的行将被忽略而
不产生SQL语句。状态为DataModified的行将产生UPDATE语句,状态为
NewModified的行将产生INSERT语句,在Dele te缓冲区中的行将产生D
ELETE语句。

    四个缓冲区在编程中的运用
    某些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()函数以及改变DataO
bject属性时,系统将重置这几个缓冲区。
    当用户插入一个新行时,编程者往往要自动在新插入行中的某些
列中插入一些缺省的数据值。这时,用户并没有对数据作任何修改。
可是在用户要关闭这一窗口时,如果在CloseQu ery事件中用Modified
Count()函数查看数据是否修改,得到的结果显然是有所改变。用户将
得到一个提示信息框:"是否打算保存所作的修改?是/否/取消"———
这显然是不适合的:而且如果用户选择的是保存时,这些原应是空记录
的行也成为了有内容的行,系统将其形成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 detectus er entries.
    dw_1.SetItemStatus(1_Row,0,Primary!,New!)
    使用SetItemStatus函数时有一些状态转换的限制,下表中显示的
是将原来的状态改变为另一状态时,会产生的影响。若表中为No,则说
明用这一函数进行这样的设置无效;若表中给出了不同的状态,则该状
态是对您指定的状态的替代。表6
    当一个状态的改变不能允许时,可以多次调用SetItemStatus以得
到期望的状态。例如, 从New!状态不能改成NotModified!状态,可将
其改成DataModified!状态,然后再改成NotMod ified!状态。

--
※ 来源:.南大小百合信息交换站 bbs.nju.edu.cn.[FROM: hsia.nju.edu.cn]
--
※ 转载:.Top Gun sun20.nuaa.edu.cn.[FROM: 202.119.71.141]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.028毫秒