一DATAWINDOW的四个缓站区
在PowerBuilder中DataWindow是用户前端用来存储操纵数据的对象在每一个DataWindow对象中有个二维表作为数据缓沖区用来存储查询到的数据用户在DataWindow中对数据处理系统内部的操作实际上都是将数据在这几个缓沖区中进行的修改和移动最后在用户提交数据库时系统根据这四个缓沖区中的信息形成SQL的INSERTUPDATEDELETE等语句这四个缓沖区是:
1Primary Buffer
这个缓沖区是存放填充窗口中DataWindow控件中数据的调用DataWindow的Retrieve()函数和InsertRow()函数可以将数据填入这个缓沖区中当使用有关DataWindow删除和过滤函数时相应记录将从这一缓沖区中删除而在执行DataWindow的Update()函数时PowerBuilder将查看这一缓沖区中的记录以形成SQL INSERT和UPDATE语句
2Delete Buffer
这个缓沖区保存的是用DeleteRow()函数从Primary Buffer中删除的记录执行Update()函数时系统根据这一缓沖区的记录形成DELETE语句
3Filter Buffer
这个缓沖区存储的是从Original Buffer使用Filter()函数过滤到Primary Buffer中后剩余的记录
4Original Buffer
这一缓沖区存储的是DataWindow最初执行retrieve()函数时得到的全部记录当提交数据库时根据Primary Buffer生成的UPDATE语句和根据Delete Buffer生成的DELETE语句都要依据这一缓沖区来构造这些SQL语句中的Where子句
Original Buffer由PowerBuilder内部维护PowerBuilder所提供的任何函数都无法改变它的值不过通过PowerBuilder所提供的GetItem…系列的函数可以读出DataWindow最初从数据库中查到的原始值通过这些函数我们可以编程实现所谓的Undo功能并且得到在使用乐观锁时形成提交数据库的WHERE子句
如果您当前使用的DataWindow没有设置修改的权力您将不能对Delete缓沖区和Original缓沖进行操作而且当调用Update()时也将引起系统错误
二数据缓沖区的状态值
Primary Buffer和Delete Buffer都有行级和列级的状态值这个状态值是一个枚举类型在提交时由该行的状态值来决定是否要产生SQL语句其中Primary Buffer产生的是INSERT和UPDATE语句而Delete Buffer产生的是DELETE语句我们用GetItemStatus()函数和SetItemStatus()函数可以对这一状态值作操纵这一枚举状态有以下四种:
·NotModified!———该行或行的值为查询所得没有发生改变
·DataModified!———该行或列的值为查询所得发生了改变
·New!———该行或列为一插入的新行数据没有发生改变(数据为空或缺省值)
·NewModified!———该行或列为一插入的新行数据发生改变改变是通过用户键盘输入或调用了SetItem()函数
让我们来看下面这一实例:
我们有这样一张表表中有三个字段其中ITEM是主键
ITEM CHAR();
NAME CHAR();
QUANTITY INT
在Script中我们查询这张表的记录得到以下这些信息存储了在Primary和Origianal Buffer中其中的行号是缓沖区加上的!TB gif
在窗口中我们编程过滤掉数量为的行并且加上一个空行:
dw_SetFilter(quantity=)
dw_Filter()
dw_InsertRow()
这时Primary Buffer的状态为:!TB gif
在Filter Buffer中的记录为:!TB gif
用户在新插入行中输入数据删除了第行数据并修改了第行数据当他离开这个DataWindow时Primary和Delete缓沖区的状态如下:!TB gif
这时执行dw_update()函数系统将基于这两个缓沖区生成SQL语句!TB 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()