[转]用存储过程生成单据号
转自二十四画生
 -插入客户订单
-插入客户订单 
 CREATE PROCEDURE InsertOrder
CREATE PROCEDURE InsertOrder 
 (
( 
 @CustomerId int,
    @CustomerId int, 
 @MX nvarchar(4000),
    @MX nvarchar(4000), 
 @Incom smallint
    @Incom smallint 
 )
) 
 
 
 AS
AS 
 
 
 SET NOCOUNT ON
SET NOCOUNT ON 
 
 
 --这一个部分还可单独提取到一个存储过程中通过传入“单据标识号”和“单据表名”为参数---------------------------------------
--这一个部分还可单独提取到一个存储过程中通过传入“单据标识号”和“单据表名”为参数--------------------------------------- 
 
 
 --找帐套字头号
--找帐套字头号 
 DECLARE @IH char(1)
DECLARE @IH char(1) 
 SELECT @IH = LEFT(IncID,1) FROM accounts WHERE ID = @Incom
SELECT @IH = LEFT(IncID,1) FROM accounts WHERE ID = @Incom 
 
 
 --编号年月部分
--编号年月部分 
 DECLARE @YM char(6)
DECLARE @YM char(6) 
 SET @YM = CONVERT(char(6),GETDATE(),12)
SET @YM = CONVERT(char(6),GETDATE(),12) 
 --单据字头
--单据字头 
 DECLARE @DJHH char(8)
DECLARE @DJHH char(8) 
 SET @DJHH = @IH + 'E' + @YM
SET @DJHH = @IH + 'E' + @YM 
 
 
 
 
 --找编号的基值(方法:用当天的编号到排序取最大的一个。如当前最大编号为0001那么它的基值为1,这样就能得出下个编号为0002)
--找编号的基值(方法:用当天的编号到排序取最大的一个。如当前最大编号为0001那么它的基值为1,这样就能得出下个编号为0002) 
 DECLARE @MNO INT        --当天最大的单据号(数值)
DECLARE @MNO INT        --当天最大的单据号(数值) 
 SET @MNO = 1
SET @MNO = 1 
 select TOP 1 @MNO = CONVERT(int,RIGHT(DJH,4))+1 from Orders where left(DJH,8) = @DJHH and incom = @Incom Orders by DJH desc
select TOP 1 @MNO = CONVERT(int,RIGHT(DJH,4))+1 from Orders where left(DJH,8) = @DJHH and incom = @Incom Orders by DJH desc 
 
 
 
 
 DECLARE @DJH char(12)
DECLARE @DJH char(12) 
 
 
 --扩充成4位十进制编号(最大可显示9999)
--扩充成4位十进制编号(最大可显示9999) 
 IF @MNO < 9999
IF @MNO < 9999 
 IF @MNO < 999
  IF @MNO < 999 
 IF @MNO < 99
    IF @MNO < 99 
 IF @MNO < 9
      IF @MNO < 9 
 SET @DJH = @DJHH + '000' + CONVERT(char(1),@MNO)
        SET @DJH = @DJHH + '000' + CONVERT(char(1),@MNO) 
 ELSE
      ELSE 
 SET @DJH = @DJHH + '00' + CONVERT(char(2),@MNO)
        SET @DJH = @DJHH + '00' + CONVERT(char(2),@MNO) 
 ELSE
    ELSE 
 SET @DJH = @DJHH + '0' + CONVERT(char(3),@MNO)
      SET @DJH = @DJHH + '0' + CONVERT(char(3),@MNO) 
 ELSE
  ELSE 
 SET @DJH = @DJHH + CONVERT(char(4),@MNO)
    SET @DJH = @DJHH + CONVERT(char(4),@MNO) 
 ELSE
ELSE 
 SET @DJH = @DJHH + '9999'
  SET @DJH = @DJHH + '9999' 
 
 
 
 
 ----(可提取的部分结束)------------------------------------------------------------------------------------------------------
----(可提取的部分结束)------------------------------------------------------------------------------------------------------ 
 
  
 --插入订单
--插入订单 
 INSERT INTO Orders (DJH, CustomerId, MX, InCom) VALUES (@DJH, @CustomerId, @MX, @Incom)
INSERT INTO Orders (DJH, CustomerId, MX, InCom) VALUES (@DJH, @CustomerId, @MX, @Incom) 
 
 
 RETURN
RETURN 
 GO
GO 
 
 
  大多数的单据都需要有个单据号。有的单据号就是顺序编号如:000001,000002……。有的单据号是有一定意义的,如我遇见过的一个需求:单据号共12位,1位帐套号(区分使用单位的),1位单据标识号(表示该单是什么单,如:E表示订货单,X表示销售单),2位年号(05表示2005年),2位月号,2位日号,4位编号(按当天的顺序,最大9999,超过9999的就用9999表示) 
JE0505070001就表示某某单位2005年5月7日的第一单订货单。用编程实现这个要求当然不算太难,不过要将单据号生成方法放到存储过程中去就要费点心思了。 
下面就以插入订单为例,其中有一段代码是可提取到一个单独的存储存储过程中的,这样可增加通用性。 
 -插入客户订单
-插入客户订单  CREATE PROCEDURE InsertOrder
CREATE PROCEDURE InsertOrder  (
(  @CustomerId int,
    @CustomerId int,  @MX nvarchar(4000),
    @MX nvarchar(4000),  @Incom smallint
    @Incom smallint  )
)  
  AS
AS  
  SET NOCOUNT ON
SET NOCOUNT ON  
  --这一个部分还可单独提取到一个存储过程中通过传入“单据标识号”和“单据表名”为参数---------------------------------------
--这一个部分还可单独提取到一个存储过程中通过传入“单据标识号”和“单据表名”为参数---------------------------------------  
  --找帐套字头号
--找帐套字头号  DECLARE @IH char(1)
DECLARE @IH char(1)  SELECT @IH = LEFT(IncID,1) FROM accounts WHERE ID = @Incom
SELECT @IH = LEFT(IncID,1) FROM accounts WHERE ID = @Incom  
  --编号年月部分
--编号年月部分  DECLARE @YM char(6)
DECLARE @YM char(6)  SET @YM = CONVERT(char(6),GETDATE(),12)
SET @YM = CONVERT(char(6),GETDATE(),12)  --单据字头
--单据字头  DECLARE @DJHH char(8)
DECLARE @DJHH char(8)  SET @DJHH = @IH + 'E' + @YM
SET @DJHH = @IH + 'E' + @YM  
  
  --找编号的基值(方法:用当天的编号到排序取最大的一个。如当前最大编号为0001那么它的基值为1,这样就能得出下个编号为0002)
--找编号的基值(方法:用当天的编号到排序取最大的一个。如当前最大编号为0001那么它的基值为1,这样就能得出下个编号为0002)  DECLARE @MNO INT        --当天最大的单据号(数值)
DECLARE @MNO INT        --当天最大的单据号(数值)  SET @MNO = 1
SET @MNO = 1  select TOP 1 @MNO = CONVERT(int,RIGHT(DJH,4))+1 from Orders where left(DJH,8) = @DJHH and incom = @Incom Orders by DJH desc
select TOP 1 @MNO = CONVERT(int,RIGHT(DJH,4))+1 from Orders where left(DJH,8) = @DJHH and incom = @Incom Orders by DJH desc  
  
  DECLARE @DJH char(12)
DECLARE @DJH char(12)  
  --扩充成4位十进制编号(最大可显示9999)
--扩充成4位十进制编号(最大可显示9999)  IF @MNO < 9999
IF @MNO < 9999  IF @MNO < 999
  IF @MNO < 999  IF @MNO < 99
    IF @MNO < 99  IF @MNO < 9
      IF @MNO < 9  SET @DJH = @DJHH + '000' + CONVERT(char(1),@MNO)
        SET @DJH = @DJHH + '000' + CONVERT(char(1),@MNO)  ELSE
      ELSE  SET @DJH = @DJHH + '00' + CONVERT(char(2),@MNO)
        SET @DJH = @DJHH + '00' + CONVERT(char(2),@MNO)  ELSE
    ELSE  SET @DJH = @DJHH + '0' + CONVERT(char(3),@MNO)
      SET @DJH = @DJHH + '0' + CONVERT(char(3),@MNO)  ELSE
  ELSE  SET @DJH = @DJHH + CONVERT(char(4),@MNO)
    SET @DJH = @DJHH + CONVERT(char(4),@MNO)  ELSE
ELSE  SET @DJH = @DJHH + '9999'
  SET @DJH = @DJHH + '9999'  
  
  ----(可提取的部分结束)------------------------------------------------------------------------------------------------------
----(可提取的部分结束)------------------------------------------------------------------------------------------------------  
   --插入订单
--插入订单  INSERT INTO Orders (DJH, CustomerId, MX, InCom) VALUES (@DJH, @CustomerId, @MX, @Incom)
INSERT INTO Orders (DJH, CustomerId, MX, InCom) VALUES (@DJH, @CustomerId, @MX, @Incom)  
  RETURN
RETURN  GO
GO  
  
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号