2013-08-10 3 views
1

나는 클라이언트 테이블을 가지고 있으며 필드/항목이 EdtSearch의 사용자 유형에 관계없이 문자열 유형 인 경우 런타임에 콤보 상자 구성 요소에 포함 된 모든 테이블 필드를 사용자가 선택한 필드에서 필터링하려고합니다. 사용자가 파이어 버드 정수 auto_inc 필드 가져 오기 예외 ID를 선택한 경우 그러나 필터 작업을 텍스트 :정수 필드의 필터

Exception class EVariantTypeCastError with message 'Could not convert variant of type (OleStr) into type (Boolean)'. 

코드 : 정수 필드 감사의에 필터 작업을 얻을 수있는 적절한 방법을 무엇

procedure Tfrm_Personnes.EdtSearchChange(Sender: TObject); 
var 
    Pattern: string; 
begin 
    if CbxSearchOptions.Text = 'Commence' then Pattern := QuotedStr(EdtSearch.Text +  '*'); 
    if CbxSearchOptions.Text = 'Contient' then Pattern := QuotedStr('*' + EdtSearch.Text + '*'); 
    with TClientDataSet(dts_Tableau_Personnes.DataSet) do 
    begin 
    if EdtSearch.Text <> EmptyStr then 
    begin 
     Filter := DisplayToOriginName(dts_Tableau_Personnes, CbxField.Text)+' = ' +  Pattern; 
     Filtered := True; 
    end else 
     Filtered := False; 
    end; 
end; 

function DisplayToOriginName(DataSource: TDataSource; DisplayName: string): string; 
var 
    I: Integer; 
begin 
    with TClientDataSet(DataSource.DataSet) do 
    for I := 0 to FieldCount - 1 do 
    begin 
    if SameStr(Fields[i].DisplayName, DisplayName) then 
     Result := Fields[i].FieldName; 
    end; 
end; 

이벤트를 검색하고 각 레코드의 데이터 세트에 의해 생성

OnFilterRecord 이벤트 기록 여부를 결정하는 기준에 의해 매개 변수를 수락했다 :3210

+3

OnFilterRecord 이벤트에 대해 알고 있습니까? 그것은 당신에게 필터 문자열보다 더 많은 통제력을 줄 것입니다. –

+0

Uwe Raabe는 내가 여기에 물어보기 전에 검색을 해보지 만, OnFilterRecord 이벤트에 아무런 언급이 없다. 계산 된 필드 asString을 추가하고 솔루션을 필터링하면 솔루션이 나를 설득하지 못했다고 말했다. –

+1

당신은 또한 숫자 필드에'LIKE' 와일드 카드를 사용할 수 없다는 것을 알고 있습니까? ('LIKE 1 *'을 필터링하려고 시도해도 아무런 의미가 없지만 유효한 SQL이나 필터 조건이 아닙니다.) –

답변

1

가장 좋은 방법은 문서에서 OnFilterRecord 이벤트를 사용하는 것입니다 (예 : DBGride에 포함) 그렇지 않으면 와일드 카드 문자 및 기타 필터 메서드 기능을 사용할 수 없음

ClientDataSet이 이미 필터링 된 경우 속성을 False로 변경 한 다음 orde에서 True로 변경해야합니다 r 필터를 제대로 작동하게하십시오.

procedure Tfrm_Personnes.EdtSearchChange(Sender: TObject); 
begin 
    MyClientDataSet.Filtered := False; 
    MyClientDataSet.Filtered := True; 
end; 

procedure TDM_Tableau.cds_ClientsFilterRecord(DataSet: TDataSet; 
    var Accept: Boolean); 
var 
    s, SubStr: string; 
begin 
    s := DataSet.FieldByName('ID_ClIENT').AsString; 
    SubStr := frm_Clients.EdtSearch.Text; 
    Accept := Pos(SubStr ,s) > 0; 
end; 
관련 문제