TFDTable中的降序排序会导致重复的行

时间:2014-12-24 11:22:54

标签: delphi sorting delphi-xe5 firebird2.5 firedac

在LDW模式下使用TFDTable时,降序字段会导致重复行。例如:

TFDTable.TableName is set to a VIEW name (not a tablename)

TFDTable.UpdateOptions.KeyFields is set to the primary key in the VIEW base table.

TFDTable.IndexFieldNames is set to 'PERS_NAME:A'.

显示正确的结果集,没有任何重复。如果我将 IndexFieldnames更改为“PERS_NAME:D”,则视图返回的每条记录都会显示两次或树次。

如何避免这些重复?它只会在按降序排序表时发生,无论我用哪个字段进行排序。

更新 您可以找到一个示例项目来重现github上的问题:https://github.com/cytrinox/firedac-sort-issue或通过https://github.com/cytrinox/firedac-sort-issue/archive/master.zip下载项目

3 个答案:

答案 0 :(得分:2)

此问题将持续存在,直到我们在LDW模式下获得其他处理TFDTable的方法。

Definition of LDW - XE6

将LDW与基于数字之外的任何索引(即整数)一起使用会让你遇到各种各样的问题 - 如果你不遵守规则的话。

我也花了好几个小时试图让LDW使用索引的VARCHAR字段 - 但让我的SQL语句使用COLLATE(或直接整理字段的字符集)会使我的应用程序无用。这意味着它会因您描述的错误而崩溃。

以下是我从FireDAC的作者那里获得的信息。

  
    

由于概念,有1001种方法使LDW失败。没有意义也没有能力使客户端排序同步     在所有情况下使用服务器端排序校对。我,你什么时候     在字符串字段上对TFDTable进行排序,在更多情况下可能会失败     谁都可以想象。两种方式:

  
     
      
  • 您正在理解为什么会发生这种情况并尝试调整FireDAC客户端排序,如上所述。我不能提供所有选择 -   太多了。
  •   
  • 你不理解 - 那么最好不要在字符串列上排序TFDTable,甚至不要使用TFDTable。
  •   
     

你上面的段落   当你被允许使用TFDTable和时,可以考虑作为合同   什么时候没有。

Personaly我很乐意看到LDW在没有内部排序的情况下运行。 如果我们可以禁用排序并让它处理数据分页 - 那就太好了。

修改

想一想 - 尝试使用TFDQuery而不是TFDTable。 TFDQuery不支持LDW,那么你应该好好去。

希望这会对你有所帮助。

答案 1 :(得分:0)

我遇到了与FireDAC和PostgreSQL相同的问题。我决定继续使用TFDTable,但我创建了一个简单的视图。

对于您需要显示的每个表,请使用简单的SQL代码创建一个视图:

CREATE VIEW my_view AS 
SELECT * FROM my_table;

然后,您可以从TFDTable.TableName列表中选择my_view。问题不会出现。

答案 2 :(得分:0)

这个答案可能有点晚了,但我昨天遇到了同样的问题,将来可以帮助其他人。

问题与字符串类型索引的内部排序有关。

我们解决这个问题的方法是在连接中更改此设置:

FDConnection.FormatOptions.SortLocale:= 0;

最好的问候