PDA

Просмотр полной версии : хелп . Процедура не работает



Ac1d
31.01.2005, 21:24
:cry: Вопрос . Сия поцедура заполняет поля PayDate которые соответствуют
определенному IDCard
Все вроде работает как надо но при попытке заполнить еще 1 дату уже в
заполненых полях PayDate в соотв. IDCard (т.е. к примеру все PayDate которые
соответствуют IDCard=1 заполнены а мы вызываем Payment 1,100 ) ничего не
происходит. При этом если повторно вызвать процедуру уже для IDCard =2 то
тоже не работает.
Кароче я думаю что я чето с курсором намутил но все равно никак не могу
понять где именно.у меня и бекап базы есть.
вобщем кому не лень или интересно то помогите плз . очень нада.
ALTER Procedure Payment
@IDCard varchar(50),
@PaymentSum int,
@Rest int OUTPUT
AS
--declare @Rest int
declare @IDCheck int
declare @DateCheck datetime
declare @SumPos int
declare @Counter int
Begin
SET @Rest=@PaymentSum
SET @Counter=0
Declare Cur_DateCheck CURSOR
FOR SELECT IDCard,DateCheck,SumPos
FROM MarketClubCardCheck
WHERE @IDCard=IDCard AND PayDate IS NULL
ORDER BY DateCheck ASC
OPEN Cur_DateCheck
Begin
WHILE (@@FETCH_STATUS=0)
BEGIN
Begin Tran
IF @Counter=0
Begin
FETCH Cur_DateCheck
INTO @IDCard,@DateCheck,@SumPos
End
IF @Rest>=@SumPos
Begin
UPDATE MarketClubCardCheck
SET PayDate=GETDATE()
WHERE PayDate IS NULL AND @IDCard=IDCard AND DateCheck=@DateCheck
SET @Rest=@Rest-@SumPos
SET @Counter=@Counter+1
IF @@error!=0 or @@rowcount=0
Begin
rollback Tran
BREAK
end
Commit Tran
CONTINUE
End
Else
Begin
Commit Tran
BREAK
End
IF @Counter!=0
Begin
FETCH Cur_DateCheck
INTO @IDCard,@DateCheck,@SumPos
End
END
End
END
CLOSE Cur_DateCheck
DEALLOCATE Cur_DateCheck

AiK
01.02.2005, 15:35
Ac1d, ты бы код отформатировал, а то в таком листе очень неудобно ковыряться.
В код пока не вникал, но ошибку уже одну вижу.


SET @Counter=@Counter+1
IF @@error!=0 or @@rowcount=0

Здесь ошибка не ноль, только в том случае, если у тебя @Counter+1 выходит за границы типа, и @@rowcount =0 тоже только в этом случае. Если ты ошибки Update ловить хочешь, то делать это надо двумя строчками выше, т.е. сразу после update statement'a.