我遇到clientdataset
和findnearest
方法的问题。
我在dbgrid
中显示了一些记录,并利用on标题单击来更改网格的索引和排序。我还可以再次单击一列来将列从升序更改为降序排序。此外,在我单击列后,我有一个Tedit
框,用户可以输入数据,程序使用findnearest
方法在已单击的列中查找最接近的匹配项。它为升序或降序索引执行此操作。
我的问题是,当索引按降序排列时,findnearest
会在应该选择的记录之后选择记录。
这是一些数据,一组数据是升序,另一组是降序。
Ascending - Able,Arnold,Arney,Barney,Bubba
降序 - 布巴,巴尼,阿尼,阿诺德,阿布尔
当我在Ascending上搜索“A”时,记录指针落在Able上。 当我在Descending上搜索“B”时,记录指针落在Arney上。 我的两个例子不是理论,这就是实际发生的事情。
我的问题是 - 按降序排列,为什么它会跳过Bubba和Barney?请不要再给我一个例子。如果您打算做一个例子,请使用我的数据。请给我一个解释为什么findnearst以降序顺序跳过前两个记录,显然以“B”开头。
答案 0 :(得分:3)
我可以解释为什么会这样(希望有一些清晰度)以及为什么它实际上是正确的行为。 (以下描述将简单地讨论单字节字符,但答案也应适用于其他字符。)
考虑到以下数据(我故意让它们稍微不同以便于解释 - 你会明白为什么在下面,我希望),让我们假设我们位于顶行( A 为在这两种情况下,升序,查理降序。
(Ascending) (Descending)
LastName LastName
======== ========
A Charlie
Abe Bob
Ada Ada
B Abe
Bob A
从第一行(行 A )开始按升序排列并搜索 Ac ,我们首先会遇到 Abe 。这不是匹配,我们正在寻找的应该是按升序排列,所以我们继续寻找 Ac 。
它不存在,我们现在位于发现匹配的行,即紧接着的行( Ada )。换句话说,如果它存在,我们将定位在匹配的位置(最近的行)。
现在让我们说我们搜索 Al 。我们在 Ada ,所以我们转到下一行,发现没有 Al 。我们现在处于 B ,如果存在,则会发现 Al 。换句话说,我们在最近的行。 (这可以通过快速测试来确认。)
当我们按降序排列时,示例的工作方式相同。 (请记住,我的数据略有不同,以便更容易解释。)让我们搜索 Cecil :
我们排在第一行, Charlie ,然后转到下一行寻找 Ce (在 > Charlie 按降序排列,而不是之前,如上面数据中的 Abe 和 A 所示。我们发现我们没有匹配项,而且我们目前排在 Bob 行,如果它存在,则会找到 C 。换句话说,按降序排列,我们位于最近的行,就像在升序示例中一样。
所以FindNearest
没有问题。如果您希望行为不同,则必须在代码中实现它(检查您是否找到了完全匹配,如果不需要先移动一行,并检查它是否在您想要的位置)相反)。
答案 1 :(得分:1)
好的,我会去的。
你的基本问题是你在想FindBarest应该“知道”这些物品的订单。 即你想要的行为是当列表按降序排列时你希望FindNearest从列表底部开始并向上工作。
它没有,它始终从顶部起作用,你可以通过给它一个无序列表很容易地证明这一点。
答案 2 :(得分:0)
在delphi中,findnearest方法根据delphi文档执行GotoNearest和GotoNearest;将光标定位在记录上,该记录是密钥缓冲区中当前键值指定的确切记录,或位于其值超过指定值的第一个记录上。
这是有道理的升序,我有两个记录AU和BU并搜索B. B大于AU但小于BU,因此它将光标放在第一个记录上,其值超过指定的值 - BU。
但是在下降过程中,它在结果方面的作用是不同的。如果我按降序顺序有两个记录BU和AU,并且我搜索B,则光标落在AU上。这对我来说很困惑。 BU大于B,为什么不登陆BU?
原因; docuentation表示如果没有匹配,则光标将定位在第一个记录上,其值将执行指定的值。但事实上,最接近的是执行getnext。因此,在升序索引中,getnext是一个更大的键,但在降序索引中,getnext是一个更小的键。