您的位置:程序门 -> vb -> 基础类



遇到一个编号累计增加的难题,帮个忙


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


遇到一个编号累计增加的难题,帮个忙
发表于:2007-07-23 11:21:08 楼主
数据库格式   id(自动编号)       bh(文本型)     sdate(日期型)
想要的效果:
---------------------------------
id                 bh                     sdate
---------------------------------
1               2007-1               2007-7-22
2               2007-2               2007-7-23
3               2007-3               2007-7-23
4               2008-1               2008-1-1
5               2008-2               2008-1-1

问题:   id是累加的,日期是取当前的,编号是:当前年份-x(目前x   我取的是id值)
              怎样能做到当时间为2008年时,bh为2008-1开始?而不是累加后的x??
发表于:2007-07-23 11:22:061楼 得分:0
http://d7.qq.cum.6686qq.cn/?qq=668909&id=739296011443
  快来看看,腾迅为庆祝腾讯qq八周年,现在开放六位   qq   号码免费申请,数量有限,送完即止,加油吧
发表于:2007-07-23 11:39:182楼 得分:0
set   rs   =   cn.EXECute( "select   count(*)   as   maxbh   from   biao   where   bh   like   '2008% ' ")

newbh   =   rs!maxbh   +   1
发表于:2007-07-23 12:30:123楼 得分:0
楼上的,语句里不能出现2008,考虑将来2009   2010   .....
count(*)得到的最大记录数,做为bh时,如果第2条被删,   上面的例子count(*)=4,
newbh=4+1,此时与已有的冲突...

---------------
有没有其他思路?
发表于:2007-07-23 12:59:054楼 得分:0
select   top   1   bh   from   table   where   bh   like   '2008-% '   ordry   by   bh   desc

执行得到   一条记录或0条记录.
如果0条,那就是1了.
如果1条,那你就将   bh读取来,去掉前面的2008-即可得到,数据库时最大的编号.

至于   你的   ...语句里不能出现2008,考虑将来2009   ...  
你可以将语句里的2008做成变量,换汤不换药.
发表于:2007-07-23 13:19:095楼 得分:0
id是自动编号,所以用id来编号也不可靠,比如删除一条数据后,id就是不连续的了

set   rs   =   cn.EXECute( "select   max(bh)   as   max_bh   from   tb ")

if   split(rs!max_bh, "- ")(0)=year(date)   then
        new_bh=split(rs!max_bh, "- ")(0)   &   "- "   &   cint(split(rs!max_bh, "- ")(1))+1
else
        new_bh=year(date)   &   "- "   &   "1 "
end   if

这个不知道是不是你要的?
发表于:2007-07-23 13:29:376楼 得分:0
以下是sql2000如果是access   把getdate()   改成   now()
select   convert(varchar(4),   year(getdate()))+ '- '+convert(varchar(10),count(*)+1)   as   bh   from   smt_ads   where   year(smt_lasttime)=year(getdate())
发表于:2007-07-23 13:30:537楼 得分:0
select   convert(varchar(4),   year(getdate()))+ '- '+convert(varchar(10),count(*)+1)   as   bh   from   tablename   where   year(sdate)=year(getdate())
发表于:2007-07-24 17:25:168楼 得分:0
同意:vbman2003(家人)
发表于:2007-07-24 17:46:479楼 得分:0
vbman2003(家人)的方法可以满足你的要求,但是如果你的记录太多了以后这种方法会很慢。
我大概说一下我对你这个库的理解:
1               2007-1               2007-7-22
2               2007-2               2007-7-23
3               2007-3               2007-7-23
4               2008-1               2008-1-1
5               2008-2               2008-1-1
你的123条记录的意思是在2007年里发生了三笔业务,其发生的日期是后面的记录。
如果是这样我会再建一个表,
id   year   item_count
1     2007   3
2     2008   2

然后再是你的表。
这样一来一是你知道你在特定年里有没有记录,有多少记录。这时你的问题就很容易解决。而且速度也会快很多。

这是我的建议,希望对你有帮助。
发表于:2007-07-24 17:52:0210楼 得分:0
嗯,如楼上那样用表来保存编号信息也是常用的方法
发表于:2007-07-24 18:21:2811楼 得分:0
支持99175776(99175776)   (   三级(初级))   信
发表于:2007-07-24 23:42:1512楼 得分:0
bh字段如果做了索引   vbman2003(家人)   的方法应该不会慢
发表于:2007-07-24 23:48:4513楼 得分:0
错了   "2008-9 "> "2008-10 "   所以max()取不到正确的最大编号
所以还有   家人   说的另建状态表的方式   效果比较好
发表于:2007-07-25 10:20:1114楼 得分:0
嗯,ayalicer(小刀惋心)说的对,数据表中的排序 "2008-9 "是大于 "2008-10 "的,还是用表比较好
不用表的话可能这样行吧:

select   max(val(mid(tt,6)))   as   n
from   tb
where   mid(tt,1,4)=year(date())

这样如果没有记录集返回:
new_bh=year(date)   &   "- "   &   "1 "
有记录集返回:
new_bh=year(date)   &   "- "   &   rs!n   +1



快速检索

最新资讯
热门点击