Como hago una consulta para que no me aparezcan los valores que ya estén utilizados en el campo

Tengo disponible una lista de códigos en una tabla y relacionada a su vez con otra tabla en la que utilizo uno de estos códigos en cada registro. La cuestión es que no puedo repetir los valores en esta segunda tabla, para lo cual hago que el campo sea sin duplicados, pero necesito que cuando introduzca un registro nuevo muestre como opciones los valores de la primera tabla que no haya ya utilizado.
Por tanto necesito una consulta que me evite mostrar los valores que ya haya utilizado.
No se si se puede hacer en la opción buscar del campo o es necesario utilizar combobox, en cualquiera de los casos necesitaría saber cómo hacerlo.

1 respuesta

Respuesta
1
Te explico cómo puedes hacerlo:
1.- Pon tu primera tabla (la que tiene la lista de códigos), y que yo llamaré Tabla1, en vista diseño. Le añades un campo, que llamaremos [Utilizado], de tipo SÍ/No, con su valor predeterminado en 0 (cero). La guardamos. Voy a suponer que el campo que recoge el código se llama [CodigoT1]
2.- En la segunda tabla, que yo llamaré Tabla2, supongo que tendrás un campo donde introduces el código. Yo llamaré a ese campo [CodigoT2]
3.- En el formulario donde introduces los datos imagino que tendrás un textBox ligado a [CodigoT2]. Borras ese textbox.
4.- En su lugar introduces un cuadro combinado. Cancela el asistente. Sacas sus propiedades y te vas a:
- Pestaña Otras -> Nombre: le escribes cboCodigo
- Pestaña Datos -> Origen del registro: le seleccionas como origen el campo [CodigoT2]
- Pestaña Otras -> Orden de tabulación: le seleccionas el número de orden que mejor se adapte a tu formulario.
- Pestaña Eventos -> Después de actualizar, y le generas el siguiente código:
...
Private Sub ...
Dim vCod as Long
vCod = nz(me.cboCodigo.value,0)
If vCod=0 then Exit Sub
'Creamos la SQL y el recordset para actualizar el campo [Utilizado] de Tabla1
Dim miSql as String
Dim rst as DAO.Recordset
miSql = "SELECT * FROM Tabla1 WHERE [CodigoT1]=" & vCod
Set rst = currentdb.openrecordset(miSql)
'Marcamos el código seleccionado como ya utilizado
rst.Fields("Utilizado").Value = True
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub
...
Este código VB da por supuesto que el código-valor de la tabla es de tipo numérico. Si fuera un valor de tipo texto el código VB anterior debería ser el siguiente:
...
Private Sub ...
Dim vCod as String
vCod = nz(me.cboCodigo.value,"")
If vCod="" then Exit Sub
'Creamos la SQL y el recordset para actualizar el campo [Utilizado] de Tabla1
Dim miSql as String
Dim rst as DAO.Recordset
miSql = "SELECT * FROM Tabla1 WHERE [CodigoT1]='" & vCod & "'"
Set rst = currentdb.openrecordset(miSql)
'Marcamos el código seleccionado como ya utilizado
rst.Fields("Utilizado").Value = True
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub
...
5.- Sacas las propiedades del formulario y te vas a la pestaña Eventos -> Al activar registro, y le generas el siguiente código:
...
Private Sub ...
Dim noUsadosSql as String
noUsadosSql = "SELECT * FROM Tabla1 WHERE [Utilizado]=FALSE"
With me.cboCodigo
.RowSource = noUsadosSql
.Requery
End With
End Sub
...
Evidentemente tendrás que sustituir los nombres que yo he supuesto por los que tú tengas en la BD.
Si utilizas Access 2003 necesitaras comprobar que tengas registrada la referencia "Microsoft DAO 3.6 Object Library".
Te he escrito el código de memoria. Si te da algún error me comentas el número de error y la línea que te marque en amarillo.
Hola, ante todo muchísimas gracias por la pronta respuesta.
He probado lo que dices y me puede servir perfectamente, por lo que voy a ir en esa opción, el único problema es que sólo funcionaría a partir de los valores que empiece a asignar en el formulario, quizás esto se pueda corregir con una consulta de modificación.
Con respecto al código que me envías, cuando meto un valor en el combobox me falla en la
línea:  ?
?
rst.Fields("Utilizado").Value = True
Con este mensaje?:
Se ha producido el error '3020' sen tiempo de ejecución: 
Update o CancelUpdate sin AddNew o Edit.
Saludos
MFA
Me alegro que comentes que la respuesta va bien encaminada según tus necesidades.
Respecto a tu primer comentario, no acabo de entender claramente lo que quieres decir. ¿Puede ser que estés diciendo que ya tienes valores introducidos, y que deberían estar marcados como "utilizado" en la tabla para que no te salieran en el combo?
Si es así como yo lo he entendido lo único que deberías hacer es (te aconsejo que hagas primero la prueba en una copia de tu BD, no sea cosa que los resultados no sean los esperados):
1.- Crear una consulta, basada en ambas tablas, y añades sólo los campos [CodigoT2] y [Utilizado].
2.- Relacionas los campos [CodigoT1] y [CodigoT2]
3.- Ejecutas la consulta para comprobar que te está devolviendo los códigos que son coincidentes en ambas tablas (si hay muchos valores haz una comprobación aleatoria)
4.- Vuelves al diseño de la consulta y la conviertes en una consulta de actualización
5.- En el grid de la consulta, donde te ha aparecido la línea "Actualizar a", en la columna correspondiente a [Utilizado], escribes
TRUE
6.- Ejecuta la consulta. En teoría te habrá marcado todos los códigos que ya se han utilizado
a través del campo [Utilizado]
---------------
Respecto al error que te da el código es un error mío (por escribir el código de cabeza). Te indico la parte del código que tienes (para situarte) y a continuación cómo debería ser escrito correctamente:
Parte del código que no está bien:
...
'Marcamos el código seleccionado como ya utilizado
rst.Fields("Utilizado").Value = True
'Cerramos conexiones y liberamos memoria
...
Modificación:
...
'Marcamos el código seleccionado como ya utilizado
With rst
.AddNew
.Fields("Utilizado").Value = True
.Update
End With
'Cerramos conexiones y liberamos memoria
...
A ver si ahora te funciona bien.
Muchas gracias!!!
Has entendido perfectamente lo que preguntaba y la respuesta es excelente!!!
Con respecto a la consulta de actualización es tal cual lo que necesito. Gracias por indicarme como se hace.
Con respecto al código que me indicas le cambié el .AddNew por .Edit y funcionó estupendamente, ya que lo que hacía era generar nuevo registro.
Es impresionante la labor que haces para la divulgación y conocimiento de Access desde tu página web y con tus altruistas ayudas. De verdad, da gusto que haya personas como tú.
Un saludo y espero poder ayudarte a ti también algún día.
MFA

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas