2013-05-27 65 views
0

的埃羅味精「的表達式類型不匹配」的出現,當我運行這段代碼:如何避免「類型不匹配的表達」,在ClientDataSet的過濾

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

我知道什麼時候有一個錯誤,可能會出現此消息字段的數據類型。但我無法修復。是它嗎?

+0

如果我正在調試這個,我首先檢查什麼值分配給CDSIndicados.Filter,然後我開始推理。 –

+0

難道你不能只是將這個錯誤追溯到dbcommon.pas來得到這個想法是什麼實際的原因? – vavan

回答

6

我懷疑EDICOES_ID字段是一個整數值,在這種情況下,您不需要在您的過濾器表達式中引用它,並且不支持LIKE運算符AFAIK。如果它是一個字符串字段,則確實需要引號並支持LIKE,但您通常還需要在表達式中使用通配符。 (LIKE僅支持字符(串)類型字段。對於NUMERICS或日期,則需要使用通常的比較運算符>,<,> =,< =,=BETWEEN。)

也請自己幫忙,並聲明一個本地變量,並確保在嘗試訪問其Objects之前在ComboBox中選擇了一個項目。我已經爲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; 
+0

感謝您的提示。我已經確定在ComboBox中選擇了一個項目。 我提出了建議的更改,問題仍然存在。 也許該字段的數據類型在某個地方是錯誤的,我會繼續尋找我的錯誤。 – fmmatheus

+0

Ken在這裏描述的問題是,您可能在過濾器中使用了引用的整數值(通過使用'QuotedStr')。整數值不喜歡那樣。 [+1] – TLama

+0

是的,我糾正了這個錯誤。但「表達式中的類型不匹配」消息不斷出現。 – fmmatheus

相關問題