Cuadros combinados access 2003. Eliminar de la lista el valor del cuadro anterior

Soy usuario básico y hay una cuestión que no se resolver.

Estoy creando una base de datos con access 2003 para mi empresa.

Lo que necesito es crear un formulario con varios cuadros combinados y que en la lista de cada uno no aparezcan lo seleccionado en los anteriores. Digamos como ejemplo que tengo una tabla uso_vehiculos con un campo id_uso, un campo id_vehiculo y un campo id_conductor. Luego tengo dos tablas más, una donde guardo los vehículos y otra donde guardo los conductores. Las relaciono por el id de estas dos a los campos id_ vehículo e id_conductor. Lo que necesito es poner en el formulario un cuadro combinado para seleccionar la matricula de un vehículo guardando el id_vehiculo (eso se hacerlo) y lo mismo para un conductor. Lo que no se es como hacer que al ir a asignar el siguiente vehículo, en el cuadro combinado ya no me aparezca el anterior, para evitar duplicidades y lo mismo para el conductor y así sucesivamente con varios vehículos y conductores. Que cada vez que en un cuadro combinado seleccione uno, este no me aparezca en la lista del siguiente. Si voy resolviendo dudas, tengo un montón de ideas que no se como llevar a cabo, y quizá las vaya planteando.

2 respuestas

Respuesta
2

Tal como lo planteas se resolvería modificando el origen de la fila de tus cuadros combinados en el formulario y recargándolos cada vez que entres a ellos.

Por ejemplo, para el cuadro combinado de conductor, el origen de la fila sería algo como esto (adaptándolo a tus nombres)

SELECT id_conductor, nombre_conductor FROM TConductores WHERE id_conductor NOT IN (SELECT id_conductor FROM uso_vehiculos)

De esta forma te seleccionará todos los conductores que no estén ya en la tabla uso_vehículos.

Para completar, en el evento "Al entrar" o "al recibir el enfoque" del cuadro combinado, le generas este código (supongo que sabrás): Me. NombreCuadroCombinado. Requery.

Lo mismo harías para los vehículos.

Ahora bien, tal como está planteada tu duda (y en función de eso la respuesta), veo el siguiente problema: sólo vas a poder seleccionar una vez cada conductor y cada vehículo, a no ser que establezcas alguna serie de filtros adicionales.

Un ejemplo sería añadir a uso_vehiculo un campo de tipo Sí/NO que indique si el uso ha finalizado, con lo que así podrías hacer esta SQLcomo origen de la fila:

SELECT id_conductor, nombre_conductor FROM TConductores WHERE id_conductor NOT IN (SELECT id_conductor FROM uso_vehiculos WHERE uso_finalizado=False)

Y de esta forma te saldrían en el combo los conductores que no están en uso_vehiculos y los que están pero tienen marcada la casilla uso_finalizado.

Espero que me pilles la idea.

Un saludo


Un nuevo espacio dedicado a Access, visítanos: http://nksvaccessolutions.com/ 

Un saludo


Muchisimas gracias por tu ayuda. Aun no he podido probarlo. En un ratito cuando llegue a casa seguiré con esto y ya te informaré. A lo que comentas del problema de solo un coche, solo un conductor, no es tal, ya que la asignación se hace diaria. no se si tendría que incluir en la select el campo fecha para que busque solo los asignados ya el día del registro correspondiente. En cualquier caso, cuando haga las pruebas te comentaré. Otra vez, gracias.

Sí, si las asignaciones las haces diariamente, con un campo de tipo fecha, has de añadirlo al WHERE de la SQL que va entre paréntesis.

Ten en cuenta también la puntualización de la respuesta de Neckkito, pues es algo que no tuve en cuenta al responder.

He hecho ya un montón de pruebas, y no consigo que me funcione. La culpa es mía que di poca información. 

El problema es que por abreviar no explique todo bien.

Tengo que asignar cada día cinco vehículos a los conductores. Entonces, en realidad existen los campos

fecha

vehiculo_1

conductor_1

vehiculo_2

conductor_2

vehiculo_3

conductor_3

vehiculo_4

conductor_4

vehiculo_5

conductor_5

En el formulario quiero poner diez combos, cinco para los vehículos y cinco para los conductores, de manera que una vez que haya puesto un vehículo en uno de ellos, no me aparezca en los demás combos, y lo mismo para los conductores.

Los vehículos y conductores se guardan en dos tablas auxiliares relacionadas por el id_vehiculo y el id_conductor.

Los combos los he hecho con las columnas id_vehiculo y matricula de la tabla vehículos y el id_conductor y (apell_1 & apell_2 &", "& nombre) de la tabla conductores.

Eso funciona bien todo y me muestra los textos y me graba los id en la tabla uso_vehiculos.

Pero despues de rellenar el primero, los demas me aparecen en blanco.


PRUEBA 1

Para probar he hecho el primer combo de vehículo normal. que muestre todo.

He hecho el segundo combo de vehículo poniendo en la SELECT del WHERE que busque solo en el campo vehiculo_1.

Y nada, el combo 2 me aparece en blanco. 

De momento para ir paso a paso, no he puesto fecha. como estoy intentando resolver esto primero y estoy en pruebas, antes de cada prueba borro los registros en la tabla y empiezo con la tabla en blanco, así que no hay posibilidad de que se enrede con los resultados de varios registros. Solo hay el que estoy creando en ese momento.

El requery lo he hecho con el generador de código en el evento ENTER.

queda así...

Private Sub combo1_Enter()
Me.combo1.Requery
End Sub

Private Sub combo2_Enter()
Me.combo2.Requery
End Sub

combo1 y combo2 evidentemente son los nombres de los combos correspondientes a los campos vehiculo_1 y vehiculo_2

Voy a seguir repasando a ver si he hecho algo mal... Una vez que me funcione el dos respecto al uno, ire poniendo los demas. Imagino que debe valer añadiendolos a la SELECT 

Ok, así explicado cambia un poco la cosa. Te adjunto un mini-ejemplo, que creo es lo que quieres (usé otros nombres más de mi estilo, así que tendrás que adaptarlo a los tuyos): http://www.filebig.net/files/urHFP7JtGs

Te explico por encima:

En el primer cuadro combinado (vehiculo1, que guardará en la tabla el IDvehiculo en el campo con el mismo nombre vehiculo1), seleccionas todos los vehiculos:

SELECT TVehiculos.IdVehiculo, TVehiculos.Matricula FROM TVehiculos; 

Y en el evento "Después de actualizar", guardas los datos y recargas el siguiente cuadro combinado (vehiculo2), con el código:

Private Sub vehiculo1_AfterUpdate()
DoCmd. RunCommand acCmdSaveRecord
Me. Vehiculo2. Requery
End Sub

A este segundo cuadro combinado, como origen de la fila, le pones esta SQL:

SELECT TVehiculos.IdVehiculo, TVehiculos.Matricula FROM TVehiculos WHERE IdVehiculo<>Forms!FUsos!vehiculo1 OR IdVehiculo IN (SELECT vehiculo2 FROM TUsos WHERE IDUso=Forms!FUsos!IDUso); 

Es decir, que te seleccione los vehículos menos el que está seleccionado en el combo uno (IdVehiculo<>Forms! FUsos! Vehiculo1). Además, fíjate que le añado otra condición, con un OR, para que muestre también el vehículo almacenado en ese campo para ese ID. Esto lo hago para evitar lo que comenta Neckkito en su mensaje. Si quieres probarlo, quita esa segunda condición, y verás que al navegar por los registros (y al haber 7 coches y solo 5 combos) hay combos que aparecen en blanco aunque en la tabla sí tienen datos guardados correctamente.

En el evento "Después de actualizar" hacemos la misma operación para el siguiente combo (vehiculo3):

Private Sub vehiculo2_AfterUpdate()
DoCmd.RunCommand acCmdSaveRecord
Me.vehiculo3.Requery
End Sub

La SQL para el tercer cuadro combinado sería:

SELECT TVehiculos.IdVehiculo, TVehiculos.Matricula FROM TVehiculos WHERE IdVehiculo<>Forms!FUsos!vehiculo1 AND  IdVehiculo<>Forms!FUsos!vehiculo2 OR IdVehiculo IN (SELECT vehiculo3 FROM TUsos WHERE IDUso=Forms!FUsos!IDUso); 

Es decir, como condiciones le ponemos que no esté en vehiculo1 ni en vehiculo2 o que ya esté en vehiculo3 para el registro actual.

En "después de actualizar" lo mismo para el siguiente combo.

Y así seguirías añadiendo condiciones a los restantes cuadros combinados de vehiculos.

Para los conductores la mecánica sería exactamente la misma, y al ejemplo me remito.

Por último, en orden de que funcione todo correctamente (y me refiero a las condiciones OR), tienes que recargar los cuadros combinados cada vez que cambias de registro para que muestren los datos que ya están guardados. Eso lo haces en el evento "Al activar regsitro" del formulario, con el código:

Private Sub Form_Current()
Me. Conductor2. Requery
Me. Conductor3. Requery
Me. Conductor4. Requery
Me. Conductor5. Requery
Me. Vehiculo2. Requery
Me. Vehiculo3. Requery
Me. Vehiculo4. Requery
Me. Vehiculo5. Requery
End Sub

Creo que esto es lo que buscas, si no, seguimos mirando posibilidades.

Un saludo


Respuesta
2

Si se me permite una puntualización, querido Sveinbjorn... ;-)

Si utilizas el cuadro combinado que recoge el valor del ID y a la vez le asignas ese origen de datos (SQL con NOT IN) el sistema te funcionará perfecto para los nuevos registros, pero no para los existentes, dado que fuerzas un requery cada vez que accedes al combo.

Es decir, que en la tabla sí tendrás guardado el ID, pero en el formulario no lo podrás ver.

La solución sería hacer lo que comentas, que es perfecto, pero separando el campo que recoge el id del combo (y haciendo alguna cosilla más porque si no, al cambiar de registro, te quedará el último valor seleccionado en el combo) del combo para seleccionar los id's. Y si necesita ver no solo el ID sino también la descripción tendría que acudir, por ejemplo, a textbox independientes con un dlookup.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas