网站导航网学 原创论文 原创专题 网站设计 最新系统 原创论文 论文降重 发表论文 论文发表 UI设计定制 论文答辩PPT格式排版 期刊发表 论文专题
返回网学首页
网学原创论文
最新论文 推荐专题 热门论文 论文专题
当前位置: 网学 > 设计资源 > 数据库 > 正文

sqlserver,Oracle通用处理自动产生流水编号:字母、日期、数字等组成

论文降重修改服务、格式排版等 获取论文 论文降重及排版 论文发表 相关服务

曾经在实训时,做了最后一个项目是伟库网里的ERP-进销存网站。这个网站有一点就是每操作保存成功,都会产生一个单据编号。

而这个单据编号是由不同方式组成的,比如以下两个图:JH10120001,CD10120001。以下我来详细的讲解个人的理解与做法,

随笔中如若有错之处或者修要修改的,欢迎各位高手或浏览者指教,并希望你们提出宝贵的意见和建议。以下的内容希望对那些做ERP或者电子商务等等需要用到流水编号的同志们有所帮助.方法不是唯一的,知其中原理。

第一幅图的编号:JH10120001--进货首字母、日期是10年12月、4为编号组成的。

第二幅图的编号:CD10120001--采购订货中的采和订首字母、日期是10年12月、4为编号组成的

我们来看下sql server的做法,这里用到标量值函数,也可以用存储过程。

  1. ------------------------------------ 
  2. ---- 
  3. /* 
  4.  *作    者:lin sen 
  5.  *功能说明:标量值函数(返回自动流水编号) 
  6.  *编写日期:2010-12-23 
  7. */ 
  8. ------------------------------------ 
  9. DROP FUNCTION FUN_AutoLSH 
  10. GO 
  11. CREATE FUNCTION FUN_AuTOLSH() 
  12. RETURNS VARCHAR(20) 
  13. AS 
  14. BEGIN 
  15.     DECLARE @LSHID VARCHAR(20)    --返回流水编号 
  16.     DECLARE @NUM INT 
  17.      
  18.     --查询该表最大的流水号 
  19.     SELECT @NUM=ISNULL(MAX(CONVERT(INT,SUBSTRING(LSH,8,4))),0)+1  
  20.     FROM YW_MESSAGE 
  21.      
  22.     --拼接下一个流水号:J+年份4位+月份2位+4位编号(如J2010120001) 
  23.     SELECT @LSHID='J'+SUBSTRING(CONVERT(VARCHAR(100),GETDATE(),112),1,6)+SUBSTRING(CONVERT(CHAR(5),10000+@NUM),2,4) 
  24.     FROM YW_MESSAGE 
  25.      
  26.     RETURN @LSHID 
  27. END 

调用:select dbo.FUN_AutoLSH();

 有人会说哥们公司不用sql server,而是oracle。这个跟底下的通用一样的道理,只不过几个系统的函数不一样。以下是oracle标量值函数做法:

  1. create or replace function Fun_AutoLSH  
  2. return  nvarchar2 
  3. AS 
  4.   LSHID nvarchar2; 
  5.   NUM   number; 
  6. begin 
  7.   --查询该表最大的流水号 
  8.   SELECT nvl(max(to_number(substr(LSH,6,4))),0) + 1 into NUM 
  9.   From TEST.YW_MESSAGE; 
  10.    
  11.   --拼接下一个流水号:J+年份4位+月份2位+4位编号(如J2010120001) 
  12.   SELECT 'J'||to_number(to_char(sysdate,'yyyymm'))||substr(to_char(10000+NUM),2,4) into LSHID                  
  13.   FROM TEST.YW_MESSAGE; 
  14.   return(LSHID); 
  15. end Fun_AutoLSH; 

调用:select Fun_AutoLSH() from dual;

我们看到一个单据编号写一个函数,两个呢....上百个呢,总不可能写一百个函数,关键是他们基本相同。

比如那个进销存网站有采购订货、采购入库...销售签单、销售出库...库存管理的调拨、货品盘点等等保存数据都会产生单据编号。
可以写个通用的函数,其他要用的话,只要调用就行。以下是个人写的:通用存储过程

  1. ------------------------------------ 
  2. ---- 
  3. /* 
  4.  *作    者:lin sen 
  5.  *功能说明:返回自动流水编号的存储过程 
  6.  *编写日期:2010-12-23 
  7. */ 
  8. ------------------------------------ 
  9. DROP PROCEDURE PRO_AutoLSH 
  10. GO 
  11. CREATE PROCEDURE PRO_AutoLSH 
  12.     @letter        varchar(10),    --首字母,可以多个字母 
  13.     @LSHkey        varchar(20),    --表中的流水号列名,最好是主键 
  14.     @tablename    varchar(20)     --表名 
  15. AS 
  16. begin 
  17.     DECLARE @LSHID  NVARCHAR(20) 
  18.     DECLARE @TLSH   VARCHAR(20) 
  19.     DECLARE @NUM    INT 
  20.     DECLARE @sql    NVARCHAR(200) 
  21.      
  22.     ----查询该表最大的流水号 
  23.     SET @sql='SELECT ISNULL(MAX(CONVERT(INT,SUBSTRING('+@LSHkey+',8,4))),0)+1 FROM '+@tablename 
  24.     --创建临时表 
  25.     CREATE TABLE TEMP1(TOTAL INT); 
  26.     --写入查询得到的数据 
  27.     INSERT INTO TEMP1 EXEC(@sql); 
  28.     --再查询出值 
  29.     SET @NUM=(SELECT TOTAL FROM TEMP1) 
  30.     DROP TABLE TEMP1 
  31.      
  32.     --拼接下一个流水号:J+年份4位+月份2位+4位编号(如J2010120001) 
  33.     SET @TLSH=@letter+SUBSTRING(CONVERT(VARCHAR(100),GETDATE(),112),1,6)+SUBSTRING(CONVERT(CHAR(5),10000+@NUM),2,4) 
  34.     SET @sql=''     
  35.     SET @sql='SELECT @LSH='+''''+@TLSH+''''+' FROM '+@tablename 
  36.      
  37.     EXEC sp_executesql 
  38.             @sql, 
  39.             N'@LSH NVARCHAR(20) OUTPUT'
  40.             @LSHID OUTPUT 
  41.     SELECT @LSHID 
  42. end 

貌似exec在标量值函数中不能使用,所以本人采用存储过程。本来是想用两个exec试行,可惜不行有问题,所以借鉴他人的做法
采用sp_executesql。如果想要了解EXEC与sp_executesql的区别及应用

这个通用函数有个特点就是这个网站中所有的单据编号的长度是一致的,就像进销存的一般单据编号。当然这个地方应该也可以写成通用的不限制长度。

有一次听到一位同学去应聘的时候公司让它写流水编号,用CS。这个我想一样道理可以采用StringBuilder进行拼接,前提也是最取数据库中最大值。

像上面说的那个进销存里面有很多操作,似乎要写很多存储过称或函数,页面也差不多。这个可以去网站找找通用增删改查存储过程,页面也是可以封装的。

  • 上一篇资讯: T-SQL变量操作详解
  • 设为首页 | 加入收藏 | 网学首页 | 原创论文 | 计算机原创
    版权所有 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2020 myeducs.Cn www.myeducs.Cn All Rights Reserved 湘ICP备09003080号 常年法律顾问:王律师