El IDE – Mucho más que un editor
A estas alturas ya habrás notado la gran utilidad del IDE, te colorea las palabras dependiendo de su contexto y te muestra mensajes preventivos o de error siempre que sea posible. En este capitulo, veremos algunas otras características del IDE que nos pueden ayudar a depurar nuestras macros, entendiendo por depurar, las técnicas que nos ayudan a encontrar más fácilmente un error, sobre todo lógico, que son, a veces, los más complicados de encontrar.
Para empezar demos un repaso a nuestro centro de trabajo, es decir, al IDE y sus diferentes partes:
- Barra de titulo
- Barra de menús
- Barras de herramientas
- Ventana de edición
- Ventana de observador
- Ventana de llamadas
- Barra de desplazamiento de módulos y diálogos
- Barra de estado
Algunas de estas ya te serán muy familiares, otras son nuevas pero las veremos en este capitulo. Como ya mencionamos, el IDE, es solo otra aplicación de Apache OpenOffice, que nos permite crear y editar nuestras macros, la barra de titulo y la de menús es consistente con las demás aplicaciones que integran la aplicación, por lo que no las veremos aquí, Las barras de herramientas las veremos a continuación.
La primer barra de herramientas se llama MacroBar, por lo que supongo que en castellano será Barra de macros, ya que el nombre no aparece en su barra de titulo, como si lo hace en la mayoría de las barras de herramientas.
El primer control que es un cuadro de lista desplegable (control ComboBox) te permite seleccionar el archivo que este abierto y la biblioteca que quieras editar.
Observa como la primer opción es Todos, si seleccionas esta opción, en la barra de desplazamiento de módulos, te mostrara “todos” los módulos y diálogos de todos los archivos abiertos, así como del archivo especial Mis macros y los integrados en Apache OpenOffice, por lo que esta opción te podría llegar a mostrar varias decenas de módulos dependiendo de cuantos archivos tengas abiertos y de cuantos módulos tengas con código.
El resto de los botones son los siguientes.
- Icono de compilar: Me gustaría mucho que el código de nuestras macros se pudiese compilar, que es lo que dice hace este icono, pero todo el código de nuestras macros es interpretado, por lo que este icono, lo único que hace es volver a recorrer el código del modulo actual en busca de errores, pero no compila código.
- Icono de ejecutar: Este icono ejecuta “solo” la primer macro del módulo activo, pero ya vimos las técnicas para ejecutar las demás macros, equivale a presionar la tecla F5 . Recuerda que en algunas distribuciones de OpenOffice.org, puedes ejecutar la macro donde se encuentre el cursor, pero en la oficial (y en Apache OpenOffice) aun no.
- Icono de detener macro: Solo esta activo cuando ejecutamos una macro, normalmente se usa en conjunción con los iconos 4 y 5.
- Icono pasar al siguiente: Permite ejecutar línea a línea el código de nuestra macro, muy útil para depurar y encontrar errores, normalmente se usa junto con el “Observador” para encontrar errores, equivale a presionar la tecla F8
- Icono entrar en el proceso: Realiza la misma acción del icono 4, los iconos 4 y 5, solo se ejecutan en la primer macro del modulo activo, por lo que para depurar macros, es mejor usar “puntos de ruptura”, te das cuenta que línea es la siguiente a ejecutar por una flecha amarilla en el margen izquierdo del editor.
- Icono salir de proceso: Cuando ejecutamos una macro línea por línea, este icono nos permite continuar la ejecución de la macro normalmente, equivale a presionar la tecla F5 .
- Icono de activar/desactivar puntos de ruptura: Un punto de ruptura es una “señal” que le indica al IDE que detenga la ejecución en la linea indicada por un punto rojo en el margen izquierdo de nuestro editor, con este icono activamos (mostramos) y desactivamos (ocultamos) los puntos rojos que son puntos de ruptura en la línea actual donde este el cursor de escritura, recuerda que el cursor de escritura es la raya vertical negra de todo editor de texto, también puedes activar y desactivar puntos de ruptura con la tecla F9 o dando un doble clic en la línea que quieras, pero muy importante, dentro del margen izquierdo del editor. Observa en la siguiente imagen los puntos rojos.
- Icono gestionar puntos de ruptura: Nos permite administrar los puntos de ruptura existentes en nuestro modulo actual, es decir, nos permite agregar, eliminar o desactivar puntos de ruptura en un cuadro de dialogo. Cada punto de ruptura estará indicado por la línea en donde se encuentre y podrás seleccionar y desactivar el punto que quieras, con lo cual el punto rojo pasará a ser un punto gris, también puede eliminar el punto de interrupción que quieras tan solo seleccionándolo y presionando el botón Eliminar, así mismo, puedes agregar el que quieras, tan solo indicando el numero de línea donde deseas establecerlos y presionar el botón nuevo, pero lo mejor es agregar los puntos desde el editor, exactamente en la línea que quieras.
- Icono de habilitar inspección: Permite agregar la variable seleccionada a la ventana de observador para visualizar el valor de dicha variable durante la ejecución de una macro, esta ventana normalmente se usa ejecutando la macro línea a línea ( F8 ) o junto con puntos de ruptura para poder observar el valor de las variables, más adelante veremos a detalle esta herramienta
- Icono de buscar paréntesis: Con el cursor de escritura posicionado “antes” de un paréntesis de apertura o cierre, nos permite seleccionar todo el texto dentro de dichos paréntesis e incluyendo los paréntesis, muy útil sobre todo en grandes funciones anidadas donde se pierden los paréntesis.
- Icono de insertar código Basic: Permite, a partir de un archivo de texto (normalmente con extensión BAS) insertar el código Basic que contengo en el modulo actual en la posición del cursor de escritura actual.
- Icono de guardar código Basic: Nos permite exportar a un archivo de texto con extensión BAS el código seleccionado o todo el modulo si no hay nada seleccionado.
- Icono de importación de Dialogo: Nos permite importar un cuadro de diálogo.
La siguiente barra de herramientas se llama Estándar, y es muy similar a la mayoría de las barras estándar de las demás aplicaciones, te permite abrir, guardar, imprimir, copiar, pegar, etc, por lo que no veremos aquí estas opciones, salvo por los tres iconos siguientes solo disponibles en el IDE.
- Icono catalogo de objetos: Nos muestra un cuadro de dialogo que nos permite navegar en forma de árbol entre los archivos abiertos y dentro de sus bibliotecas, módulos y macros disponibles, con un doble clic sobre la macro seleccionada nos lleva a ella o usando el botón Mostrar (circulo rojo en la imagen).
- Icono de seleccionar macro: Nos muestra un cuadro de dialogo para administrar nuestras macros, nos permite también navegar entre los archivos abiertos, sus bibliotecas y sus módulos, por ahora, principalmente la hemos usados para ejecutar la macro que queramos, pero también podemos editar y eliminarlas, una opción muy interesante y poderosa es Asignar una macro, que se verá más adelante.
- Icono seleccionar modulo: Nos muestra un cuadro de dialogo que nos permite administrar módulos, diálogos y bibliotecas, agregarlos y eliminarlos entre otras opciones como agregar una contraseña a una biblioteca.
Observa la llave al lado izquierdo de miBiblioteca que nos indica que esta biblioteca tiene establecida una contraseña para su visualización, la cual te solicitara si intentas editarla.
Veamos ahora como nos pueden ayudar los puntos de ruptura, la ejecución línea a línea, la ventana de observador y la ventana de llamadas a depurar nuestras macros. Puedes usar cualquier macro de las que hayamos desarrollado en estos apuntes o cualquiera que tengas, lo importante es seguir la secuencia correcta de los pasos siguientes, por ejemplo, el siguiente código, cópialo en la parte superior de cualquier módulo, es decir, asegúrate de que sea la primer macro de dicho módulo de código.
Option Explicit
'Construimos un seudo-RFC, el RFC es un dato personal y único en México y digo seudo
'por que no es tan simple como lo pongo aquí, pero nos sirve muy bien de ejemplo
'Primeras dos letras del apellido paterno
'Primera letra del apellido materno
'Primera letra del nombre
'Año de nacimiento de dos dígitos
'Mes de nacimiento de dos dígitos
'Dia de nacimiento de dos dígitos
Sub ObtenerRFC1()
Dim sNombre As String
Dim dNacimiento As Date
Dim pos1 As Byte, pos2 As Byte
Dim RFC As String
'Vamos a suponer que capturamos un nombre estandar Nombre Paterno Materno
'por ejemplo Vanessa Bauche Chavira
sNombre = Trim( InputBox( "Escribe tu nombre completo", "Nombre" ))
'Vamos a suponer una fecha correcta, por ahora no haremos verificación
'OJO solo por ahora, así que prueba fechas correctas
dNacimiento = CDate( InputBox( "Ahora tu fecha de nacimiento", "Fecha" ))
'Encontramos la posición del primer espacio
pos1 = InStr(1,sNombre," ")
'Encontramos la posicion del segundo espacio
pos2 = InStr(pos1+1,sNombre," ")
RFC = UCase( Mid(sNombre,pos1+1,2) & Mid(sNombre,pos2+1,1) & Mid(sNombre,1,1) ) & _
Right(CStr(Year(dNacimiento)),2) & Format(Month(dNacimiento),"00" ) & _
Format(Day(dNacimiento),"00" )
'Mostramos el RFC construido
MsgBox RFC
End Sub
Tienes que ser muy observador, presiona la tecla F5 , por supuesto nuestra macro se ejecutara de forma normal, captura los datos solicitados correctamente y verifica que el resultado sea el esperado. Ahora, presiona F8 , nota como aparece una flecha amarilla en el margen izquierdo de nuestro editor, empezando por la primer línea de nuestra macro, continua presionando F8 y nota como la flecha amarilla va avanzando línea por línea en nuestro código, continua así hasta terminar de ejecutar la macro.
Vuelve a empezar presionando F8 , pero ahora, detente exactamente en la línea siguiente, que si copiaste el código anterior, tiene que ser la línea 28 aproximadamente.
RFC = UCase( Mid(sNombre,pos1+1,2) & Mid(sNombre,pos2+1,1) & Mid(sNombre,1,1) ) & _
Right(CStr(Year(dNacimiento)),2) & Format(Month(dNacimiento),"00" ) & _
Format(Day(dNacimiento),"00" )
Posiciona el cursor sobre cada una de las variables sNombre, dNacimiento, pos1, pos2 y RFC, ¿que notas?, muy bien, muy bien, observa como el IDE nos muestra el valor almacenados en cada una de las variables en un pequeño cuadro de texto amarillo que desaparece en cuanto movemos el cursor. No esta de más aclararte que la imagen siguiente esta editada para mostrarte el valor de todas la variables.
También observa que, mientras estas ejecutando el código, línea por línea, en cualquier momento puedes continuarla de forma normal presionando F5 o de plano detener la macro con el botón Detener Macro o presionando Ctrl + ⇧ Shift + Q .
Con justa razón te preguntaras, ¿esto no es muy practico cuando tenemos decenas de variables? Y si, tendrás razón, ahora para ello, para ver el valor de las variables, usaremos la ventana del observador de la siguiente manera. Selecciona una variable y presiona el icono Habilitar inspección o presiona la tecla F7 que tiene el mismo efecto, repite este proceso con todas las restantes variables y ve observando como en la ventana del observador se van listando las variables.
Ahora, vuelve a ejecutar la macro paso a paso, es decir, línea a línea y ve observando la ventana de inspección, al llegar a la línea donde construimos el RFC, tienes que ver algo muy similar a.
Mira que lindo, tenemos el valor de todas nuestras variables, además, te muestra el tipo de variable que es, por supuesto si estas variables cambian su valor en el transcurso de ejecución de nuestra macro, estos cambios los podrás ir analizando en la ventana del observador, he ahí su importancia, una frecuente fuente de errores, es precisamente que en ocasiones al procesar los datos tan rápido, puede ser que una variable no tenga o no obtenga los datos que necesitamos. Y surge una nueva pregunta, ¿tenemos que ejecutar nuestro código línea a línea para poder ver los valores de las variables?, ¿y si tenemos decenas o centenas de líneas de código?, muy buena pregunta, veo que eres un alumno atento, para estos casos, en vez de ejecutar nuestro código línea a línea, usaremos puntos de interrupción, que, como vimos más atrás, son señales que le dejamos al IDE para que se detenga en la línea indicada. Para agregarlos usamos el icono “activar/desactivar puntos de ruptura” o presionamos la tecla F9 , pero, “muy importante”, primero posicionamos el cursor sobre la línea donde nos interese establecer el punto de interrupción. Agrega un punto de interrupción en la linea donde construimos el RFC de modo que te quede de la siguiente manera.
Observa como aun tenemos las variables en la ventana del observador, ahora, ejecuta la macro con F5 y observa como después de alimentar los datos, el código se detiene exactamente en la línea que establecimos.
Ahora, puedes continuar ejecutando línea a línea ( F8 ) o continuar normalmente ( F5 ), puedes establecer tantos puntos de interrupción como quieras o necesites. Las variables que agregues a la ventana del observador y los puntos de interrupción que establezcas, solo estarán disponibles en tu sesión actual, si cierras tu archivo los perderás. En cualquier momento puedes quitar los puntos de interrupción con F9 sobre la línea donde esta el punto de interrupción o las variables de la ventana del observador, solo selecciona la variable que quieras quitar en la ventana del observador y la eliminas de esta con el icono que esta inmediatamente encima de estas.
Para terminar este tema tan divertido, veamos para que sirve la ventana de llamadas y veamos como la ventana de observador también nos puede mostrar el valor de una matriz de datos, para esto, modifica el código anterior para dividirlo en una subrutina y en una función, de modo que quede de la siguiente manera.
Option Explicit
Sub ObtenerRFC2()
Dim sNombre As String
Dim dNacimiento As Date
Dim RFC As String
Dim mDatos(2) As String
'Obtenemos los datos
sNombre = Trim( InputBox( "Escribe tu nombre completo", "Nombre","Vanessa Bauche Chavira" ))
dNacimiento = CDate( InputBox( "Ahora tu fecha de nacimiento", "Fecha", "15/01/74" ))
'Los procesamos
Call ObtenerIniciales( sNombre, mDatos() )
RFC = Join(mDatos(),"")
RFC = RFC & FechaRFC( dNacimiento )
'Mostramos el resultado
MsgBox RFC
End Sub
Sub ObtenerIniciales(ByVal Nombre As String, mDatos)
Dim pos1 As Byte, pos2 As Byte
pos1 = InStr(1,Nombre," ")
pos2 = InStr(pos1+1,Nombre," ")
mDatos(0)=UCase(Mid(Nombre,pos1+1,2))
mDatos(1)=UCase(Mid(Nombre,pos2+1,1))
mDatos(2)=UCase(Mid(Nombre,1,1))
End Sub
Function FechaRFC(ByVal Nacimiento As Date) As String
FechaRFC= Right(CStr(Year(Nacimiento)),2) & Format(Month(Nacimiento),"00" ) & Format(Day(Nacimiento),"00" )
End Function
Ejecuta el código primero ( F5 ) para verificar que obtenemos los resultados esperados, después agrega la variable mDatos a la ventana del observador ( F7 ) y ejecuta el código paso a paso ( F8 ), detente en la primer línea donde aparece la variable sNombre, para tener algo muy similar a la siguiente imagen.
Tal vez en la ventana del observador tendrás que darle un clic al símbolo del signo más a la izquierda del nombre de la variable para que te despliegue el contenido de la matriz, que, en esta caso, esta vacía. Continua ejecutando paso a paso ( F8 ) y detente en.
Reitero, tienes que ser muy observador, nota como al llegar a la línea donde llamamos a la subrutina, el código salta a dicha subrutina y muy importante, observa la ventana de llamadas como te muestra el nombre de la subrutina y además, los valores que se le están pasando, muy útil para saber si estamos estableciendo correctamente los valores. Continua la ejecución paso a paso y detente en.
Observa como ahora la matriz ya tiene datos y estos se muestran en la ventana del observador. Continua paso a paso hasta el inicio de la función FechaRFC y observa la ventana de llamadas que una vez más muestra la función y sus valores pasados.
Termina la ejecución de la macro ( F5 ) y observa que la pila de llamadas se vacía, así como el valor de las variable en la ventana del observador. Y sin querer queriendo dimos un breve repaso a varios temas vistos anteriormente. No se te olvide que las teclas F5 y F8 solo tienen efecto en la primer macro declarada en el modulo activo, para ejecutar paso a paso otras macros, establece primero un punto de ruptura en la linea que te interese dentro de dicha macro y después ejecutas la macro de forma normal para que se detenga en el punto de ruptura establecido, a partir de ahí ya puedes usar F8 para continuar paso a paso...
Más adelante, aprenderemos que el Observador también nos sirve para analizar objetos.
!Feliz programación¡
Si tienes dudas acerca de lo aquí explicado, tienes algún problema con AOO, o quieres ampliar la información, no dudes en dirigirte al Foro Oficial en español de Apache OpenOffice para Macros y API UNO |