Mandar Mail desde SQL Server

355 views
Skip to first unread message

Marcelo ARG

unread,
Feb 16, 2016, 7:40:06 AM2/16/16
to Comunidad de Visual Foxpro en Español
Buenas Estimados.
He desarrollado una aplicacion en VFP 9 + SQL Server 2012 y ahora me piden que cada vez que cambie el estado de un pedido se mande un mail informando esto al usuario que lo realizo.
Para esto he generado un Tigger en la tabla Detalles de Pedido que cuando cambia el estado me inserta un registro en otra tabla con los datos para mandar el mail.

La idea es generar un Job que cada 15 minutos revise esa tabla y si hay registros, los mande por mail a cada destinatario. Al finalizar, debe eliminar los registros de dicha tabla.
También debería controlar que no sean más de 50 registros (mails) por cada 15 minutos para evitar tener problemas con mi servidor SMTP.

Para hacer un job no tengo problema, pero no se bien como hacer el cuerpo del job para que tome los datos de cada registro y los mande por mail.

Encontre esto en internet para mandar mail desde SQL Server

EXEC msdb.dbo.sp_send_dbmail  
    
@recipients='direccion',

    @subject = 'asd',
    @body = @aux,
    @body_format = 'HTML' 


pero como le voy pasando los datos de cada registro?

Alguien me puede ayudar?
Gracias.

Martin Inga

unread,
Feb 16, 2016, 9:01:49 AM2/16/16
to publice...@googlegroups.com

Maestro ya lo tienes resuelto!!

Lo que si te recomendarías que observes es la frecuencia, pero en fin cada regla de negocio!!

 

Recuerda que SQL Server no sólo trabaja en bloques la cual es su naturaleza, también puede trabajar como trabaja Fox , leer registro por registro.

 

Lo que debes es crear Trigger y Store Procedure

 

En el Store Procedure, evaluas los registros que enviaras a determinados destinatarios bueno aquí lo realizas como lo realizarías en Fox, vas a tener que crear un cursor para recorrer los registros nada más.

 

El trigger avisará cuando realicen cambios en el registro de la tabla

 

Saludos,

Martín Inga

Patricio Muñoz

unread,
Feb 16, 2016, 9:04:14 AM2/16/16
to publice...@googlegroups.com
Marcelo

Para poder controlar la cantidad de registros y los destinatarios del mail, debes crearte un SP que recorra las distintas tablas en cuestion, luego desde el JOB invocas el SP. 
Para lograr esto creo que deberas trabajar con cursores sqlserver, no se si estes familiarizado con eso.

Bendiciones
--
Patricio Muñoz
Pro&Tech
Analista en Sistemas

Marcelo Cicuto

unread,
Feb 16, 2016, 9:45:56 AM2/16/16
to publice...@googlegroups.com
Gracias Amigos.
Habia visto el tema de cursores pero en muchos lados dice que NO SE DEBEN USAR CURSORES en SQL Server...
No hay una forma de hacer un Do While con un Skip en SQL Server? 
Gracias.

Patricio Muñoz

unread,
Feb 16, 2016, 10:04:13 AM2/16/16
to publice...@googlegroups.com
Marcelo , el problema de los cursores en SQLServer es que son muy lentos, pero si necesitas recorrer registro a registro en el sql como lo hace el VFP con SCAN o DO WHILE, entonces si o si debes usar cursor.

Bendiciones

Víctor Hugo Espínola Domínguez

unread,
Feb 16, 2016, 11:21:40 AM2/16/16
to publice...@googlegroups.com

Victor Espina

unread,
Feb 16, 2016, 11:50:01 AM2/16/16
to Comunidad de Visual Foxpro en Español

Hola. Yo tengo un proceso muy similar. El codigo que necesitas debe ser parecido a este:


-- spTMMQProcess

-- Procesa los trabajos pendientes y fallidos

--

IF OBJECT_ID('spTMMQProcess','P') IS NOT NULL

 DROP PROCEDURE spTMMQProcess

GO

CREATE PROCEDURE spTMMQProcess(

 @verbose BIT = 0 

) AS BEGIN


SET NOCOUNT ON

IF @verbose = 1 SELECT 'TMMailQ'

DECLARE @rows CURSOR

SET @rows = CURSOR FOR SELECT 0 AS priority, mailID 

                        FROM vwTMMQPending

                        UNION

                      SELECT 1 AS priority, mailId

                        FROM vwTMMQFailed

                        ORDER BY priority, mailId


    DECLARE @mailId INT

           ,@response VARCHAR(max)

           ,@sent INT = 0 

           ,@failed INT = 0 

           ,@priority SMALLINT

    OPEN @rows

    FETCH NEXT FROM @rows INTO @priority, @mailId                        

    WHILE @@FETCH_STATUS = 0 BEGIN

     EXEC spTMMQSend @mailId, @response OUTPUT

     IF @response = 'SENT' SET @sent = @sent + 1

     IF @response <> 'SENT' SET @failed = @failed + 1

     IF @verbose = 1 SELECT @mailId, @response

     FETCH NEXT FROM @rows INTO @priority, @mailId                        

    END 

    CLOSE @rows

    DEALLOCATE @rows

    

    IF @verbose = 1 BEGIN

     SELECT 'Completed'

     SELECT @sent,'sent'

     SELECT @failed,'failed'

    END


END

GO


Espero te sirva para tomar ideas.


Victor

Leboni

unread,
Feb 16, 2016, 9:03:21 PM2/16/16
to Comunidad de Visual Foxpro en Español
Marcelo::

Quiero compartir que ante una necesidad muy similar a la que tienes, definí una tarea programada en un Windows server, que ejecuta con una frecuencia determinada un programa en VFP que accesa la BD, leyendo y actualizando datos, estados, etc, de tablas relativamente grandes (Cerca del par de millones de registros) pero procesando solamente los registros que se van actualizando en el día (Hay  un campo fecha de modificación en el cual me baso)  para finalmente enviar un informe en un correo muy presentable, gracias a la versatilidad de nuestro zorro.

Por el lado de VFP no creo que tengas problema con el programa que necesitas, la definición de la tarea programada no debería de darte tampoco mucho problema si usas el windows server manager y/o te apoyas en la documentación que sobre el tema publica tanto microsoft como otros foros.

Salu2..! 

____________________________________________________________________________
Reply all
Reply to author
Forward
0 new messages