¿Como avisar por medio de un mensaje que un producto esta próximo a vencer?

Quisiera que me ayudaran con lo siguiente, la verdad es que ya llevo rato buscando como hacer esto:

Necesito que un sistema que he creado en vb.net, conectado con base de datos en sql server 2008, me avise cuando un producto esta próximo a vencer. El sistema es de ventas e inventario, tengo una tabla en la cual guardo los productos, ejemplo : tabla----> Productos // Campos -----> Nombre, Precio, Fecha de vencimiento... Lo que quiero es que 5 o 10 días antes de que se venza el producto, el sistema me envie un aviso .. Que diga el producto (Nombre del producto) se vence en 10 días o menos...

1 respuesta

Respuesta
5

Existen varias formas de solucionar esto: con un servicio de Windows a modo de tarea "cron" (pero necesarias un servidor que estuviera siempre encendido y desconozco tu infraestructura o bien haciendo uso de las tareas programadas y el envío de mail desde el propio SQL Server .

Paso 1: Configurando Sql Server 2008 para envío de correo:

Esto es muy sencillo y lo puedes hacer desde un asistente paso a paso.

Aquí tienes un enlace dónde viene todo explicado hasta el final y con imágenes:

http://geeks.ms/blogs/rcarreras/archive/2009/09/16/configurando-sql-server-2008-para-enviar-emails-paso-a-paso.aspx 

Paso 2: Escribimos una consulta TSQL para enviar el correo:

¿En caso de que un producto esté a punto de vencer necesitamos que se envíe un correo no? Pues para ello escribimos una consulta TSQL similar a esta:

-- Declaramos las variables que necesitamos
DECLARE @productId int
-- Obtenemos los IDs de los productos a 10 días de vencimiento y lo guardamos en un cursor para iterar después
DECLARE cursorProducto CURSOR FOR
    SELECT Id FROM Productos WHERE DATEDIFF(days, GetDate(), FechaVencimiento) <= 10
OPEN cursorProducto
FETCH NEXT FROM cursorProducto INTO @productId
-- Recorremos cada Id de Producto y enviamos un mail
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC msdb.dbo.sp_send_dbmail @profile_name='ElNombreDelPerfilDeCorreoCreadoEnPaso1',
    @recipients= '[email protected]',
    @subject= 'Producto ' + @productId + ' próximo a vencimiento' ,
    @body= 'Cuerpo del mensaje... si necesitamos mostrar más info del producto aquí deberías hacer una nueva SELECT dentro del bucle para obtener los datos de @productId'
    FETCH NEXT FROM cursorProducto 
    INTO @productId
END
CLOSE cursorProducto 
DEALLOCATE cursorProducto 

Revisa el código que puede que me haya bailado algo pero basicamente esta consulta lo que debe hacer es envíar un correo por cada producto que FechaVencimiento sea menor a 10 días desde hoy.

Paso 3: Crear una tarea programada:

Para que el sistema te avise cuando un producto esté a punto de vencer creamos una tarea programada en Sql Server que ejecuta, ¿cada día? Esta consulta.

Esto también se hace desde un asistente en Sql Server sin mucha complicación.

Este link lo explica paso a paso (aunque es del 2005 no ha cambiado mucho en la versión 2008):

http://www.danielcostas.com/tareas-programadas-en-sql-server-2005/ 

Fíjate como el está creando una tarea para ejecutar una TSQL de copia de seguridad. Nosotros pondremos la consulta que hemos creado en el Paso 2 y la programaremos para que se ejecute con la cadencia deseada.

Espero que haya quedad más o menos claro. Para cualquier cosa vuelves a preguntarme.

Hola, Víctor, espero que este bien, saludos..

Lo que pasa es que yo no quiero que me mande un mensaje al correo, más bien lo que quiero es que me mande un aviso en el sistema, tipo mensagebox, del medicamento que esta próximo a vence.. ahora bien, estaría muy agradecida si me explicara más o menos como seria la consulta en sql, de la manera que le estoy diciendo, y como lo haría en el código de vb.net, .. tengo más o menos una idea. Estaba pensando en comparar dos fechas, la fecha actual como por ejemplo la de hoy con las fechas de los productos que tengo en el sistema y hacer algo así como una condicio, de que si el medicamento le faltan 15 o 10 días para vencer, en vb.net me mande un mensajito con un el nombre del medicamento ... no se si me explique :) espero su respuesta

Entonces es mucho más fácil de lo que te había propuesto en un primer momento.

La consulta es esta:

 SELECT * FROM Productos WHERE DATEDIFF(days, GetDate(), FechaVencimiento) <= 10

Y para mostrar el MessageBox en Visual Basic .NET así:

MessageBox.Show("El producto está a menos de 10 días de vencer")

Hola, víctor .. una pregunta, por que no me reconoce la palabra days, dice que no es una opción de datadiff conocida .

me sale este error 

Mens 155, Nivel 15, Estado 1, Procedimiento Fecha_vencimiento, Línea 5
'days' no es una opción datediff reconocida.

Me equivoqué en la consulta, es "day" no "days".

http://msdn.microsoft.com/es-es/library/ms189794.aspx 

Gracias !! por su ayuda :) me sirvió de muchooo .. Saludos y buen día :)

Me alegro :)

Recuerda valorar la respuesta y si tienes alguna otra duda me abres otra pregunta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas