数据库结构:卡编号表
编号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
以此类推,生成编号。
          

解决方案 »

  1.   

    给个思路:
    第一步.根据产品的ID获取这个产品的信息。
    第二步.根据获取产品的ID获取在卡编号表的个数:select @Count=count(编号ID) from 卡编号表
     where 产品ID=id 
    第三步: 卡编号表.编号=DateTime.Now.Year.tostring()+产品编号+(@Count+1).tostring();
    第四步:插入卡编号表表中
    在做这个的时候,还要考虑多线程的问题。假如你在获取ID=1的产品在卡编号表的个数为2后做第三步操作的同时,另外一个人也同时对这个产品进行相同的操作。则有可能会出入相同的卡片号
      

  2.   

    create procedure p_GetProductId
    (
     @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
      

  3.   

    存储过程 output返回值
    cast(year(getdate) as varchar)+''+right(10000000+isnull(right(max(id),3),0),3)
      

  4.   

    http://topic.csdn.net/u/20101223/09/c2da23af-37ba-4c31-b3c4-05c350bac039.html
      

  5.   

    cmd.parameters[].Direction=ParemeterDiretion.returnValue;
    获取返回值
    cmd.parameters[].value;
      

  6.   

    happy664618843     正解
      

  7.   


    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
      

  8.   

       把alter pro    改成 Create procedure pro   
      

  9.   


    重新更正一下 没运行代码 
    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
      

  10.   

    我已经用sql 语句实现了,但是我感觉不好,还是想用存储过程实现,但是不会写,纯代码如下   //生成卡
        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");
        }
      

  11.   

    我的存储过程漏掉了@step了 
    晕 你写的太繁琐了
    你现在前台判断插入的产品编号 
    如果有产品编号的话 
    直接去执行存储过程
    我上面我写的存储过程 是根据我刚做的项目来的 和你情况差不多
    大体思路是那样的 
    小地方你再修改一下重新更正一下 没运行代码 
    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