Como completar un formulario con datos de un subformulario?

Tengo un formularioA que filtra de una tabla los datos de un cliente. En ese formulario se muestra un subformulario con los productos activos que tiene dicho cliente.

En el formularioA tengo un cuadro de opciones donde se muestra si el cliente tiene Riesgo o no.

Lo que necesito hacer es que se muestre tildado ese botón del FormularioA en SI o en NO en función a los productos que el cliente tiene activos que se muestran en el subformulario.

Si en el campo Producto del subformulario hay algún registro diferente de 2 (cada producto tiene un número asignado) debería mostrarse en el FormularioA : tiene riesgo SI.

No he podido hacer que funcione, acá mi código

If Forms![FormularioA].[Subform_Productos_Activos].Form![Producto] Is Null Or  Forms![FormularioA].[Subform_Productos_Activos].Form![Producto] = "2" Then
OpciónSI.Value = Null
OpciónNO.Value = 1
Else
OpciónSI.Value = 1
OpciónNO.Value = Null

End If

Exit Sub

Agradezco desde ya si me pueden ayudar con este tema.

2 Respuestas

Respuesta
1

Matías, convendría saber si ese control Riesgo, tiene como origen de datos algún campo de una tabla o es un control independiente. Te lo digo porque si es independiente y te despalzaras a otro registro, cuando volvieras no estaría "marcado" a menos que le digas algo,. Por ejemplo, si t5engo el formulario Ventas y en el subformulario DetalleVenta, elijo un producto 2

Puedes ver que la casilla de Riesgo no está marcada. Pero si pongo algún otro producto

Voy a seleccionar el 1. En el momento que lo hago

En este caso, el código del evento Después de actualizar del combinado Producto es

Private Sub Producto_AfterUpdate()
If Producto <> 2 Then
Me.Parent!Riesgo = True
End If
End Sub

Es decir, que si el producto que elijo es distinto de 2, el valor del control riesgo del formulario "padre" es True.

En caso de que el control Riesgo fuera independiente, convendría añadirle al Evento Al activar registro del formulario algo como

If dcount("*","detalleventas".....

Por eso deberías concretar

Respuesta
1

Si lo que se necesita es verificar si todos los registros del subformulario sean del tipo (¿riesgo?) Igual a dos, se puede lograr de varias formas.

Una de ellas es la clásica DCount, esto es contar los elementos que cumplen (o no cumplen) una condición.

Si se espera que todos cumplan 'riesgo = 2' se cuentan aquellos cuyo riesgo sea diferente, la respuesta será un cero (0) si todos cumplen y cualquier valor diferente de cero si alguno no la cumple.

Tenemos una respuesta que se puede tratar como un Booleano (verdadero/falso, Si/No ...):
.-  Es cero (=FALSE)
.-  NO es cero (=TRUE).

En un subformulario se mostrarán los elementos de la tabla u origen de datos que tengan relación con el formulario principal (si es un subformulario independiente en más sencillo, pero no es lo natural).

Aplicándolo en la práctica:

Formulario_A:  principal

Formulario_B : subformulario (tabla origen 'Gastos')

Campo de relación entre el Formulario_A y Formulario_B (su subformulario): Proveedor

Campo a evaluar en el subformulario (el Formulario_B) : Valor
Se desea hacer visible/invisible un objeto si el campo 'Valor' es superior a 50, (un cuadro de texto en el ejemplo): MSG_Aviso

La función:

DCount("*", "gastos", "Valor > 50 And Tipo = " & Me.Proveedor)

Creamos una subfunción que declaramos publica, para utilizarla desde donde la necesitemos (en el cambio de registro o si se le modifica un valor al subformulario)

Public Sub Refresca()
Me.MSG_Aviso.Visible = DCount("*", "gastos", "Valor > 50 And Tipo = " & Me.Proveedor)
End Sub

La utilizamos en el Formulario_A  en su evento ‘al cambiar de registro’

Private Sub Form_Current()
Refresca
End Sub

Y en su subformulario (el Formulario_B) si se modifica un valor

Private Sub Valor_BeforeUpdate(Cancel As Integer)
Parent.Refresca
End Sub

Si no se permite modificar ningún dato en el formulario_B, se puede hacer privada la función o eliminarla y poner la acción directamente en el evento ‘al cambiar de registro (y nada en el subformulario) quedaría así:

Private Sub Form_Current()
Me.MSG_Aviso.Visible = DCount("*", "gastos", "Valor > 50 And Tipo = " & Me.Proveedor)
End Sub

Es un ejemplo que creo adaptable a la solicitud publicada y que (probablemente) sea más amplia de lo que se solicita, hay que verla como un método que será de utilidad para otros casos (compartir una función desde varios sitios).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas