打印本文 打印本文  关闭窗口 关闭窗口  
案例分析:得到单据流水号
作者:佚名  文章来源:不详  点击数  更新时间:2007/11/20 10:46:06  文章录入:杜斌  责任编辑:杜斌

==================================================
-- 名称:得到单据流水号
-- 实现功能:取得对应表的计数器,实现流水号功能.
-- 调用示例: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_timeout000

--取当前序号
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

打印本文 打印本文  关闭窗口 关闭窗口