Как отсортировать ClientDataSet по вычисляемому полю?

Я пытаюсь отсортировать 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 только поле Какие-нибудь мысли?

1 ответ

То есть индексирование ClientDatasSet по составному индексу, включающему поле fkInternalCalc, работает нормально.

Приведенный ниже код работает в D7 и XE6, а с версией Midas.Dll десять лет, давая

Скриншот

Таким образом, если бы не было какого-то регресса в XE2, я бы заподозрил, что проблема, о которой сообщают, была в чем-то в конце ОП.

 // 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;
Другие вопросы по тегам