none
Trigger que actualiza la misma tabla RRS feed

  • Pregunta

  • Hola compañeros, la situación es la siguiente: Tengo una tabla con varios campos, lo que quiero hacer es que al insertar un dato, o al actualizar un valor, se determine si el campo montoNomina coincide con el campo montoListado, de no ser así, que en el campo estado se coloque "Discrepancia"¿Cómo puedo hacerlo? 

    ALTER TRIGGER [dbo].[DiscrepanciaBase]
        ON [dbo].[Base]
        AFTER INSERT
    AS
    BEGIN
        UPDATE c    
        SET 
    	   c.estado = 'Discrepancia'
    
        FROM
    
    	   inserted i
    	   INNER JOIN dbo.Base c ON (i.montoListado != i.montoNomina)
    
    END

    Este es el trigger que llevo, el problema es que llena todos las celdas del campo estado con "Discrepancia", no solo la celda de donde no coinciden.

    viernes, 24 de julio de 2020 1:36

Todas las respuestas

  • Hola ceesar7Xteruck:

    Una de las cosas que tienes que tener en cuenta es el tratamiento de los null, caso de que puedan existir

    Create table Base (id int primary key, montoListado int, montoNomina int, estado varchar(20))
    go
    CREATE OR ALTER TRIGGER [dbo].[DiscrepanciaBase]
        ON [dbo].[Base]
        AFTER INSERT
    AS
    BEGIN
        UPDATE c    
        SET 
    	   c.estado = 'Discrepancia'
        FROM
    	   inserted i
    	   INNER JOIN dbo.Base c ON (i.id =c.id)
    	   Where
    		   (i.montoListado is null and c.montoNomina is not null)
    		   or 
    		   (i.montoListado is not null and c.montoNomina is null)
    		   or
    		   (i.montoListado <> c.montoNomina);
    END
    GO

    En el on, tienes que identificar la clave primaria que identifica los registros.

    INSERT INTO dbo.Base (id, montoListado, montoNomina, estado)
    values
    (1,5,5,'bien'),      -- iguales
    (2,null,3,'mal'),    -- null vs numero
    (3,null,null,'bien'),-- null vs null
    (4,8,null,'mal'),    -- numero vs null
    (5,1,9,'mal'),       -- diferentes
    (6,9,9,'bien');      -- iguales
    go

    Resultado:

    select * from dbo.Base

    • Propuesto como respuesta Nacherasg viernes, 24 de julio de 2020 8:13
    viernes, 24 de julio de 2020 3:22
  • Muchas gracias!! Me funciono
    viernes, 24 de julio de 2020 4:02
  • De nada
    viernes, 24 de julio de 2020 6:04