1、过滤实现的前提条件:uses EhlibADO, EhlibBDE 等 ….
要实现 DBGridEh 的自动过滤,必须先添加 Ehlib 的几个相关 unit 到你的 project 中,如果你使用的
是 ADO 连接数据库,请在工程任一 unit 的 uses 列表中添加 EhlibADO,如果使用的是 BDE,请添加
EhlibBDE,其他可能添加的还有:EhlibCDS、EhlibDBX、EhlibIBX、EhlibMTE;
2、启用过滤,显示过滤行:DBGridEh.STFilter.Visible := True
DBGridEh 默认不显示过滤行,设置 STFilter.Visible 为 True 过滤行就显示出来了。
3、选择:客户端还是服务器端过滤?DBGridEh.STFilter.Local = True|False
这一步很主要。客户端过滤也就是 Query 自身的过滤功能,在内存中过滤,不会到服务器端去查询,优
点是实现简单,过滤速度快,缺点就是只能获得本地更新的数据,其他用户新增和修改的数据无法实时反
映出来。
DBGridEh 服务器端过滤的实现方式是“拼凑”SQL 语句。在过滤之前,DBGridEh 绑定的 Query 的
SQL 语句必须含有 DBGridEh 指定的一个过滤标记,该过滤标记默认为 /*Filter*/,其必须在 SQL 任一
行的行首,当用户输入过滤值时,EhLib 生成过滤条件,并且用此条件替换过滤标记之后的内容,然后将
新的 SQL 语句发送到数据库端去执行,获得的即为过滤后的数据。
具体应该使用哪种过滤方式,需根据实际要求选用。
4、客户端过滤(本地过滤)的实现:DBGridEh.STFilter.Local := True
客户端过滤实现比较简单,而且容易理解,设置 Local 为 True,过滤功能就 OK 了。
5、服务器端过滤的实现:DBGridEh.STFilter.Local := False
服务器端过滤需设置 Local 为 False,然后剩下的就是 SQL 语句,SQL 一般为以下样式:
AdoQuery.SQL.Text := 'SELECT * FROM Students WHERE ' + #13 +'/*Filter*/1=1';
以上代码生成的 SQL 在 SQL Server 等支持 /* 注释的数据库中会非常正确的执行,但在 Access 中就
会出错,解决方案也很简单,更改 DBGridEh 的过滤标记即可:
DBUtilsEh.SQLFilterMarker :=6 '(1>0)AND';
那么 Query 的 SQL 应该为以下:
AdoQuery.SQL.Text := 'SELECT * FROM Students WHERE ' + #13 + '(1>0)AND 1=1';
服务器端过滤也 OK 了!
注:如果你使用的是 Delphi 2007,你可能会发现当你完全无误按以上设置后,服务器端过滤功能还是
无效,这是由于 Ehlib DBUtilsEh 单元的一处 Bug 造成的,此 Bug 产生的原因请查看该文:EhLib 4.1
在 Delphi 2007 下无法过滤和排序的问题 。(本示例代码中包含了修正过的 DBUtilsEh,请到 Delphi
盒子下载)
6、过滤行下拉列表的实现:Column.STFilter.ListSource、ListField、KeyField
评论10