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

LocateDataSetで指定された基準に一致する最初のレコードを検索します。
レコードが見つかった場合、そのレコードがアクティブ/現在のレコードになります。
「次の」一致を見つけるために使用することはできません。/でFilter基準を使用することをお勧めします。例:FindFirstFindNext

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で使用可能になります。
次に、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グリッドの各行を検索するため、各行で[OK]ボタンを1回押す必要があります.[OK]を1回クリックすると、コードは次の一致するデータを検索します各行を検索するよりも?

于 2013-03-19T12:56:56.847 に答える