PB中的数据窗口和Filter和DataStore

一.Filter的使用:

函数作用:为DataWindow或者DataStore指定数据过滤规则。通常在调用该函数前使用函数Retrieve将数据检索到客户端,该函数可以决定检索到客户端的这些数据哪些可以显示,哪些不能显示。该函数对客户端的数据进行操作,和后台数据库没有任何关系。在设置完过滤规则后使用函数Retrieve检索数据是不合理的,每次设置过滤规则后都检索数据,这样的执行效率很低。需要注意的是,该函数仅仅是设置过滤规则,并不进行过滤。函数Filter是进行过滤的,使用最近设置好的过滤规则对数据进行过滤。
函数语法:integer dwcontrol.SetFilter ( string format )
ldwcontrol:要为其设定过滤规则的DataWindow、DataStore或者下拉子数据窗口控件的名称;
lformat:作为过滤规则的表达式,该表达式的返回值应该是Boolean类型,或者是True、或者是False。如果表达式返回值为Null,则在执行函数Filter时自动弹出对话框让用户指定过滤规则。在表达式中可以使用数据窗口对象函数、列名、列号、数字、字符串等。如果用到了列号,则应该以‘#’开头、后面紧跟数字来表示。多个条件可以使用逻辑运算符进行联结,一个非常良好的习惯是每个条件都应该使用括号。这样既可以保证表达式的清晰,又可以避免一些Bug。后面的代码实例中会讲到。
返 回值:数字类型,1表示执行成功,-1表示执行失败。该函数的返回值没有多大意义,很少在程序中使用该返回值。

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   //释放定义的数据存储

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值