假如有名字如下:
Abrandy
Alan
.....
Atala
Azyne
Ben
Benny
Bin
Bonny
....
Cindy
用户在TEDIT上键入B,则在TDBGird上列出所有姓名是B的,且,列出姓名是A中的最后俩个(Atala, Azyne)
当用户接着在TEdit键入i,则列出姓名是Bi的,且列出姓名在Bi前的最后俩个 (Ben, Benny)问题一:如何得到符合搜索标准之前的俩个记录?
问题二:不想每按键一次,就去Server上query一下,比如按B了后,Bi已经在客户端了,不应该再去query了谢谢!

解决方案 »

  1.   

    先回答你问题二,因为问题一在问题二的基础上进行的。
    二:一次将所有数据拿到本地数据集中即可。一:在本地数据集中进行如下操作,
    1、首先要排好序,
    2、在当前结果中定位到第一个符合条件的记录
    3、记录下来此记录前的两条记录的值(Atala,Azyne)
    4、使用filter,filter的条件设置为包含此次查询条件及前两条记录(filter='Filed=''A'' or filed=''Atala'' or filed=''Azyne''')
    5、filtered=true即可得到包含B且包含Atala,Azyne的记录当然,以上办法是在数据量不大的情况下进行的(几万条数据以内),若数据量较大的话,只好在数据库中进行了,但思路都是一样的
      

  2.   

    上面有点错误,过滤的第一个条件应该用like 
      

  3.   

    谢谢回复, 但不符合要求一,当然不能把表格的所有名字弄到客户端。
    二,当顾客按B的时候,你可以
    select name from mytable where name > 'B' order by name top 10
    但在B前面的俩个你怎么取?你说的or filed=''Atala'' or filed=''Azyne''')
    你并不知道前俩个记录是Atala和Aryne, 顾客要按的是D呢?你还是Atala?
      

  4.   

    TEdit.OnChange事件里面做查询动作可以么?OnChange的时候模糊查询TEdit.text
      

  5.   

    你数据库里有主键id没有,另外显示的内容用主键来解决select top(2) a.name from 
    (select id from mytable where name > 'B' order by name top 10) as b
    inner join mytable as a on a.id<b.id desc 
    如果要合并显示union就可以了
      

  6.   

    抱歉刚才desc写错了 ,如果要显示最后两个还需要再套一层查询
      

  7.   

    select top(2) a.name from  
    (select id from mytable where name > 'B' order by name top 10) as b
    inner join mytable as a on a.id<b.id order by a.id desc  
      

  8.   

    各位大侠没有更好的办法了么,目前的方法似乎要把SERVER累死: 顾客每按一个键,都要到SERVER上重新QUERY。这似乎是比较常见的应用
      

  9.   

    create table t (s varchar(32))
    go
    insert into t 
    select 'Abrandy' union
    select 'Alan' union
    select 'Amfaf' union
    select 'Anfds' union
    select 'Atala' union
    select 'Azyne' union
    select 'Ben' union
    select 'Benny' union
    select 'Bin' union
    select 'Bonny' union
    select 'Cindy'
    gocreate procedure p (@s varchar(32))
    as
      declare @t table (id int identity(1,1),s varchar(32))
      insert into @t (s) select s from t order by s select top 2 * from @t 
    where id < (select min(id) from @t where substring(s,1,len(@s)) = @s ) order by id descgoexec p 'B'exec p 'Bi'drop procedure pdrop table t
      

  10.   

    如果不想每次都qurey,那就行把全部记录都读下来,再用ado的filter  功能  like 'B%'