如何对计算字段上的ClientDataSet排序? [英] How to sort a ClientDataSet on a calculated field?
问题描述
我正在尝试对计算出的布尔值字段上的ClientDataSet进行排序,但是由于某种原因,数据未排序.我有一个名为Highlight
且将FieldKind
设置为fkInternalCalc
的布尔字段,以及一个定义如下的索引:
I'm trying to sort a ClientDataSet on a calculated boolean field, but for some reason the data is not sorted. I have a boolean field named Highlight
with FieldKind
set to fkInternalCalc
, and an index defined like this:
IndexDefs[0].DescFields = 'Highlight';
IndexDefs[0].Fields = 'Highlight;PatNo';
IndexDefs[0].Name = 'PatNo';
IndexDefs[0].Options = [ixDescending];
,显然我已将客户端数据集的IndexName
设置为'PatNo'
.当我运行我的应用程序时,CDS中的数据仅在PatNo
字段上排序.有什么想法吗?
and obviously I have set my client dataset's IndexName
to 'PatNo'
. When I run my application, the data in the CDS is sorted on PatNo
field only. Any thoughts?
推荐答案
Ime,在包含fkInternalCalc字段的复合索引上为ClientDatasSet编制索引是可以的.
Ime, indexing a ClientDatasSet on a compound index including an fkInternalCalc field works fine.
下面的代码可在D7和XE6中使用,并且与Midas.Dll版本相隔十年,给出
The code below works in D7 and XE6, and with Midas.Dll version ten years apart, giving
因此,除非XE2中存在某种回归,否则我怀疑该问题已报告 在OP的末尾.
So, unless there was some kind of regression in XE2, I would suspect the problem reported was in something at the OP's end.
// 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;
这篇关于如何对计算字段上的ClientDataSet排序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!