审视数据布局,是编程的基本功。现在模拟一下你数据表的数据,寻找算法。
假设数据表未排序数据如下:
201108100001
201108110001
201108100002
201108100003
201108110002
201108100004
201108120001
201108120002
今天是20110811,追加新记录。
面对这样的数据,我们应该怎样处理呢?首先,让它排序,这是最基本的,最容易想到的是升序排序,就按升序排一次看:
201108100001
201108100002
201108100003
201108100004
201108110001
201108110002
201108120001
201108120002
很明显,经过排序后的数据,必然是所有20110811的聚集在一起,其排列顺序也是升序,以20110811开头的一串数据最后那个就是当前流水号最大的。用SEEK DTOS(DATE()),就可以找到201108110001这条记录,然后一路往下SKIP,直至发现不是20110811开头的那条(即201108120001或表尾,表尾是空记录,也不是20110811开头),到了这时,往回跳一下SKIP -1,就是201108110002,这样,我们就能够加1了。如果连20110811都找不到,那更好,新记录直接就是201108110001。这就是所要的算法,按这个步骤设计程序,就达到目的。
那么,还有更快的算法吗?有!前面我们用升序排序,现在设想一下降序:
201108120002
201108120001
201108110002
201108110001
201108100004
201108100003
201108100002
201108100001
发现了吗?只要SEEK "20110811"成功,就已经找到了所需的记录,省去了后面的寻找动作。这个是最快的!
如何衡量效率呢?学过算法的应知,凡是带FOR、ALL、WHERE之类的筛选,若无索引,必然要全盘检索遍历所有数据,若有索引,就用前面第一种。所谓的INTO到数据表或视图,是把符合条件的记录复制(INTO DBF时)出来,或映射到内存虚拟表(INTO CURSOR)中,这些都是我们不需要的。要时刻记住我们现在要什么?要的是找到某条记录,不是要一个数据集合,无需那些多余的动作!
[
本帖最后由 TonyDeng 于 2011-8-29 17:17 编辑 ]