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



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

相关字段为:

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

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

更新

见下文Uwe的回复。最终的代码解决方案如下(XMax的新范围):

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

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

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

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

您试图获得的结果只能通过筛选条件或适当的SQL Select子句获得。

用于范围集table1.SetRange([1018280110400,1],[1018285103294,1]);折叠值在范围内

  • 101 280110400 1
  • 101 280110400 2
  • 101 280110400 3
  • 101 280110401-最大值
  • 101 280110401最大值
  • 101 285103294 0
  • 101 285103294 1

对前面的答案进行一点澄清:

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

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

并记录(1,3);

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

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

记录在范围内。

相关内容

  • 没有找到相关文章

最新更新