0

次のコードを実行すると、「式の型が一致しません」というエラー メッセージが表示されます。

CDSIndicados.Filtered := False;
CDSIndicados.Filter   := 'EDICOES_ID like ' + QuotedStr(IntToStr(Integer(cxComboBox1.Properties.Items.Objects[cxComboBox1.ItemIndex])));
CDSIndicados.Filtered := True;

フィールドのデータ型にエラーがあると、このメッセージが表示されることがあります。しかし、私は修正できませんでした。あれでしたか。

4

1 に答える 1

6

EDICOES_IDフィールドが整数値であると思われます。その場合、フィルター式でそれを引用する必要LIKEはなく、演算子はAFAIKでサポートされていません。文字列フィールドの場合、引用符が必要LIKEでサポートされていますが、通常は式にワイルドカードも必要です。( LIKEは、文字 (文字列) タイプのフィールドでのみサポートされています。数値または日付の場合は、通常の比較演算子>、<、>=、<=、=またはBETWEENを使用する必要があります。)

自分自身にも好意を持って、ローカル変数を宣言し、ComboBoxその にアクセスしようとする前に、 で実際に項目が選択されていることを確認してくださいObjectsItemIndex取得する型キャストの中間ストレージと中間ストレージの両方に 1 つ追加しましたObject。これにより、必要に応じてデバッグがはるかに簡単になります。

どちらの方法でも解決策があります (整数フィールドであるか、引用符が必要な文字列であるかに関係なく)。

var
  Idx, Value: Integer;
begin
  Idx := ComboBox1.ItemIndex;
  if Idx > -1 then
  begin
    CDSIndicados.Filtered := False;
    Value := Integer(cxComboBox1.Properties.Items.Objects[Idx]);

    // If the field is an integer, you don't need a quoted value,
    // and LIKE isn't supported in the filter.
    CDSIndicados.Filter   := 'EDICOES_ID = ' +  IntToStr(Value);

    // Not relevant here, but LIKE isn't supported for date values
    // either. For those, use something like this
    CDSIndicados.Filter := 'EDICOES_DATE = ' + QuotedStr(DateToStr(Value));

    // or, if the field is string and you want LIKE, you need to
    // quote the value and include a wildcard inside that quoted 
    // string.
    CDSIndicados.Filter := 'EDICOES_ID LIKE ' + QuotedStr(IntToStr(Value) + '%');
    CDSIndicados.Filtered := True;
  end;
end;
于 2013-05-27T22:22:25.753 に答える