locked
me urge resolverlos siguiente es sobre un procedimiento almacenado RRS feed

  • Pregunta

  • tengo el siguiente codigo del procedimiento almacenado

    DECLARE @importe DECIMAL(18,2),

    @CuentaOrigen VARCHAR(12),

    @CuentaDestino VARCHAR(12)

    SET @importe = 1000

    SET @CuentaOrigen = '3000'

    SET @CuentaDestino = '1000'

    BEGIN TRANSACTION -- O solo BEGIN TRAN

    BEGIN TRY

    /* Descontamos el importe de la cuenta origen */

    UPDATE CUENTA 

    SET SALDO = SALDO - @importe

    WHERE NUMCUE = @CuentaOrigen

    /* Incrementamos el importe de la cuenta destino */

    UPDATE CUENTA

    SET SALDO = SALDO + @importe

    WHERE NUMCUE = @CuentaDestino

    /* Confirmamos la transaccion*/ 

    COMMIT TRANSACTION -- O solo COMMIT

    END TRY

    BEGIN CATCH

    /* Hay un error, deshacemos los cambios*/ 

    ROLLBACK TRANSACTION -- O solo ROLLBACK

    PRINT 'Se ha producido un error!'

    END CATCH

    -----------------------------------

    lo que no se es como mandar un mensaje "Saldo insuficiente" cuando alguna cuenta no cuenta con el saldo

    necesario para hacer la transferencia, esta transacción me pone numero negativos cuando no se debería de poder

    martes, 10 de febrero de 2015 21:01

Respuestas

  • Hola,

    En realidad no es algo que deba de validarse en la base de datos, quizá si como un segundo nivel de protección pero no como primera medida. Tu aplicación debería primero validar si existe saldo antes de proceder a realizar la transacción. Aún así y como segundo nivel de seguridad puedes hacerlo en el procedimiento:

    DECLARE @importe DECIMAL(18,2),
    @CuentaOrigen VARCHAR(12),
    @CuentaDestino VARCHAR(12)
    
    SET @importe = 1000
    SET @CuentaOrigen = '3000'
    SET @CuentaDestino = '1000'
    
    BEGIN TRANSACTION -- O solo BEGIN TRAN
    BEGIN TRY
    	IF (Select SALDO from CUENTA WHERE NUMCUE = @CuentaOrigen) < @importe
    	BEGIN
    		PRINT 'No existe saldo suficiente para realizar la transacción'
    	ELSE
    	BEGIN
    		/* Descontamos el importe de la cuenta origen */
    
    		UPDATE CUENTA 
    		SET SALDO = SALDO - @importe
    		WHERE NUMCUE = @CuentaOrigen
    
    		/* Incrementamos el importe de la cuenta destino */
    
    		UPDATE CUENTA
    		SET SALDO = SALDO + @importe
    		WHERE NUMCUE = @CuentaDestino
    
    		/* Confirmamos la transaccion*/ 
    
    		COMMIT TRANSACTION -- O solo COMMIT
    	END
    END TRY
    BEGIN CATCH
    	/* Hay un error, deshacemos los cambios*/ 
    	ROLLBACK TRANSACTION -- O solo ROLLBACK
    	PRINT 'Se ha producido un error!'
    END CATCH

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    • Propuesto como respuesta Karen MalagónModerator miércoles, 11 de febrero de 2015 17:23
    • Marcado como respuesta 0claire0 miércoles, 11 de febrero de 2015 18:19
    martes, 10 de febrero de 2015 21:09

Todas las respuestas

  • Hola,

    En realidad no es algo que deba de validarse en la base de datos, quizá si como un segundo nivel de protección pero no como primera medida. Tu aplicación debería primero validar si existe saldo antes de proceder a realizar la transacción. Aún así y como segundo nivel de seguridad puedes hacerlo en el procedimiento:

    DECLARE @importe DECIMAL(18,2),
    @CuentaOrigen VARCHAR(12),
    @CuentaDestino VARCHAR(12)
    
    SET @importe = 1000
    SET @CuentaOrigen = '3000'
    SET @CuentaDestino = '1000'
    
    BEGIN TRANSACTION -- O solo BEGIN TRAN
    BEGIN TRY
    	IF (Select SALDO from CUENTA WHERE NUMCUE = @CuentaOrigen) < @importe
    	BEGIN
    		PRINT 'No existe saldo suficiente para realizar la transacción'
    	ELSE
    	BEGIN
    		/* Descontamos el importe de la cuenta origen */
    
    		UPDATE CUENTA 
    		SET SALDO = SALDO - @importe
    		WHERE NUMCUE = @CuentaOrigen
    
    		/* Incrementamos el importe de la cuenta destino */
    
    		UPDATE CUENTA
    		SET SALDO = SALDO + @importe
    		WHERE NUMCUE = @CuentaDestino
    
    		/* Confirmamos la transaccion*/ 
    
    		COMMIT TRANSACTION -- O solo COMMIT
    	END
    END TRY
    BEGIN CATCH
    	/* Hay un error, deshacemos los cambios*/ 
    	ROLLBACK TRANSACTION -- O solo ROLLBACK
    	PRINT 'Se ha producido un error!'
    END CATCH

    Si la solución propuesta atendió su consulta no olvide marcarla como respuesta.

    Willams Morales
    Arequipa - PERÚ

    • Propuesto como respuesta Karen MalagónModerator miércoles, 11 de febrero de 2015 17:23
    • Marcado como respuesta 0claire0 miércoles, 11 de febrero de 2015 18:19
    martes, 10 de febrero de 2015 21:09
  • me marco error por el else, lleva algo mas en el else?
    martes, 10 de febrero de 2015 21:30
  • Hola,

    Antes del ELSE debería haber un END para cerrar el BEGIN del IF. 

    martes, 10 de febrero de 2015 21:38
  • ok muchas gracias
    miércoles, 11 de febrero de 2015 18:20