3

我在使用 Delphi2010 在 Paradox 7 表中设置二级索引范围时遇到问题。

相关领域是:

特征类型(int);YMax(整数);XMax(整数);YMin (int); Xmin(整数)。二级索引按此顺序包含所有这些字段。

我使用这样的 SetRange 语句进行了测试(不需要添加所有字段值,其余部分假定为 NULL 并包含所有值):

table1.IndexName := 'YMaxIndex';
table1.SetRange([101, 280110400],[101, 285103294]); //386236 records

并尝试通过添加约束来获得 0 结果:

table1.IndexName := 'YMaxIndex';
table1.SetRange([101, 280110400, 1],[101, 285103294, 1]); //386236 records

但仍然得到 3863236,这在检查表中 XMax 字段中的值时显然是不正确的。

有人可以向我解释一下我对 Paradox index 和 SetRange 的不理解吗?我经常使用类似的代码,但不一定使用 3 个指定范围的字段。

更新

请参阅下面 Uwe 的回复。最终代码解决方案如下(XMax 的新范围):

Table1.SetRange([101,280110400], [101,285103294]);
Table1.Filter := 'XMax > 100000 and XMax < 110000';
Table1.Filtered := true; 
4

3 回答 3

4

索引范围始终作为一个整体用于所有字段,而不是单独查找每个字段。结果集将包含这些范围之间的每条记录。以给定顺序对每个索引字段进行比较。

在您的情况下,它将检查记录的 FeatureType 是否在 101..101 之间。如果该字段包含 101,则将其考虑在内。由于字段值位于范围的边界,因此检查下一个字段。

如果 YMax 字段位于 280110400..285103294 之间并且该值与边界不匹配(280110400 或 285103294),则将其纳入结果集中,无需进一步检查。在这种情况下,不会检查剩余的索引字段。

您试图获得的结果只能通过过滤条件或适当的 SQL Select 子句来实现。

于 2011-05-27T06:44:43.733 回答
2

对于用 table1.SetRange([101, 280110400, 1],[101, 285103294, 1]) 设置的范围;以下值在范围内

  • 101 280110400 1
  • 101 280110400 2
  • 101 280110400 3
  • ……
  • 101 280110401 -maxint
  • ……
  • 101 280110401 最大
  • ……
  • 101 285103294 0
  • 101 285103294 1
于 2011-05-27T06:24:14.250 回答
2

对前面的答案稍微澄清一下:

SetRange 分别检查范围开始和结束条件,例如我们有

设置范围([1,2],[2,2])

并记录(1、3);

范围开始:对于第一个字段(边界)我们有 1 = 1,因此我们检查第二个字段(2 < 3) - 满足范围开始条件。

范围结束:第一个字段(不是边界)有 1 < 2,因此不检查第二个字段 - 满足范围结束条件。

记录在范围内。

于 2011-05-27T08:02:23.917 回答