jueves, 24 de mayo de 2007

Jugando con TempVars en Access 2007

Acces 2007 no añade niguna innovación a VBA a no ser las necesarias para manejar sus nuevos controles, o tipos de datos o las nuevas funcionalidades de éstos. Sin embargo, por necesidades de sus nuevas macros embebidas, añade una colección nueva de objetos, TempVars, con unas características de lo más interesantes.

TempVars, abreviatura de "Variables Temporales" es una colección de hasta 255 objetos que almacenan valores tipo Variant que tienen alcance global y dos propiedades: "Name" y "Value".

Ahí es nada. Tenemos algo que equivale a una variable globlal de la que podemos obtener o asignar su propiedad "Name" por código y que, como miembro de una colección, podemos añadir o quitar sobre la marcha, también por código.

No hace falta declaración previa y sólo asignándole un nombre y un valor es suficiente (Aunque tenemos el método Add). Por ejemplo, podemos decir:

TempVars!Mifecha = Date()

Y a continuación podremos acceder a su valor desde cualquier punto de nuestra aplicación, o desde cualquier punto de nuestra aplicación, podemos decir:

TempVars.Remove "Mifecha"

A simpre vista, no parece gran cosa, pero por ejemplo, estas características nos permiten hacer cosas como, por ejemplo, abrir un formulario en modo diálogo, pasarle como argumento el nombre de una variable, crearla sobre la marcha en el formulario diálogo asignándole valor y recuperarla y destruirla desde el formulario llamador:

DoCmd.OpenForm "MiformularioDialogo", , , , , acDialog, "Resp_" & Me.Name

Respuesta = TempVars("Resp" & Me.Name).Value

TempVars.Remove  TempVars("Resp" & Me.Name)

En el formulario diálogo sencillamente habríamos tenido que escribir:

TempVar(Me.OpenArgs) = MiValor

Parece interesante, pero no es gran cosa ¿Hay algo más?

Por supuesto :-) Cuando decimos que el alcance abarca toda nuestra aplicación, es toda nuestra aplicación, incluidas las consultas. Sí, sí, las consultas. Algo así es válido:

TempVars!MisApellidos = "Bengoechea Ibaceta"

"SELECT * FROM CLIENTES WHERE Apellidos = TempVars!MisApellidos"

¡Y funciona! Ya no es necesario construir la cadena SQL concatenando variables y delimitadores, la expresión anterior sustituye perfectamente a  

MisApellidos = "Bengoechea Ibaceta"

"SELECT * FROM CLIENTES WHERE Apellidos = '" & MisApellidos & "'"

Que no parece gran cosa, pero si en Vez de "Bengoechea Ibaceta" fuera "O'Donell", con TempVars, sería exactamente igual, pero construyendo la cadena tendríamos que añadirle bastante complicación.

Evidentemente, se parece mucho al uso de Parameters, pero más sencillo. Claro, que Parameters nos permite por ejemplo usar directamente el valor de un cuadro de texto, lo que también nos ahorra formateo de cadenas, delimitadores etc. ¿Se podrá hacer lo mismo con TempVars? Pues probamos:

Private Sub Comando22_Click()
TempVars!FiltroFecha = Me.FiltroFecha.Value
Me.Filter = "fecha_proceso = Tempvars!Filtrofecha"
Me.FilterOn = True
TempVars.Remove "FiltroFecha"
End Sub

¡Y funciona! Ha interpretado correctamente la fecha sin tener que pasarla al formato americano ni añadirle delimitadores.

Pensándolo bien, no necesitamos escribir la consulta en código VBA, puesto que no hay que construirla, que siempre será igual. Podemos tenerla guardada y simplemente, asignar los valores a nuestras variables TempVars cuando queramos.

Me parece que a partir de ahora vamos ausar mucho TempVars

No hay comentarios: