本文摘自:http://searchdatabase.techtarget.com.cn/tips/44/2333544.shtml?BLK=030001&NODE=1003

 

-- ==================================================
--
名稱:得到單據流水號
--
實現功能:取得對應表的計數器,實現流水號功能.
--
調用示例:SELECT F_LT_GetOrderNo(FId) as FID, * from Tab1 T1
                    left outer join T_OrderList T2 on T1.FTabID = T2.FID
-- ==================================================
CREATE TABLE T_OrderList(
FID int IDENTITY (1, 1) NOT NULL,
FIncCount int --
計數器
)

CREATE FUNCTION F_LT_GetOrderNo(@ID int)
AS RETURN VARCHAR(32)
DECLARE @OrderNo int
SELECT @OrderNo = FIncCount FROM T_OrderList WHERE FID = @ID
    --
取得編號後,計數器加1
UPDATE T_OrderList SET FIncCount = FIncCount +1 --
函數中不允許執行UPDATE,這種情況要怎麼處理.
RETURNS @OrderNo

-- 系統單據表,存放系統所以業務單據列表,存有生成流水號計數器
CREATE  TABLE  T_OrderList( 
           FID  int  IDENTITY  (1,  1)  NOT  NULL, 
           FIncCount  int  -- 
計數器 
           FOrder varchar(30) not Null
           ) 

-- 系統業務單據,存放企業日常業務資料,具體每單有一個單據流水號
CREATE  TABLE  T_Order( 
           FID  int  IDENTITY  (1,  1)  NOT  NULL, 
           FNumber varchar(40),  --
單據流水號 
           FOrderInfo varchar(30)
           ) 

-- 現系統要求自動運算,將運算後的資料填充到T_Order業務表中.填充時各記錄要生成不同的單據流水號.我原先的實現想法是用存儲過程:
CREATE    PROCEDURE P_OnlyC
  @CodeC VARCHAR(48) OUTPUT
AS
DECLARE @OnlyC VARCHAR(48)
,@FIncCount INTEGER

-- 取出當前單據流水號
SELECT @FIncCount=FIncCount FROM T_OrderList WHERE FID=@CodeC
--
流水號加1
SELECT @FIncCount = @FIncCount +1

UPDATE T_OrderList SET FIncCount = @FIncCount WHERE FID= @CodeC

-- 組織各個編碼
SELECT @OnlyC = @CodeC  + '-' + @OnlyC
SELECT @CodeC = @OnlyC; SELECT @OnlyC AS FNumber
-- print @CodeC
GO

但這程方法不能在SELECT語句運算出的結果中調用.如前面寫的SELECT P_OnlyC(FId)  as  流水號,  *  from (select sum(..) from tab..) Tab1  所以我想用函數,但函數裏又沒辦法執行遞增流水號:

CREATE  FUNCTION  F_LT_GetOrderNo(@ID  int) 
AS  RETURN  VARCHAR(32) 
           DECLARE  @OrderNo  int 
           SELECT  @OrderNo  =  FIncCount  FROM  T_OrderList  WHERE  FID  =  @ID 
       -- 
取得編號後,計數器加1 
           UPDATE  T_OrderList  SET  FIncCount  =  FIncCount  +1  -- 
函數中不允許執行UPDATE 
           RETURNS  @OrderNo
          
          
          
CREATE PROCEDURE n_GetBillNo
@billType  char(2),--
單據類型
@BillOutNo  nvarchar(50) Output

 AS

Begin

declare @NowNO int
declare @date char(10)
declare @Symbol nvarchar(10)
declare @ErrorMsg nvarchar(200)

Set NoCount On
Begin Tran
--
設定延時
SET LOCK_TIMEOUT 5000

--取當前序號
Select @NowNO=fnumber,@Symbol=fCode,@date=Convert(char(8),fDate,112) from n_BillNo  With(xLock) where fcode=@BillType
if @@Error<>0
   begin
   Set @ErrorMsg='
資料被鎖定,請求超時!'
   Goto Failed
   end
--
是否是新的一月
if Convert(char(8),getdate(),112)<>@date
 Set @NowNo=1
 else
 Set @NowNo=@NowNo+1

--更新當前序列號和設置最後更新日期
update n_BillNo set fNumber=@NowNO,fDate=GetDate() where fcode=@BillType
if @@Error<>0
   begin
   Set @ErrorMsg='
更新外部序列號失敗!'
   Goto Failed
   end

--取得單號
Set @BillOutNo=lTrim(@SymBol)+Convert(char(8),GetDate(),112)+Right(('0000'+Convert(varchar,@NowNO)),4)

Goto Succeed

Failed:
  RaisError(@ErrorMsg,16,1)
  Rollback Tran 
  Set NoCount Off
  Return 1

Succeed:
  Commit Tran
  Set NoCount Off
  Return 0

End
GO


arrow
arrow
    全站熱搜

    Roger 發表在 痞客邦 留言(0) 人氣()