Paradox SetRange не дает правильный результат при запросе 3 полей - PullRequest
3 голосов
/ 27 мая 2011

У меня проблема с настройкой диапазона для вторичного индекса в таблице Paradox 7 с использованием Delphi2010.

Соответствующие поля:

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 полями, указывающими диапазон.

Обновление

См. Ответ Уве ниже.Далее следует окончательное решение кода (новые диапазоны для XMax):

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

Ответы [ 3 ]

4 голосов
/ 27 мая 2011

Индексный диапазон всегда берется как единое целое по всем полям и не ищет каждое поле в отдельности.Набор результатов будет содержать каждую запись, которая находится между этими диапазонами.Сравнение производится для каждого индексного поля в заданном порядке.

В вашем случае он проверит, находится ли FeatureType записи между 101..101.Если поле содержит 101, оно принимается во внимание.Поскольку значение поля лежит на границе диапазона, проверяются следующие поля.

Если поле YMax находится между 280110400..285103294 и значение не соответствует границам (280110400 или 285103294), оно принимается в набор результатов без какой-либо дополнительной проверки.В этом случае остальные поля индекса не проверяются.

Результат, который вы пытаетесь получить, возможен только с условием фильтра или с соответствующим предложением SQL Select.

2 голосов
/ 27 мая 2011

для диапазона с table1.SetRange ([101, 280110400, 1], [101, 285103294, 1]); Следующие значения находятся в диапазоне

  • 101 280110400 1
  • 101 280110400 2
  • 101 280110400 3
  • ....
  • 101 280110401 -maxint
  • ....
  • 101 280110401 maxint
  • ....
  • 101 285103294 0
  • 101 285103294 1
1 голос
/ 27 мая 2011

Небольшое пояснение к предыдущим ответам:

SetRange отдельно проверяет условия начала и конца диапазона, например, у нас есть

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

и запись (1, 3);

Начало диапазона: у нас 1 = 1 для первого поля (границы), поэтому мы проверяем второе поле (2 <3) - условие начала диапазона удовлетворено. </p>

Конец диапазона: у нас есть 1 <2 для первого поля (не границы), поэтому второе поле не проверяется - условие конца диапазона выполнено.</p>

Запись находится в диапазоне.

...