¿Cómo validar un campo de texto, que para que pueda estar duplicado dependa de un campo fecha?

Tengo en access una tabla para llevar un inventario de bienes de uso de una empresa, con los campos: codigo; tipodebien; marca/modelo; detalle; ubicación; fechaalta y fechabaja.

Ahora bien, el código es lo que identifica al bien, que según vayan pasando los tiempos, puede ser utilizado en ubicaciones distintas.
(Ej. Una netbook que hoy esta asignada a una Sucursal, el mes que viene se le asigna a otra sucursal). En ese caso pongo una fecha de baja al bien en la primer ubicación para luego hacer una nueva entrada para la nueva ubicación. Ya que lo que quiero tener guardado es el registro de uso del bien, es decir por que manos paso en su vida útil.

Esto me lleva a duplicar el nombre en el campo código.

Entonces lo que quiero lograr es una validación para el campo código que me avise que al ingresar un código que ya fue usado no pueda volver a darlo de alta si no fue dado de baja en su uso anterior.

Esto me impediría que un mismo bien sea dado de alta o asignado por error a mas de una ubicación al mismo tiempo.

¿Cómo hago esta validación?

1 respuesta

Respuesta
1

Voy a suponer que tu tabla se llama TDatos.

En el formulario de introducción de datos sacas las propiedades del campo [codigo] y en el evento "Después de actualizar" generas el siguiente código:

...

Private Sub Codigo_AfterUpdate()
Dim miSql As String
Dim rst As DAO.Recordset
Dim vCod As Long
'Cogemos el código
vCod = Nz(Me.codigo.Value, 0)
'Si el campo está en blanco sale del proceso
If vCod = 0 Then Exit Sub
'Creamos la SQL
miSql = "SELECT TOP 1 TDatos.codigo, TDatos.fechabaja FROM TDatos" _
& " WHERE TDatos.codigo=" & vCod _
& " ORDER BY TDatos.fechaalta DESC"
'Creamos el recorset sobre la SQL
Set rst = CurrentDb.OpenRecordset(miSql)
'Si no hay registros es que el código es nuevo. Dejamos meter el registro
If rst.RecordCount = 0 Then GoTo Salida
'Si hay registros miramos el último. Si la fecha de baja no está rellenada
'lanzamos un aviso y no dejamos continuar
If IsNull(rst.Fields(1).Value) Then
MsgBox "El equipo sigue de alta en otra ubicación. Debe darlo de baja" _
& " antes de proseguir la introducción de datos", vbExclamation, "AVISO"
Me.Undo
End If
Salida:
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub

...

He supuesto que [codigo] era un dato numérico. Si es un dato tipo texto me lo comentas porque hay qué cambiar algo del código.

Si utilizas una versión antigua de Access deberás registrar la referencia "Microsoft DAO 3.6 Object Library".

Y eso es todo. Ya me dirás.

hola neckkito, gracias por responder.

te confirmo que el campo código es alfanumérico ya que en el plasmamos letras que identifiquen algo del tipo de bien y ante bienes iguales que numero es. ej. NTBK0015

voy a intentar esto que me planteas. gracias

OK.

Entonces cambia:

vCod = Nz(Me.código.Value, 0)

por

vCod = Nz(Me.código.Value, "")

Cambia

If vCod = 0 Then Exit Sub

por

If vCod = "" Then Exit Sub

Y cambia

& " WHERE TDatos.código=" & vCod _

por

& " WHERE TDatos.código='" & vCod & "'" _

A ver si así te va bien.

Esta mañana he tenido un "flash" y, efectivamente, hay error en los tipos porque me olvidé de decirte que cambiaras otra cosa.

Lo que debes cambiar también es esta línea:

Dim vCod As Long

Por

Dim vCod As String

No he recibido noticias tuyas. ¿Todo bien? Bueno, si te ha ido bien te agradecería que cerraras la consulta.

Te ruego que cierres la consulta.

Me demore en cerrar la pregunta porque no había tenido tiempo de probar el código.

No me funciono. Pero igual gracias por la respuesta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas