DataWindow的数据缓冲区
张健姿 01-6-22 下午 03:14:44
DATAWINDOW的四个缓站区 在PowerBuilder中,DataWindow是用户前端用来存储、操纵数据的对象。在每一个DataWindow对象中有4个二维表作为数据缓冲区,用来存储查询到的数据。用户在DataWindow中对数据处理系统内部的操作实际上都是将数据在这几个缓冲区中进行的修正和挪动,最后在用户提交数据库时,系统依据这四个缓冲区中的信息构成SQL的IN-SERT,UPDATE,DELETE等语句。这四个缓冲区是: Primary Buffer 这个缓冲区是存放填充窗口中DataWindow控件中数据的,调用DataWindow的Retrieve()函数和InsertRow()函数可以将数据填入这个缓冲区中。当使用有关DataWindow删除和过滤函数时,相应记录将从这一缓冲区中删除。而在执行DataWindow的Update()函数时,PowerBuilder将查看这一缓冲区中的记录,以构成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缓冲区和Original缓冲进行操作,而且当调用Update()时也将惹起系统错误。 数据缓冲区的形状值 Primary Buffer和Delete Buffer都有行级和列级的形状值,这个形状值是一个枚举类型。在提交时由该行的形状值来决定能否要产生SQL语句,其中Primary Buffer产生的是IN-SERT和UPDATE语句,而Delete Buffer产生的是DELETE语句。我们用GetItemStatus()函数和SetItemStatus()函数可以对这一形状值作操纵。这一枚举形状有以下四种: ·NotModified!———该行或行的值为查询所得,没有发生改变。 ·DataModified!———该行或列的值为查询所得,发生了改变。 ·New!———该行或列为一插入的新行,数据没有发生改变(数据为空或缺省值)。 ·NewModified!———该行或列为一插入的新行,数据发生改变。改变是通过用户键盘输入或调用了SetItem()函数。 让我们来看下面这一实例: 我们有这样一张表,表中有三个字段,其中ITEM是主键。 ITEM CHAR(5); NAME CHAR(20); QUANTITY INT。 在Script中我们查询这张表的记录,得到以下这些信息存储了在Primary和Origianal Buffer中,其中的行号是缓冲区加上的。!TB 01175000.gif 在窗口中,我们编程过滤掉数量为0的行,并且加上一个空行: dw_1.SetFilter("quantity=0") dw_1.Filter() dw_1.InsertRow() 这时Primary Buffer的形状为:!TB 01175001.gif 在Filter Buffer中的记录为:!TB 01175002.gif 用户在新插入行中输入数据,删除了第3行数据,并修正了第2行数据。当他离开这个DataWindow时,Primary和Delete缓冲区的形状如下:!TB 01175003.gif 这时执行dw_1.update()函数,系统将基于这两个缓冲区生成SQL语句。!TB 01175004.gif 在Primary Buffer中,形状为NotModified和New!的即将被忽略而不产生SQL语句。形状为DataModified的即将产生UPDATE语句,形状为NewModified的即将产生INSERT语句,在Delete缓冲区中的即将产生DELETE语句。 四个缓冲区在编程中的运用 某些DataWindow控件的函数有指定DataWindow缓冲区的功用。如果缺省,则表示Primary缓冲区。下列是可以指定缓冲区的函数: ·GetItemStatus() ·GetNextModified() ·GetUpdateStatus() ·SetItemStatus() 此外还有GetItem…系列的函数,用以查询DataWindow中的值。这些函数有: ·GetItemDate() ·GetItemDataTime() ·GetItemDecimal() ·GetItemNumber() ·GetItemString() ·GetItemTime()