数据库结构:卡编号表
编号ID 编号 产品ID
1 2010EDCFRVGT000000001 1
2 2010EDCFRVGT000000002 1
2 2010EEEEEEEE000000001 2
2 2010EEEEEEEE000000002 2
2 2010EEEEEEEE000000003 2产品表产品ID 产品编号
1 EDCFRVGT
2 EEEEEEEE
需求是,生成一张卡的编号 规则是 当前年份+产品编号(根据产品ID查询出当前产品的编号)+000000001
当同一个产品第一次生成卡号时,默认是2010EDCFRVGT000000001 第二次生成卡号时,编号是2010EDCFRVGT000000002
以此类推,生成编号。
编号ID 编号 产品ID
1 2010EDCFRVGT000000001 1
2 2010EDCFRVGT000000002 1
2 2010EEEEEEEE000000001 2
2 2010EEEEEEEE000000002 2
2 2010EEEEEEEE000000003 2产品表产品ID 产品编号
1 EDCFRVGT
2 EEEEEEEE
需求是,生成一张卡的编号 规则是 当前年份+产品编号(根据产品ID查询出当前产品的编号)+000000001
当同一个产品第一次生成卡号时,默认是2010EDCFRVGT000000001 第二次生成卡号时,编号是2010EDCFRVGT000000002
以此类推,生成编号。
第一步.根据产品的ID获取这个产品的信息。
第二步.根据获取产品的ID获取在卡编号表的个数:select @Count=count(编号ID) from 卡编号表
where 产品ID=id
第三步: 卡编号表.编号=DateTime.Now.Year.tostring()+产品编号+(@Count+1).tostring();
第四步:插入卡编号表表中
在做这个的时候,还要考虑多线程的问题。假如你在获取ID=1的产品在卡编号表的个数为2后做第三步操作的同时,另外一个人也同时对这个产品进行相同的操作。则有可能会出入相同的卡片号
(
@id int
)
as
declare @productidreturned varchar(50),@poductid varchar(20),declare @num int
select @poductid=产品编号 from 产品表 where 产品ID=@id
set @productidreturned=year(getdate())
set @productidreturned +=@productid
if exists(select 1 from 卡编号表 where 编号 like '@productidreturned')
begin
set @num=1
end
else
begin
select @num=max(convert(int,right(@name,9)))+1 from 卡编号表 where 编号 like '@productidreturned'
end
set @productidreturned +=stuff(convert(varchar(20),@num),1,0,replicate( '0',9-len(convert(varchar(20),@num))))
select @productidreturned
go
cast(year(getdate) as varchar)+''+right(10000000+isnull(right(max(id),3),0),3)
获取返回值
cmd.parameters[].value;
alter proc
@product_id varchar(50),@product_nm
as
begin
declare @count int
declare @product_id varchar(50)
declare @step int
set @step=000001
set @product_id = year(getdate())+@product_nmselect @count = count([product_id] from product where [product_id] = @product_id+@step
if(@count=0)
begin
insert into tb_product value(@product_id)
end
else
begin
set @step = @step+1
insert into tb_product value(@product_id+@step)
end
重新更正一下 没运行代码
Create procedure pro
@product_id varchar(50),@product_nm varchar(100)
as
begin
declare @count int
declare @product_id varchar(50)
declare @step int
set @step=000001
set @product_id = year(getdate())+@product_nmselect @count = count([product_id]) from product where [product_id] = @product_id+@step
if(@count=0)
begin
insert into tb_product value(@product_id)
end
else
begin
set @step = @step+1
insert into tb_product value(@product_id+@step)
end
protected void BtnSave_Click(object sender, EventArgs e)
{ int count = Convert.ToInt32(TxtCount.Text);
for (int i = 0; i < count; i++)
{
//根据产品ID 查询出产品编号,判断是否有数据 如果有继续执行 如果无,告诉用户此产品无编号
string sql1 = "select ProCoding from product where productid=@productid";
SqlParameter[] prams = new SqlParameter[] {
new SqlParameter("@productid",DropDownList1.SelectedValue)
};
DataTable dt1 = SqlHelper.GetDataSet(sql1, prams);
if (dt1 != null && dt1.Rows.Count > 0)
{
//获取产品编号
string ProCoding = dt1.Rows[0]["ProCoding"].ToString(); //产品的8位编号 //在根据产品编号查询出数据库是否有此记录
//如果有此记录 我要查询出最大的一条后 ID 加1
string sql2 = "select top 1 CodeNumber from cncode where CodeNumber like '%" + ProCoding + "%' order by CodeID desc";
DataTable dt2 = SqlHelper.GetDataSet(sql2, prams);
if (dt2 != null && dt2.Rows.Count > 0)
{
string yuanbianma = dt2.Rows[0]["CodeNumber"].ToString();
string sql3 = "select right(cast(right('" + yuanbianma + "',8)+100000001 as varchar),8)";//获取后面8位编号
string bianhao = (string)SqlHelper.GetScalar(sql3, null);
string newbianhao = DateTime.Now.Year.ToString() + ProCoding + bianhao;
//MessageBox.Show(Page, newbianhao); string sql4 = "insert into cncode(CodeNumber,ProductID,Modified) values(@CodeNumber,@ProductID,@Modified)";
SqlParameter[] prams4 = new SqlParameter[] {
new SqlParameter("@CodeNumber",newbianhao),
new SqlParameter("@ProductID",DropDownList1.SelectedValue),
new SqlParameter("@Modified",DateTime.Now)
};
SqlHelper.ExecuteCommand(sql4, prams4);
} else
{
//如果没有此记录的话 直接是 年份+编号+ 000000001
string newbianhao = DateTime.Now.Year.ToString() + ProCoding + "00000001";
string sql5 = "insert into cncode(CodeNumber,ProductID,Modified) values(@CodeNumber,@ProductID,@Modified)";
SqlParameter[] prams5 = new SqlParameter[] {
new SqlParameter("@CodeNumber",newbianhao),
new SqlParameter("@ProductID",DropDownList1.SelectedValue),
new SqlParameter("@Modified",DateTime.Now)
};
SqlHelper.ExecuteCommand(sql5, prams5);
}
}
else
{
MessageBox.Show(Page, "请设置此产品编码后生成");
return;
}
}
MessageBox.ShowAndRedirect(Page, "生成成功!", "CodeList.aspx");
}
晕 你写的太繁琐了
你现在前台判断插入的产品编号
如果有产品编号的话
直接去执行存储过程
我上面我写的存储过程 是根据我刚做的项目来的 和你情况差不多
大体思路是那样的
小地方你再修改一下重新更正一下 没运行代码
Create procedure pro
@product_id varchar(50),@product_nm varchar(100)
as
begin
declare @count int
declare @product_id varchar(50)
declare @step int
set @step=000001
set @product_id = year(getdate())+@product_nmselect @count = count([product_id]),roduct_id from product where [product_id] = @product_id+@step
order by product_id desc
if(@count=0)
begin
insert into tb_product value(@product_id)
end
else
begin
set @step = prodcut_id
insert into tb_product value(@step)
end