回 帖 发 新 帖 刷新版面

主题:请教如何seek到倒数第一条记录?

有没有更好的方法?     
i=0    
seek ....  
do  while found()
    i=reccno()
    continue    
enddo  
if i>0 goto i  
又或者
  set filter   
  goto bottom
(没有视图能用吗?)  
哪个更快点?有没有更方便更高效更快的办法?用SQL好像慢很多。

回复列表 (共32个回复)

沙发

移动当前表中记录指针,并为每条满足指定条件的记录运行[Commands]命令块。

SCAN [NOOPTIMIZE] [Scope] [FOR lExpression1] [WHILE lExpression2]
   [Commands]
   [LOOP]
   [EXIT] 
ENDSCAN

实例:

SCAN FOR 条件=.T.
    最后合乎条件的纪录= 表.字段名
ENDSCAN

?最后合乎条件的纪录
 

板凳

解决MOZ的问题,我有一个通过数据编辑浏览表单,我通常用拼音首字母快速检索法,将符合条件的记录筛出来供浏览编辑,用的是set filter to 命令.我觉得很方便,不用非得找符合条件的最后一条,你想要看的也不见得就是最后一条,将所有满足条件的都显示出来,也不过十几二十多条,就在眼皮底下,用鼠标随便挑.

3 楼

建立倒排序的索引,你ssek或者loca都会定位倒末尾的记录。如果你实际操作是正排序:

set orde to 倒排序索引
seek ???  或者 loca fo ???
set orde to 正排序索引


我经常这样干。
vf数据库可以这样干,但SQL数据库好像不能这样干。

4 楼

当记录达到几十万以后,用set filt to <条件> 后goto bottom可能会产生不可容忍的低速度。

5 楼

有没有更好的方法?     
i=0
seek ....
  do  while found()
      i=reccno()
      continue 
  enddo
  if i>0
     goto i
     操作
  else 
     return
  endif

又或者
set filter...
goto bottom
(没有视图能用吗?)
哪个更快点?有没有更方便更高效更快的办法?用SQL好像慢很多。

看上去,还是乌鸦比较了解我这些邪门歪道的想法。
[quote]但SQL数据库好像不能这样干。[/quote]
SQL没有先后顺序的说法。

排序是没有帮助的,
之前因为是用手机发的,所以说的不是很清楚,
我说明一下现实意义。

举例说明:
我有一个订单表,
有客户的订货记录,还有联系方式及地址等等,
(有少数朋友可能会明白为什么要有联系方式与地址,的确有某些客户经常打游击的)
也就是说同一个名字下,会有不同的地址或电话或联系方式之类的东西。
我需要在下订单的时候,自动翻出最新的资料,核对一下,能用则用,要改则改。
也就是说需要同一个名字,日期最晚的一条记录,你们说该怎么找好?
非得locate每条记录再比较日期?
或是用SQL得子集再拿最后一条?
大家研究研究讨论讨论。到底是不是用 seek 到最后一条最快。

6 楼

我需要在下订单的时候,自动翻出最新的资料,核对一下,能用则用,要改则改。
也就是说需要同一个名字,日期最晚的一条记录,你们说该怎么找好?

其实用 select 语句也可以加排序功能的呀,你用姓名select出来之后按订货日期倒排序不就搞店了吗(最后的定单在最前面)。

若用seek,这种操作最好不用go
seek m.姓名  && loca for trim(姓名)==m.姓名
do whil trim(姓名)==m.姓名
 ...
 skip
endd

或者
set filt to
set orde to <按姓名索引>
seek m.姓名
copy to 临时表 whil trim(姓名)==m.姓名  && 速度最快


seek 没有 select 方便

7 楼

moz兄,你怎么问这么简单的问题,是不是想给乌鸦送分,
或者是兴奋过度,把脑筋弄糊涂了。

8 楼

楼主及楼上诸君,试试SELECT:(未严格测试)

假设表TB.DBF(字段有客户编号, 联系方式及地址等等)

select max(recno()) from TB where 客户编号="XXXXXX"

另:3楼所言不错,但不必特意建立倒排序的索引,比如:按客户编号索引(TAG假定是BH),不管升降,seek 可以直接指定用升序还是降序, 
seek "XXXXXX" order tag BH DESCENDING

当然该命令会影响原来索引的升降,比如原本是升序索引,上述命令用过后,打开表设计器,发现变为降序了。个人理解索引的升降序并不重要,索引文件像是一个双向链表,表头和表尾是相对的(set order命令能直接指定用升序还是降序),就看使用时哪个为头、哪个为尾。

9 楼

建个索引不就行了,用时打开它,不用时,可以不打开呀。
SEEK的速度也不会很慢的,
如果说是因为记录数太多,导致速度下降,我认为那要另想办法,
如按一定的时间段来用不同的表记录数据,这样按时间来查数据时,就会很方便的。

10 楼


我手上有一个表631064个记录,4个字段.对keyword字段建结构复合索引.做下面试验,结果都为2秒钟.
CLEAR
CLEAR ALL 
USE keyword
t1=SYS(2)
i=0
LOCATE FOR keyword='中国'
DO WHILE FOUND()
    i=RECNO()
    CONTINUE 
ENDDO 
IF i>0
    GO i
ENDIF 
t2=SYS(2)
?RECNO(),keyword,filename
?VAL(t2)-VAL(t1)
USE
t3=SYS(2)
SELECT * FROM keyword WHERE keyword='中国' INTO CURSOR curTemp
SELECT curTemp
GO bottom
t4=SYS(2)
?RECNO(),keyword,filename
?VAL(t4)-VAL(t3)
CLOSE TABLES ALL 
RETURN

VFP的FOR和SELECT-SQL的WHERE都支持RUSHMORE技术.

我来回复

您尚未登录,请登录后再回复。点此登录或注册