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;
[理解ClientDataSet的索引(http://edn.embarcadero.com/article/29056) – bummi
@bummi那麼這文章說_You不能包括虛擬字段,如計算出的或聚集的字段,在一個INDEX_,但我的計算字段是'fkInternalCalc',根據http://threads.embarcadero.com/threads/threads.exe/view?commentid=34388可用於索引 –
在該示例中,它們使用IndexFieldNames而不是IndexName。我可以證實工作。您可以嘗試添加另一個內部計算字段以構成適當的索引作爲解決方法。 –