鷹翔宇空

          學(xué)習(xí)和生活

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
          ?本文摘自:http://searchdatabase.techtarget.com.cn/tips/44/2333544.shtml?BLK=030001&NODE=1003

          -- ==================================================
          -- 名稱(chēng):得到單據(jù)流水號(hào)
          -- 實(shí)現(xiàn)功能:取得對(duì)應(yīng)表的計(jì)數(shù)器,實(shí)現(xiàn)流水號(hào)功能.
          -- 調(diào)用示例: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 -- 計(jì)數(shù)器
          )

          CREATE FUNCTION F_LT_GetOrderNo(@ID int)
          AS RETURN VARCHAR(32)
          DECLARE @OrderNo int
          SELECT @OrderNo = FIncCount FROM T_OrderList WHERE FID = @ID
          ??? -- 取得編號(hào)后,計(jì)數(shù)器加1
          UPDATE T_OrderList SET FIncCount = FIncCount +1 -- 函數(shù)中不允許執(zhí)行UPDATE,這種情況要怎么處理.
          RETURNS @OrderNo

          -- 系統(tǒng)單據(jù)表,存放系統(tǒng)所以業(yè)務(wù)單據(jù)列表,存有生成流水號(hào)計(jì)數(shù)器
          CREATE? TABLE? T_OrderList(?
          ?????????? FID? int? IDENTITY? (1,? 1)? NOT? NULL,?
          ?????????? FIncCount? int? --? 計(jì)數(shù)器?
          ?????????? FOrder varchar(30) not Null
          ?????????? )?

          -- 系統(tǒng)業(yè)務(wù)單據(jù),存放企業(yè)日常業(yè)務(wù)數(shù)據(jù),具體每單有一個(gè)單據(jù)流水號(hào)
          CREATE? TABLE? T_Order(?
          ?????????? FID? int? IDENTITY? (1,? 1)? NOT? NULL,?
          ?????????? FNumber varchar(40),? -- 單據(jù)流水號(hào)?
          ?????????? FOrderInfo varchar(30)
          ?????????? )?

          -- 現(xiàn)系統(tǒng)要求自動(dòng)運(yùn)算,將運(yùn)算后的數(shù)據(jù)填充到T_Order業(yè)務(wù)表中.填充時(shí)各記錄要生成不同的單據(jù)流水號(hào).我原先的實(shí)現(xiàn)想法是用存儲(chǔ)過(guò)程:
          CREATE??? PROCEDURE P_OnlyC
          ? @CodeC VARCHAR(48) OUTPUT
          AS
          DECLARE @OnlyC VARCHAR(48)
          ,@FIncCount INTEGER

          -- 取出當(dāng)前單據(jù)流水號(hào)
          SELECT @FIncCount=FIncCount FROM T_OrderList WHERE FID=@CodeC
          -- 流水號(hào)加1
          SELECT @FIncCount = @FIncCount +1

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

          -- 組織各個(gè)編碼
          SELECT @OnlyC = @CodeC? + '-' + @OnlyC
          SELECT @CodeC = @OnlyC; SELECT @OnlyC AS FNumber
          -- print @CodeC
          GO

          但這程方法不能在SELECT語(yǔ)句運(yùn)算出的結(jié)果中調(diào)用.如前面寫(xiě)的SELECT P_OnlyC(FId)? as? 流水號(hào),? *? from (select sum(..) from tab..) Tab1? 所以我想用函數(shù),但函數(shù)里又沒(méi)辦法執(zhí)行遞增流水號(hào):

          CREATE? FUNCTION? F_LT_GetOrderNo(@ID? int)?
          AS? RETURN? VARCHAR(32)?
          ?????????? DECLARE? @OrderNo? int?
          ?????????? SELECT? @OrderNo? =? FIncCount? FROM? T_OrderList? WHERE? FID? =? @ID?
          ?????? --? 取得編號(hào)后,計(jì)數(shù)器加1?
          ?????????? UPDATE? T_OrderList? SET? FIncCount? =? FIncCount? +1? --? 函數(shù)中不允許執(zhí)行UPDATE?
          ?????????? RETURNS? @OrderNo
          ??????????
          ??????????
          ??????????
          CREATE PROCEDURE n_GetBillNo
          @billType? char(2),--單據(jù)類(lèi)型
          @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
          --設(shè)定延時(shí)
          SET LOCK_TIMEOUT 5000

          --取當(dāng)前序號(hào)
          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='數(shù)據(jù)被鎖定,請(qǐng)求超時(shí)!'
          ?? Goto Failed
          ?? end
          --是否是新的一月
          if Convert(char(8),getdate(),112)<>@date
          ?Set @NowNo=1
          ?else
          ?Set @NowNo=@NowNo+1

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

          --取得單號(hào)
          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 閱讀(576) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 技術(shù)文摘
          主站蜘蛛池模板: 宜宾县| 同心县| 剑河县| 冷水江市| 慈溪市| 疏附县| 颍上县| 上犹县| 湖南省| 会泽县| 祁阳县| 惠州市| 凤山县| 福安市| 吴江市| 深州市| 隆德县| 屯昌县| 闻喜县| 浙江省| 合江县| 盈江县| 沈丘县| 辽宁省| 牟定县| 宜兴市| 胶州市| 长顺县| 介休市| 闸北区| 玛纳斯县| 临江市| 随州市| 阜康市| 华亭县| 巴林右旗| 衢州市| 金门县| 邹城市| 青田县| 北安市|