2010-03-28 50 views
0

使用TDataSet.FindKey可以找到记录。当结果为True时,数据集光标将定位在找到的记录上。当它导致False时,光标不会移动。这会导致发布FindKey之前的记录数据显示在数据感知组件中。如果FIndKey导致False,则不返回记录?

我如何可以编写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将光标定位在该空记录上。这将提供我以后的视觉效果。

+0

你为什么要这么做?这可能有助于回答这个问题。 – 2010-03-28 08:00:09

+0

当我选择左侧列表中的项目时,相应的数据出现在右侧。当findkey失败时,将显示来自不正确记录的数据。 – jwilfong 2010-03-28 08:18:26

回答

0

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

1

TDataSet中没有一个“中立立场”。但是,一如往常,您只有几种选择:

  1. 将数据集设置为插入/附加记录模式。所以,控件和代码将看到空记录。要小心,因为某些事情可能会偶然地将数据分配给一个字段,然后新的记录可能会发布到数据库。
  2. 根据数据访问组件,您正在使用,您可以设置数据集缓存更新模式,插入和后新空记录到的数据集,并应用于标记所有更改。然后分配一个过滤器,通常会拒绝这个空记录。然后在你的代码中,你必须切换过滤器,所以它会拒绝所有的记录,不包括这个空的记录。
  3. 考虑到断开数据集中的TDataSource和以后重新连接。

注确定,但可能有可能被发明一些其他的方法:)

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; 

当你的标准保证了最大的匹配记录是一个你上面零或一个记录的语句检索。

相关问题