Используя 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;
0
Sharpie 6 Мар 2015 в 19:28

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;
3
RRUZ 6 Мар 2015 в 16:57

Вы можете делать все, что хотите, используя свойство фильтра запроса. Сначала выполните запрос, чтобы получить все записи, которые могут отображаться.

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 видимыми и включенными.

0
crefird 6 Мар 2015 в 20:41