2016-10-04 4 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 записи для John Edwards

Впоследствии, когда я пишу это имя клиента в поле поиска, я хотел бы, чтобы все эти строки отображались на DBGrid, а любая другая строка, которая не содержит это имя в столбце номер 4, чтобы исчезнуть

Если вы используете приведенный выше пример, как только я напишу Джон Эдвардс в поле поиска, я должен увидеть только эти 2 строки на DBGrid

Как только я очищу поле поиска от того, что я написал, DBGrid должен вернуться в исходное состояние и отобразить все, как это было до поиска.

Любая идея, как это сделать? Я понятия не имею, потому что я довольно новичок в Delphi и ищет как здесь, так и на Google не придумал ничего полезного/ничего, с чем я могу работать.

Я был бы признателен за любую помощь, спасибо большое!

+0

Сколько записей? –

+0

Что вы подразумеваете под записями? Извините, не родной английский, и я не хочу путать то, о чем вы говорите, так что будьте более конкретными, спасибо – Petzy

+0

Количество записей, которые находятся в таблице, которую вы хотите отфильтровать? –

ответ

1

Если вы имеете дело с небольшим количеством строк, возвращаемых вашим SQL SELECT, вы можете использовать TDataSet.Filter и TDataSet.Filtered. Вы можете получить вход из любой точки, например, простой старый TEdit.

Поскольку вы не размещаете никаких подробностей (таких как элементы управления БД, которые вы используете, версия Delphi, любой код, который дает имена переменных или что-то еще), вот очень общий пример, который может помочь. Я вызываю запрос, прикрепленный к DBGrid Qry, потому что понятия не имею, что еще назвать его на основе того, что вы опубликовали. FilterRecordsButton и ClearFilterButton являются TButtons, а SearchEdit - это TEdit. Не стесняйтесь использовать любой элемент управления, который хотите переключить фильтр, или получить вход от пользователя.

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; 

Если вы имеете дело с большим количеством строк (SELECT * FROM MyTable без WHERE, который возвращает несколько сотен тысяч строк, к примеру), то производительность, если Filtered не может быть приемлемым. В этом случае вам лучше просто добавить соответствующее предложение WHERE к вашему SELECT и повторно открыть запрос, чтобы отображать только соответствующие строки. Конечно, вы никогда не должны делать SELECT без WHERE, поэтому вам не нужно будет этого делать.:-)

+0

Операция не разрешена для однонаправленного набора данных. - Это мой db, чтобы обвинить правильно? Что именно я должен изменить? Я заметил ссылку при чтении документации для фильтров раньше – Petzy

+0

Я использую RAD Studio Seattle и dbexpress. Использование TSQLQuery, TSimpleDataSet, TDataSource, TSQLConnection. По-видимому, компоненты dbexpress являются однонаправленными, даже TSimpleDataSet - мне нужно изменить DataSet для этого DBGrid, правильно? – Petzy

+0

TDataSource не является однонаправленным. TSQLQuery есть, AFAIK (я никогда не использую его). Если вы присоедините запрос к DBGrid, было бы бесполезно использовать однонаправленный набор данных; если бы вы могли прокручивать вниз в сетке и никогда не прокручивать назад, это не очень полезный интерфейс. :-) Почему вы не используете FireDAC? –