主题:请教如何seek到倒数第一条记录?
moz
[专家分:37620] 发布于 2007-05-23 03:04:00
有没有更好的方法?
i=0
seek ....
do while found()
i=reccno()
continue
enddo
if i>0 goto i
又或者
set filter
goto bottom
(没有视图能用吗?)
哪个更快点?有没有更方便更高效更快的办法?用SQL好像慢很多。
最后更新于:2007-12-15 09:47:00
回复列表 (共32个回复)
沙发
cbl518 [专家分:57140] 发布于 2007-05-23 08:34:00
移动当前表中记录指针,并为每条满足指定条件的记录运行[Commands]命令块。
SCAN [NOOPTIMIZE] [Scope] [FOR lExpression1] [WHILE lExpression2]
[Commands]
[LOOP]
[EXIT]
ENDSCAN
实例:
SCAN FOR 条件=.T.
最后合乎条件的纪录= 表.字段名
ENDSCAN
?最后合乎条件的纪录
板凳
jinlonggao [专家分:17130] 发布于 2007-05-23 09:13:00
解决MOZ的问题,我有一个通过数据编辑浏览表单,我通常用拼音首字母快速检索法,将符合条件的记录筛出来供浏览编辑,用的是set filter to 命令.我觉得很方便,不用非得找符合条件的最后一条,你想要看的也不见得就是最后一条,将所有满足条件的都显示出来,也不过十几二十多条,就在眼皮底下,用鼠标随便挑.
3 楼
0901chang [专家分:10660] 发布于 2007-05-23 09:57:00
建立倒排序的索引,你ssek或者loca都会定位倒末尾的记录。如果你实际操作是正排序:
set orde to 倒排序索引
seek ??? 或者 loca fo ???
set orde to 正排序索引
我经常这样干。
vf数据库可以这样干,但SQL数据库好像不能这样干。
4 楼
0901chang [专家分:10660] 发布于 2007-05-23 09:59:00
当记录达到几十万以后,用set filt to <条件> 后goto bottom可能会产生不可容忍的低速度。
5 楼
moz [专家分:37620] 发布于 2007-05-23 14:13:00
有没有更好的方法?
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 楼
0901chang [专家分:10660] 发布于 2007-05-23 15:09:00
我需要在下订单的时候,自动翻出最新的资料,核对一下,能用则用,要改则改。
也就是说需要同一个名字,日期最晚的一条记录,你们说该怎么找好?
其实用 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 楼
0901chang [专家分:10660] 发布于 2007-05-23 15:21:00
moz兄,你怎么问这么简单的问题,是不是想给乌鸦送分,
或者是兴奋过度,把脑筋弄糊涂了。
8 楼
Ilikefox [专家分:5770] 发布于 2007-05-23 17:01:00
楼主及楼上诸君,试试SELECT:(未严格测试)
假设表TB.DBF(字段有客户编号, 联系方式及地址等等)
select max(recno()) from TB where 客户编号="XXXXXX"
另:3楼所言不错,但不必特意建立倒排序的索引,比如:按客户编号索引(TAG假定是BH),不管升降,seek 可以直接指定用升序还是降序,
seek "XXXXXX" order tag BH DESCENDING
当然该命令会影响原来索引的升降,比如原本是升序索引,上述命令用过后,打开表设计器,发现变为降序了。个人理解索引的升降序并不重要,索引文件像是一个双向链表,表头和表尾是相对的(set order命令能直接指定用升序还是降序),就看使用时哪个为头、哪个为尾。
9 楼
winabcd [专家分:3790] 发布于 2007-05-23 17:30:00
建个索引不就行了,用时打开它,不用时,可以不打开呀。
SEEK的速度也不会很慢的,
如果说是因为记录数太多,导致速度下降,我认为那要另想办法,
如按一定的时间段来用不同的表记录数据,这样按时间来查数据时,就会很方便的。
10 楼
djGong2002 [专家分:5750] 发布于 2007-05-23 17:46:00
我手上有一个表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技术.
我来回复