Generar un evento en su formulario desde el formulario principal .

Tengo un problemita que estoy seguro me podrán ayudar, quiero desde un su formulario principal generar un evento en un campo de un su fórmulario vinculado al primero. Sucede que tengo en el subformulario varios campos que hace referencia a costo y otros que haces referencia a Unidad; (campoCosto1, CampoCosto2, CampoUnidad1, CampoUnidad2) y te dos casillas de verificación (Si/No) CasillaCosto, CasillaUnidad, quiero que al generar desde el formulario la casilla costo (verdadero) me oculte las casillas unidad y me muestre las casillas costo y cuando activo la casilla Unidad me oculte las casillas Costo y muestre unidad. El activar las casillas se cómo hacerlo y las columnas las oculto con ColumWith y la función IF then Else. Pero cuando las oculta ya no las vuelve a mostrar. Y si las muestras ya no las vuelve a ocultar. No sé si tiene que ver dónde pongo el evento o tiene que ver con el código . Este último como les digo funciona bien solo una vez. Luego tengo que irme al su subformulario y mostrarlas manualmente porque las oculta y la saca de la vista formulario en cualquiera de sus vista

2 respuestas

Respuesta

La opción es en utilizar un conmutador en el mismo evento, un clásico:

IIF (Una condicion, -1, 0)

Se puede crear en un solo objeto y utilizarlo como referente en el resto:

En base a Costo que puede tener dos estados (Verdadero y Falso)

Si tiene que 'hacer' lo mismo que 'Costo':

Me.[el objeto que sea].Visible = Me.Costo

Si tiene que hacer lo contrario:

Me.[el objeto que sea].Visible = NOT Me.Costo

Lo del formulario no lo veo claro, pero se puede forzar la presentación del mismo con REPAINT si es solo estética, con RECALC si hay cálculos (implica Repaint) o en caso extremo con REQUERY que renueva el origen de datos (implica a Recalc y Repaint)

HolaEnrique Feijóo, no entendí muy bien tu respuesta, puedes por favor ser un poco más claro, lo que quiero es mostrar u ocultar la columna en subformulario. Pero no entiendo como hacerlo con el ejemplo que amablemente me das

Desconociendo la estética del subformulario lo único que puedo hacer es publicar algunas formas de lograr el efecto deseado,

La propiedad que muestra/oculta objetos la tiene el propio objeto (es su propiedad 'Visible que solo admite dos valores: verdadero (=-1 o también <> 0) y falso (= 0) por lo que lo único que hay qie hacer es aplicarla cuando se cumplan las condiciones y si la condición es marcar una casilla (copio las indicaciones del mensaje inicial):


... Quiero que al generar desde el formulario la casilla costo (verdadero) me oculte las casillas unidad y me muestre las casillas costo ...


Se puede utilizar como referencia el valor de la casilla COSTO (que se supone solo puede ser verdadero y falso) y hay más de una opción, En el ejemplo se utiliza el evento (el de cambiar de verdadero a falso 'a 'COSTO') para manipular las propiedades de los objetos del subformulario.

(Los eventos se 'disparan' al hacer click con el ratón o con la barra espaciadora o ... esto es, al manipular el objeto y cambiar su estado):

Me.[nombre-del-subformulario].FORM.[COSTO].Visible = Me.[COSTO]= True

Si se cumple la igualdad (costo= true), (costo = -1), (costo <> 0 )  la respuesta es TRUE ( y lo hace visible)
Si no se cumple la igualdad (costo = FALSE), (costo= 0) la respuesta es FALSE (y lo hace invisible)

Para los objetos que se desea lo contrario (se les oculta cuando los otros son visibles) la condición es la inversa

Me.[nombre-del-subformulario].FORM.[UNIDAD].Visible = Me.[COSTO]= False

Y para evitar que solo una comande toda la actuación, se le cambia el estado a la otra casilla de verificación asignándole el valor opuesto al que tiene Costo:

Me.[Unidad] = Not Me.[Costo]

Si se conociesen los procesos y la estética del la aplicación se podrían dar más opciones.

Personalmente crearía una subfunción a la que se llama con un parámetro (verdadero/false) y se encargase desde una única ubicación a todos los objetos implicados (modificar y mejorar 'todo a la vez' en un solo lugar suele evitar los problemas de que quede algo en una esquina sin modificar).

Nota:

Ocultar objetos no es la opción más elegante (a no ser que estén superpuestos y se muestre uno u otro y .. superponer objetos no es recomendable), al ocultarlos su espacio queda libre y se verán huecos. Pero todo dependerá de la ergonomía a lograr y de la estética que se desee obtener.

Respuesta

Para lograr el comportamiento que desea, es necesario que utilice el evento adecuado en el formulario principal para manejar los cambios en las casillas de verificación y actualizar la visibilidad de los campos correspondientes en el subformulario vinculado.

Puede utilizar el evento "AfterUpdate" de las casillas de verificación en el formulario principal para manejar estos cambios y ajustar la visibilidad de los campos en el subformulario.

Supongamos que el subformulario está llamado "NombreSubformulario" y los nombres de los campos son "CampoCosto1", "CampoCosto2", "CampoUnidad1", "CampoUnidad2", "CasillaCosto" y "CasillaUnidad".

En el formulario principal, abre el editor de código y agrega el siguiente código:

Private Sub CasillaCosto_AfterUpdate()
    ActualizarVisibilidadCampos
End Sub
Private Sub CasillaUnidad_AfterUpdate()
    ActualizarVisibilidadCampos
End Sub
Private Sub ActualizarVisibilidadCampos()
    Dim mostrarCosto As Boolean
    Dim mostrarUnidad As Boolean
    mostrarCosto = Me.CasillaCosto.Value
    mostrarUnidad = Me.CasillaUnidad.Value
    ' Establecer la visibilidad de los campos en el subformulario
    Me.NombreSubformulario.Form.CampoCosto1.Visible = mostrarCosto
    Me.NombreSubformulario.Form.CampoCosto2.Visible = mostrarCosto
    Me.NombreSubformulario.Form.CampoUnidad1.Visible = mostrarUnidad
    Me.NombreSubformulario.Form.CampoUnidad2.Visible = mostrarUnidad
    ' Ajustar el tamaño de las columnas en el subformulario
    If mostrarCosto Then
        Me.NombreSubformulario.Form.CampoUnidad1.ColumnHidden = True
        Me.NombreSubformulario.Form.CampoUnidad2.ColumnHidden = True
        Me.NombreSubformulario.Form.CampoCosto1.ColumnHidden = False
        Me.NombreSubformulario.Form.CampoCosto2.ColumnHidden = False
    Else
        Me.NombreSubformulario.Form.CampoCosto1.ColumnHidden = True
        Me.NombreSubformulario.Form.CampoCosto2.ColumnHidden = True
        Me.NombreSubformulario.Form.CampoUnidad1.ColumnHidden = False
        Me.NombreSubformulario.Form.CampoUnidad2.ColumnHidden = False
    End If
End Sub

El código anterior actualiza la visibilidad de los campos y ajusta las columnas según el estado de las casillas de verificación en el formulario principal.

Asegúrese de reemplazar "NombreSubformulario" con el nombre real del subformulario en el que se encuentran los campos mencionados. Además, verifique que los nombres de los campos y las casillas de verificación coincidan con los nombres reales en su base de datos.

Con este código, cada vez que cambie el estado de las casillas de verificación en el formulario principal, se ejecutará el evento "ActualizarVisibilidadCampos", lo que actualizará la visibilidad de los campos en el subformulario según las selecciones realizadas.

Hola, buenas tardes, muchas gracias por la informacion. al leerla me surge una duda, en que evento del formulario debo poner ese codigo?

Lo menciono en este párrafo "Puede utilizar el evento "AfterUpdate" de las casillas de verificación en el formulario principal para manejar estos cambios y ajustar la visibilidad de los campos en el subformulario."

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas