1.用SQL函数生成自动流水号.
流水号格式为:'R'+日期年后二位+二位数月+'-'+二位数日期+自动编号
R0708-2001
R0708-2002
R0708-2003
自定义函数如下:
注:CaiGouInfo为采购单表,CGID为采购单自动流水号
CREATE function new_idr(@a datetime) returns varchar(50)
begin
---id为日期格式部分
declare @id varchar(50),@i int
select top 1 @id=CGID from CaiGouInfo where left(CGID,8)='R'+(left(convert(varchar(6),@a,12),4)+'-'+right(convert(varchar(6),@a,12),2)) order by CGID desc
--如果没找到该日期的流水号,则新增加一个流水号,即为当天的第一个流水号
if @@rowcount=0
return 'R'+(left(convert(varchar(6),@a,12),4)+'-'+right(convert(varchar(6),@a,12),2))+'01'
--如果存在该日期的流水号则在该流水的后二位自动编号上加1
set @i= rtrim(right(@id,2)) +1
set @id=rtrim(@i)
--转化流水号后二位为2位字符串
return 'R'+(left(convert(varchar(6),@a,12),4)+'-'+right(convert(varchar(6),@a,12),2))+right( '00'+@id ,2 )
end
调用
在数据表里的流水号字段写个默认值,则应该字段为自动流水号
default ([dbo].[new_idr](getdate()))
2.C#代码生成
因为除自动编号为的键值是不确定的.不像日期格式是确定的6位.所以SQL 自动生成流水号比较麻烦.采用C#编码生成.
注:BJID是自动生成的报价单号,CustomerProRes是客户产品资料表
//报价单为客户代码+物料名称+自动编号,自动编号自动增长
string BJID =CustomerCode+WLName;
//查找表中报价单中左边的"客户代码+物料名称"字符串是否是当前的客户数据
//如果找不到则新增加该客户的第一笔产品报价资料
DataSet ds_bj = kbs.LQSelectTable("*", "CustomerProRes", "left(BJID,len(BJID)-3)='" + BJID + "'", "", "bjtb");
if (ds_bj.Tables["bjtb"].Rows.Count == 0)
BJID += "001";
else
{
//如果存在该产品的报价资料,则新增加一笔报价资料.
int AutoNo;
//读取该客户资料的最大编号
DataSet ds_bj2 = kbs.LQSelectTable("max(BJID) as maxbjid", "CustomerProRes", "left(BJID,len(BJID)-3)='" + BJID + "'", "", "bjtb2");
//取出该客户资料的最大编号的后两位自动编号,并加1
AutoNo =Convert.ToInt32(ds_bj2.Tables["bjtb2"].Rows[0][0].ToString().Substring(ds_bj2.Tables["bjtb2"].Rows[0][0].ToString().Length - 3)) + 1;
//最后两位自动编号转成两位字符串
if (AutoNo.ToString().Length == 1) BJID +="00"+AutoNo;
else
{
if (AutoNo.ToString().Length == 2) BJID += "0"+AutoNo;
else BJID += AutoNo;
}
}
最后直接用insert到相对应的流水号字段即可