查询3个字段时,Paradox SetRange无法提供正确的结果

时间:2011-05-27 05:40:46

标签: delphi indexing paradox

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

相关领域是:

FeatureType(int); YMax(int); XMax(int); YMin(int); Xmin(int)。 二级索引按此顺序包含所有这些字段。

我使用类似的SetRange语句进行了测试(不需要添加所有字段值,假设为rest,并且包含所有值):

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指数和SetRange的理解吗?我经常使用类似的代码,但不一定使用指定范围的3个字段。

更新

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

您尝试获取的结果只能通过过滤条件 - 或使用适当的SQL Select子句来实现。

答案 1 :(得分:2)

用于设置范围 table1.SetRange([101,280110400,1],[101,285103294,1]); Folow值在

范围内
  • 101 280110400 1
  • 101 280110400 2
  • 101 280110400 3
  • ....
  • 101 280110401 -maxint
  • ....
  • 101 280110401 maxint
  • ....
  • 101 285103294 0
  • 101 285103294 1

答案 2 :(得分:1)

对以前的答案稍作澄清:

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

SetRange([1,2],[2,2])

并记录(1,3);

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

范围结束:我们有1&lt; 2表示第一个字段(不是边界),因此不检查第二个字段 - 满足范围结束条件。

记录在范围内。