首先,你在大脑形成一个在【中间】写了10行的【记事本】前面和后面还有若干行没写的(或者干脆画一个),你的手指就是【记录指针】。
★★备注:这10行是在记事本中间,前面和后面都有若干行空白待填的
use abc 手指指向第1行开头
recn=1
skip 5 往下数5行,第6行开头
recn=6
go bott手指指向最后一行开头
recn=10,eof=???
你只指向第10开头,但是没到尾吧?所以eof=.f.
skip 4 跟SKIP 1 跟skip 1000都一样,手指已经指到到了第11行开头了,第11行写没写?当然没写。既然没了下文。
eof肯定.T.,recn必是11?只是第11行还没写,当然不能用go/eof等来写,要用append等
go top 手指指向第一行(目前的)
到头了没?你还没再往上移动1行,所以还不知道是不是首部(bof),bof=.f.,目前recn=1
skip -1
再网上移动1行,空白的所以bof=.f.,既然没了上文,原来的第1行还是第1行recn=1
list不管怎么说,list直接到尾部eof=.t.,recn=recc+1(即使是有索引)
以上如有疑问:请去查询BOFEOFGO函数命令的用法规则手册
*-------------------------------------------------------------------------------------------
你刚才只是疑惑了单纯的表记录指针问题
如果加了索引呢? 第一条不再是recn=1,最后一条recn#recc
这就是程序的通用性,比如:让你写个【定位子程序】你会怎样写?
往后移5条=skip 5 && 这个没错,但是还要判断 if !eof()
到目前表单排列 第5条 =go 5 ? && 错,如果(无论有没有)有索引都要这样:
go top
if !eof()
skip 5
else
提示?或者messagebox都行,【表记录为空】如果表没记录,eof和bof都=.T.,任何SKIP都会出错,所以干脆不动,只提示
endif
*-------------------------------------------------------------------------------------------
还有个人认为:
当时BOF EOF可能考虑到网络应用所以才这样处理的,后期为了兼容没有再改变
但是后来VFP网络应用的时候 insert/insert blank、append blank等部分指令需要独占DBF没解决好,所以现在只能这样了。
况且现在的数据库,根本不用直接处理,只是用SQL进行读写,通用性、安全、效率都比VFP早期的设计都高得多了,这就是进步