如何在master-detail clientdatasets Delphi中维护排序顺序?

时间:2014-11-03 18:19:47

标签: delphi master-detail tclientdataset

我在公共字段'upn'上安排了两个CDS作为主要细节。 它们都是由针对SQLite数据库的单独的sql运行查询提供的。 主SQL通过另一个字段对其记录进行排序。 细节SQL首先通过'upn'然后通过另一个字段'x'

对其数据进行排序

如果我删除主 - 细节关系,'detail'数据集会按照sql确定的正确排序顺序显示记录。

但是,一旦我重新创建主 - 细节链接,虽然mater-detail关系正常工作以根据upn过滤细节记录,但细节数据在'x'上失去了它的排序顺序(尽管主人仍然在正确的顺序)。我无法确定细节出现的顺序,似乎是随机的。

知道发生了什么以及如何使细节以正确的顺序显示?

其他可能有用的信息

通过设置Detail CDS中的值,设计时可以设置主要细节,如下所示

DataSouce1.Dataset = CDS_Master
CDS_Detail.mastersource = datasource1 (which is pointing at CDS_Master)
CDS_Detail.MasterFields = upn
CDS_Detail.IndexFieldNames = upn

另外,由于此处描述的CDS错误http://forums.devart.com/viewtopic.php?f=28&t=25620我在详细信息CDS中设置了PacketRecords = -1

1 个答案:

答案 0 :(得分:3)

您可以通过添加索引按照您喜欢的任何顺序对详细信息行进行排序,尽管从性能角度来看通常会更好,以确保索引中的第一个字段与来自主数据集。

这里有一个简单的例子,可以添加几个"客户"记录,以及联系人的虚拟日志。它会在详细信息表格中显示联系人(我使用了两个TDBGrid,每个TDataSource连接到TClientDataSet,后者又连接到procedure TForm1.FormCreate(Sender: TObject); begin ClientDataSet1.FieldDefs.Add('ID', ftInteger); ClientDataSet1.FieldDefs.Add('CustName', ftString, 25); ClientDataSet1.CreateDataSet; ClientDataSet1.Open; ClientDataSet1.AppendRecord([1, 'Smith Co.']); ClientDataSet1.AppendRecord([2, 'Jones Bros Inc.']); ClientDataSet1.IndexFieldNames := 'CustName'; ClientDataSet2.FieldDefs.Add('ID', ftInteger); ClientDataSet2.FieldDefs.Add('Contacted', ftDate); ClientDataSet2.FieldDefs.Add('Notes', ftString, 50); ClientDataSet2.CreateDataSet; ClientDataSet2.Open; ClientDataSet2.AppendRecord([1, EncodeDate(2014, 10, 1), 'First contact.']); ClientDataSet2.AppendRecord([1, EncodeDate(2014, 10, 3), 'Called again.']); // Intentionally added out of sequence, so effect of index will be clear. ClientDataSet2.AppendRecord([2, EncodeDate(2014, 9, 1), 'Order placed.']); ClientDataSet2.AppendRecord([2, EncodeDate(2014, 8, 15), 'Initial call.']); // Note indexing on both ID and Contacted fields. ClientDataSet2.IndexFieldNames := 'ID;Contacted'; ClientDataSet2.MasterSource := DataSource1; ClientDataSet2.MasterFields := 'ID'; end; )。为清晰起见,其他所有内容都在代码中完成。请注意,客户端记录首先被过滤以仅匹配主(ClientDataSet1)中的当前ID,但随后在详细网格中按日期顺序排序:

TClientDataSet.IndexDefs

正如您所说,您需要按降序显示客户端行,您需要做更多的工作。首先,您必须在首次创建ClientDataSet时创建索引。在这里,我通过修改上面的代码完成了它。要在设计时执行此操作,请打开TIndexDefs.Options属性并在那里手动添加索引,设置相同的属性。 (将其更改为降序的属性是ixDescending标记ClientDataSet1.FieldDefs.Add('ID', ftInteger); ClientDataSet1.FieldDefs.Add('CustName', ftString, 25); ClientDataSet1.CreateDataSet; ClientDataSet1.Open; ClientDataSet1.AppendRecord([1, 'Smith Co.']); ClientDataSet1.AppendRecord([2, 'Jones Bros Inc.']); ClientDataSet1.IndexFieldNames := 'CustName'; ClientDataSet2.FieldDefs.Add('ID', ftInteger); ClientDataSet2.FieldDefs.Add('Contacted', ftDate); ClientDataSet2.FieldDefs.Add('Notes', ftString, 50); with ClientDataSet2.IndexDefs.AddIndexDef do begin Name := ''; Fields := 'Id;Contacted'; Options := [ixDescending]; end; ClientDataSet2.CreateDataSet; ClientDataSet2.Open; // Append data to ClientDataSet2 as above in first example 。)

{{1}}
相关问题