Paradox SetRangeは、3つのフィールドを照会するときに正しい結果を提供しません

delphi indexing paradox
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;

  3  0


ベストアンサー

インデックス範囲は、常にすべてのフィールドにわたって全体として取得され、各フィールドを個別に検索しません。 結果セットには、これらの範囲の間にあるすべてのレコードが含まれます。 比較は、指定された順序で各インデックスフィールドに対して行われます。

あなたの場合、レコードのFeatureTypeが101..101の間にあるかどうかをチェックします。 フィールドに101が含まれている場合、考慮されます。 フィールド値は範囲の境界にあるため、次のフィールドがチェックされます。

YMaxフィールドが280110400..285103294の間にあり、値が境界(280110400または285103294)と一致しない場合、それ以上のチェックなしで結果セットに取り込まれます。 その場合、残りのインデックスフィールドはチェックされません。

取得しようとしている結果は、フィルター条件または適切なSQL Select句でのみ可能です。

4


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

2


以前の回答に対する少しの明確化:

SetRangeは、範囲の開始条件と終了条件を個別にチェックします。たとえば、

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

および記録(1、3);

範囲の開始:最初のフィールド(境界)に1 = 1があるため、2番目のフィールドをチェックします(2 <3)-範囲の開始条件が満たされます。

範囲の終了:最初のフィールド(境界ではない)に1 <2があるため、2番目のフィールドはチェックされず、範囲の終了条件が満たされます。

レコードは範囲内です。

1


タイトルとURLをコピーしました