鷹翔宇空

          學習和生活

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
          ?本文摘自: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

          posted on 2006-03-20 08:51 TrampEagle 閱讀(575) 評論(0)  編輯  收藏 所屬分類: 技術文摘
          主站蜘蛛池模板: 常宁市| 苗栗市| 海原县| 曲松县| 鄂伦春自治旗| 桂阳县| 浏阳市| 石嘴山市| 宁强县| 报价| 三亚市| 潮安县| 济阳县| 湖南省| 达尔| 精河县| 神木县| 彭泽县| 晋州市| 广东省| 乡宁县| 安远县| 荥经县| 北辰区| 星子县| 昌宁县| 乌拉特后旗| 思南县| 玉门市| 仪征市| 郧西县| 祁东县| 云梦县| 武汉市| 虞城县| 望奎县| 正蓝旗| 宾川县| 綦江县| 博兴县| 沁水县|