如果FIndKey导致False,则不返回任何记录?

时间:2010-03-28 07:50:41

标签: delphi tdataset

使用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;

更新(等待几天才选择正确答案,因为我认为这是习惯,并且不想阻止进一步的反馈。)虽然我相信有几个建议可以解决这个问题正确答案来自马塞洛,因为不可能将光标放在记录上。提出了几种解决方法。我选择了自己的一个。它类似于:

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

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

3 个答案:

答案 0 :(得分:1)

TDataSet没有“中立位置”。但一如既往,你几乎没有选择:

  1. 将数据集设置为插入/追加记录模式。因此,控件和代码将看到空记录。请注意,因为某些事情可能偶然会将数据分配给字段,然后新记录可能会发布到数据库。
  2. 根据您使用的数据访问组件,您可以将数据集设置为缓存更新模式,插入新空记录并将其发布到数据集中,并将所有更改标记为已应用。然后分配一个过滤器,通常拒绝这个空记录。然后在您的代码中,您必须切换过滤器,因此它将拒绝所有记录,不包括此空记录。
  3. 考虑断开TDataSource与数据集的连接,然后再重新连接。
  4. 请注意,但可能会发明一些其他方法:)

答案 1 :(得分:1)

喂,

使用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;

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

答案 2 :(得分:0)

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