Datos de dos combobox en un subformulario

Que me ha surgido.

Tengo una BD con 3 tablas TABLAGASTOS, TABLADETALLE y TABLAPRODUCTOS.

En TABLAGASTOS además de los campos fecha y cantidad ..., hay un campo con IDPRODUCTO y otro con IDDETALLE que la relacionan con las otras 2 tablas.

En TABLADETALLE hay IDDETALLE, DETALLEPRODUCTO e IDPRODUCTO que la relaciona con la TABLAPRODUCTO. Hay casos en que un PRODUCTO no tiene ningún DETALLE

En TABLAPRODUCTOS hay IDPRODUCTO y PRODUCTO

Lo que quiero es que en un formulario con un combobox PRODUCTO cuyo Origen del Control es IDPRODUCTO, y con otro combobox DETALLEPRODUCTO cuyo Origen del Control es IDDETALLE, que eligiendo en el primer combobox el producto y eligiiendo en el segundo combobox los detalles relacionados con ese producto (en caso de existir), en un Subformulario llamado PORPRODUCTOSSUBFORMULARIO, me aparezcan los campos fecha, cantidad, ... Relacionados con ese DETALLEPRODUCTO (en el caso de que los tenga), y si no los tiene, los mismos campos relacionados con el PRODUCTO elegido.

Lo he intentado pero lo único que he conseguido es que al elegir el PRODUCTO en el primer combobox, aparezcan en el segundo los detalles relacionados con dicho producto, pero en el subformulario no aparece nada a no ser que pulse F5, pero esto no funciona cuando el PRODUCTO no tiene detalles asociados.

Aparte de ayudarme en que los datos aparezcan en el subformulario cuando el producto no tiene detalles, a ver si me podéis decir cómo hacer que el subformulario se actualice sin tener que pulsar F5 después de elegir el detalle del producto en el combobox segundo.

1 respuesta

Respuesta
1

te he preparado un mini ejemplo, a ver si es lo que necesitas: http://www.filebig.net/files/uPvnj6VyHB

Fíjate en los códigos de los eventos "despues de actualizar" de cada cuadro combinado, que son la clave del asunto.

Básicamente lo que hacen es recalcular el origen del subformulario con los filtros seleccionados.

Antes de nada muchas gracias Sveinbjorn El Rojo por tu respuesta y por tu ejemplo, que soluciona en buena parte mi problema, pero me queda uno de los puntos que mencionaba en mi pregunta.

Como no todos los productos tienen detalle, cuando selecciono uno de ellos en el primer combo, el segundo sale vacío por no tener detalle, haciendo esto que el subformulario no devuelva ningún dato.

Lo dicho, agradecido.

Si te fijas en el ejemplo que te mandé, al seleccionar un valor en el primer cuadro combinado ya se filtra el subformulario, independientemente de que tenga o no detalle.

El código del evento en ese combo fuerza el "filtrado" del subformulario, te pongo el código comentado:

Private Sub cboProducto_AfterUpdate()
'Actualizas el segundo combo en función del primero
Me.cboDetalle.RowSource = "SELECT IdDetalle, DetalleProd, IDProd FROM TDetalle WHERE IDProd=" & Me.cboProducto & " ORDER BY DetalleProd"
Me.cboDetalle.Requery
'Recalculas el surformulario
If IsNull(Me.cboProducto) Then
    'Si dejas el combo en blanco, muestra todos los registros
    Me.subFPorProductos.Form.RecordSource = "SELECT Id, Fecha, Cantidad, Producto, DetalleProd " _
                        & "FROM TProductos INNER JOIN (TDetalle INNER JOIN TGastos ON TDetalle.IdDetalle = TGastos.IDDetalle) ON " _
                        & "(TProductos.IDProd = TGastos.IDprod) AND (TProductos.IDProd = TDetalle.IDProd)"
Else
    'Si no, muestra los registros de ese producto (WHERE IDProd=Me.cboProducto)
    Me.subFPorProductos.Form.RecordSource = "SELECT Id, Fecha, Cantidad, Producto, DetalleProd " _
                        & "FROM TProductos INNER JOIN (TDetalle INNER JOIN TGastos ON TDetalle.IdDetalle = TGastos.IDDetalle) ON " _
                        & "(TProductos.IDProd = TGastos.IDprod) AND (TProductos.IDProd = TDetalle.IDProd) " _
                        & "WHERE TGastos.IDprod=" & Me.cboProducto
End If
'Actualizas el subformulario
Me.subFPorProductos.Form.Requery
End Sub

El segundo cuadro combinado, después de actualizarse, sólo añade el nuevo criterio de filtro (el IDDetalle). Este código se podría mejorar un poco, añadiendo un control para los nulos del segundo combo:

Private Sub cboDetalle_AfterUpdate()
If IsNull(Me.cboProducto) Then
    Me.subFPorProductos.Form.RecordSource = "SELECT Id, Fecha, Cantidad, Producto, DetalleProd " _
                        & "FROM TProductos INNER JOIN (TDetalle INNER JOIN TGastos ON TDetalle.IdDetalle = TGastos.IDDetalle) ON " _
                        & "(TProductos.IDProd = TGastos.IDprod) AND (TProductos.IDProd = TDetalle.IDProd) " _
                        & "WHERE TGastos.IDprod=" & Me.cboProducto
Else
    Me.subFPorProductos.Form.RecordSource = "SELECT Id, Fecha, Cantidad, Producto, DetalleProd " _
                        & "FROM TProductos INNER JOIN (TDetalle INNER JOIN TGastos ON TDetalle.IdDetalle = TGastos.IDDetalle) ON " _
                        & "(TProductos.IDProd = TGastos.IDprod) AND (TProductos.IDProd = TDetalle.IDProd) " _
                        & "WHERE TGastos.IDprod=" & Me.cboProducto & " AND TGastos.IDDetalle=" & Me.cboDetalle
End If
Me.subFPorProductos.Form.Requery
End Sub

Yo creo que sí están resueltas todas las situaciones que se pueden contemplar.

Gracias de nuevo Sveinbjorn El Rojo y perdona que vuelva con el tema.

Para que veas a lo que me refiero, sobre tu propio ejemplo he añadido un nuevo producto que no tiene detalle.

Al elegirlo en el cboProducto al carecer de detalle no se actualiza el subformulario y sale sin ningún tipo de información.

Te envío tu ejemplo con el producto añadido para que lo veas.

http://www.filebig.net/files/HyzbF8wXV8 

Gracias anticipadas

Vale, ya veo lo que pasa. Hay que rediseñar la consulta para que muestre todos los registros de TGastos y los relacionados de las otras dos.

Para eso, hay que abrir la consulta en vista diseño, hacer click en la relacion que une TGastos con TProductos, sacar sus propiedades, y elegir la opción "Mostrar TODOS los registros de TGastos y ...". Y lo mismo con la relación entre TGastos y TDetalles. Además hay que eliminar la relación entre TProductos y TDetalles, que para el caso no nos interesa.

Luego hay que modificar el código para poner la nueva estructura de la consulta.

Te resubo el archivo, y disculpa que no me diera cuenta de este detalle.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas