运行此代码时出现erro msg“表达式中的类型不匹配”:
CDSIndicados.Filtered := False;
CDSIndicados.Filter := 'EDICOES_ID like ' + QuotedStr(IntToStr(Integer(cxComboBox1.Properties.Items.Objects[cxComboBox1.ItemIndex])));
CDSIndicados.Filtered := True;
我知道当字段的数据类型出错时,可能会出现此消息。但我无法解决。是吗?
答案 0 :(得分:6)
我怀疑您的EDICOES_ID
字段是整数值,在这种情况下,您不需要在过滤器表达式中引用它,并且不支持LIKE
运算符AFAIK。如果它是字符串字段,则需要引号并且支持LIKE
,但您通常也希望表达式中包含通配符。 ( LIKE 仅支持字符(字符串)类型字段。对于数字或日期,您需要使用通常的比较运算符>,<,> =,< =, = 或 BETWEEN 。)
也帮自己一个忙,并声明一个局部变量,并确保在尝试访问ComboBox
之前,Objects
中确实选择了一个项目。我为ItemIndex
添加了一个,并为你要检索的类型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;