if not table1.Locate('a', "0001"[loCaseInsensitive]) then
    Application.MessageBox ('没有符合条件的运单号!','提示',
                                    MB_ICONWARNING+MB_OK+MB_DEFBUTTON2);我用一个dbgrid 连接到table1上
  table1中加入了过滤条件
  table1.Filter := str;
  table1.Filtered := true;我在查询中录入‘0001’那么只要找到这条记录 DBgrid 就自动跳到这条记录上,‘0001’在数据库中可能有重复记录,但是 DBgrid 中保证只显示一条‘0001’记录现在问题是:查询时有的编号能查到,有的却不行。是不是它找到其它相同编号记录了?可是那些同号的记录已经被过滤掉了啊?

解决方案 »

  1.   

    比如我有2条记录 编号都是 ‘0001’但是在DBgrid中只可能显示一条 ‘0001’(过滤器过滤掉了)现在查询‘0001’可能 dbgrid 却跳到‘0002’记录上是不是过滤器的问题啊????
      

  2.   

    Locate时,相同编号的记录一起查询出来,记录定在第一条上
      

  3.   

    用SQL语句吧,那样,写多少条件都没有那么烦了
      

  4.   

    thatsummer(no reason) 
    那被过滤器过滤掉的记录也会被查出来吗???
      

  5.   

    thatsummer(no reason) 
    我不太明白比如说,现在有三条记录
    a       b
    001     0
    001     1
    002     1
    过滤后剩下
    a       b
    001     1
    002     1
    现在查询  table1.Locate('a', "0001"[loCaseInsensitive]) 
    可是 DBgrid 却指向 002 
    我真晕了!!!
      

  6.   

    明白你的意思了。

      table1.Filtered := false;
      table1.Filter := 001;
      table1.Filtered := true;
    过虑以后,记录变为
    a       b
    002     1
    你这个时候在locate 001
    当然找不到001了,指针指向最后一条记录
      

  7.   

    thatsummer(no reason)
    不是的
      table1.Filtered := false;
      table1.Filter := “b=1”;
      table1.Filtered := true;
    过虑以后,记录变为
    a       b
    001     1
    002     1
      

  8.   

    filter 被数据集应用时,只有那些满足过滤器条件的记录才会被显示to yueyi (看不见北极雪)   是不是你的locate格式写错了
      

  9.   

    楼上
    table1.Locate('a', '001', [loCaseInsensitive]) 这句话有错吗?我照着帮助的格式写的
      

  10.   

    这样就对了function Locate(const KeyFields:string;const 
    KeyValues:Variant;Options:TLocateOptions):Boolean;virtual;第一个参数是要搜索的字段名称,第二个是搜索的数据,第三个是搜索的选项
      

  11.   

    楼上不要这样说嘛!!
    我详细的再说一次一个表
    id       b      dl
    1        001     0
    2        002     1
    3        003     1
    4        001     1用记录集打开后,再加上过滤
      table1.Filtered := false;
      table1.Filter := “dl=1”;
      table1.Filtered := true;
      dbgrid1.datasource = datasource1;
    现在记录为
    id       b      dl
    2        002     1
    3        003     1
    4        001     1用下面的语句定位记录
    table1.Locate('b', "001"[loCaseInsensitive]) 
    可是 dbgrid1 不是指向 
    4        001     1
    而是指向 
    2        002     1   (并不报错)因为locate还是定位到了第一条记录,就好象过滤器不存在一样
    1        001     0
    现在问当有两条‘001’记录,并且过滤掉一个的时候,我怎么定位到现存的‘001’记录???
    说的够明白了吧 !!! 谁能帮我,我再开帖给100分
      

  12.   

    應該是沒找到紀錄,即:locate返回的結果是false. (比如:你第四條紀錄:
    4        001     1 
    如果001後面多一個空格,就找不到)你可以把locate的結果showmessage看看,看是否為true.
    另外,我剛寫了一個小程序測試了一下,locate和filter是沒有沖突的。filtered:=true之後,再locate的話,指針還是定位在filter後的結果集內的。
      

  13.   

    我做測試的小程序也簡單,如下:
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    table1.Filtered:=false;
    table1.Filter:='state=''St. Croix''';
    table1.Filtered:=true;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      table1.Locate('zip','02800',[loCaseInsensitive])
    end;執行結果沒問題
      

  14.   

    你说的情况根本不存在,你到底是使用ADO还是BDE?还是你用的Delphi是盗版软件,我觉得很奇怪,特地帮你验证了一下。你复制粘贴一下我的代码看看,反正我的机器运行正常。
    1.PAS文件:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, Grids, DBGrids, DBTables, StdCtrls;type
      TForm1 = class(TForm)
        Database1: TDatabase;
        Table1: TTable;
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        Button1: TButton;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
      table1.Filtered := false;
      table1.Filter := 'd1=1';
      table1.Filtered := true;
      dbgrid1.datasource := datasource1;end;2.DFM文件:
    object Form1: TForm1
      Left = 192
      Top = 107
      Width = 544
      Height = 375
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object DBGrid1: TDBGrid
        Left = 40
        Top = 120
        Width = 320
        Height = 120
        DataSource = DataSource1
        TabOrder = 0
        TitleFont.Charset = DEFAULT_CHARSET
        TitleFont.Color = clWindowText
        TitleFont.Height = -11
        TitleFont.Name = 'MS Sans Serif'
        TitleFont.Style = []
      end
      object Button1: TButton
        Left = 192
        Top = 264
        Width = 75
        Height = 25
        Caption = 'Button1'
        TabOrder = 1
        OnClick = Button1Click
      end
      object Button2: TButton
        Left = 328
        Top = 288
        Width = 75
        Height = 25
        Caption = 'Button2'
        TabOrder = 2
        OnClick = Button2Click
      end
      object Database1: TDatabase
        Connected = True
        DatabaseName = 'BOOK'
        DriverName = 'MSSQL'
        LoginPrompt = False
        Params.Strings = (
          'DATABASE NAME=book'
          'SERVER NAME=JOEHUANG'
          'USER NAME=sa'
          'OPEN MODE=READ/WRITE'
          'SCHEMA CACHE SIZE=8'
          'BLOB EDIT LOGGING='
          'LANGDRIVER='
          'SQLQRYMODE='
          'SQLPASSTHRU MODE=SHARED AUTOCOMMIT'
          'DATE MODE=0'
          'SCHEMA CACHE TIME=-1'
          'MAX QUERY TIME=300'
          'MAX ROWS=-1'
          'BATCH COUNT=200'
          'ENABLE SCHEMA CACHE=FALSE'
          'SCHEMA CACHE DIR='
          'HOST NAME='
          'APPLICATION NAME='
          'NATIONAL LANG NAME='
          'ENABLE BCD=FALSE'
          'TDS PACKET SIZE=4096'
          'BLOBS TO CACHE=64'
          'BLOB SIZE=32'
          'PASSWORD=whole183')
        SessionName = 'Default'
        Left = 40
        Top = 40
      end
      object Table1: TTable
        Active = True
        DatabaseName = 'BOOK'
        TableName = 'dbo.TestTable'
        Left = 96
        Top = 48
      end
      object DataSource1: TDataSource
        DataSet = Table1
        Left = 168
        Top = 40
      end
    end
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      table1.Locate('b', '001', [loCaseInsensitive])
    end;end.
      

  15.   

    用locate查询,只能查找到第一条符合要求的记录,改用SQL查询吧
      

  16.   

    过滤出来的数据肯定可以用locate定位
      

  17.   

    多谢
    forgot2000(忘记2000年)
    thatsummer(no reason)
    suton(suton)
    和各位朋友帮忙我最后把记录重新排序就可以了,但是过滤出来的数据还是不能用locate定位,可能是我的D6是盗版吧