本帖最后由 lala133 于 2013-07-24 16:18:44 编辑

解决方案 »

  1.   

    声明的变量追加默认值0,否则Null+1是Null不满足条件
      

  2.   

    if exists(select name from sysobjects where name='mdcprk'and type='p')
    drop procedure mdcprk
    go
    create procedure mdcprk
    @xsmd varchar(50),--销售门店名称(调入仓库)
    @bmbm varchar(50),--销售门店代码(调入仓库代码)
    @dcck varchar(50),--调出仓库名称
    @dcckbm varchar(50),--调出仓库代码
    @danh varchar(50),--单号
    @jbr varchar(50),--经办人
    @kdsj varchar(50)--开单时间
    as 
    begin
    declare @goods_count int--配送出库产品种类(总行数)
    declare @sptm varchar(50)--商品条码
    declare @spmc varchar(50)--商品名称
    declare @kucun_count int--库存数量
    declare @ps_count int --配送单某条码的数量
    declare @ps_number int--配送明细单序号
    set @ps_number=0--配送明细单序号,初始为0
     
    select @goods_count=count(*) from SJZL_ERP_CPPHCKMX where danh=@danh--获取配送单商品种类数量
     
    while (@ps_number<@goods_count)
    begin
       set @ps_number=@ps_number+1--配送明细单序号自增一
    print @ps_number
       select @spmc=spmc,@sptm=sptm,@ps_count=shul from (select RANK() OVER (ORDER BY cpphckmxid asc) AS id,danh,spmc,sptm,shul,jine,re from SJZL_ERP_CPPHCKMX where danh=@danh)as ll where id=@ps_number--获取某条配送明细单的商品名称,商品条码,数量
       select @kucun_count=count(*) from SJZL_ERP_MD_SPFCKC where sptm=@sptm and ckbm=@bmbm
    print @kucun_count
       if (@kucun_count>0)
             begin
    print'更新'
             update SJZL_ERP_MD_SPFCKC set SJZL_ERP_MD_SPFCKC.shul=(SJZL_ERP_MD_SPFCKC.shul+SJZL_ERP_CPPHCKMX.shul),SJZL_ERP_MD_SPFCKC.zhbgsj=getdate()from SJZL_ERP_CPPHCKMX  where SJZL_ERP_CPPHCKMX.sptm=SJZL_ERP_MD_SPFCKC.sptm and SJZL_ERP_CPPHCKMX.danh=@danh and SJZL_ERP_MD_SPFCKC.ckbm=@bmbm and SJZL_ERP_CPPHCKMX.sptm=@sptm --如果库存存在该商品,直接累加数量
             end
        else 
               begin
    print'插入'
               insert SJZL_ERP_MD_SPFCKC (ckmc,ckbm,spmc,sptm,shul,zhbgsj)values(@xsmd,@bmbm,@spmc,@sptm,@ps_count,getdate())--如果库存不存在该商品,直接插入
               end
    print @ps_number
    end 
    end
      

  3.   

    你这可以了,请问,我是那一点错了。少了最后的两个END?
      

  4.   

    一个执行块由多条SQL语句构成时,要加begin end;
      

  5.   

    一个执行块由多条SQL语句构成时,要加begin end;
    所以我在if (@kucun_count>0)这里少了一个begin end,while (@ps_number<@goods_count)这里也少了一个,但是少了的话,那为什么 【set @ps_number=@ps_number+1--配送明细单序号自增一】这一步能循环够七次,而下面更新和插入加起来的不够呢?
      

  6.   


    上面你没有加事务它不会回滚的.
    只有加事务begin tran,然后要么提交commit tran ,要么回滚rollback tran
    什么判断错误呢?
    每当你执行insert或update或delete后,用if @@error<>0来判断是否有错误,有错误就不等于0大概格式如下:
    create proc proc_name
    as 
    ....
    begin tran
    insert into tb(.....)
    values(.....)
    if @@error<>0
    goto errHandle
    ....
    commit tran
    returnerrHandle:
    rollback trango