`
simon_du
  • 浏览: 22149 次
  • 性别: Icon_minigender_1
  • 来自: 洪湖
社区版块
存档分类
最新评论

单据编号的生成

    博客分类:
  • EFS
efs 
阅读更多

1. 单据编号的构成

          为了避免重复及保持有序性,单据编号通常格式为 “关键字+YYMMDD+n位流水号,当然具体规则会根据业务需   要变化,包括 年月日的显示变化和流水号的位数变化(及编号升序);

       例如: YS0812250001, YS200812250001,YS2008120001,YS081225001

 

2.代码实现关键

       生成单据号的关键点归纳为两点:a.确定生成规则;b.查询当天尾数最大的单据号

 

3.范例

 

    /*
     * TODO:(新增时)生成单据编号(编码规则:“YN”+年月(4位)+流水号(4位) 如YN08110001)
     * 单据号共10位

     */
    public String creatBudPlanNo()
    {
       
        // 初始化Plan
        Plan plan = new Plan();
        List<Plan> planList = new ArrayList<Plan>();
        // 生成单据编号的前面部分;YN+YY+MM+(四位流水)
        String planNoStr = "YN";

        //日期格式化--YYMM
        String currentDateStr = DateUtil.getDate(DateUtil.getCurrentDate());// 格式为YYYY-MM-DD
        String currentDate = currentDateStr.replaceAll("-", "");// 去掉中间的"-"
        currentDate = currentDate.substring(2, 6);// 从第三位开始取4个字符(即去掉前后两位)
        // 得到 YN+YY+MM
        planNoStr = planNoStr + currentDate;
        // 取得流水号,查询数据库与planNoStr进行匹配(可模糊查询)
        plan.setBudPlanNo(planNoStr);
        // 如果查询到记录,则在最大的送检编号基础上加1生成新的编号,如果没有记录则构建"YN+YY+MM+0001"
        planList = findByModel(plan);
        if (null != planList && planList.size() > 0)
        {
            // 循环比较得到最大的ID对应的是那条记录编号t---从而取得最大的送检编号),
            int t = 0;
            // 用于存储id
            long m = 0;
            // 用于存储i值对应的id
            long n = 0;
            for (int i = 0; i < planList.size(); i++)
            {
                m = planList.get(t).getId();
                n = planList.get(i).getId();
                // 比较id值,将更大的id值对应的记录号赋给t
                if (m < n)
                {
                    t = i;
                }
            }
            // 如果存在,取出最大的编号,取出后四位,转化为Long进行计算
            if (!StringUtil.isRealEmpty(planList.get(t).getBudPlanNo()))
            {
                // 取得编号
                String str = planList.get(t).getBudPlanNo();
                // TODO 先判断是否是长度为10(单据位数),如果不是则提醒有无效数据
                if (10 != str.length())
                {
                    return null;
                }
                // 取得字符串长度
                int k = 0;
                k = str.length();
                if (4 < k)
                {
                    // 取出最后四位,转换为Long型,自加1;
                    str = str.substring(k - 4);
                    long ln = Long.parseLong(str);
                    if (9999 > ln)
                    {
                        ln++;
                        // 转回string类型,将不足3位处补零,组合得到后三位流水号
                        str = Long.toString(ln);
                        String temp = "";
                        for (int i = 0; i < (4 - str.length()); i++)
                        {
                            temp += "0";
                        }
                        str = temp + str;
                        // 得到单据编号
                        planNoStr = planNoStr + str;
                    }
                    else
                    {
                        return null;
                    }
                }
            }
        }
        else
        {
            // 如果没有记录则构建"YN+YY+MM+0001",为编号文本框赋值
            planNoStr = planNoStr + "0001";
        }
        return planNoStr;
    }

  

2
1
分享到:
评论
3 楼 simon_du 2009-01-29  
xiaoluojinsheng 写道

有一问题,你这方法如何避免数据库并发?

:),这个问题还没考虑到,如果有好的方法,大家一起分享一下,谢谢,新年快乐!!
2 楼 xiaoluojinsheng 2009-01-13  
有一问题,你这方法如何避免数据库并发?
1 楼 xiaoluojinsheng 2009-01-13  
好文章,我先试试!

相关推荐

    K3单据编号生成代码

    本文将深入探讨“K3单据编号生成代码”的相关知识点。 首先,我们来看`DATE_FORMAT.txt`可能涉及的内容。在K3系统中,单据编号通常会包含日期信息,以确保编号的唯一性并便于追溯。`DATE_FORMAT`可能指的是日期格式...

    金蝶K3 Wise 用SQL生成单号(单据编号)及单据内码(单据ID)

    在金蝶K3 Wise系统中,管理和生成单据编号与单据内码是企业信息化管理中的重要环节。本文将详细解析如何通过SQL语句来实现这一功能,主要涉及的两个核心存储过程是`p_BM_GetBillNo`和`GetICMaxNum`。 一、生成单据...

    C# 编号/单号生成器 源码

    该项目利用了C#的面向对象特性,通过类和对象来封装编号生成的逻辑。每个编号规则可以被抽象为一个类,包含生成规则的方法和属性。 3. **编号规则定制**: 这个工具允许用户自定义编号格式,可能包括前置固定字符...

    JAVA生成订单号(日期+流水号)

    1. **资产编号生成**:`assetNumber()`方法结合了时间与三位随机数来生成资产编号。 ```java String t = getStringDate1(); int x = (int) (Math.random() * 90) + 10; String serial = t + x; return serial; ...

    根据当天日期自动生成单据号

    在IT行业中,尤其是在Java编程领域,自动生成单据号是一个常见的需求,特别是在财务系统、订单管理系统或者任何需要唯一标识业务实体的地方。这个需求通常涉及到日期处理、字符串格式化以及可能的序列号生成。下面...

    NC单据号的生成

    系统之间数据交互生成NC单据,那么单据号的生成可以不填也可以通过代码生成,防止跳号

    一个写的很不错的获取单据编号存储过程

    本文将详细解析一个用于生成单据编号的存储过程,深入理解其设计原理与实现细节。 ### 存储过程概述 存储过程是一种在数据库中存储的预编译SQL语句集合,可以接受输入参数,执行一系列数据库操作,并返回结果。...

    多种方式自定义单据编号

    可以根据自己的需求定义比如 字符+长日期+编号(自增位数)比如:CSDN200812120001 CSDN200812120002 .... 字符+短日期+编号(自增位数)比如: CSDN08121200001 CSDN08121200002

    入库单(采购)(1).xlsm VBA自动生成单据号

    VBA自动生成单据号

    用Word制作自动连号(自动连续编号)的单据

    Word自动连续编号技术是指使用Word软件来实现自动连续编号的单据制作技术。这种技术可以应用于日常工作中需要打印自动连号的单据,或者给不同的客户发送相同信息的邮件,每封邮件的信息类型相同,但具体内容各不...

    nc57审批流单据配置(巨详细).doc

    * 单据编号 * 单据类型 步骤四:单据动作组管理 在NC57系统中,需要配置单据动作组管理,点击“客户化→二次开发工具→单据管理→单据动作组管理”,配置好提交、审批、弃审等动作管理。 步骤五:动作脚本 在NC...

    Oracle生成单据编号存储过程的实例代码

    Oracle生成单据编号存储过程,在做订单类似的系统都可能会存在订单编号不重复,或是流水号按日,按年,按月进行重新编号。 可以参考以下存储过程 CREATE OR REPLACE procedure Pro_GetBillNO(TypeTable in varchar2...

    如何通过C#实现单据号码的自动增加

    在许多业务系统中,单据编号的自动生成是一项常见的需求。合理的编号规则不仅能够方便管理和追踪,还能体现系统的专业性和规范性。本文将详细介绍如何利用C#语言来实现单据号码的自动增加功能。 #### 知识点概览 1...

    Springboot唯一编号整合,vesta全局唯一id生成器

    在现代的分布式系统中,确保每个实体的唯一标识是非常重要的,这通常涉及到全局唯一ID(Global Unique Identifier,简称GUID)的生成。SpringBoot作为一个轻量级的Java开发框架,广泛应用于微服务架构,而Vesta ID ...

    用友最大单据号工具大全

    【用友最大单据号工具大全】是一套专为用友软件用户设计的实用工具集,主要用于管理和查询用友系统中的最大单据编号。在企业信息化管理中,单据号作为业务记录的重要标识,对于数据的准确性、连续性和完整性至关重要...

    C#生成流水号小代码

    流水号通常用于标识唯一性记录,例如订单编号、文档编号等。该代码通过结合当前日期与递增的序列号来生成唯一的流水号。 #### 二、关键代码分析 ##### 1. **命名空间引入** ```csharp using System; using ...

    c# 按日期+序号进行自动编号

    在网上搜了半天,都没有看到满意的程序。只好参照别人写的例子,自己写了。编号是按照年份和月份+三位序号自动生成的,用的是SQL server数据库,用VS2010编写的。调试已通过。希望给同为新手的各位一个参考。

    小系统单据自动生成存储过程

    存储过程是SQL Server等数据库管理系统中的一个重要功能,它是一组预编译的SQL语句集合,用于执行特定任务,如生成自定义序列号或单据编号。本文将深入讨论如何利用存储过程实现小系统单据的自动生成,并分析两种...

Global site tag (gtag.js) - Google Analytics