计算机二级VFP关于EOF、BOF和SKIP的问题

1个回答

  • 首先,你在大脑形成一个在【中间】写了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早期的设计都高得多了,这就是进步