Pregunta

04/05/2004 - 00:22 por Heidi | Informe spam
Hola, tengo un problemita que me ha sacado como 20 canas (además de que he
intentado enviar este mensaje unas 1000 veces y no se por que no me ha
pasado).
resulta que tengo un trigger que envia un e-mail cuando hacen una inserción
de datos en una tabla (adelante lo pongo), pero cuando estan haciendo el
movimiento en un programa de fox sale un error asi..
"No es posible devolver la transaccion manual para las vistas.. posible
causa.. Mensaje: Error de conectividad: [Microsoft][ODBC SQL Server
Driver][sql server] the ROLLBACK TRANSACTION request has no corresponding
BEGIN TRANSACTION"
y otro que dice
"Mensaje: Error de conectividad: [Microsoft][ODBC SQL Server Driver][SL
Server]A cursor with the name 'rc' does not exist"
Alguien sería tan amable de ayudarme??
Este es mi trigger...
CREATE TRIGGER [MvtoFac_Ins] ON [dbo].[MVTOFAC]
FOR INSERT AS
SET XACT_ABORT ON
DECLARE @rcm int
DECLARE @SiNo INT
DECLARE @Desde NVARCHAR(4000),
@Desde_Nombre NVARCHAR(4000),
@Para NVARCHAR(4000),
@Titul NVARCHAR(4000),
@Mensaje NVARCHAR(4000),
@Mensaje1 NVARCHAR(4000),
@Servidor NVARCHAR(4000),
@MensajeDef NVARCHAR(4000)
SET @SiNo = 0
SET @Desde = Suser_sname()
SET @Desde_Nombre = HOST_NAME()
SET @Para = 'Alexander_Gomez@admon'
SET @Titul = 'Orden Facturada'
SET @Mensaje 'Orden,Titulo,Cliente,Trabajo,Nombre,Pedido,Factura,VrUnidad,Cantidad,VrTota
l' + CHAR(13) + CHAR(10)
SET @Mensaje1 = ' '
SET @Servidor = 'SERVIDOR'
DECLARE @Cantidad NUMERIC(15,2), @Factura CHAR(10), @Nombre CHAR(60),
@NPedido CHAR(10), @OrdenNro CHAR(10),@Producto CHAR(20), @ValorUnit
NUMERIC(17,4), @Titulo CHAR(60)
DECLARE @FacBruto NUMERIC(15,2), @FacCodMoneda CHAR(5), @FacFactura
CHAR(10),
@FacFecha DATETIME, @Nit CHAR(15), @NomCli CHAR(60), @FacNota CHAR(255),
@FacOrden CHAR(10), @FacTipoDcto CHAR(2), @FacTipoVta CHAR(5)

DECLARE rcmvto CURSOR GLOBAL SCROLL FOR
SELECT Ins.CANTIDAD, Ins.FACTURA, Ins.NOMBRE, Ins.NPEDIDO, Ins.ORDENNRO,
Ins.PRODUCTO, Ins.VALORUNIT, Lot.DESCRIPCIO
FROM inserted Ins INNER JOIN MTLOTE Lot ON Ins.ORDENNRO = Lot.CODLOTE
WHERE ((LEFT(FACTURA,3) = '211' AND
((ORDENNRO)>'0')) OR
(LEFT(FACTURA,3) = '200')AND
((ORDENNRO)>'0'))
OPEN rcmvto
FETCH FIRST FROM rc
INTO @Cantidad, @Factura, @Nombre, @NPedido, @OrdenNro, @Producto,
@ValorUnit, @Titulo
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE rtfac CURSOR LOCAL SCROLL FOR
SELECT FAC.BRUTO, FAC.CODMONEDA, FAC.FACTURA, FAC.FECHA, FAC.NIT,
CLI.NOMBRE,
FAC.NOTA, FAC.ORDEN, FAC.TIPODCTO, FAC.TIPOVTA
FROM FACTURAS FAC INNER JOIN CLIENTES CLI ON FAC.NIT = CLI.NIT
WHERE (FAC.FACTURA = @Factura AND FAC.TIPODCTO = 'FA' AND (FAC.TIPOVTA '2' OR FAC.TIPOVTA = '1')) OR
(FAC.FACTURA = @Factura AND FAC.TIPODCTO = 'FR' AND (FAC.TIPOVTA = '2' OR
FAC.TIPOVTA = '1'))
OPEN rtfac
FETCH FIRST FROM rtfac
INTO @FacBruto, @FacCodMoneda, @FacFactura, @FacFecha, @Nit, @NomCli,
@FacNota,
@FacOrden, @FacTipoDcto, @FacTipoVta
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SiNo = 1
SET @Mensaje1 = @Mensaje1 + CHAR(13) + CHAR(10)
+ 'Orden ' + @OrdenNro + CHAR(13) + CHAR(10)
+ 'Titulo ' + @Titulo + CHAR(13) + CHAR(10)
+ 'Cliente ' + @NomCli + CHAR(13) + CHAR(10)
+ 'Producto ' + @Producto + '-' + @Nombre + CHAR(13) + CHAR(10)
+ 'Pedido ' + @NPedido + CHAR(13) + CHAR(10)
+ 'Factura ' + @Factura + CHAR(13) + CHAR(10)
+ 'VrUnidad ' + @ValorUnit + CHAR(13) + CHAR(10)
+ 'Cantidad ' + @Cantidad + CHAR(13) + CHAR(10)
+ 'VrTotal ' + @FacBruto + CHAR(13) + CHAR(10)
SET @Mensaje = @Mensaje + @OrdenNro + ',' + @Titulo + ',' + @NomCli + ','
+ @Producto
+ ',' + @Nombre + ',' + @NPedido + ',' + @Factura + ',' + @ValorUnit + ','
+
@Cantidad + ',' + @FacBruto + CHAR(13) + CHAR(10)
FETCH NEXT FROM rt
INTO @FacBruto, @FacCodMoneda, @FacFactura, @FacFecha, @Nit, @NomCli,
@FacNota,
@FacOrden, @FacTipoDcto, @FacTipoVta
END
CLOSE rtfac
DEALLOCATE rtfac
FETCH NEXT FROM rcmvto
INTO @Cantidad, @Factura, @Nombre, @NPedido, @OrdenNro, @Producto,
@ValorUnit, @Titulo
END
CLOSE rcmvto
DEALLOCATE rcmvto
IF @SiNo = 1
BEGIN
SET @MensajeDef = @Mensaje1 + CHAR(10) + CHAR(13) + 'Datos Para Excel' +
CHAR(10) + CHAR(13) + @Mensaje
EXEC @rcm = master.dbo.xp_smtp_sendmail
@FROM = @Desde,
@FROM_NAME = @Desde_Nombre,
@TO = N'alexander_gomez@admon',
@subject = @Titul,
@message = @MensajeDef,
@server = @Servidor
END
SET XACT_ABORT OFF
 

Leer las respuestas

#1 ulises
04/05/2004 - 01:44 | Informe spam
Descontando que manejar un cursor dentro de un trigger es
bastante malo para el rendimiento y que has cometido
varios errores de sintaxis definiendo cursores que luego
los llamas con nombres diferentes, creo que lo mejor es
que definas un DTS que genere el archivo excel y lo envíe
al correo especificado, en el trigger puedes
1) grabar un registro que será tomado por un proceso para
invocar el DTS
2) invocar en forma asíncrona el DTS, para chequear si
llegó a enviarse o no puedes definir un paso final en el
DTS que grabe lo que se envio y definir adicionalmente un
proceso que cada cierto tiempo revise si algo no se envió.

Saludos,
Ulises


Hola, tengo un problemita que me ha sacado como 20 canas


(además de que he
intentado enviar este mensaje unas 1000 veces y no se por


que no me ha
pasado).
resulta que tengo un trigger que envia un e-mail cuando


hacen una inserción
de datos en una tabla (adelante lo pongo), pero cuando


estan haciendo el
movimiento en un programa de fox sale un error asi..
"No es posible devolver la transaccion manual para las


vistas.. posible
causa.. Mensaje: Error de conectividad: [Microsoft][ODBC


SQL Server
Driver][sql server] the ROLLBACK TRANSACTION request has


no corresponding
BEGIN TRANSACTION"
y otro que dice
"Mensaje: Error de conectividad: [Microsoft][ODBC SQL


Server Driver][SL
Server]A cursor with the name 'rc' does not exist"
Alguien sería tan amable de ayudarme??
Este es mi trigger...
CREATE TRIGGER [MvtoFac_Ins] ON [dbo].[MVTOFAC]
FOR INSERT AS
SET XACT_ABORT ON
DECLARE @rcm int
DECLARE @SiNo INT
DECLARE @Desde NVARCHAR(4000),
@Desde_Nombre NVARCHAR(4000),
@Para NVARCHAR(4000),
@Titul NVARCHAR(4000),
@Mensaje NVARCHAR(4000),
@Mensaje1 NVARCHAR(4000),
@Servidor NVARCHAR(4000),
@MensajeDef NVARCHAR(4000)
SET @SiNo = 0
SET @Desde = Suser_sname()
SET @Desde_Nombre = HOST_NAME()
SET @Para = ''
SET @Titul = 'Orden Facturada'
SET @Mensaje >'Orden,Titulo,Cliente,Trabajo,Nombre,Pedido,Factura,VrUnid


ad,Cantidad,VrTota
l' + CHAR(13) + CHAR(10)
SET @Mensaje1 = ' '
SET @Servidor = 'SERVIDOR'
DECLARE @Cantidad NUMERIC(15,2), @Factura CHAR(10),


@Nombre CHAR(60),
@NPedido CHAR(10), @OrdenNro CHAR(10),@Producto CHAR(20),


@ValorUnit
NUMERIC(17,4), @Titulo CHAR(60)
DECLARE @FacBruto NUMERIC(15,2), @FacCodMoneda CHAR(5),


@FacFactura
CHAR(10),
@FacFecha DATETIME, @Nit CHAR(15), @NomCli CHAR(60),


@FacNota CHAR(255),
@FacOrden CHAR(10), @FacTipoDcto CHAR(2), @FacTipoVta


CHAR(5)

DECLARE rcmvto CURSOR GLOBAL SCROLL FOR
SELECT Ins.CANTIDAD, Ins.FACTURA, Ins.NOMBRE,


Ins.NPEDIDO, Ins.ORDENNRO,
Ins.PRODUCTO, Ins.VALORUNIT, Lot.DESCRIPCIO
FROM inserted Ins INNER JOIN MTLOTE Lot ON Ins.ORDENNRO


= Lot.CODLOTE
WHERE ((LEFT(FACTURA,3) = '211' AND
((ORDENNRO)>'0')) OR
(LEFT(FACTURA,3) = '200')AND
((ORDENNRO)>'0'))
OPEN rcmvto
FETCH FIRST FROM rc
INTO @Cantidad, @Factura, @Nombre, @NPedido, @OrdenNro,


@Producto,
@ValorUnit, @Titulo
WHILE @@FETCH_STATUS = 0
BEGIN
DECLARE rtfac CURSOR LOCAL SCROLL FOR
SELECT FAC.BRUTO, FAC.CODMONEDA, FAC.FACTURA, FAC.FECHA,


FAC.NIT,
CLI.NOMBRE,
FAC.NOTA, FAC.ORDEN, FAC.TIPODCTO, FAC.TIPOVTA
FROM FACTURAS FAC INNER JOIN CLIENTES CLI ON FAC.NIT =


CLI.NIT
WHERE (FAC.FACTURA = @Factura AND FAC.TIPODCTO = 'FA'


AND (FAC.TIPOVTA >'2' OR FAC.TIPOVTA = '1')) OR
(FAC.FACTURA = @Factura AND FAC.TIPODCTO = 'FR' AND


(FAC.TIPOVTA = '2' OR
FAC.TIPOVTA = '1'))
OPEN rtfac
FETCH FIRST FROM rtfac
INTO @FacBruto, @FacCodMoneda, @FacFactura, @FacFecha,


@Nit, @NomCli,
@FacNota,
@FacOrden, @FacTipoDcto, @FacTipoVta
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SiNo = 1
SET @Mensaje1 = @Mensaje1 + CHAR(13) + CHAR(10)
+ 'Orden ' + @OrdenNro + CHAR(13) + CHAR(10)
+ 'Titulo ' + @Titulo + CHAR(13) + CHAR(10)
+ 'Cliente ' + @NomCli + CHAR(13) + CHAR(10)
+ 'Producto ' + @Producto + '-' + @Nombre + CHAR(13) +


CHAR(10)
+ 'Pedido ' + @NPedido + CHAR(13) + CHAR(10)
+ 'Factura ' + @Factura + CHAR(13) + CHAR(10)
+ 'VrUnidad ' + @ValorUnit + CHAR(13) + CHAR(10)
+ 'Cantidad ' + @Cantidad + CHAR(13) + CHAR(10)
+ 'VrTotal ' + @FacBruto + CHAR(13) + CHAR(10)
SET @Mensaje = @Mensaje + @OrdenNro + ',' + @Titulo


+ ',' + @NomCli + ','
+ @Producto
+ ',' + @Nombre + ',' + @NPedido + ',' + @Factura + ','


+ @ValorUnit + ','
+
@Cantidad + ',' + @FacBruto + CHAR(13) + CHAR(10)
FETCH NEXT FROM rt
INTO @FacBruto, @FacCodMoneda, @FacFactura, @FacFecha,


@Nit, @NomCli,
@FacNota,
@FacOrden, @FacTipoDcto, @FacTipoVta
END
CLOSE rtfac
DEALLOCATE rtfac
FETCH NEXT FROM rcmvto
INTO @Cantidad, @Factura, @Nombre, @NPedido, @OrdenNro,


@Producto,
@ValorUnit, @Titulo
END
CLOSE rcmvto
DEALLOCATE rcmvto
IF @SiNo = 1
BEGIN
SET @MensajeDef = @Mensaje1 + CHAR(10) + CHAR(13)


+ 'Datos Para Excel' +
CHAR(10) + CHAR(13) + @Mensaje
EXEC @rcm = master.dbo.xp_smtp_sendmail
@FROM = @Desde,
@FROM_NAME = @Desde_Nombre,
@TO = N'',
@subject = @Titul,
@message = @MensajeDef,
@server = @Servidor
END
SET XACT_ABORT OFF


.

Preguntas similares