none
Que salga mensaje si no hay 2 campos iguales RRS feed

  • Pregunta

  • Buenas tardes,

    En una tabla tengo 3 campos toma_1, toma_2 y toma_3, solo debe dejar almacenar la información en la tabla cuando 2 de los campos sean iguales, de lo contrario debe detener la operación sacando un mensaje.

    Tengo el desencadenador:

    ALTER TRIGGER [dbo].[Control_Conteos] ON [dbo].[documentos_lin]
    FOR INSERT
    AS
    DECLARE @conteo INT
    DECLARE @mensaje VARCHAR(80)
    DECLARE @toma1 REAL
    DECLARE @toma2 REAL
    DECLARE @toma3 REAL

    SELECT @toma1 = rf.toma_1
    ,@toma2 = rf.toma_2
    ,@toma3 = rf.toma_3
    FROM referencias_fis rf
    INNER JOIN inserted i
    ON rf.codigo = i.codigo
    AND rf.bodega = i.bodega

    IF ((@toma1 <> @toma2)
    OR (@toma1 <> @toma3))
    and (@toma2 <> @toma3)

    AND (
    SELECT tipo
    FROM inserted
    ) IN (
    'EIF'
    ,'SIF'
    )
    BEGIN
    ROLLBACK TRANSACTION

    SELECT @mensaje = 'NO SE GENERO EL DOCUMENTO, REVISE LAS TOMAS1'

    RAISERROR (
    @mensaje
    ,11
    ,2
    )

    RETURN
    END

    Pero cuando tengo la toma_1= a la toma_2 no deja almacenar los datos, y si debería de dejar almacenar, puesto que estaría cumpliendo con la validación de 2 datos iguales.

    Ayuda please!! =(


    Steven Ramirez S.

    lunes, 20 de enero de 2020 18:10

Respuestas

  • Deleted
    lunes, 20 de enero de 2020 20:23
  • Muchas gracias por tu pronta ayuda y respuesta, adecué un poco la consulta, pero me está saliendo un error con el CTE:

    CREATE TRIGGER dbo.Control_Conteos ON dbo.documentos_lin
    FOR INSERT
    AS

    DECLARE @toma1 REAL
    DECLARE @toma2 REAL
    DECLARE @toma3 REAL
    declare @tipo varchar
    declare @cte INT


    SELECT @toma1 = rf.toma_1
    ,@toma2 = rf.toma_2
    ,@toma3 = rf.toma_3
    ,@tipo= i.tipo
    FROM referencias_fis rf
    INNER JOIN inserted i
    ON rf.codigo = i.codigo
    AND rf.bodega = i.bodega

         BEGIN
             BEGIN TRAN;
             DECLARE @RES INT;
             WITH CTE
                  AS (SELECT @tipo
                           , @toma1
                           , @toma2
                           , @toma3
                           , CASE
                                 WHEN((@toma1 = @toma2)
                                      OR (@toma1 = @toma3))
                                     AND (@tipo IN('EIF', 'SIF'))
                                 THEN 0
                                 WHEN NOT @tipo IN('EIF', 'SIF')
                                 THEN 0
                                 ELSE 1
                             END AS RESULTADO
                      FROM 
                           referencias_fis rf
    INNER JOIN inserted i
    ON rf.codigo = i.codigo
    AND rf.bodega = i.bodega)
                  SELECT @RES = SUM(RESULTADO)
                  FROM 
                       CTE;
             IF @RES = 0
                 COMMIT TRANSACTION;
                 ELSE
                 BEGIN
                     RAISERROR(N'NO SE GENERO EL DOCUMENTO, REVISE LAS TOMAS1', 11, 2);
                     ROLLBACK TRANSACTION;
             END;
         END;

    Me sale el mensaje:

    Mens 8155, Nivel 16, Estado 2, Procedimiento Control_Conteos2, Línea 24
    No se especificó ningún nombre de columna para la columna 1 de 'CTE'.
    Mens 8155, Nivel 16, Estado 2, Procedimiento Control_Conteos2, Línea 24
    No se especificó ningún nombre de columna para la columna 2 de 'CTE'.
    Mens 8155, Nivel 16, Estado 2, Procedimiento Control_Conteos2, Línea 24
    No se especificó ningún nombre de columna para la columna 3 de 'CTE'.
    Mens 8155, Nivel 16, Estado 2, Procedimiento Control_Conteos2, Línea 24
    No se especificó ningún nombre de columna para la columna 4 de 'CTE'.


    Steven Ramirez S.

    lunes, 20 de enero de 2020 20:24

Todas las respuestas

  • Hola Ubuntu83:

    Los triggers tienen que evaluarse como conjuntos de datos, ya que las insercciones pueden ser de varios a la vez.

    CREATE TRIGGER dbo.Control_Conteos ON dbo.documentos_lin
    FOR INSERT
    AS
         BEGIN
             BEGIN TRAN;
             DECLARE @RES INT;
             WITH CTE
                  AS (SELECT rf.tipo
                           , rf.toma1
                           , rf.toma2
                           , rf.toma3
                           , CASE
                                 WHEN((rf.toma1 = rf.toma2)
                                      OR (rf.toma1 = rf.toma3))
                                     AND (rf.tipo IN('EIF', 'SIF'))
                                 THEN 0
                                 WHEN NOT rf.tipo IN('EIF', 'SIF')
                                 THEN 0
                                 ELSE 1
                             END AS RESULTADO
                      FROM 
                           referencias_fis rf
    					INNER JOIN inserted t	
    					ON rf.codigo = i.codigo
    					AND rf.bodega = i.bodega)
                  SELECT @RES = SUM(RESULTADO)
                  FROM 
                       CTE;
             IF @RES = 0
                 COMMIT TRANSACTION;
                 ELSE
                 BEGIN
                     RAISERROR(N'NO SE GENERO EL DOCUMENTO, REVISE LAS TOMAS1', 11, 2);
                     ROLLBACK TRANSACTION;
             END;
         END;

    Si observas el código, utilizamos una tabla de expresión común para recoger todos los registros insertados.

    Si cada una de las filas tiene el tipo 1 y el tipo2 iguales,  o el tipo 1 y el 3 y es de los tipados EIF o SIF, o de cualquier otro tipado entonces es válido, porque el case de resultado es igual a 0. Pero si no se cumple cualquiera de estas dos condiciones, entonces la fila es 1.

    A la salida sumamos los resultados, y si es mayor que 0 algún registro no es válido.

    Y por este deshacemos la transacción y retornamos el mensaje a través de RAISERROR.

    Tablas de expresión común

    https://javifer2.wordpress.com/2018/12/18/with-cte-tablas-de-expresion-comun-1/

    lunes, 20 de enero de 2020 19:21
  • Deleted
    lunes, 20 de enero de 2020 20:23
  • Muchas gracias por tu pronta ayuda y respuesta, adecué un poco la consulta, pero me está saliendo un error con el CTE:

    CREATE TRIGGER dbo.Control_Conteos ON dbo.documentos_lin
    FOR INSERT
    AS

    DECLARE @toma1 REAL
    DECLARE @toma2 REAL
    DECLARE @toma3 REAL
    declare @tipo varchar
    declare @cte INT


    SELECT @toma1 = rf.toma_1
    ,@toma2 = rf.toma_2
    ,@toma3 = rf.toma_3
    ,@tipo= i.tipo
    FROM referencias_fis rf
    INNER JOIN inserted i
    ON rf.codigo = i.codigo
    AND rf.bodega = i.bodega

         BEGIN
             BEGIN TRAN;
             DECLARE @RES INT;
             WITH CTE
                  AS (SELECT @tipo
                           , @toma1
                           , @toma2
                           , @toma3
                           , CASE
                                 WHEN((@toma1 = @toma2)
                                      OR (@toma1 = @toma3))
                                     AND (@tipo IN('EIF', 'SIF'))
                                 THEN 0
                                 WHEN NOT @tipo IN('EIF', 'SIF')
                                 THEN 0
                                 ELSE 1
                             END AS RESULTADO
                      FROM 
                           referencias_fis rf
    INNER JOIN inserted i
    ON rf.codigo = i.codigo
    AND rf.bodega = i.bodega)
                  SELECT @RES = SUM(RESULTADO)
                  FROM 
                       CTE;
             IF @RES = 0
                 COMMIT TRANSACTION;
                 ELSE
                 BEGIN
                     RAISERROR(N'NO SE GENERO EL DOCUMENTO, REVISE LAS TOMAS1', 11, 2);
                     ROLLBACK TRANSACTION;
             END;
         END;

    Me sale el mensaje:

    Mens 8155, Nivel 16, Estado 2, Procedimiento Control_Conteos2, Línea 24
    No se especificó ningún nombre de columna para la columna 1 de 'CTE'.
    Mens 8155, Nivel 16, Estado 2, Procedimiento Control_Conteos2, Línea 24
    No se especificó ningún nombre de columna para la columna 2 de 'CTE'.
    Mens 8155, Nivel 16, Estado 2, Procedimiento Control_Conteos2, Línea 24
    No se especificó ningún nombre de columna para la columna 3 de 'CTE'.
    Mens 8155, Nivel 16, Estado 2, Procedimiento Control_Conteos2, Línea 24
    No se especificó ningún nombre de columna para la columna 4 de 'CTE'.


    Steven Ramirez S.

    lunes, 20 de enero de 2020 20:24
  • Muchísimas Gracias! Estoy realizando pruebas y hasta ahora está funcionando correctamente!

    Steven Ramirez S.

    lunes, 20 de enero de 2020 20:36