數據庫中如何實現查找下一筆功能﹖請具體一點。(50分)

  • 主题发起人 主题发起人 dadabox
  • 开始时间 开始时间
D

dadabox

Unregistered / Unconfirmed
GUEST, unregistred user!
我想實現數據庫中用QUERY或TABLE查找下一筆功能。用LOCATE只能找第一筆﹐怎么找第二筆
呢﹖我的想法是查找后﹐按F3就找下一筆﹐點上一筆﹐下一筆就還是上一筆﹐下一筆﹐有哪
些方法﹖請具體一點﹐查找我會﹐但不清楚如何實現查找下一筆。
 
??
Table.Next;
Table.Prior;
 
使用ehlib's DBGridEh好啦,她会自动实现你所需要的功能
www.51delphi.com
enlib 2.0
 
好像有一个是AdoQ.seeknext,我记不清了,那个时候用delphi5 的时候用过
 
AdoQuery1.FindNext
我看了一下,这个可以
 
樓上的﹐你答題還是看一下吧﹐我說的是查找下一筆。
我不想用其他的控件﹐而且程序中不會用到GRID。
我希望用ADO和BDE都能用。
哦﹐我忘了﹐還有FindNext﹐但是為什么我用FindNext﹐在當前的資料已經查找完了之后﹐
他還在往下一筆并不符合條件的資料跑呢﹖他是與Locate結合起來用的嗎﹖
 
试试下面的方法:
设定DataSet.Filter属性,但filtered := False,
然后,使用“FindFirst;FindNext;FindPrior”即可实现。
 
可這樣其他資料就看不到了﹐我是想其他資料也同時能看到﹐而也可以找到下一筆資料﹐不
想用過濾的方法。用Locate不行嗎﹖
 
if you sue oracle, try the sql script below.
select * from
(select row_num, * from my_table)
where row_num>?? and row_num<??
 
to yyanghhong,我要的是delphi中的寫法﹐不是sql中的﹐何況你這方法并不好﹐我試過。
只能select出最前面的資料。
 
你可以用Table.find;table.next.[8D]
 
>>只能select出最前面的資料。
why? you can set last_position and Set_Count to be whatever you want.
select * from
(select row_num, * from my_table)
where row_num>last_position and row_num<Set_Count

could you think of my words one more times, Ok?

>>我要的是delphi中的寫法.
use TDataSet.Bookmark, check the Help of delphi



 
我看你不如加个变量数组,二维的,专门存储查找的数据及所在的位置,找到一个就写一个
到数组中,再找的时候就接着这个位置往下找,还可以在程序中加判断,省得找重了。我这
法儿行不?数据集组件结合数组,应该可以的。
 
印象中Locate函数好象是从当前位置往下找的,不太确定了,
如果是这样的话,你可以总用Locate函数进行查找,只是每次查找的时候记得
把当前记录往下移一条再查。例:
while DataSet1.Locate('Key1','ABC',[]) do
begin
DoMyOperations(DataSet1);
DataSet1.Next;
end;

另外还有个很明确可以实现你想要的功能的是Filter,利用Filter你可以让
数据集看上去只有你想要的满足条件的记录,然后可以做你想做的事情,例:
DataSet1.Filtered:=true;
DataSet1.Filter:='Key1=abc';
DataSet1.First;
while not DataSet1.EOF do
begin
DoMyOperations(DataSet1);
DataSet1.Next;
end;
DataSet1.Filtered:=false;
DataSet1.Filter:='';
 
查找完后先用书签记做记号,然后再显示所有数据,再回到
书签位置不就完了。
 
recordset.movenext
 
用Filer我知道﹐但我如果在用DBGrid時﹐用這個就只用顯示符合條件的數據了。我是想這
樣子實現。我定義一個快捷鍵﹐如果我有查詢動作﹐按這個鍵﹐他就查下一筆﹐如果我點
下一筆這個按鈕﹐他還是定位到下一筆﹐而不是查找到下一筆。所以用Filer是不行了。這
個查找就像Notepad中的那樣﹐你們清楚了嗎﹖怎樣實現呢﹖
我問的是怎么找到下一筆﹐用Locate似乎只能找第一筆。麻煩各位再幫我想想﹐如果有法子
的請說清楚一點。
 
查看一下Delphi的Table.Locate函数的源代码,发现它也是用Filter进行查找的,
只不过是直接调用BDE的Filter函数。找到一条记录以后,再取消Filter……。

除了上面提的设Filter然后做书签数组来记录满足条件的记录之外,
你可以自己实现一个Locate以满足需要,例:

function MyLocate(DataSet: TDataSet; KeyFields: string; KeyValues: Variant; Options: TLocateOptions; GoForward: boolean): boolean;
begin
DataSet.DisableControls;
if GoForward then
begin
Next;
while not MyMatch(DataSet,KeyFields,KeyValues,Options) and not DataSet.EOF do Next;
Result:=not DataSet.EOF;
end
else begin
Prev;
while not MyMatch(DataSet,KeyFields,KeyValues,Options) and not DataSet.BOF do Prev;
Result:=not DataSet.BOF;
end;
DataSet.EnableControls;
end;

至于这个MyMatch,给定一个数据集,查找的字段和关键字,确定数据集的当前记录是
否满足条件,不算是很复杂吧?:)
 
谢谢各位!分数少,就只分给两位朋友了,其他见谅了。
 
后退
顶部