存储过程问题

a78782295 2010-12-02 05:08:11
CREATE procedure p_unlock
@cPdno VARCHAR(20),
@cReturn varchar(100) OUTPUT
AS
SET NOCOUNT ON
if @cPdno=''
return


declare @cZgbm varchar(10),
@dtPdrq datetime,
@numRow numeric(10,0)


--判断盘点单是否存在
SELECT TOP 1 @cZgbm = zgbm, @dtPdrq=pdrq FROM PDDA_ZG WHERE PDNO=@cPdno
IF IsNull(@cZgbm,'')=''
begin
SET @cReturn='盘点单不存在'
return
end



SELECT TOP 1 @cZgbm =zgbm FROM PDDA_ZG WHERE pdrq>=@dtPdrq and zgbm=@cZgbm and flag='1' and pdno<>@cPdno

--IF IsNull(@cPdno,'')=''
if @@rowcount<>0
begin
SET @cReturn='在本次反审核的盘点单日期之后存在已审核的盘点单'
return
end

--开始反审核
begin tran
begin

update pdda_zg set flag='0' where pdno=@cPdno and flag='1' --A
update jbzgk set pdrq=(select MAX(pdrq) from pdda_zg where zgbm=@cZgbm and flag='1' ) where item=@cZgbm --B

if @@rowcount<>0
begin

SET @cReturn='盘点单反审核成功!' --这里虽然提示了,但是没走A,B这两条语句
ROLLBACK TRAN
return
end

if @@rowcount=0
begin
set @cReturn='盘点单已反审核过了!'

ROLLBACK TRAN
return
end

if @@error<>0
begin
SET @cReturn='反审核失败,意外错误'
ROLLBACK TRAN
return
end

end
--重新计算库存
execute p_jisuan_sales @cZgbm

commit tran


GO


大家帮忙看下 ! 那里不清楚我再补充

...全文
443 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshile 2010-12-03
  • 打赏
  • 举报
回复
原来盘点单都这么难啊?
abuying 2010-12-03
  • 打赏
  • 举报
回复
不要@@rowcount,@@error
因为它只返回上一条语句返回的行数
这里只是B返回的行数.
可以用一个变量去接收!
前面定义

declare @rowNum int ,@errorID int

Begin tran
Begin
update pdda_zg set flag='0' where pdno=@cPdno and flag='1' --A
update jbzgk set pdrq=(select MAX(pdrq) from pdda_zg where zgbm=@cZgbm and flag='1' ) where item=@cZgbm --B
set @rowNum=@@rowcount
set @errorID=@@error
--把下面所有@@rowcount,@@error替换成@rowNum,@errorID
end

If @@errorID = 0 or @@rowNum <> 0
Begin
SET @cReturn='盘点单反审核成功!' --这里虽然提示了,但是没走A,B这两条语句
return
end
a78782295 2010-12-03
  • 打赏
  • 举报
回复
问题还是没有解决,没人关注了吗??
wisdom1 2010-12-02
  • 打赏
  • 举报
回复
学习了

可惜太乱 而且没有注释~·
otnto 2010-12-02
  • 打赏
  • 举报
回复

--感觉这里的问题
@@rowcount
--返回受上一语句影响的行数。
--用个变量去更新后的@@rowcount 存起来 再判断
a78782295 2010-12-02
  • 打赏
  • 举报
回复
to 11楼

走了那2句update语句了,也提示‘盘点单反审核成功!’,但是比如说我执行

declare @result varchar(100)
exec p_unlock '9051-00015',@result output

print @result

2次,应该提示 ‘盘点单已反审核过了’,但是还是提示的‘盘点单反审核成功!’ ,如何修改呢?小弟愚昧啊
「已注销」 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 zsh0809 的回复:]

update pdda_zg set flag='0' where pdno=@cPdno and flag='1' --A
GO
update jbzgk set pdrq=(select MAX(pdrq) from pdda_zg where zgbm=@cZgbm and flag='1' ) where item=@cZgbm --B
GO
[/Quote]
13#写错了,主要是你后面就return了,没有执行到go,在每一个bengin end后加上go试试呢
「已注销」 2010-12-02
  • 打赏
  • 举报
回复
update pdda_zg set flag='0' where pdno=@cPdno and flag='1' --A
GO
update jbzgk set pdrq=(select MAX(pdrq) from pdda_zg where zgbm=@cZgbm and flag='1' ) where item=@cZgbm --B
GO
a78782295 2010-12-02
  • 打赏
  • 举报
回复
to 10楼


有的,如果没有则提示 '盘点单不存在'
jayjiang0910 2010-12-02
  • 打赏
  • 举报
回复
LZ這樣試試:

CREATE procedure p_unlock
@cPdno VARCHAR(20),
@cReturn varchar(100) OUTPUT
AS


SET NOCOUNT ON
If @cPdno=''
return


declare @cZgbm varchar(10),
@dtPdrq datetime,
@numRow numeric(10,0)


--判断盘点单是否存在
SELECT TOP 1 @cZgbm = zgbm, @dtPdrq=pdrq FROM PDDA_ZG WHERE PDNO=@cPdno
IF IsNull(@cZgbm,'')=''
Begin
SET @cReturn='盘点单不存在'
return
End

SELECT TOP 1 @cZgbm =zgbm FROM PDDA_ZG WHERE pdrq>=@dtPdrq and zgbm=@cZgbm and flag='1' and pdno<>@cPdno

--IF IsNull(@cPdno,'')=''
If @@rowcount<>0
Begin
SET @cReturn='在本次反审核的盘点单日期之后存在已审核的盘点单'
return
End


--开始反审核
Begin tran
Begin
update pdda_zg set flag='0' where pdno=@cPdno and flag='1' --A
update jbzgk set pdrq=(select MAX(pdrq) from pdda_zg where zgbm=@cZgbm and flag='1' ) where item=@cZgbm --B
end

If @@error = 0 or @@rowcount <> 0
Begin
SET @cReturn='盘点单反审核成功!' --这里虽然提示了,但是没走A,B这两条语句
return
end

If @@error <> 0
Begin
set @cReturn='盘点单已反审核过了!'
goto Proc_Fail
End

If @@rowcount = 0
Begin
SET @cReturn='反审核失败,意外错误'
goto Proc_Fail
End


--重新计算库存
execute p_jisuan_sales @cZgbm

Commit tran

Proc_Fail:
ROLLBACK TRAN
GO

「已注销」 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 a78782295 的回复:]

引用 4 楼 luoyefeng1022 的回复:
你贴它出来要干嘛?哪里有问题?


虽然提示 “盘点单反审核成功”,
update pdda_zg set flag='0' where pdno=@cPdno and flag='1' --A
update jbzgk set pdrq=(select MAX(pdrq) from pdda_zg where zgbm=@cZg……
[/Quote]
先查询这两句看看有没有条件符合的:
select * from pdda_zg
where pdno=@cPdno and flag='1' --A 补充上@cPdno 的值
a78782295 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 huminghua 的回复:]
update pdda_zg set flag='0' where pdno=@cPdno and flag='1' --A在这后面输出一个东西
print 'A'
update jbzgk set pdrq=(select MAX(pdrq) from pdda_zg where zgbm=@cZgbm and flag='1' ) where item=@cZgbm --B
pr……
[/Quote]

发出去就成这了··我也很郁闷
7761098 2010-12-02
  • 打赏
  • 举报
回复
没仔细看完,不过1.将begin, end对齐,好像代码中不是很一致
2. 不要用@@rowcount判断,尤其跨界判断,最好用自定义的参数来判断
可以将两个update语句前面写多一个select赋值语句判断是否有update
huminghua 2010-12-02
  • 打赏
  • 举报
回复
update pdda_zg set flag='0' where pdno=@cPdno and flag='1' --A在这后面输出一个东西
print 'A'
update jbzgk set pdrq=(select MAX(pdrq) from pdda_zg where zgbm=@cZgbm and flag='1' ) where item=@cZgbm --B
print 'B'
这样先测下呗!
begin tran
begin
这中间的Begin我是看到啦! end不知道你的在哪里结束。。这代码。。。。
a78782295 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 luoyefeng1022 的回复:]
你贴它出来要干嘛?哪里有问题?
[/Quote]

虽然提示 “盘点单反审核成功”,
update pdda_zg set flag='0' where pdno=@cPdno and flag='1' --A
update jbzgk set pdrq=(select MAX(pdrq) from pdda_zg where zgbm=@cZgbm and flag='1' ) where item=@cZgbm --B

这2条语句没执行
luoyefeng1022 2010-12-02
  • 打赏
  • 举报
回复
你贴它出来要干嘛?哪里有问题?
a78782295 2010-12-02
  • 打赏
  • 举报
回复
发帖还没玩转 ,很是悲剧!
a78782295 2010-12-02
  • 打赏
  • 举报
回复
update pdda_zg set flag='0' where pdno=@cPdno and flag='1' --A
update jbzgk set pdrq=(select MAX(pdrq) from pdda_zg where zgbm=@cZgbm and flag='1' ) where item=@cZgbm --B
「已注销」 2010-12-02
  • 打赏
  • 举报
回复
' --这里虽然提示了,但是没走A,B这两条语句
========
A,B指的是哪两句?

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧