| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2834 人关注过本帖
标题:不理解recno和reccount
只看楼主 加入收藏
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:2 
以下是引用hu9jj在2015-5-25 17:21:45的发言:

本论坛就有啊。
这些最基础的知识在任何一体入门教材中都会有啊。
应该没看过教材
2015-05-26 00:00
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:2 
楼主,不是我打击你,如果连这俩函数都搞不明白的话,建议你不要学数据库了。
2015-05-27 07:43
ILoveVFD
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:218
专家分:147
注 册:2015-5-2
收藏
得分:2 
2015-05-27 23:41
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
以下是引用muyubo在2015-5-25 23:10:18的发言:

recn() &&当前记录号,记录指针变化,recn()也变化.
recc() &&表的记录个数,如1000条记录,recc()就是1000


还没有那么简单

授人以渔,不授人以鱼。
2015-05-28 10:34
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
把函数的名字写全了,困惑会比较少。

recn(),其实是RecNo(),即Record No.,记录号(No.是number),记录在表中的物理序号,那是在append记录(不管用什么指令添加)时生成的,记录的逻辑位置可以随着索引起作用而呈现在不同的视图位置,但在物理位置上,它是不变的。从低级文件IO的角度看,这个号码标识记录离表头的绝对距离,vfp读写数据记录的指令之所以那么快,就是用这个距离公式直接跳到指定位置读写的,你可以把它理解为數組的下标(为什么數組随机读写记录的速度比链表快,原因就在这里)。这个序号,不会随着记录被Delete而改变,Delete过但没Pack过的记录,是仍然存在表中的,一旦被Pack过,RecNo的值就会改变(物理排序Sort指令会更改记录号),这是编程利用物理序号时必须注意的陷阱——我见过很多人乱用recno和pack根本不怕死的。

recc(),其实是RecCount(),Record Count的缩写,就是表的物理记录总数,它也同样不随Delete而变化。这个数值也是在Append记录时写在表头的,只要没pack和zap过,就不会变。凡是Delete过记录的表,用recc()得到的结果,九成与期望的不同,这也同样是陷阱,我也见有人踩过而不自觉。

[ 本帖最后由 TonyDeng 于 2015-5-30 09:28 编辑 ]

授人以渔,不授人以鱼。
2015-05-28 12:19
chychychy
Rank: 2
等 级:论坛游民
帖 子:278
专家分:98
注 册:2015-4-18
收藏
得分:2 
15楼详细明了,学了。
2015-05-28 21:21
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
15楼分析得很到位,但估计楼主不会看得懂。
2015-05-29 10:14
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用taifu945在2015-5-29 10:14:15的发言:

15楼分析得很到位,但估计楼主不会看得懂。

那是给muyubo补充的

授人以渔,不授人以鱼。
2015-05-29 11:49
muyubo
Rank: 9Rank: 9Rank: 9
来 自:山东莱芜
等 级:蜘蛛侠
威 望:3
帖 子:471
专家分:1017
注 册:2011-3-6
收藏
得分:0 
回复 18楼 TonyDeng
感谢指点!向版主们学习,我倒是知道dele记录还是存在物理记录位置.
set dele on只是被dele的记录不显示了,物理记录位置也是存在的对吗?也就是recc()也包括它.
2015-05-29 15:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
当然存在了。delete记录,其实只是在记录的前面写上一个特殊的符号,标识这条记录是作为被删除记录看待的,能不能看到,在乎显示数据的指令(亦即程序员)是否跳过它。这就是每条记录的真实尺寸比所有字段尺寸的总和大一个字节的原因。像Grid那样的控件,有一个DeleteMark屬性,就是控制这个字段(本质上这一列符号也是字段)是否呈现出来的,Browse指令就是一个Grid对象。set deleted on全局设置,是告诉所有相关的指令代码:当你处理数据之前,若发现这个全局变量为真,就跳过被标识为删除的记录不处理。仅此而已,物理上,这些数据是仍然存在的,所谓的recall恢复记录,不过就是把那个标志字符抹去而已。我曾说过回收记录,就是这么做的。

明白这个原理,所谓的删除或消隐、过滤、筛选,统统都是这个手法,关键处是控制循环的skip條件。不妨回忆一下,set filter to过滤数据之后,为什么要把记录指针移动一下才行呢?那是为了防止当前记录指针正好落在被标识删除的记录上,若不移动一下发生skip判断,那么引用当前记录数据的时候就会出现错误。

记录号是不变的,与生俱来的。有人依据记录号作为顺序,那是把逻辑顺序和物理顺序搞混了,前者可以按照索引條件变化,goto bottom的记录,未必是recno最大的。有个别的insert指令,会把记录物理插入在表的中间,它会搬动数据,从而把一批数据的记录号全变动过。append总是比insert快。在某些追求效率的程序环境中,为了不浪费磁盘空间,以及回避pack需要独占数据表的困难,可以使用上述的回收记录方式,这个时候,模拟的append不是追加在表尾的(记住:数据的顺序应该以索引为依据,改变索引字段正确的值即可,不要用记录号)。

记录号,本质上就如数组的下标,那是一个物理位置序号。空间位置是不会变的,永远存在的,但在这个空间上的数据是可以变的。房子住什么人,的确会变。

[ 本帖最后由 TonyDeng 于 2015-5-29 16:28 编辑 ]

授人以渔,不授人以鱼。
2015-05-29 16:20
快速回复:不理解recno和reccount
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038905 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved