Aquí se utilizan mucho los subformularios. A veces, podemos tener añadidos más de 5 o 6 por formularios. Estos pueden ser una verdadera molestia en el rendimiento si no tiene cuidado. Esta es la primera parte de dos. Más adelante Ben le hablara de como deshabilitar lo subformularios ante de que sean cargados.

Los subformularios se cargan primero primero

Agregando un subformulario alterará la secuencia de eventos de la aplicación, en lugar de que el formulario principal se disparare primero, los subformularios toman el control y dispararan sus eventos, se apagarán los eventos del formulario principal. Con la siguiente secuencia:

  • Abrir el evento del formulario principal
  • Cargar el evento del formulario principal
  • Abrir el evento del subformulario x
  • Cargar el evento del subformulario x

En cambio, el orden de los acontecimientos cambia:

  • Abrir el evento del subformulario x
  • Cargar el evento del subformulario x
  • Abrir el evento del formulario principal
  • Cargar el evento del formulario principal

Efecto atrapado en el tiempo

Si usted no tiene cuidado, los eventos open y load de su subformularios se dispararan varias veces, bajo ciertas condiciones, retrasando su aplicación y haciendo que se sienta como si estuviera en la película “Atrapado en el tiempo”. Por ejemplo, si usted cambia la propiedad recordsource de su subformularios en el evento open del formulario principal, la secuencia se disparara de este modo:

  • Todos los eventos open y load de su subformularios se ejecutan./li>
  • El evento open del formulario principal se dispara y cambiara el recordsource de sus subformularios.
  • Los subformularios se disparan de nuevo
  • El Control vuelve al formulario principal y ahora se filtran los registros
  • Los subformularios se disparan de nuevo
  • El control vuelve al formulario principal y el resto de los códigos se ejecutan

La secuencia anterior puede significar que su aplicación puede tardar varios segundos en cargar un formulario, mucho más si se trata de la lectura de datos desde la nube. El ciclo sólo se seguirá repitiendo en base a lo que hace su formulario principal.

Utilice una variable pública en el formulario principal para controlar el flujo de datos

No se puede cambiar el comportamiento de Access, pero se puede minimizar el impacto de dos maneras: mediante la separación de los códigos en sus propios procedimientos y mediante el uso de una variable global en el formulario principal. A continuación, puede comprobar el valor de la variable en los subformularios y detiene la ejecución hasta que el formulario principal haya terminado de cargarse.

La separación de código

Es muy tentador hacerlo todo a la vez en un solo evento y a menudo se puede, pero como se dijo anteriormente, haciendo ciertas acciones en un evento puede provocar muchos acontecimientos que sólo pueden servir para complicarlo todo y que el proceso sea más lento. Por lo tanto, unas reglas generales deben ser aplicadas para la asignación del código:

Utilice la condición WHERE para realizar filtros en los formularios a través de DoCmd.OpenForm siempre que sea posible.
Solo utilice el evento de open para comprobar si se permite abrir el formulario.
Utilice el evento load para establecer los valores predeterminados y modifique recourdsource solo si apropiado.
Utilice el evento current solo para manipular el registro actual.

Normalmente, esto ayuda en la mayoría de las circunstancias, pero a veces tenemos formularios más complicados en los que necesitamos controlar el orden y ahí es donde se utiliza el siguiente ítem…

Uso de variable pública

En primer lugar, agregue una variable Module Level en el formulario principal:

Public bolFinishedLoading As Boolean

Después, agregue el siguiente código en el evento Load de cada subformulario:

If not Me.Parent.bolFinishedLoading Then
        Exit Sub
End If

Una vez que el formulario principal ha terminado de cargarse, cambie el valor en True:

bolFinishedLoading = True

You may then want to call subform's loading routine especially if it needs to be performed after the parent formhas finished loading. You typically can do so like this:
Me.frmMyChild.Form.FinishLoading  (frmMyChild is the name of your subform)

Siempre que el subformulario tenga un procedimiento público denominado FinishLoading.

También puede llamar al procedimiento FinishLoading desde el evento Load del subformulario, especialmente después de que el formulario principal haya terminado de cargar, en cuyo caso el código se verá como este:

If Me.Parent.bolFinishedLoading Then
        FinishLoading
Else
        Exit Sub
End If

Con este procedimiento especial, se está asegurando de que el código se ejecutara siempre que el evento Load de los subformularios se haya disparado o siempre que el evento Load del formulario principal se haya disparado pero no cuando el formulario principal este aun cargando.
¡Felices Fiesta!