一.Filter的使用:
函数作用:为DataWindow或者DataStore指定数据过滤规则。通常在调用该函数前使用函数Retrieve将数据检索到客户端,该函数可以决定检索到客户端的这些数据哪些可以显示,哪些不能显示。该函数对客户端的数据进行操作,和后台数据库没有任何关系。在设置完过滤规则后使用函数Retrieve检索数据是不合理的,每次设置过滤规则后都检索数据,这样的执行效率很低。需要注意的是,该函数仅仅是设置过滤规则,并不进行过滤。函数Filter是进行过滤的,使用最近设置好的过滤规则对数据进行过滤。 |
FILTER()函数过滤和清除过滤方法如下:
dw.setfilter(" name = 'lily' ") //过滤中如果有字符串,需要加单引号
dw.filter() // 查找名字叫lily的数据
dw.setfilter("")
dw.filter() //取消过虑
如果有多个过滤条件 ,可通过and连接起来一起执行:
string DWfilter2
DWfilter2 = "cust_qty > 100 and cust_code >30"
dw_Employee.SetFilter(DWfilter2)
dw_Employee.Filter( )
二.DataStore不可视数据窗口
Datastore是PB中不可视的数据窗口控制,除此以外与数据窗口相比各个方面都极其相似。
由于datastore具有对数据的交互操作,所以用它来代替在程序中经常使用的游标Cursors. 使用datastore检索数据比游标的速度快,
并对数据的分组变得容易,提高比较高级的过滤功能,在程序中不需要变量也可以访问数据,
并且在PB中使编码变得相对简单。
String ls_cust_code,ls_customer_name,ls_address
long ll_row,ll_row_count
datastore lds_dstastore
lds_datastore = CREATE datastore
lds_datastore.dataobject = "dw_customers" //dw_customers为已经存在的数据窗口对象
lds_datastore.settransobject(sqlca)
lds_datastore.retrieve()
ll_row_count = lds_datastore.rowcount()
FOR ll_row = 1 to ll_row_count
ls_cust_code = lds_datastore.getitemstring(ll_row,"cust_id")
ls_customer_name = lds_datastore.getitemstring(ll_row,"cust_name")
ls_address = lds_datastore.getitemstring(ll_row,"cust_address")
NEXT DESTROY lds_datastore //释放定义的数据存储
一个调用datastore显示数据的示例:
datastore ds_demo //声明
ds_demo= create datastore //实例化
ds_demo.dataobject = "d_demo" // d_demo为已存在数据对象
ds_demo.settransobject(sqlca)
ds_demo.retrieve()
dw_1.dataobject = ds_demo.dataobject // 为可见数据窗口dw_1传递数据
ds_demo.sharedata(dw_1) //
三.三者之间的关系:
数据窗口是可见的;
DataStore是一种不可见的数据窗口;
Filter是数据窗口的过滤设置;
BUG:!!!
一个有趣的现象是:当DataStore设置了数据窗口后,在代码中编写Filter函数过滤条件,会发现数据窗口和DataStore的数据是不同步的!向这样:
单个数据窗口 dw_department中的数据是经过过滤的数据;
但是lds_place即DataStore的数据确实未经过过滤的;这很诡异
勉强的解释是:数据窗口中没有过滤条件,但是如果在代码中写了Filter过滤条件的话,只对数据窗口有效,而对DataStore无效。只有在创建数据窗口之初设置了过滤,或者重新在数据窗口上添加了过滤,才奏效。
dw_department.SetFilter("deptid='1'")
dw_department.Filter()
//如果要动态添加目录树,那么需要将数据窗口和数据存储相关联
treeviewitem ltvi_data //定义一个树形视图变量
datastore lds_place //定义第一个数据存储
int i,li_num_place //定义循环的次数,就是数据的条数
long handle //插入后返回的句柄
lds_place=create datastore //将数据存储与数据窗口对象关联
lds_place.dataobject="dw_department"
lds_place.settransobject(sqlca)
li_num_place=lds_place.retrieve() //检索数据 在此处赋值动态where索引参数
Messagebox("条数",li_num_place)
for i=1 to li_num_place //循环插入第一层节点数据
ltvi_data.label=lds_place.getitemstring(i,"DeptName") //为树形视图标签赋值
ltvi_data.data=lds_place.getitemstring(i,"DeptName") //为树形视图DATA变量(ANY类型)定义一个想保存的数据
//ltvi_data.pictureindex=1 //定义图片索引
//ltvi_data.selectedpictureindex=2 //定义选中图标
ltvi_data.children=true //指定该节点仍有下级孩子节点
handle=tv_department.insertitemlast( 0, ltvi_data) //插入节点
next
destroy lds_place //释放定义的数据存储