Cambiar el valor de un campo cuando llegue o no una fecha determinada

Recurro a vuestra ayuda, aunque no sé si estoy rizando demasiado la cosa

Tengo una tabla de trabajadores: DATOS PERSONALES

Otra de contratos: Nº de contrato, incio contrato, fin de contrato, situación (activo o cesado por finalización de contrato)

Ámbas están enlazadas por el DNI

Pues bien... Quisiera saber si es posible que cuando llegue la fecha del fin de contrato en el cuadro de situación figura la palabra cesado, y si no ha llegado a la fecha figure activo

Por otra parte me gustaría que al abrir la base, si tengo trabajadores que les va a cumplir el contrato me avise 5 dias antes y me lance un mesaje con los trabajadores que son... No sé si me estoy columpiado demasiado jajaja, si es así decirmelo sin problema... Quiero pensar que es por el confinamiento que me da mucho tiempo para pensar.

Y por útlimo... Sabrias como decirme donde puedo ordenar los registros de un formulario por orden de entrada. Es decir quiero que me figure primero el último registro que he incorporado... En otras ocasiones lo he hecho pero soy incapaz de encontrarlo ahora.

Un saludo y como siempre mil gracias por vuestra inestimable ayuda

1 Respuesta

Respuesta
1

Lo primero comentarte que no deberías hacer varias preguntas bajo un mismo título, sobre todo si no tienen mucho que ver con él, por un motivo muy simple: si otro usuario tiene la misma duda (por ejemplo "como ordenar los registros"), difícilmente encontrará la respuesta si la pregunta es "cambiar valor de un campo al llegar una fecha"...

Dicho esto:

1º/ En cualquier formulario, aunque lo ideal sería que tuvieses uno que se abra al iniciar la aplicación, como un formulario menú, o un formulario de bienvenida, en su evento "Al cargar" le pones algo así:

Dim rst As DAO.Recordset
Set rst=CurrentDb.OpenRecordset("SELECT * FROM TablaContratos WHERE Situacion='Activo'")
If Not rst.BOF And rst.EOF Then
  Do Until rst.EOF
     If rst("fin de contrato")<=Format(Date,"mm/dd/yyyy") Then
        rst.Edit
        rst("situacion")="cesado"
        rst.Update
        rst.MoveNext
  Loop
End If
Rst. Close

He supuesto que el valor "predeterminado" es "activo" y que solo hay que cambiar a "cesado".

2º/ Para el aviso automático, te remito a este ejemplo de Neckkito, que es justo lo que necesitas (y con un ejemplo similar a tu caso real, además): https://neckkito.xyz/nck/index.php/ejemplos/13-formularios/59-aviso-automatico-al-abrir-un-formulario

3º/ En las propiedades del formulario, pestaña Datos, tienes las filas Ordenar por, donde le puedes indicar uno o más campos para que ordene, además de decirle si lo quieres ascendente (poniendo ASC o nada) o descendiente (con DESC), y la propiedad Ordenar por al cargar, que deberás poner en Sí, para que te aplique el orden al cargarlo.

Por código sería similar: en el evento "Al cargar" del formulario:

Me.OrderBy="[Nº Entrada] DESC"

Me.OrderByOn =True

Y si tu formulario depende de de una consulta, puedes ordenar la consulta y el formulario ya te saldrá así ordenado.

Genial... voy a ponerme con ello  y si tengo problemas te cuento.

Tomo nota de tu recomendación y en próximas ocasiones me limito a una cuestiión por pregunta... tienes toda la razón.

Mil gracias

Hola... aquí estoy dandoté otra vez la lata pero es que no consigo que me funcione. Soy muy torpe en VBA

Mi subformulario se llama fcontratos y esta dentro de un formulario que se llama fdatos personal. Lo he cargado en este último pero no me hace los cambios. También lo he intentado

Private Sub FCONTRATOS_Load()
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT * FROM Contratos WHERE Situacion='ACTIVO'")
If Not rst.BOF And rst.EOF Then
  Do Until rst.EOF
     If rst("fincontrato") <= Format(Date, "mm/dd/yyyy") Then
        rst.Edit
        rst("situacion") = "CESADO"
        rst.Update
        rst.MoveNext
 Loop
End If
rst.Close
End Sub

Muchas gracias.

Primero, el. Codigo ponlo en el formulario, no en el subformulario.

Segundo, e código hace los cambios directamente en la tabla ( compruébalo a ver). Además solo cambia a 'cesado' si ya finalizó el contrato y si en el Situacion estaba puesto 'activo'.

Si ves que no hace cambios, pon un rst.movefirst antes del "do until"

Y para que te  actualice el subformulario  pon, antes del End Sub lo siguiente :

Me.fcontratos.form.requery

Buenos dias:
Aquí sigo... he hecho los cambios que me has dicho pero nada de nada....seguro que es una tontería que no estoy viendo pero soy incapaz.

Te digo los pasa que sigo:

-tengo el formulario fcontratos que esta creado a través de la tabla "contratos" . dentro de este formulario están los campos (entre otros) fecha fin y situación. El campo situación tiene como predeterminado "activo".

Tengo un formulario datos personasles y dentro de el hay un botón donde llamo al subformulario fcontratos

En el formulario datos personales en el evento al cargar escribo el siguiente códido:

Private Sub Fcontratos_Load()
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT * FROM contratos WHERE Situacion='Activo'")
If Not rst.BOF And rst.EOF Then
rst.MoveFirst
Do Until rst.EOF
If rst("fincontrato") <= Format(Date, "mm/dd/yyyy") Then
rst.Edit
rst("situacion") = "cesado"
rst.Update
rst.MoveNext
Loop
End If
rst.Close
Me.fcontratos.Form.Requery
End Sub

Mil gracias

Primero disculpa, porque por ponerte el código "de cabeza" y sin probarlo, metí la pata con el orden de dos lineas de código. El código "bueno" sería así:

Private Sub Fcontratos_Load()
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT * FROM contratos WHERE Situacion='Activo'")
If Not rst.BOF And rst.EOF Then
  rst.MoveFirst
   Do Until rst.EOF
      If rst("fincontrato") <= Date Then
          rst.Edit
          rst("situacion") = "cesado"
         rst.Update
      End If
      rst.MoveNext
   Loop  
End If
rst.Close
Me.fcontratos.Form.Requery
End Sub

De todas formas te dejo una BD de ejemplo para que lo veas en funcionamiento, con el código para responderte a las dudas 1 y 2: http://www.filebig.net/files/bychewpdtu 

Antes de abrir el formulario, abre la tabla y verás que todos tienen la situación de "Activo", aunque hay 2 trabajadores que ya finalizaron contrato. También verás que hay una trabajadora que finaliza contrato en breve. Al abrir el formulario, actualizará los datos de la tabla TContratos (cambiando los 2 primeros regostros a "Cesado") y lanzará un mensaje avisando del fin de contrato próximo. Al aceptar el mensaje verás que en el subformulario ya aparece la nueva situación en los contratos que corresponda.

Lo del mensaje lo puedes sustituir por abrir un informe (como en el ejemplo de Neckkito), otro formulario con esos datos o una consulta (lo digo porque si tienes muchos trabajadores, el mensaje se puede hacer muy grande y difícil de leer)

¿

Perdón?... solo faltaría con la mano que me estás echando. Mil gracias...

Pregunta... veo que si en el formulario cambio la fecha fin de contrato no me actualiza inmediatamente el estado a cesado o activo... ¿esto se puede hacer?

En la base que me has mandado veo que se actualizan si haces el cambio desde la tabla y te vuelves a meter en el formulario. Me gustaría, si puede ser que me lo cambie directamente

Si, y es fácil. En el evento " Después de actualizar " del campo FinContrato ponle este código :

If me.FinContrato<=Date Then

Me.situacion="cesado"

End if

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas