4

在 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

4

3 回答 3

2

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

LDW的定义 - XE6

将 LDW 与基于除数字(即整数)以外的任何索引的索引一起使用会使您陷入各种问题 - 如果您不遵守规则。

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

这是我从 FireDAC 的作者那里得到的信息。

由于概念,有 1001 种方法可以使 LDW 失败。在所有情况下使客户端排序与服务器端排序排序同步是没有意义的,也没有能力。IOW,当您在字符串字段上对 TFDTable 进行排序时,在任何人都可以想象的情况下,它可能会在更多情况下失败。两种方式:

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

当您被允许使用 TFDTable 时,您可以将上面的段落视为合同。

就个人而言,我希望看到 LDW 无需内部排序即可运行。如果我们可以禁用排序并让它处理数据分页 - 那会很好。

编辑:

想一想 - 尝试使用 TFDQuery 代替 TFDTable。TFDQuery 不支持 LDW,然后你应该好好去。

希望这对您有所帮助。

于 2015-01-29T13:20:33.957 回答
0

我对 FireDAC 和 PostgreSQL 也有同样的问题。我决定继续使用 TFDTable,但我创建了一个简单的视图。

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

CREATE VIEW my_view AS 
SELECT * FROM my_table;

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

于 2016-02-03T15:12:12.427 回答
0

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

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

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

FDConnection.FormatOptions.SortLocale:= 0;

此致

于 2017-12-15T15:12:06.403 回答