LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

如何生成连续的流水号

admin
2011年3月3日 17:8 本文热度 2859
工作中常常遇到流水号生成的问题,有的客户要求流水号必须连续,这个我们的开发工作提出了一个小难题。

解决方法如下:

方法一:采用最大号表的形式

在数据库中创建一个表专门存放其他数据库的最大流水号,table_maxOrderID {table1_max,table2_max};

在向数据库中插入数据的时候,首先想table_maxOrderId表查询到当前表的最大号加1,先更新最大号表,然后保存到业务数据。

优点:效率高

缺点:号码浪费大一些(例如保存的时候失败了,那么这个号码就浪费了。)

方法二:采用抢号的形式

这个不需要创建最大号表,在向数据库中保存数据的时候,获取当前表的最大流水号。例如:

select max(ID) from tableName ; 让后将结果加一。

优点:速度快,不浪费号码;

缺点:并发的时候,号码重复造成数据无法保存。

解决办法:抢号。如果保存失败,那么重复抢号例如:

Java代码
  1. public synchronized String getOrderId(String shengid) {   
  2.   
  3.     if (shengid == null ││ "".equals(shengid.trim())) {   
  4.   
  5.         throw new NullPointerException("在获取流水号的时候,省id为空!获取流水号失败!");   
  6.   
  7.     }          
  8.   
  9.     // 首先查找所在地区查找企业表中有没有数据   
  10.   
  11.     int num = xjqyDao.getCountBySql(" and qy_sheng='" + shengid + "'");   
  12.   
  13.     String orderId = null;   
  14.   
  15.     if (num == 0) {   
  16.   
  17.         orderId = "0001";   
  18.   
  19.     } else {   
  20.   
  21.         //必须找到本省最大的档案的id               
  22.   
  23.         String maxDabh = xjqyDao.getMaxDabhBySheng(shengid);   
  24.   
  25.         num = Integer.parseInt(maxDabh.substring(6));   
  26.   
  27.         String temp = (num + 1) + "";   
  28.   
  29.         int LEN = temp.length();   
  30.   
  31.         if (LEN > 4) {   
  32.   
  33.             log.error("出错了!一个省的蚕茧收购加工企业的个数不能超过1万!");   
  34.   
  35.             return null;   
  36.   
  37.         }   
  38.   
  39.         for (int i = 0; i < 4 - LEN; i++) {   
  40.   
  41.             temp = "0" + temp;   
  42.   
  43.         }   
  44.   
  45.         orderId = temp;   
  46.   
  47.     }   
  48.   
  49.     return orderId;   
  50.   
  51. }  
Java代码
  1.   
Java代码
  1. class=java name="code">            for (int i = 0; i < 5; i++) { // 连续抢号5次,如果失败,请用户稍后再试!   
  2.   
  3.                 try {   
  4.   
  5.                     String orderId = getOrderId(xjqy.getSheng());// 获取连续的流水号   
  6.   
  7.                     log.debug("获取到的连续的流水号为:" + orderId);   
  8.   
  9.                     String dabh = ""// 档案编号   
  10.   
  11.                     String code = ""// 企业编号   
  12.   
  13.   
  14.   
  15.                     dabh = xjqy.getSheng() + xjqy.getJdrq().substring(04)   
  16.   
  17.                             + orderId;   
  18.   
  19.                     log.debug("档案编号为:" + dabh);   
  20.   
  21.                     xjqy.setDabh(dabh);   
  22.   
  23.   
  24.   
  25.                     // 所在省做了js校验   
  26.   
  27.                     if (xjqy.getShi() == null ││ xjqy.getShi().equals("")) {   
  28.   
  29.                         // 如果市为空   
  30.   
  31.                         code = xjqy.getSheng() + "0000" + xjqy.getLb()   
  32.   
  33.                                 + orderId;   
  34.   
  35.                     } else if (xjqy.getXian() == null  
  36.   
  37.                             ││ xjqy.getXian().equals("")) {   
  38.   
  39.                         // 如果县为空   
  40.   
  41.                         code = xjqy.getShi() + "00" + xjqy.getLb() + orderId;   
  42.   
  43.                     } else {   
  44.   
  45.                         code = xjqy.getXian() + xjqy.getLb() + orderId;   
  46.   
  47.                     }   
  48.   
  49.                     log.debug("企业编号为:" + code);   
  50.   
  51.                     xjqy.setCode(code);   
  52.   
  53.   
  54.   
  55.                     xjqyDao.create(xjqy);   
  56.   
  57.                     log.debug("create object");   
  58.   
  59.                     flag = true;// 保存成功!   
  60.   
  61.                     break// 退出循环   
  62.   
  63.                 } catch (Exception e) {   
  64.   
  65.                     log.debug("保存企业信息出错:", e);   
  66.   
  67.                 }   
  68.   
  69.             }   
  70.   
  71.   
  72.   
  73.             if (!flag) {   
  74.   
  75.                 throw new OurException("保存失败!请稍后重试!");   
  76.   
  77.             }
      

小结:
如果要从严格意义上生成连续的流水号,那么应该采用抢号的方法,同时限制用户不准删除记录,这样才能保证流水号的严格连续,否则录入5条,删掉其中的2条,那么用户看到的记录的号码将无法连续了。


该文章在 2011/3/3 17:09:10 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved