Agradezco tus comentarios

Me encantaría conocer tus impresiones acerca de los distintos ejemplos o artículos de este blog, si te es posible deja un comentario en mi libro de visitas. En cambio para preguntas o problemas con alguno de los ejemplos, te ruego me las formules en el foro de Access en grupos Emagister o en en el foro de Access y VBA.

sábado, 5 de enero de 2008

CAPITULO 4.- FUNCIONES AGREGADAS DE DOMINIO

Cuando uno empieza a desarrollar sus aplicaciones, se nos suele atragantar el acceder a los datos de las tablas que se encuentran cerradas. Una de las maneras más sencillas es con las funciones
agregadas de dominio.

Prácticamente todas ellas son muy similares:

NombredelaFuncion("Campodelatabla","Tabla","Condicion")

Para este capitulo vamos a crear una tabla que vamos a llamar Clientes con los siguientes campos:

IdCliente (Autonumérico)

NombreCliente (Texto)

DNICliente (Texto)

FechaNacimiento (Fecha/Hora)

Edad (Numero)


Escribimos tres o cuatro registros inventados para hacer pruebas.


Ahora creamos un formulario independiente, con un simple cuadro de texto, que vamos a llamar txtResultados, y un botón de comando.

Vamos a comenzar por intentar averiguar cuantos registros tenemos en nuestra tabla y para ello vamos a usar la función agregada de dominio DCount.


Como decía antes sería algo así como DCount("CampodelaTabla","Tabla","Condicion"),
pero para este primer ejemplo no vamos a poner ninguna condición con lo que nos quedaría así: DCount("IdCliente","Clientes")

Ahora vamos a aplicarlo, en el evento al hacer click del botón de comando de nuestro formulario ponemos:


Me.txtResultados = DCount("IdCliente","Clientes")

Si hacemos click en el botón, nos aparecerá en nuestro cuadro de texto el número de registros de la tabla.

Como todas son muy parecidas, ahora vamos a ver DSum, vamos a sumar las edades de todos nuestros clientes, para ello en el botón de comando borramos lo que teníamos y ponemos:


Me.txtResultados = DSum("Edad","Clientes")


Bueno...fácil...¿verdad?


Vamos a obtener el promedio de edad de nuestros clientes, para ello divideremos la suma de sus edades entre el número de clientes


Me.txtResultados = DSum("Edad","Clientes") / DCount("IdCliente","Clientes").

Funciona. Pero Access incluye una función para calcular el promedio, se trata de Avg. Probamos ahora poniendo


Me.txtResultados = DAvg("Edad","Clientes")


Y obtendremos el mismo resultado que antes.

Ahora vamos a descubrir que edad es la más alta de todas las de la tabla. Utilizaremos DMax


Me.txtResultados = DMax("Edad","Clientes")

La menor de todas con DMin


Me.txtResultados = DMin("Edad","Clientes").


Vamos a introducir condiciones, y a conocer DLookUp. Esta función nos sirve para encontrar un campo en una tabla. El objetivo va a ser conocer el nombre del cliente que tengamos en la tabla cuyo IdCliente sea igual a 3.


La condición sería "IdCliente = 3"


Por tanto como lo que buscamos es el nombre del cliente quedaría así:

DLookUp("NombreCliente","Clientes","IdCliente = 3")


Lo ponemos ahora en el botón de comando


Me.txtResultados = DLookUp("NombreCliente","Clientes","IdCliente = 3")


Al hacer click, obtendremos el cliente que se corresponda con el numero 3.


Bien, ahora vamos a poner otro campo de texto en nuestro formulario al que vamos a llamar txtCondicion


Ahora vamos a repetir el ejercicio anterior pero en este caso en vez de utilizar el número 3, utilizaremos el valor del campo txtCondicion. Esta parte de las condiciones es la que se suele atragantar a todo el mundo, pero si lo comprendes bien, verás que en el fondo es sencillo, simplemente respetar la sintaxis para que Access lo entienda.


A la función, la condición se la pasamos como una cadena. Por ello antes de entrar de lleno en el tema, vamos a ver como concatenar cadenas, básicamente sería algo así como cadena1 & cadena2


Por ejemplo pon en el botón de comando lo siguiente:


Me.txtResultados = "Esta mañana" & "hace mucho calor"

Al hacer click nos aparecerán ambas frases concatenadas, lógicamente solo es un ejemplo, porque podríamos haber puesto el texto entero. Pero para el propósito de entenderlo sirve. Vemos que se han concatenado pero ha quedado así Esta mañanahace mucho calor. Vamos pues a ponerle un espacio entre una frase y la otra.


Me.txtResultados = "Esta mañana " & "hace mucho calor"


Ahora sí, ha quedado perfecto. Vale, pues volviendo a la condición que hay que pasarle a las funciones de dominio debe ser una cadena que la función pueda entender.


Antes poníamos una condición que era "IdCliente = 3"


Como veíamos antes sería lo mismo que poner:


"IdCliente= " & "3"


Ahora lo que queremos es que IdCliente sea Igual a lo que pongamos en el campo txtCondicion, por tanto sustituimos "3" por Me.txtCondicion y quedaría así:


"IdCliente= " & Me.txtCondicion

Y ahora ya escribimos todo entero:


Me.txtResultados = DLookUp("NombreCliente","Clientes","IdCliente= " & Me.txtCondicion)


Esta sintaxis funcionará correctamente siempre y cuando el campo variable sea un número.

Pero la sintaxis varía si el campo variable es un texto o una fecha, vamos a suponer que lo que buscamos es: introduciendo el nombre de nuestro cliente obtener su edad , para ello la función sería


Me.txtResultados = DLookUp("Edad","Clientes","NombreCliente= '" & Me.txtCondicion & "'")

Como vemos al tratarse el campo variable de un texto nuestra forma de decírselo es poniéndolo entre comillas simples y dobles.

Por último si se trata de una fecha, debemos ponerlo entre almohadillas, por ejemplo queremos saber el nombre de un cliente poniendo su fecha de nacimiento en el cuadro de texto txtCondicion.


Me.txtResultados = DLookUp("NombreCliente","Clientes","FechaNacimiento= #" &
Me.txtCondicion & "#")

En principio esta sintaxis sería correcta, pero ya sabemos que VBA entiende las fechas en formato americano, por tanto para estar seguros de hacerlo bien le aplicamos a txtCondicion la función Format. Sería así:

Format(Me.txtCondicion,"mm/dd/yyyy"). Por tanto quedaría:


Me.txtResultados = DLookup("NombreCliente", "Clientes", "FechaNacimiento= #" &
Format(Me.txtCondicion, "mm/dd/yyyy") & "#")

Como podrás comprobar es una simple cuestión de sintaxis, pero en el fondo es muy fácil


CAPITULO 3.- LAS VARIABLES.

viernes, 4 de enero de 2008

CAPITULO 3.- LAS VARIABLES

Es posible que cuando hayas oído hablar de variables, te haya parecido algo muy complicado. En este capítulo vas a comprobar que familiarizarse con ellas es algo muy sencillo.

El procedimiento básico es declararlas, asignarles valor y después utilizar ese valor.

La declaración debe incluir el tipo de datos que vamos a querer asignar a esa variable. Como primer ejemplo vamos a asignar un texto a una variable y luego vamos a introducírselo a un cuadro de texto.

Creamos un formulario nuevo y le llamamos frmPruebaVariables, creamos un cuadro de texto y le llamamos txtMiTexto y un botón de comando. Si al crear el botón nos sale un asistente le damos a
cancelar, luego vamos a sus propiedades y en la ficha Otras, en el Campo Nombre le ponemos cmdAsignaVariable y en la ficha Formato en su campo Título le ponemos Asigna Variable.

Ya lo tenemos todo preparado, ahora vamos al botón de Comando, a sus propiedades y en la ficha Eventos, esta vez vamos a elegir "Al hacer click", le damos a los tres puntitos y vamos a ir poniéndole un poco de código.

Lo primero que vamos a hacer es Declarar una variable de texto (para que quede más claro no voy a utilizar la Nomenclatura de VB).

Dim Miprimeravariable As String

Con Dim le asignamos un espacio en memoria y le estamos diciendo que va a ser un texto (String)

Ahora le asignamos un valor

Miprimeravariable = "Esta es mi primera variable de texto"

Ahora vamos a utilizarla para introducir el valor en el campo de texto txtMiTexto

Me.txtMiTexto = Miprimeravariable

Ya lo tenemos todo debe quedar así:

Dim
Miprimeravariable As String

Miprimeravariable = "Esta es mi primera variable de texto"

Me.txtMiTexto = Miprimeravariable


Ahora si guardamos los cambios y hacemos click en el botón, debería aparecer en el campo de texto el valor de la variable.


Vamos a poner otro botón de comando en nuestro formulario y le vamos a llamar por ejemplo cmdVariableMoneda, ahora en su evento "Al hacer click" vamos a poner lo siguiente:

Dim Midinero As Currency
Midinero = 7 + 2
Me.txtMitexto = Midinero

Estamos declarando la variable como tipo Currency (Moneda) y le hemos llamado Midinero

Ahora como valor le asignamos 7+2 y luego se lo mandamos al cuadro de texto que ya teníamos creado.

Al hacer click en el botón, en el campo debería aparecernos 9.



Antes hemos visto que
cuando poníamos un texto lo hacíamos entre comillas, en cambio al poner números no las hemos utilizado, ahora vamos a poner una fecha.

Creamos un nuevo botón y le llamamos cmdAsignaFecha y en su evento al hacer click ponemos:

Dim Mifecha As Date
Mifecha = #1/1/2009#
Me.txtMitexto = Mifecha


Como verás la fecha la hemos puesto entre # , esa es la forma que tiene Access de entender que se trata de una fecha.



Ahora en el último ejemplo prueba a cambiar la línea:
Mifecha = #1/1/2009#
Por esta otra:
Mifecha = #1/1/2009# - 1
Y observa lo que sucede....
Como conclusión de este capítulo:
La ayuda de Access dice lo siguiente:
Las variables se pueden declarar como de uno de los siguientes tipos de datos: Boolean, Byte, Integer, Long, Currency, Single, Double, Date, String (para cadenas de longitud variable), String * longitud (para cadenas de longitud fija), Object, o Variant. Si no se especifica el tipo de datos, el tipo de datos Variant es el predefinido. También es posible crear un tipo definido por el usuario empleando la instrucción Type
Poco a poco iremos viéndolas todas.
En estos ejemplo hemos utilizado siempre la instrucción Dim. Las variables declaradas con Dim en el nivel de módulo están disponibles para todos los procedimientos disponibles sólo dentro de ese módulo, más adelante veremos también otras posibilidades.
Por último:
Option Explicit
Comentarios
Si se usa, la instrucción Option Explicit debe aparecer en un módulo antes de cualquier procedimiento.
Cuando Option Explicit aparece en un módulo, debe declarar explícitamente todas las variables mediante las instrucciones Dim, Private, Public, ReDim o Static. Si intenta usar un nombre de variable no declarado, ocurrirá un error en tiempo de compilación.
Si no usa la instrucción Option Explicit todas las variables no declaradas son Variant, a menos que el tipo predeterminado esté especificado de otra manera con una instrucción Deftipo.
Nota Utilice Option Explicit para evitar escribir incorrectamente el nombre de una variable existente o para evitar confusiones en el código, donde el alcance de la variable no está claro.
CAPITULO 2.-DATE,FORMAT. INSTRUCCIÓN IF... THEN... ELSE. CAPITULO 4.- FUNCIONES AGREGADAS DE DOMINIO

jueves, 3 de enero de 2008

CAPITULO 2.- FUNCIONES DATE, FORMAT. INSTRUCCIÓN IF... THEN... ELSE. SELECT CASE

En el capítulo anterior usábamos la función MsgBox para mostrar un cuadro de mensaje. En este capítulo vamos a ver algunas funciones mas. Comenzaremos con la función Date (Devuelve la
fecha actual).


Para ello abrimos un formulario nuevo y le llamamos frmPrincipal, le ponemos un cuadro de texto independiente al que vamos a llamar txtFecha.


Es posible que te preguntes como se decide el nombre a poner a cada control, en principio exceptuando las palabras reservadas se le puede poner cualquiera, no obstante sería buena idea seguir las convenciones de nomenclatura de Visual Basic. (aunque yo no te aseguro que las siga siempre en el presente tutorial.)


Si has seguido el capítulo anterior ya conoces el Evento "Al abrir" del formulario, pues bien en ese mismo evento vamos a poner lo siguiente:


Forms!frmPrincipal!txtFecha = Date


Básicamente le estaríamos diciendo que en un formulario (Forms) que se llama frmPrincipal y en el campo txtFecha ponga la fecha actual y para eso utilizamos la función Date que nos devuelve la fecha actual.


Tal y como lo hemos escrito funcionaría correctamente, no obstante Access posee algunas palabras clave que son bastante útiles. En este caso vamos a usar la palabra clave Me. Me proporciona una forma de referirse a una instancia específica de la clase donde se está ejecutando el código. Y dicho esto en cristiano, si nos referimos al formulario donde se está ejecutando el código podemos referirnos al mismo con dicha palabra, o lo que es lo mismo podemos sustituir Forms!frmPrincipal por Me, por ello vamos a volver a escribir la instrucción anterior así:



Me.txtFecha = Date


Si nos estuviéramos refiriendo a un formulario distinto al que estamos escribiendo el código, tendríamos que utilizar la forma completa


Ahora sí. Cerramos, guardamos cambios y al abrir, en el campo txtFecha, nos aparece la fecha
actual
. Puedes probar a sustituir Date por Now o por Time y apreciar las diferencias que se producen.


Debería quedarte algo así:




Esto sigue siendo muy fácil ¿No te parece? Seguimos.



En programación, una sentencia condicional es una instrucción o grupo de instrucciones que se pueden ejecutar o no en función del valor de una condición. La más conocida de todas es If...Then...Else que podría traducirse como Si esto es cierto Entonces haz esto En caso contrario haz esto otro


Pues bien, vamos a crear otro cuadro de texto y vamos a llamarle txtFechaPrueba, lo seleccionamos, vamos a sus propiedades...Eventos y en este caso vamos a utilizar uno que se llama "Después de Actualizar" y vamos a escribir en el mismo lo siguiente:


If Me.txtFechaPrueba = Date
Then

MsgBox "Has introducido la fecha actual"
Else
MsgBox "Has introducido una fecha distinta de la actual"
End If


Con esto le estaríamos diciendo Si lo que escribas en el campo txtFechaPrueba es igual a la fecha actual (Date) Entonces muestra un mensaje que ponga "Has introducido la fecha actual",
En caso contrario
muestra un mensaje que diga "Has introducido una fecha distinta de la actual".


Si probamos tal y como está en estos momentos desgraciadamente no va a funcionar adecuadamente, el problema es que VBA considera las fechas en Formato Americano (bueno esto merece un capítulo aparte, dado que no siempre lo hace así), pero lo más probable es que considere la fecha que hemos introducido como mes/día/año y como para nosotros lo normal es día/mes/año, pues vamos a encontrarnos con problemas, para solucionarlo vamos a aplicarle a la función Date la función Format de esta forma:


Format(Date,"dd/mm/yyyy")


Ahora sustituimos la primera línea anterior y la dejamos de la siguiente forma:
If Me.txtFechaPrueba = Format(Date, "dd/mm/yyyy")
Then

MsgBox "Has introducido la fecha actual"
Else
MsgBox "Has introducido una fecha distinta de la actual"
End If



Y ahora sí. Si en el campo ponemos por ejemplo 10/04/2009 y le damos a enter, si es la fecha actual nos mostrará el primer mensaje y en caso contrario el segundo.



Imagen de como debería de quedar:




SELECT CASE...

La ayuda de Access la define de esta forma:


Ejecuta uno de varios grupos de instrucciones, dependiendo del valor de una expresión.


Para este ejemplo vamos a crear un formulario con dos campos independientes a los que vamos a llamar "dorsal" y "posición"


Nuestro propósito va a ser escribir un número en el campo "dorsal" y que se escriba automáticamente en el campo "posición", la posición a la que representa ese dorsal.


Para ello necesitaríamos algo así:


Después de actualizar el campo dorsal


Caso de que sea 1

Posición = portero

Caso de que sea 2

Posición = Defensa

Caso de que sea 5

Posición = Medio

Caso de que sea 9

Posición = Delantero

Caso de que no sea ninguno de los mencionados

Posición = Posición no definida.


Ahora vamos a hacerlo utilizando Select Case.
Para ello nos vamos al evento "Despues de actualizar" del campo "dorsal" y escribimos lo siguiente:


Select Case dorsal
Case 1
Me.puesto = "Portero"
Case 2
Me.puesto = "Defensa"
Case 5
Me.puesto = "Medio"
Case 9
Me.puesto = "Delantero"
Case Else
Me.puesto = "Posición no definida"
End Select



Así es como debe de quedar





CAPITULO 1.- FUNCIÓN MSGBOX CAPITULO 3.- LAS VARIABLES


miércoles, 2 de enero de 2008

CAPITULO 1.- FUNCIÓN MSGBOX

Como había comentado en la introducción, vamos a obviar muchos aspectos técnicos , VBA (Visual Basic para Aplicaciones) permite acceder a las funcionalidades de un lenguaje orientado a eventos. Por tanto podemos programar todos los objetos de nuestra aplicación.

Pensemos en un formulario. Todos los controles de ese formulario serán objetos susceptibles de ser programados, un cuadro de texto, un botón de comando, un cuadro combinado, un botón de opción.....etc, pero también son objetos las secciones del formulario e incluso el propio formulario.


Vamos a empezar a programar, creamos un formulario nuevo vacío, Access por defecto le va a
llamar Formulario1 le dejamos ese nombre, lo ponemos en vista diseño y vamos a sus propiedades. (ver imagen abajo).

En la parte de arriba del todo, podemos leer Tipo de selección: Formulario, por tanto vamos a programar el Objeto Formulario para que haga lo que nosotros le pidamos.



Nos vamos a la ficha Eventos, buscamos uno que se llama "Al abrir"...

Nos aparece un cuadro combinado, lo desplegamos y elegimos [Procedimiento de Evento]...

Hacemos click en los tres puntitos que aparecen a la derecha y se nos mostrará una ventana de Visual Basic.



Access ha escrito por nosotros varias cosas, en la parte superior vemos:

Option Compare Database
Option Explicit


Es posible que Option Explicit no aparezca, por el momento no te preocupas, ahora mismo no nos hace falta.
Esa parte superior se llama Declaraciones.


Ahora vamos a lo que nos interesa, Access pone por nosotros el encabezado y el fin del procedimiento de Evento...


Private Sub Form_Open(Cancel As Integer)

End Sub



Por tanto nosotros solo tenemos que rellenar lo que va entre ambas cosas, que serán las instrucciones que queremos darle al Formulario, como el Evento que hemos elegido es "Al abrir", nuestras instrucciones se producirán cuando abramos el formulario.

Vamos a mostrar un mensaje, para ello escribimos:

MsgBox "Hola Mundo"


Por tanto ahora nos quedará así:


Private Sub Form_Open(Cancel As Integer)
MsgBox "Hola Mundo"

End Sub


Cerramos la ventana, cerramos el formulario, guardamos cambios y ahora abrimos el formulario. Se nos mostrará el mensaje "Hola Mundo"


Bueno...yo diría que por el momento esto ha sido facil ¿no?.


Hemos utilizado la función MsgBox en su forma más simple, vamos a mejorar un poco nuestro cuadro de mensaje, utilizando algunas de las opciones que esta función nos proporciona. Vamos a sustituir lo que pusimos antes:


MsgBox "Hola Mundo"


Por esto otro:


MsgBox "Hola Mundo", vbInformation, "Mi primer mensaje"


Ahora si abrimos de nuevo el formulario, podemos ver los cambios que se han producido.



Puedes probar cambiando vbInformation por vbCritical o por vbExclamation o por vbQuestion. También puedes cambiar "Mi primer mensaje" por cualquier otro título.



Más adelante veremos otras posibilidades que nos aporta esta función.


Para finalizar con este capítulo, prueba a poner exactamente lo mismo, pero en el evento "Al cerrar". Puedes experimentar probando en distintos eventos.

martes, 1 de enero de 2008

INICIACIÓN A VBA PARA ACCESS

Vamos a comenzar un pequeño "curso" acerca de VBA para aquellos que tenéis vuestro primer contacto con esta herramienta. No va a tener mucho rigor técnico, y no tomes por cierto todo lo que leas aquí, simplemente vamos a intentar perder el miedo a la programación. Si lo que deseas es un buen curso puedes pasarte por http://www.olaz.net/ posiblemente el mejor curso de VBA en castellano, desarrollado por Eduardo Olaz.

Iré añadiendo capítulos a medida que los vaya completando.

Si quieres que te avise cada vez que se publique un nuevo capítulo, házmelo saber en esta dirección
juan@pyq.es . También me gustaría mucho conocer tus impresiones y si te ha servido para algo

CAPITULO 1.- FUNCIÓN MSGBOX

CAPITULO 2.- FUNCIONES DATE, FORMAT. INSTRUCCIÓN IF... THEN... ELSE.

CAPITULO 3.- LAS VARIABLES

CAPITULO 4.- FUNCIONES AGREGADAS DE DOMINIO