lunes, 3 de noviembre de 2014
Creación de método Transferencia
Creación de método Transferencia
9 Horas
Éste método fue el más difícil por ser el más enredado y el más extenso, la dificultad residía en ser un movimiento de una cuenta a otra, visto en tablas, una referencia entre la misma tabla. Ademas de guardar el movimiento se tuvo que tomar en cuenta los bancos desde los que se hacía el movimiento y también se tuvo que modificar los saldos de las respectivas cuentas. El problema, que no se pudo solucionar, fue optimizar el procedure de manera que se automatizara para evitar depender de tantos parámetros en el procedure. Otro problema fue acomodar bien las validaciones de manera que el procedure diera los resultados esperados (usualmente retornaba tablas vacías o sin alterar).
-- ########################################################################################################################
-- Stored Procedure of Transferencia
-- ########################################################################################################################
-- Verify that the stored procedure does not exist.
IF OBJECT_ID(N'CA_SP_Transferencia', N'P') IS NOT NULL
DROP PROCEDURE CA_SP_Transferencia;
GO
CREATE PROCEDURE [dbo].[CA_SP_Transferencia]
@CuentaDepositante INT ,
@CuentaDepositada INT ,
@Monto MONEY ,
@TipoMovimiento1 INT ,
@TipoMovimiento2 INT ,
@TipoMedio1 INT ,
@TipoMedio2 INT ,
@Fecha DATETIME ,
@IdBanco INT ,
@Banco1 INT ,
@Banco2 INT ,
@ReturnValue INT OUTPUT
AS
BEGIN TRY
IF (( EXISTS( SELECT * FROM [dbo].[CA_Cuenta] WHERE (Id = @CuentaDepositante)))--existen ambas cuentas
AND (EXISTS(SELECT * FROM [dbo].[CA_Cuenta] WHERE ( Id = @CuentaDepositada))))
BEGIN
IF((SELECT SaldoReal FROM dbo.CA_Cuenta WHERE @CuentaDepositante = Id) > @Monto )--monto suficiente
BEGIN
IF (EXISTS(SELECT * FROM dbo.CA_Banco WHERE Id = @Banco1 )AND EXISTS (SELECT * FROM dbo.CA_Banco WHERE Id = @Banco2))-- Existen los bancos
BEGIN
DECLARE @recargo int
SET @recargo = 0
IF (@Banco1 != @Banco2)
SET @recargo = 265
BEGIN TRANSACTION
--Movimiento a cuenta depositante
INSERT INTO dbo.CA_Movimiento ( FK_Cuenta ,FK_TipoMovimiento ,FK_TipoMedio ,FechaHora ,Monto)
VALUES ( @CuentaDepositante ,@TipoMovimiento1 ,@TipoMedio1 ,@Fecha ,@Monto)
UPDATE dbo.CA_Cuenta
SET SaldoReal = SaldoReal - (@Monto+@recargo)
WHERE Id = @CuentaDepositante
--Movimiento a cuenta depositada
INSERT INTO dbo.CA_Movimiento( FK_Cuenta ,FK_TipoMovimiento ,FK_TipoMedio ,FechaHora ,Monto)
VALUES ( @CuentaDepositada ,@TipoMovimiento2 ,@TipoMedio2 ,@Fecha ,@Monto)
UPDATE dbo.CA_Cuenta
SET SaldoReal = SaldoReal + @Monto
WHERE Id = @CuentaDepositada
COMMIT
END
ELSE
BEGIN
PRINT 'No existe el banco'
END
END
ELSE
BEGIN
PRINT 'Monto insuficiente'
END
END
ELSE
BEGIN
PRINT 'Cuenta inexistente'
END
END TRY
BEGIN CATCH
PRINT 'Error de transaction'
END CATCH
Suscribirse a:
Enviar comentarios (Atom)
No hay comentarios:
Publicar un comentario