如何生成一个单据号?

本文介绍了如何在网页端生成不重复的单据号,包括利用产品名称首字母拼接日期时间,以及通过查询数据库获取有规律的编号。详细讲述了在JSP页面、DAO实现类和服务层的实现步骤,确保单据号的唯一性和规律性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

平常新增一条数据的时候会用到流水号,单据号,编码号什么的,它们都是唯一的,不可以重复的,还有一些是必须有规律的,这样就比较容易区分。
那么如何设置一个不重复的单据号呢?
一、在jsp页面编写一个不重复的单据号
一般是用产品名称的首字母或者英文字母来拼接日期时间,一般精确到秒,这样就存在不会重复的,这是一个比较简单的方法,它不用查询数据库中的数据,直接在页面那边设置好利用就行了,因此也是没有什么规律的,只是根据时间变化的不同而不同罢了。
1、创建一个值为当前时间的变量
var date = new Date();//当前时间
alert(date);
在这里插入图片描述
2、根据本地时间格式,把Date对象转换为字符串,通过字符串方法match()找到一个或多个正则表达式的匹配。
利用正则表达式匹配字符串,‘//’代表的是正则中的包含字符,‘\’代表转义字符(将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符),‘\d’表示匹配一个数字字符,等价于[0,9],‘g’表示该表达式可以进行全局匹配,如果不加g,则只返回第一个匹配,‘+’代表匹配1个或多个的表达式,.join("")把匹配号的字符之间的分隔符去掉,用空字符代替。

//根据本地时间格式,把 Date 对象转换为字符串
document.getElementById("num").value="Y"+date.toLocaleString().match(/\d+/g).join("");
var num=$("#num").val();
alert("编号:"+num);

执行结果:
在这里插入图片描述
二、通过查询数据库中的编号来编写一个不重复有规律的编号
1、在Dao实现类中的方法
在Dao实现类的方法中实现方法,先获取我们封装好的连接,然后就可以对数据库中的数据进行操作,执行SQL语句,查询出表中的编号,获取表中的总条数i,如果存在数据就获取最后一条数据的编码,然后截取编码的最后三位数intLastCode(位数不定,这个是根据日期后面的位数来设置的),是根据开始索引和结束索引来截取目标字符的,它遵循的是左闭右开区间,由于我们获取的是一个整数,所以整数前面的0不会包含在内。
比如我获取的最后一条数据是‘ZGLY20190709001’,最后三位数‘001’的‘00’是不会显示的,只会显示后面的‘1’,然后再对它进行自增1;
因为我们获取的是整数,所以我们要把它格式化为n位的字符串,不足的位就用0来代替。
例:比如我们自增后的整数为99,日期后面的位数设置为4,那么最后的结果就为‘0099’
代码定义:
strCode=String.format("%0"+4+“d”, 99);// strCode=‘0099’
然后我们就可以对最后的结果拼接了,在此之前,我们要获取当前日期date,实例化Date对象,利用SimpleDateFormat类对date格式进行转换,转换为String格式“yyyyMMdd”,最后再将转换后的字符串str拼接我们获取到的最后三位数intLastCode,当然在日期前面也可以拼接一些标识性的字符串,假如我获取的是药品编号,可以这样拼接:
strCode = “Y” +str+intLastCode;
然后返回编号 return strCode;
但是如果查询不到数据的话就为第一条 strCode=“Y”+str+“0001”;
还有一个很重要的细节就是在返回字符串之前要记得关闭资源。
下面是详细代码:

public String selectZGLYDJ() {
	Connection con=null;
	PreparedStatement ps=null;
	ResultSet rs=null;
	Date date=new Date();//获取当前时间
	SimpleDateFormat format=new SimpleDateFormat("yyyyMMdd");
	String str=format.format(date);
	String strCode = "";
	String selectDJH="SELECT Billsnumber FROM pw_employeeneckdrug ORDER BY Billsnumber";
	List<String> list=new ArrayList<String>();
	try {
		con=DbUtil.getConnection();		
		ps=con.prepareStatement(selectDJH); 
		rs=ps.executeQuery();
		while(rs.next()){
			list.add(rs.getString("Billsnumber"));
		}
		int i=list.size();
		if(i>0){//如果存在数据
			String code=list.get(i-1);//获取最后一条的索引值的编码ZGLY20190709001
			System.out.println(code);
			int intLastCode = Integer.parseInt(code.substring(code.length()-3, code.length()));//截取编码的最后三位数 根据位置截取[10,13) 由于获取的是整数,0不会包含在内
			intLastCode++;//自增
			//日期后面的位数
			int num=3;
			strCode=String.format("%0"+num+"d", intLastCode);//把intLastCode格式化成num位的字符串,不足的位用0来代替,比如:String.format("%04d", 3);则结果为"0003"
			//编号
			strCode = "ZGLY" +str+strCode; //返回ZGLY20190712002
		}else{//不存在就为第一条
			strCode="ZGLY"+str+"0001";
			System.out.println(strCode);
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}finally{
		DbUtil.close(con, ps, rs);
	}
	return strCode;
}

二、在Servlet那边接收Dao实现类方法中返回的字符串
1、要想调用Dao实现类中的方法,就必须在Service实现类中
实例化Dao实现类

private BusinessDao businessDao=new BusinessDaoImpl();

然后返回Dao实现类中的方法

@Override
public String selectZGLYDJ() {
	return businessDao.selectZGLYDJ();
}

2、要调用Service实现类中返回的方法,就要在Servlet中实例化Service实现类

private BusinessService businessService=new BusinessServiceImpl();

方法:接收结果,并赋值到JSONObject中

public void selectZGLYDJ(HttpServletRequest request,HttpServletResponse response) throws IOException{
	String Billsnumber=businessService.selectZGLYDJ();
	JSONObject jsonObject=new JSONObject();
	jsonObject.put("Billsnumber", Billsnumber);
	PrintWriter printWriter=response.getWriter();
	printWriter.write(jsonObject.toString());
	printWriter.flush();
	printWriter.close();
}

在doPost方法中提交该方法,在doGet方法中调用doPost方法,对doPost方法的请求提交响应。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	request.setCharacterEncoding("utf-8");//请求的编码格式
	String type=request.getParameter("type");//用来区分方法
	if("selectZGLYDJ ".equals(type)){
		selectZGLYDJ(request, response);
	}
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	doPost(request, response);
}

三、Jsp页面中获取Json中的结果

$.getJSON("${ctx}/servlet/BusinessServlet?type=selectZGLYDJ",function(data){//单据编号
  	var billsnumber=$("#Billsnumber").val(data.Billsnumber);
	var num =$("#Billsnumber").val();
  	alert(num);
});

执行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值