SQL Server - PROBLEMA CON TRIGGER SQL SERVER 2008 SR2

   
Vista:

PROBLEMA CON TRIGGER SQL SERVER 2008 SR2

Publicado por Coral (3 intervenciones) el 17/01/2013 23:13:24
Hola, tenemos el siguiente trigger que se ejecuta tras actualizar la tabla TL_ticketsCabecera y escribe un archivo V123.txt con el importe del total del ticket (importe) de esa operación, funciona correctamente, solo que por alguna razón, lo hace 3 veces por cada ticket creado, se supone que el programa hace 3 updates en esa tabla y por eso genera los 3 archivos(por supuesto no tenemos acceso al código del programa, por eso solo tengo el recurso de los triggers).
La pregunta es.... como evitar eso y hacer que solo genere un solo archivo por cada ticket generado o que por cada tres UPDATE de la tabla solo se active una vez el trigger?

USE [DATABASE]
GO
/****** Object: Trigger [dbo].[Cash] Script Date: 01/10/2013 17:39:27 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Cash] ON [dbo].[TL_TicketsCabecera]
AFTER UPDATE
AS
DECLARE @UnidadOperativa VARCHAR(20)
DECLARE @Jornada VARCHAR(8)
DECLARE @Numero VARCHAR(20)
DECLARE @Importe NUMERIC(9,2)
DECLARE @COMMAND VARCHAR(1000)
DECLARE @Caja VARCHAR(20);
BEGIN
SELECT
@UnidadOperativa= TC.UnidadOperativa,
@Jornada= TC.Jornada,
@Numero= TC.Numero,
@Importe = TC.Importe,
@Caja=TC.Caja
FROM
inserted AS TC
LEFT JOIN
[dbo].[TL_TicketsPagos] AS TP
ON
(TC.UnidadOperativa = TP.UnidadOperativa AND TC.Jornada= TP.Jornada AND TC.Numero= TP.Numero)
WHERE
TP.Tipo='MET'
GROUP BY
TC.UnidadOperativa, TC.Jornada, TC.Numero, TC.Importe, TC.Caja

IF (@Importe>0 AND @Caja='CAJA01')
BEGIN

SET @COMMAND='@ECHO ' + CAST(ABS(@Importe) AS VARCHAR(6)) +' >C:\CAS\V123.TXT'
EXEC Xp_CMDSHELL @COMMAND

END
ELSE
BEGIN

END
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias

PROBLEMA CON TRIGGER SQL SERVER 2008 SR2

Publicado por Isaias (3182 intervenciones) el 18/01/2013 21:05:54
Lo unico que se me ocurre, es que guardes en una tabla (que la vas a crear), la generacion de tu ticket, en base a los parametros de:

@UnidadOperativa= TC.UnidadOperativa,
@Jornada= TC.Jornada,
@Numero= TC.Numero,
@Importe = TC.Importe,
@Caja=TC.Caja

Si ya existe (en tu tabla que vas a crear), ya no lo vuelves a generar.

Esta tabla deberia limpiarse, al final de la jornada con un simple TRUNCATE TABLE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

PROBLEMA CON TRIGGER SQL SERVER 2008 SR2

Publicado por Coral (3 intervenciones) el 19/01/2013 23:49:47
Al final he resuelto de la siguiente manera, se crea una nueva tabla con dos campos, uno jornada y otro número, correspondientes a la fecha y número de ticket, se graban esos dos datos en dicha tabla y se comprueba si existen despues.
En el caso de que no existan se genera el archivo con la cantidad del total del ticket y se aprovecha para eliminar todos los registros de esa tabla de la jornada anterior....y queda así

USE [DB1]
GO
/****** Object: Trigger [dbo].[Cas] Script Date: 01/19/2013 BY CORAL ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[Cash] ON [dbo].[TL_TicketsCabecera]
after update
AS
SET NOCOUNT ON;
DECLARE @UnidadOperativa VARCHAR(20)
DECLARE @Jornada VARCHAR(8)
DECLARE @Numero VARCHAR(20)
DECLARE @Importe NUMERIC(9,2)
DECLARE @COMMAND VARCHAR(1000)
DECLARE @Caja VARCHAR(20);
;
BEGIN

SELECT

@UnidadOperativa= TC.UnidadOperativa,
@Jornada= TC.Jornada,
@Numero= TC.Numero,
@Importe = TC.Importe,
@Caja=TC.Caja


FROM
inserted AS TC

LEFT JOIN
[dbo].[TL_TicketsPagos] AS TP
ON
(TC.UnidadOperativa = TP.UnidadOperativa AND TC.Jornada= TP.Jornada AND TC.Numero= TP.Numero)
WHERE
TP.Tipo='MET'

GROUP BY
TC.UnidadOperativa, TC.Jornada, TC.Numero, TC.Importe, TC.Caja

/*-----------------------
CAJA01
-------------------------*/
IF NOT EXISTS(SELECT * FROM COBRO WHERE JORNADA = @JORNADA AND NUMERO=@NUMERO)

BEGIN
DELETE FROM COBRO WHERE (JORNADA<>@JORNADA)


IF (@Importe>0 AND @CAJA='CAJA01')
BEGIN

SET @COMMAND='@ECHO ' + LEFT(CAST(ABS(@Importe*100) AS VARCHAR(9)),LEN(CAST(ABS(@Importe*100) AS VARCHAR(9)))-3) + ' >>C:\cas\V123.txt'

INSERT INTO COBRO (JORNADA, NUMERO) VALUES (@JORNADA, @NUMERO)
EXEC Xp_CMDSHELL @COMMAND

END
END
END
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve

PROBLEMA CON TRIGGER SQL SERVER 2008 SR2

Publicado por xve (86 intervenciones) el 20/01/2013 20:13:36
Gracias por comentarlo Coral...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar