Ticker

6/recent/ticker-posts

Mensaje personalizado T-SQL

En este apartado pretendemos demostrar con un ejemplo claro y sencillo el uso y control de Mensaje personalizado usando T-SQL:

Requisitos :
1. SQL Server 2008 -  (T-SQL).

ESTRUCTURA DE TABLA
Antes de iniciar el desarrollo de T-SQL, considero que ya cuento con la tabla creada. Para este caso estoy tomando como referencia la tabla SEG_MODULO del diseño y modelo de base de datos Modulo de Control de Acceso - Primera Fase http://hadsonpar.blogspot.com/2013/08/modulo-de-control-de-acceso-primera-fase.html

Iniciamos creando nuestro procedimiento almacenado SP_INS_SEG_MODULO, haciendo referencia a la estructura de tabla:
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

El parámetro @OC_MESSAGE_ERROR es solo de salida, parámetro que nos ayudará a controlar los mensajes personalizadosAhora ingresamos el valor que nos solicita cada parámetro de nuestro procedimiento almacenado que acabamos de crear.

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 
RESULTADOS
CONFIRMAMOS SI LOS DATOS FUERON EFECTIVAMENTE INGRESADOS
Por ahora todo bien y que pasa si es que comenzamos a ingresar un nuevo registro sin ninguna validación que pueda restringir dicho proceso de inserción. 

Ejemplo
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.
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


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



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.


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.

Publicar un comentario

0 Comentarios