Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何对计算字段上的ClientDataSet进行排序?_Delphi_Delphi Xe2_Tclientdataset - Fatal编程技术网

Delphi 如何对计算字段上的ClientDataSet进行排序?

Delphi 如何对计算字段上的ClientDataSet进行排序?,delphi,delphi-xe2,tclientdataset,Delphi,Delphi Xe2,Tclientdataset,我试图在计算的布尔字段上对ClientDataSet进行排序,但由于某些原因,数据没有排序。我有一个名为Highlight的布尔字段,其中FieldKind设置为fkenternalcalc,索引定义如下: IndexDefs[0].DescFields = 'Highlight'; IndexDefs[0].Fields = 'Highlight;PatNo'; IndexDefs[0].Name = 'PatNo'; IndexDefs[0].Options = [ixDescending]

我试图在计算的布尔字段上对ClientDataSet进行排序,但由于某些原因,数据没有排序。我有一个名为
Highlight
的布尔字段,其中
FieldKind
设置为
fkenternalcalc
,索引定义如下:

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

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

Ime,在包含fkInternalCalc字段的复合索引上为ClientDataSet编制索引很好

下面的代码在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;

@不过,那篇文章说不能在索引中包含虚拟字段,例如计算字段或聚合字段,但我的计算字段是
fkInternalCalc
,根据该字段可以在indexIn中使用,例如,他们使用IndexFieldNames而不是IndexName。我可以证实这是可行的。您可以尝试添加另一个内部计算字段以组成适当的索引作为解决方法。@Uwerabe我将布尔字段更改为整数;没有变化。我只是好奇;如何强制执行
OnCalcField()
?我无法调用
Refresh()
,因为我的客户端数据集未连接到任何提供程序。我找到的唯一方法是调用
Resync([])
强制重新计算所有计算字段。是否尝试将索引命名为与所有数据集字段不同的名称?要重新计算所有fkInternalCalc字段,请打开一个新问题。这可能对其他人也有用,如果在评论中得到回答,就会迷失方向。