2013-07-27 96 views
3

我想對計算的布爾型字段上的ClientDataSet進行排序,但出於某種原因數據未排序。我有一個名爲HighlightFieldKind設置爲fkInternalCalc一個布爾領域,像這樣定義的索引:如何在計算字段上對ClientDataSet進行排序?

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

,顯然我已經把我的客戶端數據集的IndexName'PatNo'。當我運行我的應用程序時,CDS中的數據僅在PatNo字段上排序。有什麼想法嗎?

+0

[理解ClientDataSet的索引(http://edn.embarcadero.com/article/29056) – bummi

+0

@bummi那麼這文章說_You不能包括虛擬字段,如計算出的或聚集的字段,在一個INDEX_,但我的計算字段是'fkInternalCalc',根據http://threads.embarcadero.com/threads/threads.exe/view?commentid=34388可用於索引 –

+0

在該示例中,它們使用IndexFieldNames而不是IndexName。我可以證實工作。您可以嘗試添加另一個內部計算字段以構成適當的索引作爲解決方法。 –

回答

2

Ime,索引包括fkInternalCalc字段的複合索引上的ClientDatasSet可以正常工作。

下面的代碼在D7和XE6,並與MIDAS.DLL版本相隔十幾年,給人

screenshot

所以,除非有在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; 
相關問題