1

Locate メソッドを使用して TADOTable を検索していますが、複数フィールド検索では機能しません。(TADOTable を直接検索しているため、この場合は SQL には関心がありません)。

次のコードは、単一のフィールドを使用する場合は正常に機能しますが、複数のフィールドでは機能しません!

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        TLocateOptions LOpts;
        LOpts.Clear();
        LOpts << loPartialKey;
        Variant VAR[1];
        VAR[0] = Variant(Edit1->Text);

        try{
          if ( ADOTable1->Locate("CompanyID;Supplier", VAR, LOpts) ){
            // Record found
          }
        }
        catch(...){}
}
4

1 に答える 1

2

内の複数のフィールドの検索は、関数とオプションの を使用して、TADODataSet他の とほとんど同じように行われます。TDataSetLocateTLocateOptions

if ADODataSet1.Locate('CompanyID;Supplier', 
                      VarArrayOf([Edit1.Text, Edit2.Text]), 
                      [loPartialKey]) then
begin
  // Record found
end;

あなたのコメントは、あなたが実際に C++Builder と を使用していることを示しTADOTableているため、同様に機能する例を次に示します (新しい VCL フォーム アプリケーションの C++Builder XE5 でコンパイルおよびテストされています)。

TLocateOptions Opts;
Opts.Clear();
Opts << loPartialKey;

Variant locateValues[2];
locateValues[0] = Variant(Edit1->Text);
locateValues[1] = Variant(Edit2->Text);

if (ADOTable1->Locate("CompanyID;Supplier", VarArrayOf(locateValues, 1), Opts))
{
  // Record found.
};

元の質問に対するあなたのコメントは、実際に必要なのは 2 つの列を検索して、それらのいずれかが値と一致するかどうかを確認することであることを示しています。単一Locateの でそれを行うことはできませんが、複数の呼び出しで行うことができます (Delphi コード - ここにある他のサンプルがあれば、C++ Builder に簡単に変換できるはずです)。もちろん、両方の列が同じデータ型である必要があります。数値フィールドと文字フィールドで同じ数値 (または文字) 値を検索するには、何かを変換する必要があります。

var
  LastName: Variant;
begin
  LastName := Edit1.Text;
  if ADOTable1.Locate('LastName', LastName, [loPartialKey]) or
     ADOTable1.Locate('CompanyName', LastName, [loPartialKey]) then
  begin
    // Record found
  end;

もう 1 つの方法は、Filter(ここでも、Delphi コード - 簡単な C++ Builder 変換) を使用することです。

AdoTable1.Filter := 'LastName = ' + QuotedStr(Edit1.Text) +
                    ' or CompanyName LIKE "' + QuotedStr(Edit1.Text) + '%"';
AdoTable1.Filtered := True;
AdoTable1.First;
// Get key values needed to locate on a full key, and then clear the filter.
于 2014-02-13T16:58:16.757 に答える