Programación de Macros en Open Office con Open Basic
(Curso Intermedio de 42 Horas)
Escrito por: José Andrés Martínez Silva
Inspirado en: múltiples fuentes disponibles en el mundo de Software Libre
Con la ayuda de: cada uno de los alumnos que tomó este curso por primera vez
Material en constante revisión, desarrollo y ampliación Versión 0.2
El Profesor Ahora Cuenta con Excel...72
Mejorando lo Presente...74
Generando Gráficos a Partir de los Datos Existentes en una Hoja de Cálculo...78
Asociando los Macros a Documentos Específicos...80
Buscando Cadenas...80
Diálogos Personalizados para Macros...82
Integrando un Buscador en Línea a OO...82
Añadiendo un Diálogo a la Macro Anterior...83
Calculadora RPN programada en Open Basic...89
Capítulo 7...98
Introducción a Open Base...98
Implementando un Sistema para Control de Citas Básico...98
Integración de Macros a los Formularios de Base...105
Ejemplos de Programación de Macros con Bases de Datos...109
Macros y ejercicios con Hojas de Cálculo...114
Accediendo a Directorios y Archivos...119
Trabajando con DataPilot y alternativa al DataPilot...123
Macro que modifica los datos de un DataPilot y lo refresca de forma automática...127
Cuando DataPilot no es suficiente...128
Subformas en Base...131
Programando Diálogos MultiStep...139
Make a Table Query, desde Open Base...143
Bibliografía:...148
Programar muchas veces no es visto por la gente como un trabajo, al menos no con la remuneración que debería tener. Tienen razón quienes piensan que no es un trabajo, es más un reto creativo, el placer de dominar la máquina y hacerla funcionar a voluntad. Se equivocan quienes no son capaces de reconocer el valor real de esta tarea creativa, pues si no cuentan con nadie que controle la máquina por ellos, que harán
entonces en poder de la máquina y su software por defecto?
Presentación:
Existen muchas formas y lenguajes en los que se puede programar, existen también muchos paradigmas y teorías que sirven de guía a los desarrolladores, pero en último caso será la mente del programador la que decida que solución dar al problema al que se enfrenta.
En las páginas siguientes se desarrollará un curso orientado a aquellas personas que desean aprender a escribir macros para Open Office haciendo uso de Open Basic. El curso no exige un conocimiento previo en programación, aunque saber algo de C o C++ podría ayudar.
Convenciones:
Se emplearán las siguientes convenciones para indicar partes claves del texto:
Este símbolo indica el comienzo de una explicación detallada
Este símbolo precede una nota importante para tener en cuenta a la hora de estar trabajando
Capítulo 1:
Introducción:
Open Basic (equivalente a StarOffice Basic) es un lenguaje de programación perteneciente a la familia de lenguajes tipo Basic (Beginners Allpurpose Symbolic Instruction Code1), es similar a Visual Basic y Visual Basic for Applications de Microsoft, aunque no cuenta con todas sus características.
Open Basic es un lenguaje interpretado línea por línea, esto quiere decir que el fin de línea es algo digno de tener en cuenta cuando se esté escribiendo un programa. Cuando la instrucción que se pretenda escribir no quepa en una sola línea puede emplearse el símbolo _ para escribir varias líneas como una sola:
ResultadoNomina = (calculo1 * calculo2)/numero_personas + _ (porcentajeobtenido * 90) – 8*(numeroaleatorio2 + 100) + _ otrosvalores
Por otra parte, si en algún momento se desea usar una sola línea para ingresar varias instrucciones cortas, puede dividirse la línea empleando el símbolo :
aux1 = 5 + topic1 : aux2 = 10 + topic3 : aux3 = aux1 + aux2
Aunque líneas largas y cortas son soportadas por el lenguaje, es importante tener siempre en cuenta que al momento de escribir un programa debe pensarse no sólo en los usuarios finales del mismo, sino en los “lectores” del código fuente2, es decir aquellos programadores que querrán ampliar o modificar el programa original, e incluso el mismo autor del programa quien puede retomarlo meses después. Siempre será más fácil para cualquiera de estos lectores, entender un código escrito de forma clara y limpia, que uno escrito de forma descuidada. Por esta razón es importante mantener el código fuente tan limpio y claro como sea posible.
1 Encuentra más información acerca de BASIC en el siguiente enlace: http://es.wikipedia.org/wiki/BASIC 2 Recuerde que usted ahora está usando Software Libre por lo tanto debe comenzar a pensar como un
Por dónde comenzar?
Lo primero que debe hacerse para comenzar a programar con Open Basic es cargar Open Office en cualquiera de sus componentes, bien sea el procesador de texto, la hoja de cálculo, la base de datos, etc. Para este ejemplo en particular se trabajará con el componente hoja de cálculo.
Paso 1: inicie la hoja de cálculo de Open Office como lo hace habitualmente
Paso 3: seleccione el item Standard que se encuentra dentro del grupo My Macros y de click sobre el botón New:
Paso 4: aparecerá frente a usted un cuadro de diálogo solicitándole el nombre de su módulo – un módulo es un conjunto de macros, piense en él como un programa , diligencie el nombre que desee y de click sobre el botón aceptar, acto seguido aparecerá el IDE3 de Open Office para el desarrollo de programas con Open Basic:
Importante: el nombre de un módulo NO puede contener espacios en blanco ni caracteres especiales como tildes, ñ, etc...
Código de Muestra
Al cargarse por primera vez el IDE en un nuevo módulo, aparece un código de muestra con algunos elementos que conviene aclarar de una vez:
REM ***** BASIC *****
Sub Main
End Sub
La palabra REM indica un comentario, es decir una línea de código que no se ejecuta, pero que se incluye en el código con algún fin, generalmente el de documentar un punto importante del código o el de presentar los créditos de un tercero cuyo código está siendo empleado para un desarrollo propio.
La palabra Sub indica el comienzo de una subrutina dentro del módulo, es decir una parte del módulo que realiza una acción específica. Las subrutinas se comienzan con la palabra Sub seguida del nombre que se le quiera dar y se terminan con la palabra End seguida de la palabra Sub.
Hola Mundo
En todos los lenguajes de programación que existen, siempre conviene comenzar por implementar un pequeño programa denominado Hola Mundo. Se trata en la mayoría de los casos de un par de líneas de código muy simples que tienen como único fin acercar al aprendiz a la fuente del conocimiento sin atemorizarlo por oscuras y profundas que puedan parecer sus aguas.
En el caso de Open Basic el Hola Mundo es tan simple como es posible:
REM Este es el Programa Hola Mundo en Open Basic
Sub HolaMundo
Para correr (ejecutar) este programa desde el IDE debe darse click sobre el botón como se ilustra en la imagen siguiente:
Luego de lo cual aparecerá el siguiente cuadro de diálogo:
Marcadores
En cualquier lenguaje de programación se requiere declarar variables y constantes, así como funciones. La palabra con la que se designa el nombre de estos elementos en Open Basic es Marcadores. Un Marcador es el nombre que se le da a una variable, a una constante o a una función. Existen algunas reglas que se deben respetar al momento de definir un Marcador:
1. Los Marcadores sólo pueden contener caracteres alfa numéricos y el signo de subrayado _.
2. Los caracteres especiales como las tildes, ñ, diéresis, no están permitidos 3. Un Marcador debe comenzar con una letra o un _
4. La longitud máxima de un Marcador es de 255 caracteres
escribiéndolo siempre de la misma manera. Es importante observar esta regla pues si bien en términos generales Open Basic no diferencia entre mayúsculas y minúsculas, al usar más adelante algunos elementos avanzados si será necesario respetar la forma de escritura de los marcadores, así que es mejor acostumbrarse a hacerlo desde un comienzo
Ejemplos de Marcadores admitidos
NombreMedico nombrepaciente aux1
_sumador
Ejemplo de Marcadores inválidos
MarcadorInválido 8suma
Otra forma de incluir comentarios en un programa de Open Basic es incluyéndolos directamente en la línea sobre la que se está trabajando, para hacer esto se incluye un apostrofe al final del código y a continuación el comentario, por ejemplo:
NombreMédico 'este Marcador es inválido por la tilde
Variables
Una variable es una representación simbólica que denota una cantidad o expresión4. En Open Basic no es necesario definir una variable antes de usarla, de hecho las variables son definidas al momento de ser usadas por primera vez, a esta característica se le conoce con el nombre de Declaración Implícita de variables. Sin embargo si bien esta característica puede parecer atractiva a simple vista en realidad se puede convertir en fuente de problemas, ya que un simple error tipográfico podría declarar una nueva variable y generar un resultado desconcertante en un programa, por ejemplo en el siguiente fragmento de código:
Sub ErrorFacilDeCometer
aux1 = 5 'se declara una variable aux1 con el valor de 5 b = aux*2 'se declara b para almacenar el valor de aux1 X 2 'pero por accidente se cambia el nombre de aux1 a aux
Print b 'el resultado no sera 10 como se podria esperar End Sub
Para evitar este tipo de problemas Open Basic cuenta con la opción de forzar la declaración Explícita de las variables que se deseen usar, para activar esta opción debe incluirse la siguiente línea al comienzo de cada programa:
Option Explicit
El mismo código anterior incluyendo esta opción se ve de la siguiente forma:
REM Declaracion Explicita de Variables
Option Explicit 'de esta forma se obliga a declarar cada variable
'antes de poder usarla
Sub ComoEvitarlo
Dim aux1 'se declara la variable aux1 aux1 = 5 'aux1 recine el valor de 5 Dim b 'se declara b
b = aux*2 'b almacena el valor de aux1 X 2
'pero por accidente se cambia el nombre de aux1 a aux Print b 'el resultado no sera 10 como se podria esperar End Sub
Ahora cuando se intenta ejecutar el programa aparece el siguiente mensaje de error:
De esta forma es imposible declarar accidentalmente variables y se tiene un mayor control sobre el programa que se está desarrollando, por lo tanto es una opción altamente recomendada y se usará a partir de este punto durante el resto de este curso.
Tipos de Datos
Cuando una variable es definida de la forma: Dim Nombre, se le está asignando implícitamente el tipo variant. Esto permite que la variable almacene cualquier tipo de datos, un número entero, una cadena alfanumérica, etc. Sin embargo es preferible ser explícito a la hora de definir el tipo de una variable. La siguiente tabla ilustra las diferentes declaraciones que se deben usar para los diferentes tipos de datos soportados por Open Basic:
Tipo de Dato Forma de Declaración Forma Alternativa Valores Almacenados Entero Dim Var1 As Integer Dim Var1% 32768, 32767
Cadena Dim Var1 As String Dim Var1$ Hola Mundo!
Entero Largo Dim Var1 As Long Dim Var1& 2147483648, 2147483647 Simple Dim Var1 As Single Dim Var1! Valores positivos o
negativos entre 3.402823 x 1038 y 1.401298 x 1045 Doble (los de
mayor precisión)
Dim Var1 As Double Dim Var1# Valores positivos o negativos entre 1.79769313486232 x 10308 y 4.94065645841247 x 10 324
Moneda Dim Var1 As Currency Dim Var1@ Valores entre
922337203685477.5808 y +922337203685477.5808
Boolean Dim Var1 As Boolean True, False
Date Dim Var1 As Date Fecha
Práctica con Tipos de Dato Numéricos
El siguiente ejercicio pretende demostrar la diferencia entre trabajar con tipos de dato Double y tipos de dato Integer
REM Ejercicio con tipos de datos numericos
Option Explicit 'se prefiere la declaracion explicita de variables
Sub ProfeCuchilla
REM esta subrutina representa a un profesor muy exigente REM que esta calificando a uno de sus alumnos
REM como buen profesor cuchilla no sube una decima
Dim Parcial1 As Double Dim Parcial2 As Double Dim Parcial3 As Double
' La declaracion de estas variables se habria podido realizar en una
' sola linea de la siguiente forma:
' Dim Parcial1 As Double, Parcial2 As Double, Parcial3 As Double
Dim ExamenFinal As Double Dim NotaFinal As Double
Parcial1 = 3.01 Parcial2 = 2.21 Parcial3 = 3.70
ExamenFinal = 3.00
NotaFinal = Parcial1 + Parcial2 + Parcial3 + ExamenFinal NotaFinal = NotaFinal/4
Print NotaFinal
End Sub
Pero si al mismo ejercicio se le introduce el siguiente cambio:
REM Ejercicio con tipos de datos numericos
Option Explicit 'se prefiere la declaracion explicita de variables
Sub ProfeCuchilla
REM esta subrutina representa a un profesor muy exigente REM que esta calificando a uno de sus alumnos
REM como buen profesor cuchilla no sube una decima
Dim Parcial1 As Double Dim Parcial2 As Double Dim Parcial3 As Double
' La declaracion de estas variables se habria podido realizar en una
' sola linea de la siguiente forma:
' Dim Parcial1 As Double, Parcial2 As Double, Parcial3 As Double
Dim ExamenFinal As Double
Dim NotaFinal As Integer 'El profe ya no es tan cuchilla 'y redondea la nota
Parcial1 = 3.01 Parcial2 = 2.21 Parcial3 = 3.70
ExamenFinal = 3.00
NotaFinal = Parcial1 + Parcial2 + Parcial3 + ExamenFinal NotaFinal = NotaFinal/4
Print NotaFinal
End Sub
Así como en el ejercicio anterior se definieron valores de punto flotante, también pueden definirse valores exponenciales como: 1.34E4; para otro tipo de valores como los hexadecimales se deben definir variables tipo LONG que los almacenen y se ingresan de la siguiente forma: &HEE, &H02; es decir siempre antecedidos por los símbolos &H
Vectores y Matrices
Un vector es un arreglo unidimensional, es decir una fila o columna de posiciones donde se pueden almacenar objetos – variables. Una matriz es un arreglo bidimensional, es decir un conjunto de filas y columnas de posiciones donde se pueden almacenar objetos – variables.
Para definir un vector se emplea una sintaxis como la utilizada para definir cualquier otro tipo de variable, pero luego del marcador y dentro de paréntesis se especifica el tamaño del vector – el número de posiciones:
Dim MiVector(5) As Integer
Para definir una matriz aplica la anterior explicación, pero con la adición de un valor más dentro de los paréntesis – quedando especificado de esta forma el número de columnas y el número de filas de la misma:
Dim MiMatriz(5, 3) As Integer
Práctica con Vectores
Para acceder a las diferentes posiciones de un Vector basta con indicar dentro del paréntesis la posición a la que se quiere acceder, para entender esto mejor se presenta de nuevo el ejemplo del Profesor Cuchilla empleando en esta oportunidad un Vector para almacenar las notas de los parciales:
REM Ejercicio con Vectores
Option Explicit 'se prefiere la declaracion explicita de variables
Sub ProfeCuchilla
REM esta subrutina representa a un profesor muy exigente REM que esta calificando a uno de sus alumnos
REM como buen profesor cuchilla no sube una decima
Dim NotasParciales(2) As Double NotasParciales(0) = 3.01
NotasParciales(1) = 2.21 NotasParciales(2) = 3.70
Dim ExamenFinal As Double
Dim NotaFinal As Double 'El profe ya no es tan cuchilla y redondea la nota
ExamenFinal = 3.00
NotaFinal = NotasParciales(0) + NotasParciales(1) + NotasParciales(2) + ExamenFinal
NotaFinal = NotaFinal/4 Print NotaFinal
End Sub
Operadores en Open Basic
ahora para poder continuar con el desarrollo de este curso.
Operadores Matemáticos:
+ : se emplea como se ha visto hasta ahora para realizar la adición entre números, pero también se puede utilizar para sumar fechas y concatenar cadenas de texto5
: se utiliza para sustraer números y fechas * : se emplea para multiplicar números / : se emplea para la división de números
\ : este operador también se utiliza para dividir números pero el resultado que devuelve es redondeado
^ : se utiliza para elevar enteros a potencias
MOD : este último operador se utiliza para obtener el residuo de una división
Operadores Lógicos:
Los operadores lógicos se emplean con tipos de datos enteros o booleanos, permiten relacionar dichos elementos mediante las reglas del álgebra de Boole6.
AND: Operación de Y Lógico OR: Operación de O Lógico XOR: Operación de O exclusivo NOT: Negación
EQV: Prueba de equivalencia
IMP: Implicación (si la primera expresión es verdadera, la segunda también debe serlo)
Operadores de Comparación:
Los operadores de comparación permiten – valga la redundancia – comparar dos variables de cualquier tipo.
= : Igualdad, aplica a números, fechas y cadenas de texto <> : Desigualdad, aplica a números, fechas y cadenas de texto
> : Comprobación de mayor que, aplica a números, fechas y cadenas de texto
>= : Comprobación de mayor o igual que, aplica a números, fechas y cadenas de texto < : Comprobación de menor que, aplica a números, fechas y cadenas de texto
<= : Comprobación de menor o igual que, aplica a números, fechas y cadenas de texto
Capítulo 2:
Control de Flujo:
Los ejemplos presentados anteriormente corresponden a una clase muy básica de programas, una en la cual dados unos datos de entrada se realizan operaciones aritméticas sobre los mismos y se imprime el resultado. A partir de este punto se comenzará a evaluar la información sobre la que se está trabajando y a tomar decisiones dependiendo de los resultados de dicha evaluación.
If ... Then ... Else
Una de las expresiones para control de flujo de un programa que más se emplea es la de evaluar un valor y tomar una decisión si se cumple determinado valor . Retomando el ejemplo del profesor anterior, se podría presentar una nota más amable – no necesariamente más alegre al alumno en cuestión :
REM Ejercicio con Vectores
Option Explicit 'se prefiere la declaracion explicita de variables
Sub ProfeCuchilla
REM esta subrutina representa a un profesor muy exigente REM que esta calificando a uno de sus alumnos
REM como buen profesor cuchilla no sube una decima
Dim NotasParciales(2) As Double NotasParciales(0) = 3.01
NotasParciales(1) = 2.21 NotasParciales(2) = 3.70
Dim ExamenFinal As Double Dim NotaFinal As Double
ExamenFinal = 3.00
NotaFinal = NotasParciales(0) + NotasParciales(1) + NotasParciales(2) + ExamenFinal
NotaFinal = NotaFinal/4
mensaje
If NotaFinal < 3.0 Then
Print "Usted ha reprobado el curso, su nota final es: " + NotaFinal
REM en la linea anterior se emplea + para concatenar variables
Else
Print "Usted ha aprobado el curso, su nota final es: " + NotaFinal
End If
End Sub
La ejecución de este programa ahora arroja el siguiente resultado:
Pero si las notas del estudiante son otras, el mensaje también cambia:
REM Ejercicio con Vectores
Option Explicit 'se prefiere la declaracion explicita de variables
Sub ProfeCuchilla
Dim NotasParciales(2) As Double NotasParciales(0) = 3.01
NotasParciales(1) = 2.21 NotasParciales(2) = 3.70
Dim ExamenFinal As Double Dim NotaFinal As Double
ExamenFinal = 3.20
NotaFinal = NotaFinal/4
REM dependiendo del resultado de la operacion se le muestra un mensaje u otro al usuario
If NotaFinal < 3.0 Then
Print "Usted ha reprobado el curso, su nota final es: " + NotaFinal REM en la linea anterior se emplea + para concatenar variables Else
Print "Usted ha aprobado el curso, su nota final es: " + NotaFinal End If
End Sub
Expresiones If Anidadas
Comúnmente se requiere la evaluación en cadena de varias expresiones If, es decir que una vez evaluada una condición se requiera evaluar una segunda condición. Para lograr este propósito es necesario usar varias instrucciones If “anidadas”. Otra posibilidad es que evaluada como falsa una primera condición se requiera evaluar la validez de una segunda condición, para lo cual se emplea la Instrucción ElseIf, el siguiente ejemplo ilustra mejor esta idea:
Sub CondicionesAnidadas
Dim EdadAsistente As Integer
Dim ClasificacionPelicula As String
EdadAsistente = 15
ClasificacionPelicula = "E"
If EdadAsistente < 18 Then
Print "Este asistente no puede ingresar a la pelicula1"
Else
Print "Ingreso Permitido" End If
ElseIf ClasificacionPelicula <> "R" Then Print "Pelicula Apta para Todo Publico" End If
End Sub
Estructura de Control Select Case
En Ocasiones el anidamiento consecutivo de estructuras If hace que el código pierda legibilidad, por este motivo y porque se trata de una forma más adecuada de solucionar las situaciones en las cuales se deben realizar validaciones encadenadas se emplea la estructura de control Select.
La forma básica de emplear esta estructura es la siguiente:
Select Case NombreDeLaVariable 'se abre estructura de control Case Opcion1: 'se define el valor número 1 a probar
instrucciones para esta opcion 'que hacer en este caso Case Opcion2:
instrucciones para esta opcion 'que hacer en este caso ...
Case OpcionN:
instrucciones para esta opcion 'que hacer en este caso Case Else:
instrucciones para esta opcion 'que hacer en cualquier otro caso
End Select 'Se cierra la estructura de control
El mismo ejemplo del control de acceso a las películas puede implementarse usando una estructura de control SELECT de la siguiente manera, se adicionó la validación para películas XXX ya que como se plantea el ejercicio la primera vez un menor de edad podría ingresar a una película cualquiera que no fuera clasificación R:
Ingreso a peliculas – explicación SELECT CASE
Option Explicit 'se prefiere la declaracion explicita de variables
Sub CondicionesAnidadas
Dim EdadAsistente As Integer
Dim ClasificacionPelicula As String
EdadAsistente = 18
ClasificacionPelicula = "YXX"
Select Case ClasificacionPelicula Case "E":
Print "Pelicula Apta para Todo Publico" Case "R":
If EdadAsistente < 18 Then
Print "Pelicula Solo Adultos" Else
Print "Ingreso Permitido" End If
Case "XXX":
If EdadAsistente < 18 Then
Print "Pelicula Solo Adultos XXX" Else
Print "Ingreso Permitido" End If
Case Else:
Print "Ingrese bajo su propia responsabilidad" End Select
End Sub
Dado que en el caso de que la variable ClasificacionPelicula valga R o valga XXX se realizan las mismas operaciones puede reescribirse el código anterior de la siguiente forma:
REM Ejercicio para Ingreso a Peliculas
Option Explicit 'se prefiere la declaracion explicita de variables
Dim EdadAsistente As Integer
Dim ClasificacionPelicula As String
EdadAsistente = 17
ClasificacionPelicula = "R"
Select Case ClasificacionPelicula Case "E":
Print "Pelicula Apta para Todo Publico" Case "XXX","R":
If EdadAsistente < 18 Then
Print "Pelicula Solo Adultos XXX" Else
Print "Ingreso Permitido" End If
Case Else:
Print "Ingrese bajo su propia responsabilidad" End Select
End Sub
Bucles o ciclos de ejecución
Una estructura de control muy importante es aquella que permite ejecutar varias veces la misma instrucción hasta que cierta condición es cierta. Open Basic provee dos estructuras para realizar este tipo de tareas. La primera de ellas es la estructura For ... Next, en la cual una instrucción se realiza hasta el momento en que el valor del contador del bucle o ciclo es alcanzado. Su sintáxis básica es la siguiente:
For NombreVariable = ValorInicial To Valor Final Instrucciones a realizar
Next NombreVariable 'se incrementa la variable que actua como contador
Determinando los números pares
Empleando lo visto hasta el momento y utilizando la estructura de control For Next, se presenta el siguiente ejemplo, el cual imprime en pantalla los números pares que existen en el rango 1 a 10:
REM Ejercicio para aprender a trabajar con Ciclos
Option Explicit 'se prefiere la declaracion explicita de variables
Sub BuclesEjemplo1
REM La idea de este ejemplo es ilustrar el uso REM basico de la estructura For Next
REM El ejemplo imprime los numeros pares del 1 al 10
Dim Contador As Integer Contador = 1
For Contador = 1 To 10
If Contador MOD 2 = 0 Then
Print Contador ," es un numero par " REM Usando la , para concatenar cadenas Else
End If Next Contador
End Sub
Empleando Do While Loop
Como se dijo anteriormente la principal diferencia entre las dos estructuras para control de ciclos de Open Basic, está en que Do ... Loop no hace uso de un contador sino de una condición lógica, las condiciones lógicas que pueden usarse son las siguientes:
Imprimiendo los números menores que la mitad del número mayor
Para ilustrar mejor el uso de la estructura Do While Loop se presenta el siguiente código de ejemplo. En el mismo se definen dos variables: NumeroMenor y NumeroMayor. La idea del ejemplo es que el ciclo ejecutará las instrucciones que contiene siempre y cuando la diferencia entre el NumeroMenor y el NumeroMayor sea menor que la mitad del NumeroMayor:
REM Ejercicio para aprender a trabajar con Ciclos
Option Explicit 'se prefiere la declaracion explicita de variables
Sub BuclesEjemplo2
REM La idea de este ejemplo es ilustrar el uso REM basico de la estructura Do While Loop
Dim NumeroMayor, NumeroMenor As Integer NumeroMenor = 1
NumeroMayor = 10
REM Mientras el NumeroMenor sea menos que la mitad REM del NumeroMayor se ejecutaran las instrucciones REM del ciclo
Do While NumeroMayorNumeroMenor > NumeroMayor/2
Print NumeroMenor," es menor que la mitad de",NumeroMayor NumeroMenor = NumeroMenor+1
Loop
End Sub
Do Loop While
Es muy similar al caso anterior, pero sólo realiza la validación luego de haber ejecutado por primera vez el contenido del bucle. De esta forma garantiza que al menos se ejecute una vez. Empleando esta estructura el ejemplo anterior quedaría de la siguiente forma:
Option Explicit 'se prefiere la declaracion explicita de variables
Sub BuclesEjemplo2
REM La idea de este ejemplo es ilustrar el uso REM basico de la estructura Do While Loop
Dim NumeroMayor, NumeroMenor As Integer NumeroMenor = 1
NumeroMayor = 10
REM Mientras el NumeroMenor sea menos que la mitad REM del NumeroMayor se ejecutaran las instrucciones REM del ciclo
Do
Print NumeroMenor," es menor que la mitad de",NumeroMayor NumeroMenor = NumeroMenor+1
Loop While NumeroMayorNumeroMenor > NumeroMayor/2
End Sub
Sin embargo para este caso en particular los resultados de la ejecución no difieren.
Do Until Loop
Mientras que en Do While se ejecutan las instrucciones contenidas en el ciclo mientras una condición es válida, en Do Until se ejecutan las instrucciones que se encuentran en el ciclo hasta que una condición sea cierta. Por ejemplo el siguiente código ilustra como se puede emplear esta estructura de control para imprimir las fechas anteriores a un día específico – en el caso del ejemplo el que corresponde a la variable FechaDeCorte :
REM Ejercicio empleando el Do Until Loop
Option Explicit 'se prefiere la declaracion explicita de variables
Sub BuclesEjemplo2
REM La idea de este ejemplo es ilustrar el uso REM basico de la estructura Do Until Loop
'Las fechas se ingresan en formato MM/DD/YYYY FechaDeCorte = "08/31/2007"
FechaActual = "08/13/2007"
Do Until FechaActual = FechaDeCorte
Print "Aun no es dia de corte: "+FechaActual FechaActual = FechaActual+1
Loop
Print "Fecha de corte alcanzada: "+FechaActual
End Sub
Do Loop Until
Al igual que con Do Loop While, la única diferencia entre esta cuarta forma y su similar, es que el contenido del bucle se ejecuta antes de validar la condición necesaria para continuar.
Procedimientos y Funciones
Cuando un programa comienza a crecer en tamaño debido a la complejidad del problema que debe resolver, se hace uso de los procedimientos y las funciones para dividirlo en unidades más pequeñas. La diferencia fundamental entre un procedimiento y una función es que la segunda retorna un valor, mientras que el primero realiza una tarea pero no retorna ningún valor. Una vez escritas las funciones y los procedimientos, pueden ser llamados desde la rutina de ejecución principal.
La forma básica de un procedimiento es la siguiente:
Sub NombreProcedimiento
Por otra parte, la forma básica de una función es la siguiente:
Function7 NombreFuncion
'codigo que debe ejecutarse
NombreFuncion = ValorRetorno 'las funciones retornan un valor End Function
Dado que las funciones devuelven un valor, es posible especificar el tipo de valor que devuelven al momento de su declaración de forma similar a como se hace con la declaración de variables:
Function NombreFuncion As Double 'codigo que debe ejecutarse
NombreFuncion = ValorRetorno 'retorna un valor Double End Function
Adicionalmente las funciones y los procedimientos pueden recibir parámetros, esto es especialmente útil cuando se desea realizar por fuera de la rutina principal de ejecución una serie de operaciones sobre valores dados o capturados al momento de correr el programa. Para definir los parámetros que recibe una función y el tipo de los mismos se emplea la siguiente sintaxis:
Function NombreFuncion(Param1 As Double, Param2 As Double) As Double 'codigo que debe ejecutarse
NombreFuncion = ValorRetorno 'retorna un valor Double End Function
Calculando en que momento y porque valor se debe renovar el seguro del carro
El siguiente ejemplo ilustra el uso de funciones para determinar en que momento y por que valor se debe pagar el seguro del auto:
REM Introduccion a los procedimientos y Funciones
Option Explicit
Sub Main 'esta sera la rutina central del programa
Dim ValorCarro As Long ValorCarro = 20000000 Dim FechaSOAT As Date FechaSOAT = "08/13/2006"
Dim DebeRenovarSOAT As Boolean
DebeRenovarSOAT = CalculaFecha(FechaSOAT)
If DebeRenovarSOAT = False Then
Print "aun no es necesario renovar el SOAT" Else
Print "debe renovar el SOAT, el valor a pagar es de: " + CalculaValorAPagar(ValorCarro)
End If
End Sub
Sub CalculaFecha(Fecha As Date) As Boolean Dim Aux As Date
Aux = Date 'De esta forma se asigna la fecha actual a una variable
If Aux Fecha < 365 Then 'aun no ha pasado un ano desde la renovacion
CalculaFecha = False Else
CalculaFecha = True End If
End Sub
Sub CalculaValorAPagar(Valor As Long) As Double CalculaValorAPagar = Valor * 1/100
End Sub
Es posible – y constituye una buena práctica de programación – incluir puntos de salida en las funciones en caso de que algún error se presente el siguiente ejemplo ilustra como hacerlo en el caso del ejercicio del carro planteado párrafos atrás8:
REM Introduccion a los procedimientos y Funciones
Option Explicit
Sub Main 'esta sera la rutina central del programa
Dim ValorCarro As Long ValorCarro = 20000000 Dim FechaSOAT As Date FechaSOAT = "08/05/2006"
Dim DebeRenovarSOAT As Boolean
DebeRenovarSOAT = CalculaFecha(FechaSOAT)
If DebeRenovarSOAT = FALSE Then
Print "aun no es necesario renovar el SOAT" Else
Print "debe renovar el SOAT, el valor a pagar es de: " + CalculaValorAPagar(ValorCarro)
End If
End Sub
Sub CalculaFecha(Fecha As Date) As Boolean Dim Aux As Date
Aux = Date 'De esta forma se asigna la fecha actual a una variable
If Aux Fecha < 365 Then 'si aun no ha pasado un ano desde la renovacion del SOAT
CalculaFecha = False Else
CalculaFecha = True End If
End Sub
Sub CalculaValorAPagar(Valor As Long) As Double
Dim Error As Boolean
If Valor < 0 Then 'En caso de que el valor del carro sea negativo Error = True Else End If If Error Then Exit Sub End If CalculaValorAPagar = Valor * 1/100 End Sub Recursividad Por recursividad se entiende la capacidad que tiene una función de llamarse a si misma hasta que encuentre el valor deseado. En Open Basic es posible incluir funciones recursivas. Para ilustrar mejor el concepto se incluye a continuación uno de los ejemplos clásicos de recursividad, el cálculo del factorial9:
Sub Main Msgbox CalcularFactorial( 3 ) Msgbox CalcularFactorial( 42 ) Msgbox CalcularFactorial( 3.14 ) End Sub Function CalcularFactorial( Numero ) If Numero < 0 Or Numero <> Int( Numero ) Then
Determinando el Ingreso al Cine mediante funciones El siguiente ejercicio hace uso de los conceptos vistos hasta el momento para recrear un control de acceso al cine basado en dos criterios, la edad del asistente y la clasificación de la película: REM Ejercicio para aprender a trabajar con Funciones Option Explicit 'se prefiere la declaracion explicita de variables Sub Main 'Hilo central de ejecucion Dim FechaNacimiento As Date Dim ClasificacionPelicula As String FechaNacimiento = "08/18/1989" ClasificacionPelicula = "R"
If DeterminarEdadMinima(ClasificacionPelicula) <= CalcularEdad(FechaNacimiento) Then10
MsgBox("Bienvenido a la Pelicula",0,"Taquilla Cine") Else
DeterminarEdadMinima = 12*365 CASE ELSE
DeterminarEdadMinima = 0 END SELECT
End Sub
Capítulo 3:
La Biblioteca de Funciones de Open Basic:
Open Basic cuenta con una serie de funciones incluidas que hacen más fácil el trabajo diario del programador, a continuación se irán presentando funciones que podrán usarse para tareas como: conversión de variables, comprobación del contenido de las variables, manipulación de cadenas de texto, trabajo con fechas y monedas, diálogos de texto simple y diálogos de texto con que capturan valores.
Funciones para Conversión de Variables
En Open Basic existe la conversión implícita de variables, de tal manera una variable puede cambiar su tipo cuando es asignada a otra del tipo deseado, por ejemplo:
REM 'Conversion de variables
Option Explicit
Sub ConversionImplicita
Dim A As Integer Dim B As String
A = 100 B = A
Print B End Sub
Sin embargo, al igual que los otros ejemplos de acciones implícitas, los resultados de trabajar de esta manera no son siempre los deseados, por esta razón es mejor emplear las funciones que convierten las variables de forma explicita de un tipo de datos a otro:
Nombre Descripción Parámetros de Entrada
CStr Convierte una variable de cualquier tipo a una cadena de texto
Una variable de cualquier tipo
entero – si se intenta convertir una cadena de caracteres el resultado obtenido es 0 en sistemas tipo UNIX
CLng Convierte una variable de cualquier tipo a un tipo Long
Una variable de cualquier tipo – si se intenta convertir una cadena de caracteres el resultado obtenido es 0 en sistemas tipo UNIX
CSng Convierte una variable de cualquier tipo a un tipo Simple
Una variable de cualquier tipo – si se intenta convertir una cadena de caracteres el resultado obtenido es 0 en sistemas tipo UNIX
CDbl Convierte una variable de cualquier tipo a un tipo Double
Una variable de cualquier tipo – si se intenta convertir una cadena de caracteres el resultado obtenido es 0 en sistemas tipo UNIX
CBool Convierte una variable de cualquier tipo a un tipo Boolean
Una variable de cualquier tipo. Si se convierte el entero 1 el resultado es True, si se convierte el entero 0 el resultado es False
Val Convierte una variable de tipo string a una de tipo entero
Una cadena que represente un valor numérico
CDate Convierte una variable a tipo Date
Funciones para Validación del Contenido de las Variables
Option Explicit
Sub ConversionExplicitaError Dim MyVar2 As String Dim MyVar5 As Date
MyVar2 = "27022006" MyVar5 = CDate(MyVar2)
Print MyVar5
End Sub
Al intentar ejecutarlo se obtiene el siguiente mensaje de error:
Existen tres funciones básicas para comprobar el contenido de las variables:
Nombre Descripción Parámetros de Entrada
IsNumeric Determinar si el contenido de una variable es numérico
La variable que se desea evaluar
IsDate Determinar si el contenido de
una variable es una fecha
La variable que se desea evaluar
IsArray Determinar si el contenido de una variable es un arreglo
La variable que se desea evaluar
Empleando la segunda de estas funciones es posible modificar el código anterior para evitar el mensaje de error:
REM 'Conversion de variables
Option Explicit
Dim MyVar2 As String Dim MyVar5 As Date
MyVar2 = "27022006" If IsDate(MyVar2) Then
MyVar5 = CDate(MyVar2) Print MyVar5
Else
Print "La variable no es una fecha, no puede ser convertida"
End If
End Sub
Las variables cuentan con diferentes niveles de acceso, dentro de Open Basic se habla de los siguientes: público, privado, global. Una variable privada es accesible únicamente dentro de la sub rutina dentro de la cual se definió, mientras que una variable pública es accesible para todas las sub rutinas de un módulo. Una variable global es accesible para todos los módulos definidos dentro de una misma librería en Open Office. El acceso a las variables por defecto es definido como privado a menos que se especifique lo contrario.
Trabajando con Diferentes Niveles de Acceso:
Los siguientes ejemplos ilustran los diferentes resultados que se obtienen en un mismo programa al modificar los niveles de acceso de las variables empleadas.
REM 'Modificando el acceso a las variables
Option Explicit
Sub Main
Dim MyVar1,MyVar2 As Integer 'Las variables son privadas por defecto
MyVar1=10 MyVar2=1
Print Sumar(MyVar1,MyVar2) Print Restar(MyVar1,MyVar2) Print MyVar1
Sub Sumar(Input1, Input2 As Integer) As Integer Dim Aux As Integer
Aux = Input1+Input2
'MyVar1 = 0 'se modifica el valor de la variable dentro de esta funcion
Sumar = Aux End Sub
Sub Restar(Input1, Input2 As Integer) As Integer Dim Aux As Integer
Aux = Input1Input2
'MyVar2 = 0 'se modifica el valor de la variable dentro de esta funcion
Restar = Aux End Sub
En esta primera versión del programa todo funciona como es de esperarse, las líneas comentadas que modifican el valor de las variables definidas en la sub rutina Main deben dejarse comentadas para que el programa pueda ser ejecutado, de lo contrario aparecerá un error como el siguiente:
En el segundo escenario las variables han sido declaradas públicas y los resultados de la ejecución cambian por completo:
REM 'Modificando el acceso a las variables
Option Explicit
' las variables son publicas se declaran por fuera del procedimiento Public MyVar1 As Integer
Public MyVar2 As Integer
Sub Main
MyVar1=10 MyVar2=1
Print Sumar(MyVar1,MyVar2) Print Restar(MyVar1,MyVar2) Print MyVar1
End Sub Sub Sumar(Input1, Input2 As Integer) As Integer Dim Aux As Integer Aux = Input1+Input2 MyVar1 = 0 'se modifica el valor de la variable dentro de esta funcion Sumar = Aux End Sub Sub Restar(Input1, Input2 As Integer) As Integer Dim Aux As Integer Aux = Input1Input2 MyVar2 = 0 'se modifica el valor de la variable dentro de esta funcion Restar = Aux End Sub La ejecución de este programa arroja ahora los resultados: 11, 1, 0, 0; la razón de esto es que las variables son públicas y se pueden modificar en cualquier parte del programa. Funciones para Acceso a Cadenas Cuando se desea trabajar con variables de tipo texto Open Basic cuenta con funciones que facilitan la búsqueda y el acceso a la información dentro de éstas. Función (parámetros) Descripción Resultado
Left(Cadena,n) Devuelve los caracteres de Cadena que se encuentren hasta n posiciones después del inicio
Left(“Hola Mundo”,5) = Hola⌴
Right(Cadena,n) Devuelve los caracteres de Cadena que se encuentren hasta n posiciones antes del final
Right(“Hola Mundo”,5) = Mundo
Mid(Cadena,ori,n) Devuelve n caracteres de Cadena contando a partir de la posición ori
Mid(“Hola Mundo”,2,4) = ola⌴
Funciones para Búsqueda y Reemplazo dentro de Cadenas
Open Basic cuenta con las siguientes funciones integradas que permiten la búsqueda dentro de variables tipo String y el reemplazo parcial o total del contenido de las mismas:
Función Parámetros Descripción Retorno
InStr ([Start As Long,] Text1 As String, Text2 As String[, Compare])
Realiza una búsqueda de la cadena Text2 dentro de la cadena Text1, a partir de la posición Start o desde el inicio de Text1 si este parámetro no se especifica. En caso de que el parámetro opcional Compare valga 0 la búsqueda es Case Sensitive
Un valor entero con la posición donde se encontró el inicio de la coincidencia o 0 en caso de no encontrar nada Mid (Text As String, Start As Long , Length As Long, TextR As String)
Print MiCadena1
End Sub
Buscar y Reemplazar Mejorado
El ejercicio anterior plantea un nuevo problema, cómo hacer para qué al cambiar la palabra Señor por Doctor se conserve el espacio entre el título y el nombre, las respuestas – brindadas por los primeros alumnos de este curso – a continuación:
Opción 1:
REM 'Manipulacion de cadenas
Option Explicit
Sub BusquedaYReemplazo
Dim MiCadena1 As String Dim Reemplazo As String Dim Cadena as String
MiCadena1 = "Señor Juan Ramón Vargas" Reemplazo = "Doctor"
Print MiCadena1
Mid(MiCadena1,1,6,"Doctor") 'la primera posicion de la cadena es 1 no 0
Cadena = Left(MiCadena1,6)+ " " + Right(MiCadena1,17) Print Cadena
End Sub
Opción 2:
REM 'Manipulacion de cadenas
Option Explicit
Sub BusquedaYReemplazo
Dim Tamano, TamanoReemplazo As Integer
MiCadena1 = "Señor Juan Ramón Vargas" Reemplazo = "Doctor"
Print MiCadena1
Tamano = Len(MiCadena1)
TamanoReemplazo = Len(Reemplazo)
Print Reemplazo + " " + Right (MiCadena1, Tamano TamanoReemplazo)
End Sub
Función para dar Formato a las Cadenas
En ocasiones luego de haber realizado los cálculos necesarios para obtener un valor, se desea presentar dicho valor de la forma más adecuada posible al usuario final, para formatear las variables de texto y presentarlas como se desee se utiliza la función Format:
Format (Number [, Format As String])
El formato que se desea dar se especifica como una cadena de texto, a esta cadena se le conoce con el nombre de plantilla y dentro de la misma es posible emplear los siguientes símbolos: el número cero (0), el símbolo número (#), el punto (.) , la coma (,) y el símbolo de moneda ($):
REM 'Formato a numero Option Explicit
Sub PresentarSueldo
Dim SueldoCalculado As Long
Dim Visualizacion,Plantilla As String
REM a continuacion se le daran diferentes formatos REM para su presentacion:
REM el simbolo $ se emplea para que aparezca en pantalla REM como dinero, el simbolo 0 se requiere para que el numero REM sea visible
Plantilla = "$0"
Visualizacion = Format(SueldoCalculado,Plantilla) Print Visualizacion
REM ahora se especifica una plantilla mas compleja en la cual REM se indica la forma en la que se desea presentar la cifra Plantilla = "$#,###,###.00"
Visualizacion = Format(SueldoCalculado,Plantilla) Print Visualizacion
Trabajando con Fechas
Aunque es posible asignar una fecha a una variable tipo Date mediante la asignación de una cadena de la forma “YYYY/MM/DD”, esto sólo funcionaría en los sistemas para los cuales se haya definido éste como el formato de fecha a utilizar. Para evitar problemas a la hora de portar aplicaciones de un equipo a otro o de un sistema operativo a otro es necesario utilizar la función DateSerial que incluye Open Basic. Su sintaxis básica es la siguiente: DateSerial (año, mes, día).
REM 'Trabajo con Fechas
Option Explicit
Sub FechasYHoras
Dim FechaNacimiento As Date
FechaNacimiento = DateSerial(1970,2,18)
Print "Fecha de Nacimiento: " + FechaNacimiento End Sub
Existe también la función TimeSerial que se emplea para definir registros de tiempo que serán almacenados en las variables tipo Date, su sintaxis básica es la siguiente: TimeSerial (hour, minute, second).
REM 'Trabajo con Fechas
Option Explicit
Sub FechasYHoras
FechaNacimiento = DateSerial(1970,2,18)
Print "Fecha de Nacimiento: " + FechaNacimiento
HoraNacimiento = TimeSerial(2,15,00)
Print "Hora de Nacimiento: " + HoraNacimiento
End Sub
Qué Hora es?
Open Basic cuenta con tres funciones que permiten saber la fecha, la hora y el momento actual (fecha + hora). Dichas funciones y su sintaxis se exponen a continuación:
Función Retorno
Date Devuelve la fecha actual
Time Devuelve la hora actual
Mensajes de Texto
Hasta el momento la salida de todos los programas presentados en el curso se ha realizado mediante la instrucción Print, esto está bien para comenzar a entender algunos conceptos básicos de programación sin embargo deja mucho que desear a la hora de interactuar con el usuario final11, por eso se presenta a continuación la función MsgBox la cual provee una forma más conveniente de mostrar información en pantalla.
MsgBox (Text As String [,Type As Integer [,Dialogtitle As String]])
La función MsgBox recibe tres parámetros de entrada, uno de ellos obligatorio correspondiente al texto que se desea mostrar los otros dos opcionales. El segundo parámetro es un número entero que se puede especificar para solicitar un tipo específico de ventana para el usuario, los valores posibles de este segundo parámetro son:
0 : Presenta una ventana con el botón OK – Aceptar únicamente 1 : Presenta una ventana con los botones Aceptar y Cancelar
2 : Presenta un diálogo de error con los botones: Abortar, Reintentar, Ignorar 3 : Presenta una ventana con los botones Si, No y Cancelar
4 : Presenta una ventana con los botones Si, No
5 : Presenta una ventana con los botones Reintentar y Cancelar 16 : Agrega un ícono de parada al diálogo que se está presentando 32 : Agrega un ícono de interrogación al diálogo que se está presentando 48 : Agrega un ícono de exclamación al diálogo que se está presentando 64 : Agrega un ícono de información al diálogo que se está presentando
El Tercer parámetro de la función es una cadena de texto que se usa como título del cuadro
11 “Programming today is a race between software engineers striving to build bigger and better idiotproof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.” Rick Cook, The Wizardry Compiled – tomado de:
de diálogo presentado al usuario.
Diálogos Básicos con MsgBox
Usando uno de los ejemplos anteriores se cambiará la forma de presentar la información al usuario usando MsgBox en lugar de Print y aprovechando los símbolos especiales para los mensajes de error.
REM Introduccion a los procedimientos y Funciones
Option Explicit
Sub Main 'esta sera la rutina central del programa
Dim ValorCarro As Long ValorCarro = 20000000 Dim FechaSOAT As Date FechaSOAT = "08/05/2006"
Dim DebeRenovarSOAT As Boolean
DebeRenovarSOAT = CalculaFecha(FechaSOAT)
If DebeRenovarSOAT = FALSE Then
MsgBox("aun no es necesario renovar el SOAT",0,"Resultados de la Consulta")
Else
If CalculaValorAPagar(ValorCarro) <> 0 Then
MsgBox("debe renovar el SOAT, el valor a pagar es de: " + CalculaValorAPagar(ValorCarro),48,"Resultados de la Consulta")
End If
End Sub
Sub CalculaFecha(Fecha As Date) As Boolean Dim Aux As Date
Aux = Date 'De esta forma se asigna la fecha actual a una variable
If Aux Fecha < 365 Then 'si aun no ha pasado un ano desde la renovacion del SOAT
CalculaFecha = False Else
CalculaFecha = True End If
End Sub
Sub CalculaValorAPagar(Valor As Long) As Double
Dim Error As Boolean
If Valor < 0 Then 'En caso de que el valor del carro sea negativo
Error = True Else
End If
If Error Then
MsgBox("El valor ingresado no es válido",16,"Valor Incorrecto")
Exit Sub End If
CalculaValorAPagar = Valor * 1/100 End Sub
Es posible especificar cual de los botones de un cuadro de diálogo se debe activar por defecto, para hacerlo se emplean las siguientes reglas: si se desea el primer botón activo por defecto, al valor del tipo de diálogo debe sumársele 128, si se desea que sea el segundo botón el activo por defecto debe sumársele 256 a dicho valor y, si se desea que sea el tercer botón la opción por defecto se suma 512 al valor que identifica el tipo de cuadro de diálogo. Un ejemplo de esto es el siguiente código, en el cual al aparecer un cuadro con los botones Aceptar y Cancelar se muestra como opción por defecto Cancelar, es decir el segundo botón de la ventana:
MsgBox("aun no es necesario renovar el SOAT",257,"Resultados de la Consulta")
Captura de Datos Mediante Cuadros de Diálogo
El siguiente paso en este curso consiste en comenzar a capturar los valores empleados en la ejecución de los programas directamente desde el usuario, en lugar de hacerlo mediante la declaración en código como se ha venido presentando hasta este punto. Para capturar los datos del usuario se emplea la función InputBox:
InputBox (Msg As String[, Title As String[, Default As String[, x_pos As Integer, y_pos As Integer]]]])
Los parámetros de esta función corresponden a:
Msg: el mensaje que se desea presentar al usuario solicitándole un valor Title: el título de la ventana
Default: el valor por defecto que debe mostrarse y capturarse en caso de no recibir entrada de datos por parte del usuario
Captura de datos con InputBox
REM Introduccion a los procedimientos y Funciones
Option Explicit
Sub Main 'esta sera la rutina central del programa
Dim ValorCarro As Long Dim FechaSOAT As Date Dim Aux As String Dim Aux2Date As Date
'A partir de este ejercicio los valores seran capturados 'y luego procesados
Aux = InputBox("Ingrese el valor de su vehículo: ","Cálculo de SOAT","1000000")
REM Dado que InputBox devuelve un string se emplea una variable Aux
REM para almacenar temporalmente la informacion capturada, luego se
REM emplean las funciones de conversion para llevarla al tipo requerido
ValorCarro = CLng(Aux)
Aux2Date = Date
Aux2Date = Aux2Date 365
Aux = InputBox("Ingrese la fecha en que renovó el seguro: ","Cálculo de SOAT",Aux2Date)
FechaSOAT = CDate(Aux)
Dim DebeRenovarSOAT As Boolean
DebeRenovarSOAT = CalculaFecha(FechaSOAT)
If DebeRenovarSOAT = FALSE Then
MsgBox("aun no es necesario renovar el SOAT",257,"Resultados de la Consulta")
If CalculaValorAPagar(ValorCarro) <> 0 Then
MsgBox("debe renovar el SOAT, el valor a pagar es de: " + CalculaValorAPagar(ValorCarro),48,"Resultados de la Consulta")
End If
End If
End Sub
Sub CalculaFecha(Fecha As Date) As Boolean Dim Aux As Date
Aux = Date 'De esta forma se asigna la fecha actual a una variable
If Aux Fecha < 365 Then 'si aun no ha pasado un ano desde la renovacion del SOAT
CalculaFecha = False Else
CalculaFecha = True End If
End Sub
Sub CalculaValorAPagar(Valor As Long) As Double
Dim Error As Boolean
If Valor < 0 Then 'En caso de que el valor del carro sea negativo
Error = True Else
End If
If Error Then
MsgBox("El valor ingresado no es válido",16,"Valor Incorrecto")
Exit Sub End If
CalculaValorAPagar = Valor * 1/100 End Sub
Capítulo 4:
UNO, la API de Open Office:
UNO: Universal Network Objects por sus siglas en inglés es una poderosa API12 con la que cuenta Open Office13, la cual puede ser utilizada desde diferentes lenguajes y brinda las herramientas necesarias para la construcción de macros que realicen tareas complejas sobre documentos e información existente.
Si bien Open Basic es un lenguaje por procedimientos, cuenta con los mecanismos necesarios para poder interactuar con los objetos de UNO, así también por el hecho de ser UNO un conjunto de objetos se hace necesario introducir en este punto algunos conceptos de la programación orientada a objetos que permitirán entender las explicaciones posteriores.
Utilización de UNO desde Open Basic
Para poder utilizar los objetos de UNO desde Open Basic es necesario declarar una variable de un tipo diferente a los vistos hasta ahora:
Dim ObjetoSimulado As Object
Una vez creado el objeto se debe inicializar asignándole un servicio:
ObjetoSimulado = createUnoService( com.sun.star.frame.Desktop )′ ′
Al momento de trabajar con documentos en Open Office, se emplean con mayor frecuencia los siguientes servicios:
com.sun.star.frame.Desktop : permite abrir, importar y crear documentos
com.sun.star.document.OfficeDocument : permite guardar, exportar e imprimir los documentos
12 http://en.wikipedia.org/wiki/API
Los servicios cuentan con interfaces, las interfaces son colecciones de métodos (funciones). El servicio com.sun.star.document.OfficeDocument provee la interfaz com.sun.star.frame.XComponentLoader la cual permite abrir documentos.
El servicio com.sun.star.frame.Desktop se carga por defecto al momento de iniciar Open Office y para acceder a él basta con invocar la variable global StarDesktop
Carga de un archivo con Open Basic
El siguiente ejemplo ilustra la forma en que se carga un documento existente en Open Office – para ejecutarlo exitosamente es indispensable que en el PC donde se corra exista un documento con el nombre requerido :
REM Cargar un archivo con Open Basic
Option Explicit
Sub Main
Dim Doc As Object Dim Url As String Dim Dummy()
Url = "file:///home/mad/Temp/pruebaclase.odt" 'formato URL14
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy())
End Sub
Creación de un Nuevo Documento
Así como es posible cargar un documento existente es posible crear un nuevo documento:
REM Crear un nuevo archivo con Open Basic
Option Explicit
Sub Main
Dim Dummy()
Dim Url As String
Dim Doc As Object
Url = "private:factory/swriter"
Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy())
End Sub
Capítulo 5:
Trabajando con Documentos de Texto:
Una vez presentados los conceptos básicos sobre UNO se presenta a continuación la información necesaria para comenzar a trabajar con documentos de texto desde Open Basic.
Elementos que Componen un Documento de Texto
En un documento de texto existen 4 clases básicas de información: el texto como tal, las plantillas que puedan haberse utilizado para el formato, los elementos diferentes de texto como tablas, gráficos, ecuaciones, y los parámetros de configuración global del documento.
La forma en que se recorren los documentos de texto en Open Office es utilizando enumeraciones, el siguiente ejemplo asume la existencia de un archivo de texto con párrafos en él:
REM Cargar un archivo con Open Basic
Option Explicit
Sub PruebaConDoc
Dim Doc As Object Dim Enum As Object
Dim ElementoTexto As Object ' Crear objeto documento
Doc = StarDesktop.CurrentComponent ' Crear objeto enumeración
Enum = Doc.Text.createEnumeration
' recorrer en bucle todos los elementos del texto While Enum.hasMoreElements
ElementoTexto = Enum.nextElement
If
ElementoTexto.supportsService("com.sun.star.text.TextTable") Then MsgBox "El bloque actual contiene una tabla."
End If
If
ElementoTexto.supportsService("com.sun.star.text.Paragraph") Then MsgBox "El bloque actual contiene un párrafo."
End Sub
La estructura de control de flujo While ... Wend resulta ideal cuando se requiere ejecutar una operación sobre un conjunto de elementos cuyo tamaño es desconocido de antemano y resulta, por esto mismo imposible usar un For ... Next
Si se utiliza la función MsgBox de la forma en que se presenta anteriormente se asume que los valores siguientes son: 0 y soffice
La instrucción ElementoTexto.supportsService permite saber si el objeto ElementoTexto soporta un servicio específico. Al decir: If ElementoTexto.supportsService("com.sun.star.text.TextTable") se está preguntando si el objeto ElementoTexto es de echo una Tabla dentro de un texto.
Trabajando con los Párrafos de un Texto
Es momento de integrar lo visto anteriormente con esta nueva parte de los objetos de UNO, el siguiente ejercicio presenta un programa que recorre un documento de texto y realiza ciertos reemplazos sobre el contenido de cada uno de los párrafos.
Sub ReemplazoEnDoc Dim Doc As Object
Dim Enumeracion As Object Dim ElementoTexto As Object
Doc = StarDesktop.CurrentComponent 'trabajar sobre el documento actual
Enumeracion = Doc.Text.createEnumeration While Enumeracion.hasMoreElements
ElementoTexto = Enumeracion.nextElement
If
ElementoTexto.supportsService("com.sun.star.text.Paragraph") Then
ElementoTexto.String =
ElementoTexto.String = Reemplazar(ElementoTexto.String, "e", "E")
ElementoTexto.String =
Reemplazar(ElementoTexto.String, "i", "I") End If Wend End Sub Esta rutina requiere una función adicional no definida en Open Office: Function Reemplazar(Origen As String, Busqueda As String, ParteNueva As String) Dim Resultado As String Dim PosInicial As Long Dim PosActual As Long Resultado = "" PosInicial = 1 PosActual = 1 If Busqueda = " " Then Resultado = Origen Else Do While PosActual <> 0 PosActual = InStr(PosInicial,Origen,Busqueda,0) If PosActual <> 0 Then
Resultado = Resultado +
Mid(Origen,PosInicial,PosActual PosInicial)
Resultado = Resultado + ParteNueva PosInicial = PosActual + Len(Busqueda) Else
Resultado = Resultado + Mid(Origen, PosInicial, Len(Origen)) End If ' Posicion <> 0 Loop End If Reemplazar = Resultado End Function