Используя Delphi XE2.
Создание программного пакета, который подключается к базе данных через запрос / источник данных.
Я хотел бы реализовать опцию фильтра для записей в таблице, поэтому при нажатии кнопки cxgrid будет отображать записи, которые соответствуют выбранным фильтрам.
Я не могу понять, как это сделать. Любая помощь будет оценена по достоинству.
У меня есть это до сих пор, но я, честно говоря, не знаю, если это близко к тому, чего я пытаюсь достичь.
procedure TFilter.btnClick(Sender: TObject);
begin
with aQry do
begin
SQL.Clear;
Close;
SQL.Text := 'select * from TABLE where record_name like'+QuotedStr(name.Text+'%');
SQL.Text := 'and record_type like '+QuotedStr(type.Text+'%');
SQL.Text := 'and record_type2 like '+QuotedStr(type2.Text+'%');
SQL.Text := 'and record_type3 like '+QuotedStr(type3.Text+'%');
SQL.Text := 'and record_type4 like '+QuotedStr(type4.Text+'%');
Open;
end;
end;
2 ответа
В вашем коде вы создаете недопустимое предложение SQL, потому что вы перезаписываете содержимое SQL каждый раз, когда устанавливается свойство Text
, поэтому вы должны использовать метод Add
для построения предложения SQL. Также вы должны учитывать параметры использования.
Попробуйте следующий пример, который создает и запускает параметризованное предложение SQL в зависимости от значений, введенных в фильтрах (возможно, вам потребуется изменить источник для запуска).
AQry.Close;
AQry.SQL.Clear;
AQry.SQL.Add('select * from TABLE where 1=1');
if name.Text<>'' then
AQry.SQL.Add('and record_name like :record_name');
if Edittype.Text<>'' then
AQry.SQL.Add('and record_type like :record_type');
if type2.Text<>'' then
AQry.SQL.Add('and record_type2 like :record_type2');
if type3.Text<>'' then
AQry.SQL.Add('and record_type3 like :record_type3');
if type4.Text<>'' then
AQry.SQL.Add('and record_type4 like :record_type4');
if name.Text<>'' then
Aqry.Parameters.ParamByName('record_name').Value := name.Text+ '%';
if Edittype.Text<>'' then
Aqry.Parameters.ParamByName('record_type').Value := Edittype.Text+ '%';
if type2.Text<>'' then
Aqry.Parameters.ParamByName('record_type2').Value := type2.Text+ '%';
if type3.Text<>'' then
Aqry.Parameters.ParamByName('record_type3').Value := type3.Text+ '%';
if type4.Text<>'' then
Aqry.Parameters.ParamByName('record_type4').Value := type4.Text+ '%';
AQry.Open;
Вы можете делать все, что хотите, используя свойство фильтра запроса. Сначала выполните запрос, чтобы получить все записи, которые могут отображаться.
aQry.SQL.Text := 'select * from TABLE';
aQry.Open;
Затем, когда значения для фильтрации определены, определите и активируйте фильтр
aQry.Filtered := false;
aQry.Filter := 'record_name like'+QuotedStr(name.Text+'%') '+
'and record_type like '+QuotedStr(type.Text+'%') '+
'and record_type2 like '+QuotedStr(type2.Text+'%') '+
'and record_type3 like '+QuotedStr(type3.Text+'%') '+
'and record_type4 like '+QuotedStr(type4.Text+'%');
aQry.Filtered := true;
Если любое из значений текста изменится, вам придется выполнить указанное выше еще раз.
Этот подход выполняет фильтрацию в памяти вашей программы и не обновляет данные из базы данных. Если вы ожидаете, что данные в базе данных будут меняться между сменами фильтров, подход RRUZ может быть для вас лучше.
Альтернативой фильтру запросов является cxGrid.TableView.DataSource.Filter. Определить его в коде немного сложнее, чем фильтр запроса. Но он может быть легко определен пользователем без какого-либо кода, если вы сделаете TableView Navigator и Navigator.Filter видимыми и включенными.
Похожие вопросы
Новые вопросы
delphi
Delphi - это язык для быстрой разработки собственных приложений для Windows, macOS, Linux, iOS и Android с использованием Object Pascal. Название относится к языку Delphi, а также к его библиотекам, компилятору и IDE, которые используются для помощи в редактировании и отладке проектов Delphi.