delphi 如果FIndKey结果为False,是否不返回记录?

v9tzhpje  于 2023-02-12  发布在  其他
关注(0)|答案(3)|浏览(237)

使用TDataSet.FindKey可以定位记录。当结果为True时,数据集光标将定位在找到的记录上。
当我在左边的列表中选择项目时,相应的数据应该出现在右边。
当结果为False时,光标不移动。这将导致FindKey之前的记录数据显示在右侧的数据感知组件中。
我如何对FindKey的结果进行编码以返回空记录?

if Not tblSomeTable.FindKey([SomeSearchData]) then
    begin
        < code to return empty or move data cursor to neutral position >
    end;

更新:(等了几天才选择正确答案,因为我相信这是习惯,不想阻止进一步的反馈。)有几个建议来处理这种情况,虽然我相信正确的答案是从Marcelo,因为它是不可能有一个光标不在一个记录。有几个变通办法建议。我选择了我自己的一个。它如下:

If Not tblSomeTable.FindKey([SomeSearchData]) then
    begin
        tblSomeTable.FindKey([-1,2010]);
    end

我所做的是创建一个虚拟的,空白记录的索引,实际数据永远不可能,即:第一个索引值永远不会是-1,如果初始搜索结果为空,那么FindKey将把光标定位在这个空记录上,这将提供我所追求的视觉效果。

im9ewurl

im9ewurl1#

TDataSet没有“中立位置”。但和往常一样,您几乎没有什么选择:
1.将数据集设置为插入/追加记录模式。因此,控件和代码将看到空记录。要小心,因为可能会意外地将数据分配给字段,然后新记录可能会发布到DB。
1.根据所使用的数据访问组件,您可以将数据集设置为“缓存更新”模式,将新的空记录插入并发布到数据集中,并将所有更改标记为已应用。然后分配筛选器,通常拒绝此空记录。然后在代码中切换筛选器,使其拒绝除此空记录之外的所有记录。
1.请考虑断开TDataSource与数据集的连接,稍后再重新连接。
注意,当然,但可能会发明一些其他的方法:)

ubof19bj

ubof19bj2#

你好,
使用SetRange而不是FindKey。

tblSomeTable.SetRange([SomeSearchData],[SomeSearchData]);
try
  while not tblSomeTable.Eof do begin
    <do something with the Record>
    tblSomeTable.Next;
  end;
finally
  tblSomeTable.CanelRange;
end;

当您的条件确保匹配记录的最大值是您使用大于零或一个记录的语句检索的记录时。

r55awzrz

r55awzrz3#

据我所知,这是不可能的。除非Bof和Eof都为真(空数据集),否则游标必须始终位于记录上。

相关问题