• No results found

open basic en 42 horas pdf

N/A
N/A
Protected

Academic year: 2020

Share "open basic en 42 horas pdf"

Copied!
150
0
0

Loading.... (view fulltext now)

Full text

(1)

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

(2)
(3)
(4)

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

(5)

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

(6)

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  All­purpose  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 

(7)

 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

(8)

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:

(9)

  Importante: el nombre de un módulo NO puede contener espacios en blanco ni  caracteres especiales como tildes, ñ, etc...

(10)

 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

(11)

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

(12)

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

(13)

 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

(14)

      '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.

(15)

 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 10­45 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

(16)

 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

(17)

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

(18)

  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

(19)

 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

(20)

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

(21)

<= : Comprobación de menor o igual que, aplica a números, fechas y cadenas de texto

(22)

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

(23)

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

(24)

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"

(25)

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

(26)

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

(27)

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

(28)

 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:

(29)

 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 NumeroMayor­NumeroMenor > 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:

(30)

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 NumeroMayor­NumeroMenor > 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

(31)

'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

(32)

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

(33)

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

(34)

 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

(35)

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

(36)

 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

(37)

DeterminarEdadMinima = 12*365 CASE ELSE

DeterminarEdadMinima = 0 END SELECT

End Sub

(38)

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

(39)

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

(40)

Option Explicit

Sub ConversionExplicitaError Dim MyVar2 As String Dim MyVar5 As Date

MyVar2 = "27­02­2006" 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

(41)

Dim MyVar2 As String Dim MyVar5 As Date

MyVar2 = "27­02­2006" 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

(42)

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 = Input1­Input2

'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

(43)

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 = Input1­Input2 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⌴

(44)

 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)

(45)

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

(46)

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

(47)

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

(48)

 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

(49)

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

(50)

 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 idiot­proof  programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.” Rick  Cook, The Wizardry Compiled – tomado de: 

(51)

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")

(52)

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

(53)

 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

(54)

 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") 

(55)

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

(56)

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

(57)

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

(58)

Dim Doc As Object

Url = "private:factory/swriter"

Doc   =   StarDesktop.loadComponentFromURL(Url,   "_blank",   0,  Dummy())

End Sub

(59)

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."

(60)

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   = 

(61)

       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

References

Related documents

NOW IS THE TIME FOR HEROES! MUTANTS & MASTERMINDS A G R E E N RONIN PRODUCTION Design & Development Steve Kenson Cover Art Ramón Pérez Editing Jon Leitheusser Executive Producer

ó9ê¶Ø/ô9Õ~Ú;çuցè9ÚÕAÙ%Ú;ïˆ×¼ê£ð~Ù%Øu鼨7ÕÇÖwêŸÚ åaååaååaååaåHååaåHååHåaååaååaååaåaå õ ä/å¬ò9å~ä

[r]

[r]

Ö %HÑ Ø ÓUÓ1ÜåÖlðÒç1ÖÝ1ÝLÜ éçoæ ç!ÑÓ1Ô Ó1éÐÖRÓ1ܹԂälÑ ç!ÐÜsî·éçfÑ ØóÑ

[r]

Blazing New Paths From Ancient Footprints: Enactment Of Mexican Traditional Dance And Music folklórico In A New York Urban Community Of Early Childhood Learners Pamela Proscia

NAIC LIFE ANNUITY CON- INSURANCE IN DIR BENEFITS A&amp;H DIR PREM A&amp;H LOSSES.. NO NAME OF COMPANY DOM PREMIUMS SIDERATIONS FORCE, END CY PAID