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
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

PROBLEMA CON TRIGGER SQL SERVER 2008 SR2

Publicado por Isaias (4558 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
Val: 63
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

PROBLEMA CON TRIGGER SQL SERVER 2008 SR2

Publicado por xve (102 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