比如我要建一个单,比如是采购单吧,总之这个单是唯一的。不能重复。
单号这样的:今天 20091208 四位年+两位月+两位日后面还有一个序号,即当天的第几份单,第一份2009120801,第二份2009120802等,依此类推。
现在关键是找出 后面两位,也就是序号。-------我现在的方法是这样的:查库中的最后一条的日期是否今天,不是,则建一份 也就是 01,如果不是,则判断当前里序号最大的那个,然后 +1,就是我要的序号。这样的做法,多用户去用,也就出错了,因为这个序号不是唯一。比如,当前库中最大是 02,我现在新建一张单,当然是 03,但我未保存,库中也是 02,不是03,我建未保存时,其它人也建了,也一样是 03,那大家同时保存的时候,都会出现这个单号不唯一了。
------------------请问有什么好的办法可以实现这个序号是唯一的。我想过的方法:
1-----------新建时立即插到库,这样机率现在重复少,但用户不想要的时候,直接退出,关闭IE等,这个单号就多余出来了。(或者用户改变单里内容时插入,这个也一样。)
2----------新建一个单,就把最新序号写进 txt 里面,这样就可以实时,但有一个缺点,用户多次点了,或者人多点了新建,而没保存,直到这个数 到 99,那就超出我的数了。而到99时,真正在库的可能一个也没有,也就是浪费了很多个序号而没去用。我实在没用办法怎样实现这个功能了,请教怎样实现,谢谢分数可以加!!!

解决方案 »

  1.   

    干嘛不用自增呢?1、能否在过程中用事务实现呢?如存在就回滚并重新计算,不存在就提交事务
    2、或者就两个字段,一个存日期一个存当天序号,生成时只插日期当记录插入成功后更新序号,查询时用CONCAT()连接即可
      

  2.   

    我知道你在新建的时候已经有一个单号,我的意思是你点击保存后,再对数据库进行一次查询,将查询结果加1,插入数据库。现在大部分ERP系统都是这样处理的。
      

  3.   

    数据库有一种东西叫Transaction...
    http://bbs.phpchina.com/viewthread.php?tid=362
      

  4.   

    文件 上传 跟 Transaction 有什么关系...不同层的东西 
      

  5.   

    填写的时候不要生成单号,保存数据库是再计算单号,成功后再告知“记录已成功保存,单号为xxxxx”。
      

  6.   

    你代码处理的时候是不是出了问题?一份新单+附件一起提交,应该先把数据$_POST的数据insert进数据库后,获取了mysql_insert_id(),再着手处理$_FILES的数据。
      

  7.   

    既然这样设计,思路就得转过来.是先上传文件,再把生成的订单关联文件,而不是先生成订单号,上传文件的时候关联文件.
    上传文件,成功,close弹出框,然后把上传成功后的文件路径传回给window.opener的某个文本框,多文件就分号分隔(数据库里订单表要有个字段,存储关联的文件路径),然后订单才提交.