0

你好,我今天运行了这段代码,但问题是当字段上有相同的数据时,它不会循环,而只是显示它过滤的第一个数据。这是代码

ADOTable1.First;
if ADOTable1.Locate('Last', Edit1.Text, []) then
begin
  Label1.Caption := ADOTable1.FieldByName('Last').AsString;
  Label2.Caption := ADOTable1.FieldByName('First').AsString;
  Label3.Caption := ADOTable1.FieldByName('address').AsString;
  Next;
end 
else
begin
  Label1.Caption := '';
  Label2.Caption := '';
  Label3.Caption := '';
end;
4

2 回答 2

6

Locate在 DataSet 中找到与指定条件匹配的第一条记录。
如果找到记录,则该记录将成为活动/当前记录。
它不能用于定位“下一个”匹配项。您可能希望将Filter标准与FindFirst/一起使用,FindNext例如:

DataSet.Filter := 'Last = ''' + Edit1.Text + '''';
if DataSet.FindFirst then
begin
  ShowMessage('Found First!');
  while DataSet.FindNext do
  begin
    ShowMessage('Found Next!');
  end;
end;

如果您想过滤所有符合您的条件的记录,只需使用:

DataSet.Filter := 'Last = ''' + Edit1.Text + '''';
DataSet.Filtered := True; // apply filter for the dataset

现在只有那些满足过滤条件的记录在数据集中可用。
然后迭代数据集:

DataSet.First;
while not DataSet.Eof do
begin
  // do something with the record
  DataSet.Next;
end;
于 2013-03-18T16:54:32.270 回答
0

谢谢。昨晚到目前为止得到了这个代码

procedure TMain.Button1Click(Sender: TObject);

begin
ADOTable1.First;
while not ADOTable1.EOF do
begin
if (ADOTable1.FieldByName('Last Name').AsString = edit1.Text)
then begin
Label1.Caption := ADOTable1.FieldByName('Last Name').AsString;
Label2.Caption := ADOTable1.FieldByName('First Name').AsString;
Label3.Caption := ADOTable1.FieldByName('MI').AsString;
end;
ShowMessage('click ok for next profile');
ADOTable1.Next;
end;

它可能与您给出的代码相同,但此代码搜索 db 网格上的每一行,因此每一行让我按一次确定按钮。是否可以单击一次确定,然后代码将搜索下一个匹配数据而不是而不是搜索每一行?

于 2013-03-19T12:56:56.847 回答