2011年3月22日 星期二

得到單據流水號

參考
--
-- ==================================================
-- 名稱:得到單據流水號
-- 實現功能:取得對應表的計數器,實現流水號功能.
-- 調用示例: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

沒有留言:

張貼留言