Página 1 de 1

Subformulario con dos campos ligados

Publicado: Lun Sep 28, 2009 7:51 pm
por asensio
El ejemplo es el siguiente:
tablas:
- empresa [ id_empresa (PK), nombre ]
- local [ id_local (PK), nombre, id_empresa (FK) ]
- empleado [id_empleado (PK), nombre, id_empresa (FK) ]
- local_empleado [ id_empleado (PK, FK) , id_local (PK, FK) ]

relaciones:
1 empresa - N empleados
1 empresa - N locales
N locales - N empleados

Para introducir los datos tanto de locales como empleados uso un subformulario y enlazo el campo id_empresa al formulario principal de la tabla de empresas (hasta aquí todo ok), el problem surge cuando quiero asociar un empleado a varios locales.

Para ello uso un subformulario del subformulario de empleados para que muestre los locales a los que está asociado con la tabla local_empleado, despues añado una tabla de control y añado sobre ella una columna que es un listado (puesto que quiero poder seleccionar el local).

El campo de datos es id_local y en el listado escribo el siguiente SQL: select nombre, id_local from local. Así puedo introducir datos de la relacion empleado-local. El problema es que en el listado me aparecen TODOS los locales (lo cual es lógico)

¿Cómo hago que sólamente aparezcan los locales de la empresa del empleado?

¿Hay alguna forma de acceder al valor del campo id_empresa seleccionado y asignarlo a una variable o parámetro...?

me gustaría que el SQL fuera: select nombre, id_local from local WHERE LOCAL.id_empresa = :id_de_empresa_seleccionada

pero no sé como guardar en :id_de_empresa_seleccionada el id de la empresa del formulario principal.

Espero que se entienda mi pregunta, he buscado mucho y no he encontrado nada.... también soy bastante novato con BDs de usuario.. :?

Re: Subformulario con dos campos ligados

Publicado: Vie Nov 13, 2009 11:11 am
por Cascabel
1- Crea el formulario con origen de datos la tabla "empleado".
2- Crea en él un subformulario ("subformLocalEmpleado") con origen de datos la tabla "local_empleado".
3- Vincúlalos mediante "id_empleado".
4- En el subformulario, coloca un control de tabla ("tablaLocalEmpleado") con una columna ("listboxIdLocal").
La columna, que sea una lista desplagable.
El campo de datos, "id_local".
El tipo de contenido, Sql.
El contenido, déjalo en blanco.
5- Asocia al evento de "Cambio en el registro de datos" (del formulario principal) la macro siguiente para actualizar el SQL.
También a un evento que se active al modificar la empresa del empleado, si es que permites que se haga tal cosa desde el formulario
(no me parece buena idea).

Código: Seleccionar todo

Sub ActualizaSQLLocales(Event As Object)
	Dim Form As Object
	Dim ListBoxModel As Object
	Dim IdEmpresa As Integer
	Dim SQL(0) As String
	Form=Event.source	'Esto puede cambiar si el evento desencadenante es distinto del indicado
	If Form.IsAfterLast Or Form.IsNew Then
		SQL(0)=""
	Else
		IdEmpresa=Form.Columns.GetByName("id_empresa").Value
		SQL(0)="SELECT ""nombre"", ""id_local"" FROM ""local"" WHERE ""id_empresa""=" & IdEmpresa & " ORDER BY ""nombre"" ASC"
	End If
	ListBoxModel=Form.GetByName("subformLocalEmpleado").GetByName("tablaLocalEmpleado").GetByName("listboxIdLocal")
		'^ Cambiar los nombres por los que correspondan
	ListBoxModel.ListSource()=sSQL()
	ListBoxModel.Refresh
End Sub