Recibir msgbox con datos específicos

Bueno tengo una tabla llamada inventario hay hay registros ingresados en diferentes fechas cada registro tiene un número de factura. Lo que deseo es que apenas compla un año o un mes o un determinado tiempo impuesto por mi al culplir ese tiempo (desde la fecha que entró al inventario hasta la fecha en que vence) me salga un msgbox al abrir el formulario que diga el registro con factura xxxxx ha vencido

Entonces digamos si hay 5 registros vencidos que salga apenas abra el formulario 5 mensajes de registros vencidos o un solo mensaje pero UE tenga los 5 registros en ese solo mensaje esto es posible? Espero que si de antemano muchas gracias por la atención prestada y por la ayuda.

2 respuestas

Respuesta
2

No veo yo claro lo de mandar un mensaje por cada registro que cumpla las condiciones... Si resulta que tienes 100 facturas vencidas, ¿vas a obligar al usuario final a hacer clic 100 veces para cerrar todos esos mensajes? Eso es una pérdida de tiempo y llevará a más de un cabreo...

Una posible solución sería lanzar un único mensaje, y aunque resuelve el problema de tener que hacer un montón de clics, si hay muchas facturas vencidas, te quedará un msgbox enorme y puede que no te entren todas en dicho msgbox. De cualquier forma, usando un recordset para recorrer la tabla y listar los registros que cumplan la condición lo tienes resuelto. Por ejemplo (escrito sobre la marcha y sin probarlo):

Private Sub Form_Load()
Dim rst As DAO.Recordset
Dim mensaje as String
Set rst=CurrentDb.OpenRecordset("SELECT * FROM TuTabla WHERE FFactura<Date()-365")
Do Until rst.EOF
     Mensaje=mensaje & rst("NumFactura") & ", "
    rst.MoveNext
Loop
MsgBox "Las facturas " & Left(mensaje,Len(mensaje)-2) & " están vencidas"
rst.Close
End Sub

Que te listaría en un único mensaje todas aquellas facturas de antigüedad mayor a un año (365 días). 

Pero en mi opinión, lo más "profesional" sería lanzar un informe o una consulta que te muestre todas esas facturas vencidas, con la ventaja que las verás todas en un solo lugar y podrás tener mucha más información fácilmente. Puedes ver un ejemplo explicado paso a paso de cómo hacerlo en el siguiente ejemplo de Neckkito: http://neckkito.xyz/nck/index.php/ejemplos/13-formularios/59-aviso-automatico-al-abrir-un-formulario 

Y en esta misma web, si buscas "aviso automático", también te saldrán respuestas sobre el mismo tema.

Si tu vencimiento va a ser variable en función de tus necesidades, yo haría una tabla aux, por ejemplo con dos campos: número y período, y la rellenaría con un único registro, por ejemplo

30 | día    o    2 | mes    o     1 | año

Y recuperaría ese dato para usarlo en el recordset (para el msgbox) o en la SQL base del informe o consulta y ver los registros vencidos. Algo así (ojo, que va escrito "al vuelo", y puede que haya algún error):

Private Sub Form_Load()
Dim rst As DAO.Recordset
Dim mensaje as String
Select Case DLookUp("Periodo","TAux")
  Case "dia"
     Set rst=CurrentDb.OpenRecordset("SELECT * FROM TuTabla WHERE Abs(DateDiff('d',FFactura,Date"))>" & Dlookup("numero","TAux"))
  Case "mes"
     Set rst=CurrentDb.OpenRecordset("SELECT * FROM TuTabla WHERE Abs(DateDiff('m',FFactura,Date"))>" & Dlookup("numero","TAux"))
  Case "año"
     Set rst=CurrentDb.OpenRecordset("SELECT * FROM TuTabla WHERE Abs(DateDiff('yyyy',FFactura,Date"))>" & Dlookup("numero","TAux"))
End Select
Do Until rst.EOF
   Mensaje=mensaje & rst("NumFactura") & ", "
   rst.MoveNext
Loop
MsgBox "Las facturas " & Left(mensaje,Len(mensaje)-2) & " están vencidas"
rst.Close
End Sub

Por último, un pequeño comentario sobre la respuesta de Icue: a pesar de que funcione correctamente, de lo que no tengo duda, me parece "rizar el rizo" lo de usar un campo extra en la tabla y usar consultas de actualización, cuando trabajar con diferencias de fechas es mucho más eficiente y simple. De hecho, si haces la búsqueda que te indicaba en esta web, verás que Icue ya dio otras respuestas en este sentido.

Respuesta
1

No he entendido el párrafo "Lo que deseo..." ¿Fijas tú cuando vence una factura?

Si tengo la tabla Tabla1, a la que le he añadido un campo Aux( que sólo sirve para indexar los registros)

Puedes ver que hay cuatro registros en que la factura está vencida(comparando con la fecha del sistema)

El el evento Al activar el registro del formulario le pongo

Private Sub Form_Current()
Dim i As Byte, b As Byte
b = DCount("*", "tabla1", "fechavencimiento<Date()")
For i = 1 To b
DoCmd.RunSQL "update tabla1 set aux=" & i & " where fechavencimiento=dfirst(""fechavencimiento"",""tabla1"",""fechavencimiento<date() and aux is null"")"
MsgBox " El registro con número de factura " & DLookup("nfactura", "Tabla1", "Fechavencimiento<Date() and aux=" & i & "") & " está vencido", vbOKOnly + vbInformation, "Es lo que hay"
Next
DoCmd.RunSQL "update tabla1 set aux=null"
End Sub

De forma que cuando voy a abrir el formulario

Acepto y

Acepto y

Acepto y 

Se podría poner que mostrara un mensaje único con todos los registros. Va a gusto del consumidor.

Hola Julián esta genial eso es lo que necesito pero tiene algunas cosas que no se ajustan a lo mio primero

No hay forma de poner un tiempo específico digamos un mes o un año contando desde el día que ingreso 

Entonces digamos el registro entro hoy y jueves 12 de marzo del 2020 y digamos la fecha de vencimiento de todo se cumple en un mes osea que lo que quedo en el día 12 de abril de 2020 hay el día después me envié de lo que quedo me entiendes que pena tanta molestia es que no se como hacerlo 

Y lo segundo es que no entiendo la función del campo auxiliar para indexar me podrías explicar por favor gracias amigo 

Lo siento, no entiendo a partir de " osea, lo que quedó...

El campo Aux lo uso para que me "numere" los registros con fecha vencida y así poder decirle que me vaya "recorriendo" esos valores para mostrar un mensaje por cada registro. Mira, aunque no se vé, porque luego se borran, lo que hace es esto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas