|
celsius
Starting Member
26 Posts |
Posted - 2006-06-23 : 06:13:22
|
| Below is the code of SP B:ALTER PROCEDURE dbo.SPB @Action char(1) = NULL, @Amount decimal = NULL, @CashBalance decimal = NULL, @TransactionDate datetime = NULL, @Type varchar(20) = NULL, @BalanceLedgerID int = NULL, @LoadOrderID int = NULL, @PaymentID int = NULL, @ContactID int = NULL, @AccessMobile varchar(20) = NULL, @ErrorCode int = NULL OUTPUT, @ErrorMessage varchar(260) = NULL OUTPUTAS SET NOCOUNT ONDECLARE @ErrorMessage1 varchar(50), @IsInternalTransaction char(1)SET @ErrorCode = 0SET @ErrorMessage = 'Success.'SET @ErrorMessage1 = 'SPB failed. 'IF @@TRANCOUNT = 0 SET @IsInternalTransaction = 'Y'--Validate @ActionIF(@Action IS NULL OR @Action = '')BEGIN SET @ErrorCode = 1 SET @ErrorMessage = @ErrorMessage1 + 'Action is required.' GOTO LABEL_ExitENDELSEBEGIN IF @Action NOT IN ('S', 'R', 'B') BEGIN SET @ErrorCode = 1 SET @ErrorMessage = @ErrorMessage1 + 'Action is invalid.' GOTO LABEL_Exit ENDENDIF(@Amount IS NULL OR @Amount < 0) SET @Amount = 0--Validate @CashBalanceIF(@CashBalance IS NULL)BEGIN SET @ErrorCode = 1 SET @ErrorMessage = @ErrorMessage1 + 'CashBalance is required.' GOTO LABEL_Exit END--Validate @TransactionDateIF(@TransactionDate IS NULL) SET @TransactionDate = GETDATE()--Validate @TypeIF(@Type IS NULL OR @Type = '')BEGIN SET @ErrorCode = 1 SET @ErrorMessage = @ErrorMessage1 + 'Type is required.' GOTO LABEL_Exit ENDELSEBEGIN IF @Type NOT IN ('L', 'M', 'G') BEGIN SET @ErrorCode = 1 SET @ErrorMessage = @ErrorMessage1 + 'Type is invalid.' GOTO LABEL_Exit ENDENDIF(@AccessMobile IS NULL OR @AccessMobile = '')BEGIN SET @ErrorCode = 1 SET @ErrorMessage = @ErrorMessage1 + 'AccessMobile is required.' GOTO LABEL_ExitENDELSEBEGIN SET @AccessMobile = LTRIM(RTRIM(@AccessMobile)) SET @AccessMobile = dbo.FormatMobileNumber('I', @AccessMobile) IF @AccessMobile NOT IN (SELECT AccessMobile FROM dbo.AccessMobiles) BEGIN SET @ErrorCode = 1 SET @ErrorMessage = @ErrorMessage1 + @AccessMobile + ' does not exist in dbo.AccessMobiles.' GOTO LABEL_Exit ENDENDDECLARE @TempTransactionDate datetime, @IsLatestTransactionDate char(1) SELECT TOP 1 @TempTransactionDate = AL.TransactionDateFROM dbo.AccountLedger ALINNER JOIN dbo.Contacts CON AL.ContactID = C.ContactID AND AL.AccessMobile = C.AccessMobileWHERE C.ContactID = @ContactID AND C.IsDeleted IS NULL AND AL.AccessMobile = @AccessMobileORDER BY AL.TransactionDate DESCIF (@TempTransactionDate > @TransactionDate) AND (@TempTransactionDate IS NOT NULL) SET @IsLatestTransactionDate = 'N'IF @IsInternalTransaction = 'Y' BEGIN TRANSACTIONINSERT INTO dbo.AccountLedger ( [Action], Amount, CashBalance, TransactionDate, Type, BalanceLedgerID, LoadOrderID, PaymentID, ContactID, AccessMobile ) VALUES ( @Action, @Amount, @CashBalance, @TransactionDate, @Type, @BalanceLedgerID, @LoadOrderID, @PaymentID, @ContactID, @AccessMobile ) IF(@@ERROR > 0)BEGIN SET @ErrorCode = @@ERROR IF @ErrorCode > 0 GOTO LABEL_GetDatabaseErrorMessage ENDDECLARE @ID intSET @ID = @@IDENTITYIF @IsLatestTransactionDate = 'N'BEGIN DECLARE @TempID int, @TempAction char(1), @TempCashBalance decimal, @TempAmount decimal, @PrevCashBalance decimal DECLARE accountLedgerCursor CURSOR FOR SELECT AL.[ID], AL.[Action], AL.CashBalance, AL.Amount FROM dbo.AccountLedger AL LEFT OUTER JOIN dbo.TABLE1 LB ON ( AL.BalanceLedgerID = LB.BalanceID ) AND ( (AL.BalanceLedgerID IS NOT NULL AND AL.BalanceLedgerID > 0) AND (LB.BalanceID IS NOT NULL AND LB.BalanceID > 0) ) AND (AL.AccessMobile = LB.AccessMobile) LEFT OUTER JOIN dbo.TABLE2 SMT ON ( AL.BalanceLedgerID = SMT.[ID] ) AND ( (AL.BalanceLedgerID IS NOT NULL AND AL.BalanceLedgerID > 0) AND (SMT.[ID] IS NOT NULL AND SMT.[ID] > 0) ) AND (AL.AccessMobile = SMT.AccessMobile) LEFT OUTER JOIN dbo.TABLE4 GCT ON ( AL.BalanceLedgerID = GCT.[ID] ) AND ( (AL.BalanceLedgerID IS NOT NULL AND AL.BalanceLedgerID > 0) AND (GCT.[ID] IS NOT NULL AND GCT.[ID] > 0) ) AND (AL.AccessMobile = GCT.AccessMobile) LEFT OUTER JOIN dbo.Payments P ON ( AL.PaymentID = P.[ID] ) AND ( (AL.PaymentID IS NOT NULL AND AL.PaymentID > 0) AND (P.[ID] IS NOT NULL AND P.[ID] > 0) ) AND ( AL.AccessMobile = P.AccessMobile ) LEFT OUTER JOIN dbo.TABLE3 C ON ( AL.ContactID = C.ContactID ) AND ( (AL.ContactID IS NOT NULL AND AL.ContactID > 0) AND (C.ContactID IS NOT NULL AND C.ContactID > 0) ) AND ( AL.AccessMobile = C.AccessMobile ) WHERE AL.AccessMobile = @AccessMobile AND AL.ContactID = @ContactID AND AL.TransactionDate >= @TransactionDate AND AL.[ID] <> @ID AND C.IsDeleted IS NULL ORDER BY AL.TransactionDate OPEN accountLedgerCursor SET @PrevCashBalance = @CashBalance FETCH NEXT FROM accountLedgerCursor INTO @TempID, @TempAction, @TempCashBalance, @TempAmount WHILE @@FETCH_STATUS = 0 BEGIN IF @TempAction = 'S' BEGIN UPDATE dbo.AccountLedger SET CashBalance = @PrevCashBalance - @TempAmount WHERE [ID] = @TempID SET @ErrorCode = @@ERROR IF @ErrorCode > 0 GOTO LABEL_GetDatabaseErrorMessage END ELSE IF @TempAction = 'R' BEGIN UPDATE dbo.AccountLedger SET CashBalance = @PrevCashBalance + @TempAmount WHERE [ID] = @TempID SET @ErrorCode = @@ERROR IF @ErrorCode > 0 GOTO LABEL_GetDatabaseErrorMessage END SELECT @CashBalance = CashBalance FROM dbo.AccountLedger WHERE [ID] = @TempID SET @PrevCashBalance = @CashBalance FETCH NEXT FROM accountLedgerCursor INTO @TempID, @TempAction, @TempCashBalance, @TempAmount END CLOSE accountLedgerCursor DEALLOCATE accountLedgerCursorENDGOTO LABEL_CommitTransaction------------------------------LABEL_GetDatabaseErrorMessage:------------------------------SELECT @ErrorMessage = [description]FROM master.dbo.sysmessagesWHERE error = @ErrorCodeGOTO Label_RollbackTransaction------------------------LABEL_CommitTransaction:------------------------IF @IsInternalTransaction = 'Y' COMMIT TRANSACTIONGOTO LABEL_Exit------------------------LABEL_RollbackTransaction:------------------------IF @IsInternalTransaction = 'Y' ROLLBACK TRANSACTION-----------LABEL_Exit:-----------IF @IsInternalTransaction = 'Y' SELECT @ErrorCode AS 'ErrorCode', @ErrorMessage AS 'ErrorMessage' |
 |
|