| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1804 人关注过本帖
标题:表格里自动增加序号,新手自己写了一段没实现,请老师指教
只看楼主 加入收藏
wonfone
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-1-11
结帖率:100%
收藏
已结贴  问题点数:18 回复次数:8 
表格里自动增加序号,新手自己写了一段没实现,请老师指教
SELECT jh
SET FILTER TO SUBSTR(编号,1,8)=DTOS(DATE())
GO bottom
IF EOF() .and. BOF() .or. RECCOUNT()=0
  sn='000'
ELSE
  sn=SUBSTR(编号,9)
ENDIF
blen=LEN(sn)
sn=VAL(sn)
sn=sn+1
sn=ALLTRIM(STR(sn))
elen=LEN(sn)

APPEND BLANK
thisform.rec = recno()
thisform.grid1.column1.value=DTOS(DATE())+SUBSTR('0000',elen-blen)+sn
GO TOP
thisform.grid1.ReadOnly=.F.
thisform.Refresh
搜索更多相关主题的帖子: 表格 
2011-08-29 13:10
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
自己运行调试过没有?

授人以渔,不授人以鱼。
2011-08-29 13:53
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你这个是购销单号性质的东西吧?用日期加流水号作ID码的。先不管后面表格那里的问题,集中精力把数据弄准确,即如何加一。首先审视数据规律,这个表是日期带流水号,那么只要把眼光放在当天日期上,实际的表中,要么有当天数据,要么没有,很容易确定——表必然有该字段的索引,按当天日期SEEK一下,要么找到,要么没找到,没找到很好办,找到了呢,就顺着下去找到最后一条(当天日期的)记录。知道怎么找吗?

授人以渔,不授人以鱼。
2011-08-29 14:18
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:4 
试试下面的代码,看能否有参考作用:

dToday=date()                    &&设定当前的日期
select max(编号) from 表 where 日期=dToday into curs tempid
if isnull(max_编号)
    newid=val(dtos(dToday)+"001")&&设置当天第一个编号(这里假定为三位序号,可以根据需要调整)
else
    newid=max_编号+1             &&计算新的编号
endif

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2011-08-29 15:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:9 
审视数据布局,是编程的基本功。现在模拟一下你数据表的数据,寻找算法。

假设数据表未排序数据如下:
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 编辑 ]

授人以渔,不授人以鱼。
2011-08-29 17:14
wonfone
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-1-11
收藏
得分:0 
对不起,又忘了说明问题,这个代码我运行过了,出问题的命令行是:thisform.grid1.column1.value=DTOS(DATE())+SUBSTR('0000',elen-blen)+sn 这句,错误提示是找不到属性value。
2011-08-29 19:27
qjbzjp
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:尧的故乡
等 级:贵宾
威 望:48
帖 子:1914
专家分:4397
注 册:2007-3-14
收藏
得分:5 
thisform.grid1.column1.text1.value=DTOS(DATE())+SUBSTR('0000',elen-blen)+sn

相互学习,互相交流,共同提高。
2011-08-29 20:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
出错就出错,说什么没实现。早说了你没调试过,以及先不管你后面表格的问题,就是知道你有出错语句,但说没实现,就不应该仅是语句出错问题,而是没有达到按要求序号加一的目的。你的流水码,一会用三位,一会用四位,这也没问题?

授人以渔,不授人以鱼。
2011-08-30 02:39
wonfone
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2010-1-11
收藏
得分:0 
呵呵,tonydeng教训的是,以前写代码都是参考加模仿,现在亲自写起来感觉很乱,有很多问题没有发现,不过有你的指导我学会了更多,谢谢TonyDeng,qjbzjp,hu9jj。修改了代码问题已经解决。
2011-08-30 11:37
快速回复:表格里自动增加序号,新手自己写了一段没实现,请老师指教
数据加载中...
 
   



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

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