Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何转到ado.locate(Delphi)结果中的最后一条记录_Delphi_Ado - Fatal编程技术网

如何转到ado.locate(Delphi)结果中的最后一条记录

如何转到ado.locate(Delphi)结果中的最后一条记录,delphi,ado,Delphi,Ado,我通过此代码找到了一些记录: ADOQuery1.Locate('field1',ADOQuery2.FieldByName('field2').Value,[]) 如何转到这些记录中的最后一条?您有许多选择。最好的选择取决于你在问题中没有提到的许多考虑因素。我将提供一个非常简短的选项概述,以避免这种情况变得“过于广泛”。这将由你自己做出选择,并弄清楚细节。如果你陷入困境,你可以问一个新的,更具体的问题 使用定位 只有当您的数据集按照您搜索的同一字段进行排序时,Locate的解决方案才是可

我通过此代码找到了一些记录:

ADOQuery1.Locate('field1',ADOQuery2.FieldByName('field2').Value,[])  

如何转到这些记录中的最后一条?

您有许多选择。最好的选择取决于你在问题中没有提到的许多考虑因素。我将提供一个非常简短的选项概述,以避免这种情况变得“过于广泛”。这将由你自己做出选择,并弄清楚细节。如果你陷入困境,你可以问一个新的,更具体的问题

使用
定位
只有当您的数据集按照您搜索的同一字段进行排序时,
Locate
的解决方案才是可行的

显然,您的搜索值不是唯一的键。因此,我猜您正在尝试在按其他唯一字段排序的数据中查找与搜索键匹配的最后一行。(否则,最后一个概念毫无意义。)

所以这很可能不适合你;除非您的数据是由搜索字段的复合键后跟唯一键排序的

方法很简单:向前导航,直到找到搜索值不匹配的行,然后返回1行

if not DataSet.Locate(SearchField, SearchValue, []) then
  { handle not found case as desired }
else
begin
  while (not DataSet.Eof) and (DataSet.FieldByName(SearchField).Value = SearchValue) do
    DataSet.Next;

  { Watch out for case that last row in dataset matches search value }
  if (DataSet.FieldByName(SearchField).Value <> SearchValue) then
    DataSet.Prior;
end;
请参阅有关该属性的文档

注意:建议采取预防措施,避免冗余设置过滤器

使用主细节关系 之所以包含此选项,是因为您的问题代码指示SearchValue来自另一个数据集的活动记录。您正在使用ADO,因此此选项对您可用

DataSet.MasterSource := <Appropriate DataSource>;
DataSet.MasterFields := SearchField;
DataSet.Last;
然后调用存储过程,并使用其结果查找所需的行

DataSet.Locate(UniqueField, RowKey, []);

<强>注:< /强>如果没有搜索值存在行,请不要忘记考虑存储过程返回<代码> null < /代码>。< /P>


一般免责声明 以上所有代码都非常简短,仅供说明。在许多情况下,健壮的实现需要额外的代码。
例如,可能需要禁用控件并再次启用它们


注意:了解数据集中数据的实际顺序非常重要。如果不考虑这一点,可能会导致不正确的行为。如果数据集未按UniqueKey排序,则即使最后一个选项的性能也可能比预期的差。

如果表具有自动递增标识字段,则可以执行此操作

adoquery1.sql.clear;
adoquery1.sql.add('select top 1 * from  yourtablename where field1=value1 and filed2=value2 order by yourAIcolums desc')
adoquery1.execsql;
value1和value2是您所需的值。请将它们作为参数传递或放入命令文本中
这样,您只获得所需的行,无需使用循环循环

,使用
Next
,直到到达第一条不匹配的记录,然后使用
previor
向后移动一条记录。循环时不要忘记检查
非Eof
,以避免无限循环。或者在
Locate
调用中添加第二列,使搜索更加具体,以便与您真正想要查找的行匹配。事实上,条件是在特定字段中有一个特定值,然后添加的最后一条记录就是我们需要的(即ado.Locate结果中的最后一条记录)。“添加的最后一条记录”要小心,添加到数据集的最后一条记录不一定是
循环末尾的记录;是否是取决于数据集是否按插入顺序排序。
select  MAX(UniqueField) as RowKey
from    Table
where   SearchField = SearchValue
DataSet.Locate(UniqueField, RowKey, []);
adoquery1.sql.clear;
adoquery1.sql.add('select top 1 * from  yourtablename where field1=value1 and filed2=value2 order by yourAIcolums desc')
adoquery1.execsql;