Индексы не работают в FDQuery

У меня есть FDQuery, который передает данные в сетку.
Когда пользователь нажимает на столбец, я хочу, чтобы сетка упорядочивала этот столбец. Поскольку я хочу иметь возможность сортировать по нескольким столбцам, я не могу использовать параметр автоматической сортировки сетки.

Я попробовал следующий код в своем доказательстве концепции. Однако это не работает.

procedure TForm31.JvDBGrid1TitleBtnClick(Sender: TObject; ACol: Integer;
  Field: TField);
const
  sDesc = 1;
  sASC = 2;
  sNone = 0;
var
  i: integer;
  SortClause: string;
  AField: TField;
  AIndex: TFDIndex;
begin
  case Field.Tag of
    sDesc: Field.Tag:= sASC;
    sASC: Field.Tag:= sNone;
    sNone: Field.Tag:= sDesc;
  end;
  SortClause:= '';
  FDQuery1.Indexes.BeginUpdate;
  try
    FDQuery1.Indexes.Clear;
    for i:= 0 to JvDBGrid1.Columns.Count - 1 do begin
      AField:= JvDBGrid1.Columns[i].Field;
      if AField.Tag <> sNone then begin
        AIndex:= FDQuery1.Indexes.Add;
        AIndex.Name:= AField.FieldName;
        AIndex.Fields:= AField.FieldName;
        //AIndex.Options:= [soNoCase, soNullFirst, soDescNullLast, soDescending, soUnique, soPrimary, soNoSymbols]
        case AField.Tag of
          sDESC: AIndex.Options:= [soDescNullLast];
          sASC: AIndex.Options:= [];
        end;
        AIndex.Active:= true;
      end;
    end;
  finally
    FDQuery1.Indexes.EndUpdate;
    FDQuery1.Refresh;
  end;
end;

Неважно, есть ли в запросе предложение order by или нет.

Что я делаю не так?

P.S. Я бы не стал прибегать к созданию пользовательского предложения order by, но я знаю, что это вариант.


person Johan    schedule 02.02.2016    source источник


Ответы (1)


Я думаю, что вы, возможно, пропустили шаг, а именно установку IndexName в FDQuery на имя добавленного индекса. По всей видимости. установка свойства Active добавленного индекса недостаточна.

Следующее отлично работает для меня в таблице авторов базы данных MS Sql Server pubs:

procedure TForm1.AddFDIndex;
var
  AIndex : TFDIndex;
begin
  AIndex := FDQuery1.Indexes.Add;
  AIndex.Name := 'ByCityThenlname';
  AIndex.Fields := 'city;au_lname';
  AIndex.Active := True;
  FDQuery1.IndexName := AIndex.Name;
end;

Кстати, я не уверен, что должен делать ваш код, если в индекс помечено более одного столбца, но я оставлю это вам; =)

person Alex James    schedule 02.02.2016
comment
Возможно, стоит упомянуть, что OLH для TFDIndex говорит, что представление становится текущим в наборе данных, если для Selected установлено значение True или для IndexName задано имя этого представления. хотя, признаюсь, я не разобрался с понятием просмотров в TFDIndex. - person MartynA; 03.02.2016
comment
Хорошо, попробую, посмотрим, что делать с несколькими индексами asc/desc - person Johan; 03.02.2016
comment
Мой код сработал для вас? Я надеюсь, что это ответило на то, что я делаю неправильно в части вашего вопроса. - person Alex James; 04.02.2016