2016-10-04 9 views
0

그래, 데이터베이스의 데이터를 표시하는 DBGrid를 사용하고 있습니다.DBGrid에서 데이터를 검색하고 해당 DBGrid가 표시하는 내용을 일시적으로 변경하는 검색 추가 - Delphi

데이터베이스에는 11 개의 열이 포함 된 테이블이 있습니다. 열 번호 4는 고객 이름이라고하며 고객 이름을 포함합니다.

내가 원하는 클라이언트 이름으로 쓸 검색 상자 (Google 검색 표시 줄과 유사)를 원합니다. 일단 DBGrid를 변경하고 4 번째 클라이언트 이름이 포함 된 행만 표시하면 컬럼 (컬럼 고객 이름)

예 :

Column names: 

column1 - column2 - column3 - customer name - column5 - column6 - column7 - column8 - column9 - column10 - column11 
blabla blabla blabla John Edwards blabla blabla blabla blabla blabla blabla  blabla 
blabla1 blabla1 blabla1 Michael Skunk blabla blabla blabla blabla blabla blabla  blabla 
blabla2 blabla2 blabla2 John Edwards blabla2 blabla2 blabla2 blabla2 blabla2 blabla2 blabla2 

등등 .. 행을 많이, 모든 열에서 서로 다른 정보를 가진 모든. 어느 시점에서 나머지 데이터베이스 열에도 다른 정보가 있지만 열 번호 4 (고객 이름 열)의 동일한 클라이언트 이름을 갖습니다.

예를 들어, 제가 이미 보았 듯이 2 entries for John Edwards

검색 필드에 해당 고객 이름을 쓸 때 DBGrid에 표시하려는 모든 행을 열 번호 4에 포함되지 않은 다른 행이 사라질 때까지

위의 예제를 사용하는 경우 검색 필드에 John Edwards를 쓰면 DBGrid에서이 두 행만 표시되어야합니다.

일단 내가 작성한 검색 필드를 지우면 DBGrid는 초기 상태로 돌아가서 검색하기 전과 같이 모든 것을 표시해야합니다.

어떻게하면 좋을까요? 오히려 델파이에 익숙하지 않고 여기와 Google에서 검색 할 수있는 유용한 정보가 없기 때문에 단서가 없습니다.

감사합니다. 많은 도움을 주셔서 감사합니다.

+0

몇 개의 레코드가 있습니까? –

+0

레코드 란 무엇을 의미합니까? 미안 네이티브 영어와 나는 당신도 너무, 더 구체적으로 참조하십시오 혼동하고 싶지 않아요 – Petzy

+0

필터링하려는 테이블에있는 레코드의 개수? –

답변

1

SQL SELECT로 반환되는 행 수가 적다면 TDataSet.FilterTDataSet.Filtered을 사용할 수 있습니다. 평범한 구식 TEdit과 같이 어디서나 원하는 정보를 얻을 수 있습니다.

사용하고있는 DB 컨트롤, 델파이 버전, 변수 이름을 제공하는 코드 또는 그 밖의 다른 세부 정보를 게시하지 않았으므로 여기에 매우 일반적인 샘플이 있습니다. DBGrid에 연결된 쿼리를 Qry이라고 부르는데, 게시 한 내용을 기반으로 다른 어떤 호출을해야할지 모르기 때문입니다. FilterRecordsButtonClearFilterButton은 TButtons이고 SearchEditTEdit입니다. 필터를 토글하거나 사용자가 입력 할 컨트롤을 자유롭게 사용하십시오.

procedure TForm1.FilterRecordsButtonClick(Sender: TObject); 
begin 
    if SearchEdit.Text <> '' then 
    begin 
    { 
    The brackets around the column name are required because you've got 
    spaces in the name; they're also needed if your column name is a 
    reserved word. QuotedStr puts the necessary quote characters around 
    the value. 
    } 
    Qry.Filter := '[Customer Name] = ' + QuotedStr(SearchEdit.Text); 
    Qry.Filtered := True; 
    Qry.First; 
    FilterRecordsButton.Enabled := False; 
    ClearFilterButton.Enabled := True; 
    end; 
end; 

procedure TForm1.ClearFilterButtonClick(Sender: TObject); 
begin 
    Qry.Filtered := False; 
    Qry.Filter := ''; 
    Qry.First; 
    ClearFilterButton.Enabled := False; 
    FilterRecordsButton.Enabled := True; 
end; 

당신이 (예를 들어, 천 몇 백 행을 반환하는 WHERE없이 SELECT * FROM MyTable) 많은 수의 행을 처리하는 경우, 다음 Filtered 허용 성능하지 않을 경우. 이 경우 적절한 WHERE 절을 SELECT에 추가하고 쿼리를 다시 열어 관련 행만 표시하는 것이 좋습니다. 물론 WHERE없이 SELECT을 수행하면 안되므로 그렇게하지 않아도됩니다.:-)

+0

단방향 데이터 세트에서 조작이 허용되지 않습니다. - 비난 하는게 내 데이터베이스 야? 정확히 무엇을 바꾸어야합니까? 이전에 필터에 대한 설명서를 읽는 동안 참조를 알았습니다. – Petzy

+0

RAD Studio Seattle 및 dbexpress를 사용하고 있습니다. TSQLQuery, TSimpleDataSet, TDataSource, TSQLConnection 사용하기. 분명히 dbexpress 구성 요소는 단방향입니다. TSimpleDataSet조차도 - DBGrid의 DataSet을 변경해야합니다. 맞습니까? – Petzy

+0

TDataSource가 단방향이 아닙니다. TSQLQuery는 AFAIK입니다 (사용하지 않았습니다). 쿼리를 DBGrid에 연결하는 경우 단방향 데이터 셋을 사용하는 것은 꽤 쓸모가 없습니다. 그리드에서 아래로 스크롤하고 스크롤하지 않으면 매우 유용한 UI는 아닙니다. 왜 FireDAC을 대신 사용하지 않습니까? –