Sorting 索引不';不能在FDQuery中工作

Sorting 索引不';不能在FDQuery中工作,sorting,delphi,firedac,Sorting,Delphi,Firedac,我有一个FDQuery,它将数据提供给网格。 当用户单击某列时,我希望网格在该列上排序。 因为我希望能够对多个列进行排序,所以无法使用网格的自动排序选项 我在概念验证中尝试了以下代码。 但是,它不起作用 procedure TForm31.JvDBGrid1TitleBtnClick(Sender: TObject; ACol: Integer; Field: TField); const sDesc = 1; sASC = 2; sNone = 0; var i: inte

我有一个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;
过程TForm31.jvdbgrid1titlebtnlick(发送方:TObject;ACol:Integer;
字段:TField);
常数
sDesc=1;
国资委=2;
sNone=0;
变量
i:整数;
SORTCAUSE:字符串;
外地:特菲尔德;
AIndex:TFDIndex;
开始
case字段。的标记
sDesc:Field.Tag:=sASC;
sASC:Field.Tag:=sNone;
sNone:Field.Tag:=sDesc;
结束;
SORTCAUSE:='';
FDQuery1.index.BeginUpdate;
尝试
FDQuery1.index.Clear;
对于i:=0到JvDBGrid1.Columns.Count-1不开始
affield:=JvDBGrid1.Columns[i].字段;
如果不在现场,标记sNone,然后开始
AIndex:=FDQuery1.index.Add;
AIndex.Name:=AField.FieldName;
AIndex.Fields:=AField.FieldName;
//AIndex.Options:=[soNoCase、soNullFirst、SODESCNULLAST、soDescending、soUnique、soPrimary、soNoSymbols]
外地的箱子。标签
sDESC:AIndex.Options:=[soDescNullLast];
国资委:AIndex.Options:=[];
结束;
AIndex.Active:=真;
结束;
结束;
最后
FDQuery1.index.EndUpdate;
FDQuery1.刷新;
结束;
结束;
查询是否已经有
order by
子句并不重要

我做错了什么


另外,我不想求助于构造自定义的
order by
子句,但我知道这是一个选项。

我认为您可能缺少一个步骤,即将FDQuery的IndexName设置为添加索引的名称。显然地设置添加的索引的活动属性不足

在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;

顺便说一句,如果索引中包含多个列,我不确定您的代码应该做什么,但我将留给您;=)

可能值得一提的是,TFDIndex的OLH表示“如果Selected为True或IndexName设置为该视图的名称,则该视图将成为数据集中的当前视图。”尽管我承认我还没有掌握TFDIndex中视图的概念。好的,我将尝试一下,看看如何处理多个索引asc/DESC我的代码对您有用吗?我希望它能回答你问题的“我做错了什么”部分。