【问题标题】:How to sort a ClientDataSet on a calculated field?如何在计算字段上对 ClientDataSet 进行排序?
【发布时间】:2013-07-27 09:34:01
【问题描述】:

我正在尝试在计算的布尔字段上对 ClientDataSet 进行排序,但由于某种原因,数据未排序。我有一个名为Highlight 的布尔字段,FieldKind 设置为fkInternalCalc,并且索引定义如下:

IndexDefs[0].DescFields = 'Highlight';
IndexDefs[0].Fields = 'Highlight;PatNo';
IndexDefs[0].Name = 'PatNo';
IndexDefs[0].Options = [ixDescending];

显然我已将客户端数据集的 IndexName 设置为 'PatNo'。当我运行我的应用程序时,CDS 中的数据仅按PatNo 字段排序。有什么想法吗?

【问题讨论】:

  • @bummi 那篇文章说您不能在索引中包含虚拟字段,例如计算或聚合字段,但我的计算字段是fkInternalCalc,根据@ 987654322@可以在索引中使用
  • 在该示例中,他们使用 IndexFieldNames 而不是 IndexName。我可以确认工作。您可以尝试添加另一个内部计算字段以构成适当的索引作为解决方法。
  • @UweRaabe 我将布尔字段更改为整数;不用找了。我只是好奇;我应该如何强制执行OnCalcField()?我不能打电话给Refresh(),因为我的客户端数据集没有附加到任何提供者。我发现的唯一方法是调用Resync([]); 强制重新计算所有计算字段。
  • 您是否尝试过将索引命名为与所有数据集字段不同的名称?要重新计算所有 fkInternalCalc 字段,请打开一个新问题。这对其他人也可能有用,如果在评论中回答,则会丢失。

标签: delphi delphi-xe2 tclientdataset


【解决方案1】:

Ime,在包含 fkInternalCalc 字段的复合索引上索引 ClientDatasSet 工作正常。

下面的代码在 D7 和 XE6 中工作,与 Midas.Dll 版本相隔十年,给予

所以,除非 XE2 中存在某种回归,否则我会怀疑报告的问题 在 OP 的末尾。

 // tested with:
//  midas.dll 7.1.1692.668 30 August 2004
//  midas.dll 20.0.16277.1276  16 June 2014

procedure TForm1.SetUp;
var
  Field : TField;
  i : Integer;
begin
  Field := TIntegerField.Create(Self);
  Field.FieldName := 'PatNo';
  Field.FieldKind := fkData;
  Field.Index := 0;
  Field.DataSet := CDS;

  Field := TBooleanField.Create(Self);
  Field.FieldName := 'HighLight';
  Field.FieldKind := fkInternalCalc;
  Field.Index := 1;
  Field.DataSet := CDS;

  CDS.OnCalcFields := CDSCalcFields;

  CDS.CreateDataSet;
  for i := 1 to 10 do begin
    CDS.Insert;
    CDS.FieldByName('PatNo').AsInteger := i;
    CDS.Post;
  end;
end;

procedure TForm1.CDSCalcFields(DataSet: TDataSet);
var
  Value : Integer;
begin
  Value := DataSet.FieldByName('PatNo').AsInteger;
  DataSet.FieldByName('Highlight').AsBoolean := Odd(Value);
end;

const
  scIndexName = 'PatNo';
  scHighlight = 'Highlight';

procedure TForm1.AddHLIndex;
var
  IndexDef : TIndexDef;
begin
  IndexDef := TIndexDef.Create(CDS.IndexDefs, scIndexName, 'Highlight;PatNo', [ixDescending]);
  IndexDef.DescFields := scHighlight;
  CDS.IndexName := scIndexName;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  AddHLIndex;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SetUp;
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2016-01-11
    • 2018-09-22
    • 1970-01-01
    • 2015-03-24
    • 2014-07-12
    相关资源
    最近更新 更多