登录注册
上海交通大学论坛 > 数据库 > 浏览当前帖子 手机版 关闭左侧栏
DataWindow的数据缓冲区
返回本版】  【发表帖子】  【回复帖子 浏览量  9212      回帖数 0
jaying    等级  

楼主 发表于  2012/5/31 18:05:46    编 辑   


 
  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!状态。 
1
表情
所有内容均为会员自愿发表,并不代表本站立场.
论坛帮助 会员认证删帖申请 联系我们