CREATE PROCEDURE [dbo].[SP_INS_SEG_MODULO]
@PC_DES_MODULO VARCHAR(50),
@PC_MAN_MODULO VARCHAR(200),
@PC_USU_CREADOR VARCHAR(20),
@PF_FEC_CREACION DATETIME,
@PC_USU_ACTUALIZA VARCHAR(20),
@PF_FEC_ACTUALIZA DATETIME,
@OC_MESSAGE_ERROR VARCHAR(1000) OUTPUT
AS
BEGIN TRY
DECLARE @PC_ID_MODULO INTEGER
EXEC SP_GEN_ID_MODULO
@PC_ID_MODULO OUTPUT
INSERT INTO SEG_MODULO
(ID_MODULO,
DES_MODULO,
MAN_MODULO,
USU_CREADOR,
FEC_CREACION,
USU_ACTUALIZA,
FEC_ACTUALIZA)
VALUES (@PC_ID_MODULO,
@PC_DES_MODULO,
@PC_MAN_MODULO,
@PC_USU_CREADOR,
@PF_FEC_CREACION,
@PC_USU_ACTUALIZA,
@PF_FEC_ACTUALIZA)
SELECT @OC_MESSAGE_ERROR = ''
END TRY
BEGIN CATCH
SELECT @OC_MESSAGE_ERROR = (SELECT 'ERROR EN PROCEDIMIENTO : '+ ERROR_PROCEDURE() + ' , MENSAJE : ' + ERROR_MESSAGE() + ' ID_MODULO : ' + CONVERT(VARCHAR,@PC_ID_MODULO))
END CATCH
![](https://3.bp.blogspot.com/-ysTARNP9x58/U1DfMyQqo1I/AAAAAAAAATg/-_mAR7YBOF4/s1600/parametros.jpg) |
INGRESAR PARÁMETROS Y ACEPTAR |
Script que genera al ejecutar el procedimiento almacenado.
USE [BD_SISTEMA]
GO
DECLARE @return_value int,
@OC_MESSAGE_ERROR varchar(1000)
EXEC @return_value = [dbo].[SP_INS_SEG_MODULO]
@PC_DES_MODULO = N'SISTEMA',
@PC_MAN_MODULO = N'\\192.168.1.113\Sistemas\ManualModulo',
@PC_USU_CREADOR = N'HADSON',
@PF_FEC_CREACION = N'18/04/2014',
@PC_USU_ACTUALIZA = N'HADSON',
@PF_FEC_ACTUALIZA = N'18/04/2014',
@OC_MESSAGE_ERROR = @OC_MESSAGE_ERROR OUTPUT
SELECT @OC_MESSAGE_ERROR as N'@OC_MESSAGE_ERROR'
SELECT 'Return Value' = @return_value
GO
![](https://2.bp.blogspot.com/-AYmCqFYtloI/U1DnI4OWGEI/AAAAAAAAAT0/8R4QTa9HGCY/s1600/validad_ejecucion.jpg) |
RESULTADOS |
En nuestra primera inserción ingresamos como descripción de modulo SISTEMA y si intentamos ingresar nuevamente SISTEMA se insertará sin ningún problema, generando ambigüedad de datos, ejecutamos en Script generado de nuestro procedimiento almacenado.
![](https://4.bp.blogspot.com/-VzW6pNVgPFA/U1FZQBzF8kI/AAAAAAAAAUI/N-1XF7XBQ1k/s1600/ingreso_doble.jpg) |
COMO RESULTADO AHORA CONTAMOS CON 2 REGISTRO DE LA MISMA DESCRIPCIÓN DE MODULO |
Para poder controlar nuestra validación de inserción de datos utilizaremos en este caso un mensaje personalizado y en otro ejemplo utilizaremos la función RAISERROR de T-SQL. Para ambos casos el programador es quien lo define.
Ejemplo con mensaje personalizado:
ALTER PROCEDURE [dbo].[SP_INS_SEG_MODULO]
@PC_DES_MODULO VARCHAR(50),
@PC_MAN_MODULO VARCHAR(200),
@PC_USU_CREADOR VARCHAR(20),
@PF_FEC_CREACION DATETIME,
@PC_USU_ACTUALIZA VARCHAR(20),
@PF_FEC_ACTUALIZA DATETIME,
@OC_MESSAGE_ERROR VARCHAR(1000) OUTPUT
AS
BEGIN TRY
DECLARE @PC_ID_MODULO INTEGER
IF EXISTS (SELECT * FROM SEG_MODULO
WHERE DES_MODULO = LTRIM(RTRIM(@PC_DES_MODULO)))
BEGIN
SELECT @OC_MESSAGE_ERROR = 'LA DESCRIPCION QUE ESTA INTENTANDO REGISTRAS YA EXISTE EN LA BASE DE DATOS'
END
ELSE
BEGIN
EXEC SP_GEN_ID_MODULO
@PC_ID_MODULO OUTPUT
INSERT INTO SEG_MODULO
(ID_MODULO,
DES_MODULO,
MAN_MODULO,
USU_CREADOR,
FEC_CREACION,
USU_ACTUALIZA,
FEC_ACTUALIZA)
VALUES (@PC_ID_MODULO,
@PC_DES_MODULO,
@PC_MAN_MODULO,
@PC_USU_CREADOR,
@PF_FEC_CREACION,
@PC_USU_ACTUALIZA,
@PF_FEC_ACTUALIZA)
SELECT @OC_MESSAGE_ERROR = ''
END
END TRY
BEGIN CATCH
SELECT @OC_MESSAGE_ERROR = (SELECT 'ERROR EN PROCEDIMIENTO : '+ ERROR_PROCEDURE() + ' , MENSAJE : ' + ERROR_MESSAGE() + ' ID_MODULO : ' + CONVERT(VARCHAR,@PC_ID_MODULO))
END CATCH
![](https://3.bp.blogspot.com/-S8bFfyqclQo/U1FgO-ITi8I/AAAAAAAAAUg/zqImd2F2PR4/s1600/msg_personalozado.jpg) |
COMO SE APRECIA EL PARAMETRO DE SALIDA @OC_MESSAGE_ERROR DEVUELVE EL MENSAJE PERSONALIZADO |
Esto se debe a la simple y sencilla validación que se realiza y se devuelve en nuestro parámetro de salida. Línea de código que realiza esta validación.
IF EXISTS (SELECT * FROM SEG_MODULO
WHERE DES_MODULO = LTRIM(RTRIM(@PC_DES_MODULO)))
BEGIN
SELECT @OC_MESSAGE_ERROR = 'LA DESCRIPCION QUE ESTA INTENTANDO REGISTRAS YA EXISTE EN LA BASE DE DATOS'
END
Ejemplo con RAISERROR :
Para poder hacer uso de esta función propia del T-SQL modificaremos nuestro procedimiento almacenado. Donde nuestro parámetro de salida @OC_MESSAGE_ERROR, lo pasaremos como un variable para setear el mensaje o también pueden hacerlo de manera directa RAISERROR ( 'LA DESCRIPCION QUE ESTA INTENTANDO REGISTRAS YA EXISTE EN LA BASE DE DATOS',16,1) el resultado sera lo mismo.
ALTER PROCEDURE [dbo].[SP_INS_SEG_MODULO]
@PC_DES_MODULO VARCHAR(50),
@PC_MAN_MODULO VARCHAR(200),
@PC_USU_CREADOR VARCHAR(20),
@PF_FEC_CREACION DATETIME,
@PC_USU_ACTUALIZA VARCHAR(20),
@PF_FEC_ACTUALIZA DATETIME
AS
BEGIN
DECLARE @PC_ID_MODULO INTEGER
DECLARE @OC_MESSAGE_ERROR VARCHAR(1000)
IF EXISTS (SELECT * FROM SEG_MODULO
WHERE DES_MODULO = LTRIM(RTRIM(@PC_DES_MODULO)))
BEGIN
SET @OC_MESSAGE_ERROR = 'LA DESCRIPCION QUE ESTA INTENTANDO REGISTRAS YA EXISTE EN LA BASE DE DATOS'
RAISERROR (@OC_MESSAGE_ERROR,16,1)
END
ELSE
BEGIN
EXEC SP_GEN_ID_MODULO
@PC_ID_MODULO OUTPUT
INSERT INTO SEG_MODULO
(ID_MODULO,
DES_MODULO,
MAN_MODULO,
USU_CREADOR,
FEC_CREACION,
USU_ACTUALIZA,
FEC_ACTUALIZA)
VALUES (@PC_ID_MODULO,
@PC_DES_MODULO,
@PC_MAN_MODULO,
@PC_USU_CREADOR,
@PF_FEC_CREACION,
@PC_USU_ACTUALIZA,
@PF_FEC_ACTUALIZA)
SELECT @OC_MESSAGE_ERROR = ''
END
END
![](https://3.bp.blogspot.com/-2owhkdeOs90/U1FmUem5JXI/AAAAAAAAAUw/VKxU6hvwxPU/s1600/raiserror.jpg) |
RESULTADO - RAISERROR |
En ambos casos la validación es a nivel de servidor de base de datos, y puedes usar varios mensaje personalizados dependiendo el desarrollo que vienes realizando.
Cambios la descripción para ver efecto de todo este proceso que acabamos de realizar.
![](https://1.bp.blogspot.com/-IbrNPvn1w6s/U1FoMCr77KI/AAAAAAAAAU8/xi0qqgEkLts/s1600/RESULTADO_OK.jpg) |
RESULTADO: SE INGRESO LA DESCRIPCIÓN VENTA |
Esto es una las formas de controlar las validaciones a nivel de servidor de base de datos, hay muchas formas más de poder hacerlo. Nos vemos en nuestro siguiente apartado.
0 Comentarios