==================================================
-- 名称:得到单据流水号
-- 实现功能:取得对应表的计数器,实现流水号功能.
-- 调用示例: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
上一篇: 2003年9月三级网络技术笔试题及参考答案
下一篇:SQL中的时间计算语句