You are on page 1of 150

Programacin de Macros en Open Office con Open Basic

(Curso Intermedio de 42 Horas)

Escrito por: Jos Andrs Martnez Silva Inspirado en: mltiples 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 revisin, desarrollo y ampliacin Versin 0.2 Ultima revisin Martes 18 de Septiembre de 2007

TabladeContenidos
Presentacin..............................................................................................................................5 . Convenciones.............................................................................................................................5 . Captulo1...................................................................................................................................6 . Introduccin...........................................................................................................................6 . Pordndecomenzar?............................................................................................................7 . CdigodeMuestra...............................................................................................................10 . HolaMundo..........................................................................................................................10 . Marcadores...........................................................................................................................11 . Variables...............................................................................................................................13 . TiposdeDatos.....................................................................................................................15 . PrcticaconTiposdeDatoNumricos................................................................................16 VectoresyMatrices..............................................................................................................18 . PrcticaconVectores............................................................................. .............................19 . OperadoresenOpenBasic..................................................................................................19 OperadoresMatemticos:........................................................................ .......................20 . OperadoresLgicos:............................................................................... ........................20 . OperadoresdeComparacin:...................................................................... ...................20 . Captulo2:................................................................................................................................22 . ControldeFlujo:...................................................................................................................22 . If...Then...Else............................................................................. ................................22 . ExpresionesIfAnidadas..................................................................................... .............24 . EstructuradeControlSelectCase...................................................................................25 Buclesociclosdeejecucin............................................................................................27 . Determinandolosnmerospares....................................................................................28 EmpleandoDoWhileLoop..............................................................................................28 . Imprimiendolosnmerosmenoresquelamitaddelnmeromayor...............................29 DoLoopWhile.................................................................................................................29 . DoUntilLoop...................................................................................................................30 . DoLoopUntil...................................................................................................................31 . ProcedimientosyFunciones............................................................................................31 . Calculandoenquemomentoyporquevalorsedeberenovarelsegurodelcarro.........32 Recursividad....................................................................................................................35 . DeterminandoelIngresoalCinemediantefunciones.....................................................36 Captulo3:................................................................................................................................38 .

LaBibliotecadeFuncionesdeOpenBasic:.........................................................................38 FuncionesparaConversindeVariables.........................................................................38 FuncionesparaValidacindelContenidodelasVariables.............................................39 TrabajandoconDiferentesNivelesdeAcceso:................................................................41 FuncionesparaAccesoaCadenas................................................................................. 43 . FuncionesparaBsquedayReemplazodentrodeCadenas.........................................44 BuscaryReemplazarMejorado.......................................................................................45 FuncinparadarFormatoalasCadenas........................................................................46 TrabajandoconFechas............................................................................. ......................48 . QuHoraes?....................................................................................... ...........................49 . MensajesdeTexto...........................................................................................................50 . DilogosBsicosconMsgBox.........................................................................................51 CapturadeDatosMedianteCuadrosdeDilogo............................................................53 CapturadedatosconInputBox........................................................................ ...............54 . Captulo4:................................................................................................................................56 . UNO,laAPIdeOpenOffice:................................................................................... ............56 . UtilizacindeUNOdesdeOpenBasic............................................................................ 56 . CargadeunarchivoconOpenBasic....................................................................... .......57 . CreacindeunNuevoDocumento..................................................................................57 Captulo5:................................................................................................................................59 . TrabajandoconDocumentosdeTexto:................................................................................59 ElementosqueComponenunDocumentodeTexto........................................................59 TrabajandoconlosPrrafosdeunTexto.........................................................................60 PropiedadesyMtodosdeunObjeto..............................................................................62 ContandolosPrrafos.....................................................................................................62 . CursordentrodelDocumento..........................................................................................63 AclaracionesNecesariasSobrelosConceptosExpuestosdeUNO...............................64 ServicioseInterfaces..................................................................................................64 . Propiedades....................................................................................... .........................65 . Mdulos.......................................................................................................................65 . MdulosBsicosdeUNO................................................................................................66 ColeccionesyContenedores...................................................................................... .....67 . ModificandoelEstilodelaPrimeraLetradeCadaPrrafo.............................................68 Captulo6:................................................................................................................................70 . TrabajandoconHojasdeClculo:............................................................................. ..........70 . AccediendoaunaHojadeClculo..................................................................................70 Filas,ColumnasyCeldas.................................................................................. ..............71 . XRay:HerramientaparaDesarrollo................................................................................ 72 .

ElProfesorAhoraCuentaconExcel................................................................................72 MejorandoloPresente.....................................................................................................74 . GenerandoGrficosaPartirdelosDatosExistentesenunaHojadeClculo...............78 AsociandolosMacrosaDocumentosEspecficos..........................................................80 BuscandoCadenas.................................................................................. .......................80 . DilogosPersonalizadosparaMacros.............................................................................82 IntegrandounBuscadorenLneaaOO..........................................................................82 AadiendounDilogoalaMacroAnterior...................................................................... 83 . CalculadoraRPNprogramadaenOpenBasic................................................................89 Captulo7.................................................................................................................................98 . IntroduccinaOpenBase............................................................................ .......................98 . ImplementandounSistemaparaControldeCitasBsico..............................................98 IntegracindeMacrosalosFormulariosdeBase.........................................................105 EjemplosdeProgramacindeMacrosconBasesdeDatos.........................................109 MacrosyejerciciosconHojasdeClculo......................................................................114 AccediendoaDirectoriosyArchivos............................................................................ ..119 . TrabajandoconDataPilotyalternativaalDataPilot.......................................................123 MacroquemodificalosdatosdeunDataPilotylorefrescadeformaautomtica........127 CuandoDataPilotnoessuficiente.................................................................................. 28 1 SubformasenBase........................................................................ ...............................131 . ProgramandoDilogosMultiStep...................................................................................139 MakeaTableQuery,desdeOpenBase.........................................................................143 Bibliografa:.............................................................................................................................148 . Agradecimientos:....................................................................................................................150 .

Programar muchas veces no es visto por la gente como un trabajo, al menos no con la remuneracin que debera tener. Tienen razn quienes piensan que no es un trabajo, es ms un reto creativo, el placer de dominar la mquina 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 mquina por ellos, que harn entonces en poder de la mquina y su software por defecto?

Presentacin: Existenmuchasformasylenguajesenlosquesepuedeprogramar,existentambinmuchos paradigmasyteorasquesirvendeguaalosdesarrolladores,peroenltimocasoserla mentedelprogramadorlaquedecidaquesolucindaralproblemaalqueseenfrenta. Enlaspginassiguientessedesarrollaruncursoorientadoaaquellaspersonasquedesean aprenderaescribirmacrosparaOpenOfficehaciendousodeOpenBasic.Elcursonoexige unconocimientoprevioenprogramacin,aunquesaberalgodeCoC++podraayudar. Convenciones: Seemplearnlassiguientesconvencionesparaindicarpartesclavesdeltexto:

Estesmboloindicaelcomienzodeunaexplicacindetallada

Estesmboloprecedeunanotaimportanteparatenerencuentaalahoradeestar trabajando

Estesmboloindicaelcomienzodeunejercicioprctico

Captulo1: Introduccin: OpenBasic(equivalenteaStarOfficeBasic)esunlenguajedeprogramacinpertenecientea la familia de lenguajes tipo Basic (Beginners Allpurpose Symbolic Instruction Code1), es similaraVisualBasicyVisualBasic for Applications de Microsoft,aunquenocuentacon todassuscaractersticas. OpenBasicesunlenguajeinterpretadolneaporlnea,estoquieredecirqueelfindelnea es algo digno de tener en cuenta cuando se est escribiendo un programa. Cuando la instruccinquesepretendaescribirnoquepaenunasolalneapuedeemplearseelsmbolo _paraescribirvariaslneascomounasola: ResultadoNomina=(calculo1*calculo2)/numero_personas+_ (porcentajeobtenido*90)8*(numeroaleatorio2+100)+_ otrosvalores Por otra parte, si en algn momento se desea usar una sola lnea para ingresar varias instruccionescortas,puededividirselalneaempleandoelsmbolo: aux1=5+topic1:aux2=10+topic3:aux3=aux1+aux2 Aunquelneaslargasycortassonsoportadasporellenguaje,esimportantetenersiempre encuentaquealmomentodeescribirunprogramadebepensarsenosloenlosusuarios finalesdelmismo,sinoenloslectoresdelcdigofuente 2,esdeciraquellosprogramadores quequerrnampliaromodificarelprogramaoriginal,einclusoelmismoautordelprograma quien puede retomarlo mesesdespus. Siempreser msfcil para cualquiera de estos lectores, entender un cdigo escrito de forma clara y limpia, que uno escrito de forma descuidada.Porestaraznesimportantemantenerelcdigofuentetanlimpioyclarocomo seaposible.

1 EncuentramsinformacinacercadeBASICenelsiguienteenlace:http://es.wikipedia.org/wiki/BASIC 2 RecuerdequeustedahoraestusandoSoftwareLibreporlotantodebecomenzarapensarcomoun miembrodeestacomunidad:http://www.gnu.org/philosophy/freesw.es.html

Pordndecomenzar? LoprimeroquedebehacerseparacomenzaraprogramarconOpenBasicescargarOpen Officeencualquieradesuscomponentes,bienseaelprocesadordetexto,lahojadeclculo, labasededatos,etc.Paraesteejemploenparticularsetrabajarconelcomponentehojade clculo. Paso1:inicielahojadeclculodeOpenOfficecomolohacehabitualmente Paso2:seleccionelaopcin:Tools>Macros>OrganizeMacros>OpenOffice.orgBasic comosemuestraenlasiguienteimagen:

Paso3:seleccioneelitemStandardqueseencuentradentrodelgrupoMyMacrosydeclick sobreelbotnNew:

Paso4:aparecerfrenteausteduncuadrodedilogosolicitndoleelnombredesumdulo un mdulo es un conjunto de macros, piense en l como un programa , diligencie el nombrequedeseeydeclicksobreelbotnaceptar,actoseguidoaparecerelIDE 3deOpen OfficeparaeldesarrollodeprogramasconOpenBasic:

3 IntegratedDevelopmentEnvironment

Importante:elnombredeunmdulo NOpuedecontenerespaciosenblanco ni caracteresespecialescomotildes,,etc...

ApartirdeestepuntoseemplearesteIDEparairescribiendoyprobandolosdiferentes cdigosqueseexpondrnenestecurso

CdigodeMuestra AlcargarseporprimeravezelIDEenunnuevomdulo,apareceuncdigodemuestracon algunoselementosqueconvieneaclarardeunavez: REM*****BASIC***** SubMain EndSub LapalabraREMindicauncomentario,esdecirunalneadecdigoquenoseejecuta,pero que se incluye en el cdigo con algn fin, generalmente el de documentar un punto importantedelcdigooeldepresentarloscrditosdeuntercerocuyocdigoestsiendo empleadoparaundesarrollopropio. LapalabraSubindicaelcomienzodeunasubrutinadentrodelmdulo,esdecirunapartedel mduloquerealizaunaaccinespecfica.LassubrutinassecomienzanconlapalabraSub seguidadelnombrequeselequieradaryseterminanconlapalabra End seguidadela palabraSub.

HolaMundo En todos los lenguajes de programacin que existen, siempre conviene comenzar por implementarunpequeoprogramadenominadoHolaMundo.Setrataenlamayoradelos casos de un par de lneas de cdigo muy simples que tienen como nico fin acercar al aprendizalafuentedelconocimientosinatemorizarloporoscurasyprofundasquepuedan parecersusaguas. EnelcasodeOpenBasicelHolaMundoestansimplecomoesposible: REMEsteeselProgramaHolaMundoenOpenBasic SubHolaMundo Print"HolaMundoenOpenBasic" EndSub

Para correr (ejecutar) este programa desde el IDE debe darse click sobre el botn comoseilustraenlaimagensiguiente:

Luegodelocualaparecerelsiguientecuadrodedilogo:

Marcadores Encualquierlenguajedeprogramacinserequieredeclararvariablesyconstantes,ascomo funciones.LapalabraconlaquesedesignaelnombredeestoselementosenOpenBasices Marcadores.UnMarcadoreselnombrequeseledaaunavariable,aunaconstanteoauna funcin.ExistenalgunasreglasquesedebenrespetaralmomentodedefinirunMarcador: 1. Los Marcadores slo pueden contener caracteres alfa numricos y el signo de subrayado_. 2. Loscaracteresespecialescomolastildes,,diresis,noestnpermitidos 3. UnMarcadordebecomenzarconunaletraoun_ 4. LalongitudmximadeunMarcadoresde255caracteres 5. Noexistediferenciaentremaysculasyminsculas;sinembargoparamantenerel cdigolomslimpioposibledeberespetarselaformaenqueseescribeunMarcador,

escribindolosiempredelamismamanera.Esimportanteobservarestareglapuessi bienentrminosgeneralesOpenBasicnodiferenciaentremaysculasyminsculas, al usar ms adelante algunos elementos avanzados si ser necesario respetar la forma de escritura de los marcadores, as que es mejor acostumbrarse a hacerlo desdeuncomienzo EjemplosdeMarcadoresadmitidos NombreMedico nombrepaciente aux1 _sumador EjemplodeMarcadoresinvlidos MarcadorInvlido 8suma nios

OtraformadeincluircomentariosenunprogramadeOpenBasicesincluyndolos directamente en la lnea sobre la que se est trabajando, para hacer esto se incluye un apostrofealfinaldelcdigoyacontinuacinelcomentario,porejemplo: NombreMdico'esteMarcadoresinvlidoporlatilde

Variables Una variable es una representacin simblica que denota una cantidad o expresin4. En OpenBasicnoesnecesariodefinirunavariableantesdeusarla,dehecholasvariablesson definidasalmomentodeserusadasporprimeravez,aestacaractersticaseleconocecon el nombre de Declaracin Implcita de variables. Sin embargo si bien esta caracterstica puede parecer atractiva a simple vista en realidad se puede convertir en fuente de problemas,yaqueunsimpleerrortipogrficopodradeclararunanuevavariableygenerar un resultado desconcertante en un programa, por ejemplo en el siguiente fragmento de cdigo: SubErrorFacilDeCometer aux1=5'sedeclaraunavariableaux1conelvalorde5 b=aux*2'sedeclarabparaalmacenarelvalordeaux1X2 'peroporaccidentesecambiaelnombredeaux1aaux Printb'elresultadonosera10comosepodriaesperar EndSub ParaevitarestetipodeproblemasOpenBasiccuentaconlaopcindeforzarladeclaracin Explcita de las variables que se deseen usar, para activar esta opcin debe incluirse la siguientelneaalcomienzodecadaprograma: OptionExplicit Elmismocdigoanteriorincluyendoestaopcinsevedelasiguienteforma: REMDeclaracionExplicitadeVariables OptionExplicit'deestaformaseobligaadeclararcadavariable
4 http://en.wikipedia.org/wiki/Variable

'antesdepoderusarla SubComoEvitarlo Dimaux1'sedeclaralavariableaux1 aux1=5'aux1recineelvalorde5 Dimb'sedeclarab b=aux*2'balmacenaelvalordeaux1X2 'peroporaccidentesecambiaelnombredeaux1aaux Printb'elresultadonosera10comosepodriaesperar EndSub Ahoracuandoseintentaejecutarelprogramaapareceelsiguientemensajedeerror:

Deestaformaesimposibledeclararaccidentalmentevariablesysetieneunmayorcontrol sobre el programa que se est desarrollando, por lo tanto es una opcin altamente recomendadayseusarapartirdeestepuntoduranteelrestodeestecurso.

Obsrvesecomoparadeclararunavariableseanteponealmarcadorlapalabra Dim.

TiposdeDatos Cuando una variable es definida de la forma: Dim Nombre, se le est asignando implcitamenteeltipovariant.Estopermitequelavariablealmacenecualquiertipodedatos, unnmeroentero,unacadenaalfanumrica,etc.Sinembargoespreferibleserexplcitoala horadedefinireltipodeunavariable.Lasiguientetablailustralasdiferentesdeclaraciones quesedebenusarparalosdiferentestiposdedatossoportadosporOpenBasic: TipodeDato Entero Cadena EnteroLargo Simple FormadeDeclaracin DimVar1AsInteger DimVar1AsString DimVar1AsLong DimVar1AsSingle FormaAlternativa DimVar1% DimVar1$ DimVar1& DimVar1! ValoresAlmacenados 32768,32767 HolaMundo! 2147483648,2147483647 Valores positivos o negativos entre 3.402823 x1038y1.401298x1045 Valores positivos o negativos entre 1.79769313486232 x 10308 y4.94065645841247x10
324

Doble (los de DimVar1AsDouble mayorprecisin)

DimVar1#

Moneda

DimVar1AsCurrency

DimVar1@

Valores entre 922337203685477.5808y +922337203685477.5808 True,False Fecha

Boolean Date

DimVar1AsBoolean DimVar1AsDate

Originalmente se defini el tipo Simple como una alternativa para el manejo de nmerosdepuntoflotanteenmquinasconpocacapacidaddememoria,hoyendaesta consideracinesirrelevanteporloqueestetiponoesusadoenlaprctica.

PrcticaconTiposdeDatoNumricos ElsiguienteejerciciopretendedemostrarladiferenciaentretrabajarcontiposdedatoDouble ytiposdedatoInteger REMEjerciciocontiposdedatosnumericos OptionExplicit'seprefiereladeclaracionexplicitadevariables SubProfeCuchilla REMestasubrutinarepresentaaunprofesormuyexigente REMqueestacalificandoaunodesusalumnos REMcomobuenprofesorcuchillanosubeunadecima DimParcial1AsDouble DimParcial2AsDouble DimParcial3AsDouble 'Ladeclaraciondeestasvariablessehabriapodidorealizaren una 'solalineadelasiguienteforma: 'DimParcial1AsDouble,Parcial2AsDouble,Parcial3AsDouble DimExamenFinalAsDouble DimNotaFinalAsDouble Parcial1=3.01 Parcial2=2.21 Parcial3=3.70 ExamenFinal=3.00 NotaFinal=Parcial1+Parcial2+Parcial3+ExamenFinal NotaFinal=NotaFinal/4 PrintNotaFinal EndSub Alejecutaresteejercicioseobtienelasiguienterespuesta:

Perosialmismoejercicioseleintroduceelsiguientecambio: REMEjerciciocontiposdedatosnumericos OptionExplicit'seprefiereladeclaracionexplicitadevariables SubProfeCuchilla REMestasubrutinarepresentaaunprofesormuyexigente REMqueestacalificandoaunodesusalumnos REMcomobuenprofesorcuchillanosubeunadecima DimParcial1AsDouble DimParcial2AsDouble DimParcial3AsDouble 'Ladeclaraciondeestasvariablessehabriapodidorealizaren una 'solalineadelasiguienteforma: 'DimParcial1AsDouble,Parcial2AsDouble,Parcial3AsDouble DimExamenFinalAsDouble DimNotaFinalAsInteger'Elprofeyanoestancuchilla 'yredondealanota Parcial1=3.01 Parcial2=2.21 Parcial3=3.70 ExamenFinal=3.00 NotaFinal=Parcial1+Parcial2+Parcial3+ExamenFinal NotaFinal=NotaFinal/4 PrintNotaFinal EndSub Larespuestaobtenidacambiasignificativamentealmenosparaelestudiante:

Ascomoenelejercicioanteriorsedefinieronvaloresdepuntoflotante,tambin puedendefinirsevaloresexponencialescomo:1.34E4;paraotrotipodevalorescomolos hexadecimalessedebendefinirvariablestipoLONGquelosalmacenenyseingresandela siguienteforma:&HEE,&H02;esdecirsiempreantecedidosporlossmbolos&H

VectoresyMatrices Unvectoresunarreglounidimensional,esdecirunafilaocolumnadeposicionesdondese puedenalmacenarobjetosvariables.Unamatrizesunarreglobidimensional,esdecirun conjuntodefilasycolumnasdeposicionesdondesepuedenalmacenarobjetosvariables. Paradefinirunvectorseempleaunasintaxiscomolautilizadaparadefinircualquierotrotipo de variable, pero luego del marcador ydentro de parntesis seespecifica el tamao del vectorelnmerodeposiciones: DimMiVector(5)AsInteger Paradefinirunamatrizaplicalaanteriorexplicacin,peroconlaadicindeunvalorms dentrodelosparntesisquedandoespecificadodeestaformaelnmerodecolumnasyel nmerodefilasdelamisma: DimMiMatriz(5,3)AsInteger

Aclaracinimportante:aldefinirunvectorcomoDimMiVector(5)seestdefiniendo unvectorde6posicionesno5,numeradasdesdeelnmero0hastaelnmero5

PrcticaconVectores ParaaccederalasdiferentesposicionesdeunVectorbastaconindicardentrodelparntesis laposicinalaquesequiereacceder,paraentenderestomejorsepresentadenuevoel ejemplodelProfesorCuchillaempleandoenestaoportunidadunVectorparaalmacenarlas notasdelosparciales:

REMEjercicioconVectores OptionExplicit'seprefiereladeclaracionexplicitadevariables SubProfeCuchilla REMestasubrutinarepresentaaunprofesormuyexigente REMqueestacalificandoaunodesusalumnos REMcomobuenprofesorcuchillanosubeunadecima DimNotasParciales(2)AsDouble NotasParciales(0)=3.01 NotasParciales(1)=2.21 NotasParciales(2)=3.70 DimExamenFinalAsDouble Dim NotaFinal As Double 'El profe ya no es tan cuchilla y redondealanota ExamenFinal=3.00 NotaFinal = NotasParciales(0) + NotasParciales(1) + NotasParciales(2)+ExamenFinal NotaFinal=NotaFinal/4 PrintNotaFinal EndSub

OperadoresenOpenBasic Hastaestepuntosehanpresentadoalgunosejemplosenloscualessehavenidohaciendo usodeoperadoresmatemticossimples,lasuma:+yladivisin:/.OpenBasiccuentacon un amplio rango de operadores de diferentes tipos, los cuales es conveniente presentar

ahoraparapodercontinuarconeldesarrollodeestecurso. OperadoresMatemticos: +:seempleacomosehavistohastaahorapararealizarlaadicinentrenmeros,pero tambinsepuedeutilizarparasumarfechasyconcatenarcadenasdetexto5 :seutilizaparasustraernmerosyfechas *:seempleaparamultiplicarnmeros /:seempleaparaladivisindenmeros \:esteoperadortambinseutilizaparadividirnmerosperoelresultadoquedevuelvees redondeado ^:seutilizaparaelevarenterosapotencias MOD:esteltimooperadorseutilizaparaobtenerelresiduodeunadivisin OperadoresLgicos: Los operadores lgicos se emplean con tipos de datos enteros o booleanos, permiten relacionardichoselementosmediantelasreglasdellgebradeBoole6. AND:OperacindeYLgico OR:OperacindeOLgico XOR:OperacindeOexclusivo NOT:Negacin EQV:Pruebadeequivalencia IMP:Implicacin(silaprimeraexpresinesverdadera,lasegundatambindebeserlo) OperadoresdeComparacin: Losoperadoresdecomparacinpermitenvalgalaredundanciacomparardosvariables decualquiertipo. =:Igualdad,aplicaanmeros,fechasycadenasdetexto <>:Desigualdad,aplicaanmeros,fechasycadenasdetexto >:Comprobacindemayorque,aplicaanmeros,fechasycadenasdetexto >=:Comprobacindemayoroigualque,aplicaanmeros,fechasycadenasdetexto <:Comprobacindemenorque,aplicaanmeros,fechasycadenasdetexto
5 Tambinesposibleconcatenarcadenasdetextousandoelsmbolo,(coma) 6 http://en.wikipedia.org/wiki/Boolean_algebra_%28logic%29

<=:Comprobacindemenoroigualque,aplicaanmeros,fechasycadenasdetexto

Tiempopararelajarse

Captulo2: ControldeFlujo: Los ejemplos presentados anteriormente corresponden a una clase muy bsica de programas,unaenlacualdadosunosdatosdeentradaserealizanoperacionesaritmticas sobrelosmismosyseimprimeelresultado.Apartirdeestepuntosecomenzaraevaluarla informacin sobre la que se est trabajando y a tomar decisiones dependiendo de los resultadosdedichaevaluacin.

If...Then...Else Unadelasexpresionesparacontroldeflujodeunprogramaquemsseempleaeslade evaluarunvalorytomarunadecisinsisecumpledeterminadovalor.Retomandoelejemplo delprofesoranterior,sepodrapresentarunanotamsamablenonecesariamentems alegrealalumnoencuestin: REMEjercicioconVectores OptionExplicit'seprefiereladeclaracionexplicitadevariables SubProfeCuchilla REMestasubrutinarepresentaaunprofesormuyexigente REMqueestacalificandoaunodesusalumnos REMcomobuenprofesorcuchillanosubeunadecima DimNotasParciales(2)AsDouble NotasParciales(0)=3.01 NotasParciales(1)=2.21 NotasParciales(2)=3.70 DimExamenFinalAsDouble DimNotaFinalAsDouble ExamenFinal=3.00 NotaFinal = NotasParciales(0) + NotasParciales(1) + NotasParciales(2)+ExamenFinal NotaFinal=NotaFinal/4 REM dependiendo del resultado de la operacion se muestra un

mensaje IfNotaFinal<3.0Then 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 EndIf EndSub Laejecucindeesteprogramaahoraarrojaelsiguienteresultado:

Perosilasnotasdelestudiantesonotras,elmensajetambincambia: REMEjercicioconVectores OptionExplicit'seprefiereladeclaracionexplicitadevariables SubProfeCuchilla DimNotasParciales(2)AsDouble NotasParciales(0)=3.01 NotasParciales(1)=2.21 NotasParciales(2)=3.70 DimExamenFinalAsDouble DimNotaFinalAsDouble ExamenFinal=3.20 NotaFinal=NotasParciales(0)+NotasParciales(1)+NotasParciales(2)+ExamenFinal

NotaFinal=NotaFinal/4 REMdependiendodelresultadodelaoperacionselemuestraunmensajeuotroal usuario IfNotaFinal<3.0Then Print"Ustedhareprobadoelcurso,sunotafinales:"+NotaFinal REMenlalineaanteriorseemplea+paraconcatenarvariables Else Print"Ustedhaaprobadoelcurso,sunotafinales:"+NotaFinal EndIf

EndSub

ExpresionesIfAnidadas ComnmenteserequierelaevaluacinencadenadevariasexpresionesIf,esdecirqueuna vezevaluadaunacondicinserequieraevaluarunasegundacondicin.Paralograreste propsito es necesario usar varias instrucciones If anidadas. Otra posibilidad es que evaluadacomofalsaunaprimeracondicinserequieraevaluarlavalidezdeunasegunda condicin,paralocualseemplealaInstruccin ElseIf,elsiguienteejemploilustramejor estaidea: SubCondicionesAnidadas DimEdadAsistenteAsInteger DimClasificacionPeliculaAsString EdadAsistente=15 ClasificacionPelicula="E" IfClasificacionPelicula="R"Then

IfEdadAsistente<18Then Print "Este asistente no puede ingresar a la pelicula1" Else Print"IngresoPermitido" EndIf ElseIfClasificacionPelicula<>"R"Then Print"PeliculaAptaparaTodoPublico" EndIf EndSub

EstructuradeControlSelectCase En Ocasiones el anidamiento consecutivo de estructuras If hace que el cdigo pierda legibilidad,porestemotivoyporquesetratadeunaformamsadecuadadesolucionarlas situaciones en las cuales se deben realizar validaciones encadenadas se emplea la estructuradecontrolSelect. Laformabsicadeemplearestaestructuraeslasiguiente: SelectCaseNombreDeLaVariable'seabreestructuradecontrol CaseOpcion1:'sedefineelvalornmero1aprobar instruccionesparaestaopcion'quehacerenestecaso CaseOpcion2: instruccionesparaestaopcion'quehacerenestecaso ... CaseOpcionN: instruccionesparaestaopcion'quehacerenestecaso CaseElse: instruccionesparaestaopcion'quehacerencualquierotro caso EndSelect'Secierralaestructuradecontrol Elmismoejemplodelcontroldeaccesoalaspelculaspuedeimplementarseusandouna estructuradecontrolSELECTdelasiguientemanera,seadicionlavalidacinparapelculas XXXyaquecomoseplanteaelejerciciolaprimeravezunmenordeedadpodraingresara unapelculacualquieraquenofueraclasificacinR: IngresoapeliculasexplicacinSELECTCASE REMEjercicioparaIngresoaPeliculas

OptionExplicit'seprefiereladeclaracionexplicitadevariables

SubCondicionesAnidadas DimEdadAsistenteAsInteger DimClasificacionPeliculaAsString EdadAsistente=18 ClasificacionPelicula="YXX" SelectCaseClasificacionPelicula Case"E": Print"PeliculaAptaparaTodoPublico" Case"R": IfEdadAsistente<18Then Print"PeliculaSoloAdultos" Else Print"IngresoPermitido" EndIf Case"XXX": IfEdadAsistente<18Then Print"PeliculaSoloAdultosXXX" Else Print"IngresoPermitido" EndIf CaseElse: Print"Ingresebajosupropiaresponsabilidad" EndSelect EndSub DadoqueenelcasodequelavariableClasificacionPeliculavalgaRovalgaXXXserealizan lasmismasoperacionespuedereescribirseelcdigoanteriordelasiguienteforma: REMEjercicioparaIngresoaPeliculas OptionExplicit'seprefiereladeclaracionexplicitadevariables

SubCondicionesAnidadas

DimEdadAsistenteAsInteger DimClasificacionPeliculaAsString EdadAsistente=17 ClasificacionPelicula="R" SelectCaseClasificacionPelicula Case"E": Print"PeliculaAptaparaTodoPublico" Case"XXX","R": IfEdadAsistente<18Then Print"PeliculaSoloAdultosXXX" Else Print"IngresoPermitido" EndIf CaseElse: Print"Ingresebajosupropiaresponsabilidad" EndSelect EndSub

Buclesociclosdeejecucin Unaestructuradecontrolmuyimportanteesaquellaquepermiteejecutarvariasvecesla mismainstruccinhastaqueciertacondicinescierta.OpenBasicproveedosestructuras pararealizarestetipodetareas.LaprimeradeellaseslaestructuraFor...Next,enlacual unainstruccinserealizahastaelmomentoenqueelvalordelcontadordelbucleocicloes alcanzado.Susintxisbsicaeslasiguiente: ForNombreVariable=ValorInicialToValorFinal Instruccionesarealizar Next NombreVariable 'se incrementa la variable que actua como contador LasegundaformadedefinirunbucleenOpenBasicesutilizandolainstruccinDo...Loop, la diferencia fundamental es que utilizando esta segunda forma no se trabaja con un contador,sinoconunacondicinlgica.Esdecirquemientrasocurraalgoconunacondicin lgicadeterminada,elcontenidodelbucleserejecutado.

Determinandolosnmerospares Empleando lo visto hasta el momento y utilizando la estructura de control For Next, se presentaelsiguienteejemplo,elcualimprimeenpantallalosnmerosparesqueexistenen elrango1a10: REMEjercicioparaaprenderatrabajarconCiclos OptionExplicit'seprefiereladeclaracionexplicitadevariables SubBuclesEjemplo1 REMLaideadeesteejemploesilustrareluso REMbasicodelaestructuraForNext REMElejemploimprimelosnumerosparesdel1al10 DimContadorAsInteger Contador=1 ForContador=1To10 IfContadorMOD2=0Then PrintContador,"esunnumeropar" REMUsandola,paraconcatenarcadenas Else EndIf NextContador EndSub

EmpleandoDoWhileLoop Comosedijoanteriormentelaprincipaldiferenciaentrelasdosestructurasparacontrolde ciclosdeOpenBasic,estenqueDo...Loopnohaceusodeuncontadorsinodeuna condicinlgica,lascondicioneslgicasquepuedenusarsesonlassiguientes: DoWhileLoop:estaformacompruebalavalidezdeunacondicinalcomienzodecadapaso ysiesciertarealizalasinstruccionesqueseencuentrenenelcuerpodelLoop.

Imprimiendolosnmerosmenoresquelamitaddelnmeromayor ParailustrarmejorelusodelaestructuraDoWhileLoopsepresentaelsiguientecdigode ejemplo.Enelmismosedefinendosvariables:NumeroMenoryNumeroMayor.Laideadel 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: REMEjercicioparaaprenderatrabajarconCiclos OptionExplicit'seprefiereladeclaracionexplicitadevariables SubBuclesEjemplo2 REMLaideadeesteejemploesilustrareluso REMbasicodelaestructuraDoWhileLoop DimNumeroMayor,NumeroMenorAsInteger NumeroMenor=1 NumeroMayor=10 REMMientraselNumeroMenorseamenosquelamitad REMdelNumeroMayorseejecutaranlasinstrucciones REMdelciclo DoWhileNumeroMayorNumeroMenor>NumeroMayor/2 PrintNumeroMenor,"esmenorquelamitadde",NumeroMayor NumeroMenor=NumeroMenor+1 Loop EndSub

DoLoopWhile Esmuysimilaralcasoanterior,peroslorealizalavalidacinluegodehaberejecutadopor primeravezelcontenidodelbucle.Deestaformagarantizaquealmenosseejecuteunavez. Empleandoestaestructuraelejemploanteriorquedaradelasiguienteforma: REMEjercicioparaaprenderatrabajarconCiclos

OptionExplicit'seprefiereladeclaracionexplicitadevariables SubBuclesEjemplo2 REMLaideadeesteejemploesilustrareluso REMbasicodelaestructuraDoWhileLoop DimNumeroMayor,NumeroMenorAsInteger NumeroMenor=1 NumeroMayor=10 REMMientraselNumeroMenorseamenosquelamitad REMdelNumeroMayorseejecutaranlasinstrucciones REMdelciclo Do PrintNumeroMenor,"esmenorquelamitadde",NumeroMayor NumeroMenor=NumeroMenor+1 LoopWhileNumeroMayorNumeroMenor>NumeroMayor/2 EndSub Sinembargoparaestecasoenparticularlosresultadosdelaejecucinnodifieren.

DoUntilLoop MientrasqueenDoWhileseejecutanlasinstruccionescontenidasenelciclomientrasuna condicinesvlida,enDoUntilseejecutanlasinstruccionesqueseencuentranenelciclo hasta queunacondicinseacierta.Porejemploelsiguientecdigoilustracomosepuede emplearestaestructuradecontrolparaimprimirlasfechasanterioresaundaespecfico enelcasodelejemploelquecorrespondealavariableFechaDeCorte: REMEjercicioempleandoelDoUntilLoop OptionExplicit'seprefiereladeclaracionexplicitadevariables SubBuclesEjemplo2 REMLaideadeesteejemploesilustrareluso REMbasicodelaestructuraDoUntilLoop DimFechaDeCorte,FechaActualAsDate

'LasfechasseingresanenformatoMM/DD/YYYY FechaDeCorte="08/31/2007" FechaActual="08/13/2007" DoUntilFechaActual=FechaDeCorte Print"Aunnoesdiadecorte:"+FechaActual FechaActual=FechaActual+1 Loop Print"Fechadecortealcanzada:"+FechaActual EndSub

DoLoopUntil AligualqueconDoLoopWhile,lanicadiferenciaentreestacuartaformaysusimilar,es queelcontenidodelbucleseejecutaantesdevalidarlacondicinnecesariaparacontinuar.

ProcedimientosyFunciones Cuandounprogramacomienzaacrecerentamaodebidoalacomplejidaddelproblema que debe resolver, se hace uso de los procedimientos y las funciones para dividirlo en unidadesmspequeas.Ladiferenciafundamentalentreunprocedimientoyunafuncines quelasegundaretornaunvalor,mientrasqueelprimerorealizaunatareaperonoretorna ningn valor. Una vez escritas las funciones y los procedimientos, pueden ser llamados desdelarutinadeejecucinprincipal. Laformabsicadeunprocedimientoeslasiguiente: SubNombreProcedimiento 'codigoquedebeejecutarse EndSub

Porotraparte,laformabsicadeunafuncineslasiguiente: Function7NombreFuncion 'codigoquedebeejecutarse NombreFuncion=ValorRetorno'lasfuncionesretornanunvalor EndFunction Dado que las funciones devuelven un valor, es posible especificar el tipo de valor que devuelvenalmomentodesudeclaracindeformasimilaracomosehaceconladeclaracin devariables: FunctionNombreFuncionAsDouble 'codigoquedebeejecutarse NombreFuncion=ValorRetorno'retornaunvalorDouble EndFunction Adicionalmente las funciones y los procedimientos pueden recibir parmetros, esto es especialmentetilcuandosedesearealizarporfueradelarutinaprincipaldeejecucinuna seriedeoperacionessobrevaloresdadosocapturadosalmomentodecorrerelprograma. Paradefinirlosparmetrosquerecibeunafuncinyeltipodelosmismosseempleala siguientesintaxis: FunctionNombreFuncion(Param1AsDouble,Param2AsDouble)AsDouble 'codigoquedebeejecutarse NombreFuncion=ValorRetorno'retornaunvalorDouble EndFunction

Calculandoenquemomentoyporquevalorsedeberenovarelsegurodelcarro Elsiguienteejemploilustraelusodefuncionesparadeterminarenquemomentoyporque valorsedebepagarelsegurodelauto:

REMIntroduccionalosprocedimientosyFunciones OptionExplicit SubMain'estaseralarutinacentraldelprograma


7 PuedeusarseindistintamentelapalabraSuboFunctionparadeclararunafuncin,conelfindemantenerla legibilidaddelcdigosesugiereusarFunction

DimValorCarroAsLong ValorCarro=20000000 DimFechaSOATAsDate FechaSOAT="08/13/2006" DimDebeRenovarSOATAsBoolean DebeRenovarSOAT=CalculaFecha(FechaSOAT) IfDebeRenovarSOAT=FalseThen Print"aunnoesnecesariorenovarelSOAT" Else Print"deberenovarelSOAT,elvalorapagaresde:"+ CalculaValorAPagar(ValorCarro) EndIf EndSub SubCalculaFecha(FechaAsDate)AsBoolean DimAuxAsDate 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 EndIf EndSub SubCalculaValorAPagar(ValorAsLong)AsDouble CalculaValorAPagar=Valor*1/100 EndSub

Esposibleespecificarparmetrosopcionalesparalosprocedimientosyfunciones, es decir parmetros que si no son enviados no generarn un error en la ejecucin del programa,delasiguientemanera:SubNombreFuncion(Valor1AsLong,Optional Valor2AsDouble)

Esposibleyconstituyeunabuenaprcticadeprogramacinincluirpuntosde salidaenlasfuncionesencasodequealgnerrorsepresenteelsiguienteejemploilustra comohacerloenelcasodelejerciciodelcarroplanteadoprrafosatrs8: REMIntroduccionalosprocedimientosyFunciones OptionExplicit SubMain'estaseralarutinacentraldelprograma DimValorCarroAsLong ValorCarro=20000000 DimFechaSOATAsDate FechaSOAT="08/05/2006" DimDebeRenovarSOATAsBoolean DebeRenovarSOAT=CalculaFecha(FechaSOAT) IfDebeRenovarSOAT=FALSEThen Print"aunnoesnecesariorenovarelSOAT" Else Print"deberenovarelSOAT,elvalorapagaresde:"+ CalculaValorAPagar(ValorCarro) EndIf EndSub SubCalculaFecha(FechaAsDate)AsBoolean DimAuxAsDate Aux = Date 'De esta forma se asigna la fecha actual a una variable IfAuxFecha<365Then'siaunnohapasadounanodesdela renovaciondelSOAT CalculaFecha=False Else CalculaFecha=True EndIf EndSub SubCalculaValorAPagar(ValorAsLong)AsDouble
8 Paraentendermejorelejemplopresentadoejecuteelcdigoconlaslneasresaltadascomentadasyluego conlaslneasresaltadassincomentar

DimErrorAsBoolean IfValor<0Then 'En caso de que el valor del carro sea negativo Error=True Else EndIf IfErrorThen ExitSub EndIf CalculaValorAPagar=Valor*1/100 EndSub

Recursividad Porrecursividadseentiendelacapacidadquetieneunafuncindellamarse asimisma hastaqueencuentreelvalordeseado.EnOpenBasicesposibleincluirfuncionesrecursivas. Parailustrarmejorelconceptoseincluyeacontinuacinunodelosejemplosclsicosde recursividad,elclculodelfactorial9: SubMain MsgboxCalcularFactorial(3) MsgboxCalcularFactorial(42) MsgboxCalcularFactorial(3.14) EndSub FunctionCalcularFactorial(Numero) IfNumero<0OrNumero<>Int(Numero)Then CalcularFactorial = "Nmero no vlido para clculo del factorial" ElseIfNumero=0Then CalcularFactorial=1 Else 'Estaeslallamadarecursiva: CalcularFactorial=Numero*CalcularFactorial(Numero1) Endif EndFunction
9 EsteejemplohasidotomadodeformaliteraldelaGuadeProgramacinparaStarOffice8.

DeterminandoelIngresoalCinemediantefunciones Elsiguienteejerciciohaceusodelosconceptosvistoshastaelmomentopararecrearun controldeaccesoalcinebasadoendoscriterios,laedaddelasistenteylaclasificacindela pelcula: REMEjercicioparaaprenderatrabajarconFunciones OptionExplicit'seprefiereladeclaracionexplicitadevariables SubMain'Hilocentraldeejecucion DimFechaNacimientoAsDate DimClasificacionPeliculaAsString FechaNacimiento="08/18/1989" ClasificacionPelicula="R" If DeterminarEdadMinima(ClasificacionPelicula) <= CalcularEdad(FechaNacimiento)Then10 MsgBox("BienvenidoalaPelicula",0,"TaquillaCine") Else MsgBox("Usted no puede ingresar, lo sentimos",0,"Taquilla Cine") EndIf EndSub SubCalcularEdad(FechaNAsDate)AsInteger 'laedadsedevuelvecomounenterocorrespondientealaedadendias DimauxasDate aux=Date CalcularEdad=auxFechaN EndSub SubDeterminarEdadMinima(ClasificacionAsString)AsInteger 'laedaddadaennumerodedias SELECTCASEClasificacion CASE"XXX","R","+18": DeterminarEdadMinima=18*365 CASE"E","Todos": DeterminarEdadMinima=1*365 CASE"+12","PG":
10 Estalneadebeircompleta,pormotivosdeformatoeneltextoseseparaperoenelcdigodebeircomouna solalnea

DeterminarEdadMinima=12*365 CASEELSE DeterminarEdadMinima=0 ENDSELECT EndSub

Tiempopararelajarse

Captulo3: LaBibliotecadeFuncionesdeOpenBasic: OpenBasiccuentaconunaseriedefuncionesincluidasquehacenmsfcileltrabajodiario del programador, a continuacin se irn presentando funciones que podrn usarse para tareas como: conversin de variables, comprobacin del contenido de las variables, manipulacindecadenasdetexto,trabajoconfechasymonedas,dilogosdetextosimpley dilogosdetextoconquecapturanvalores.

FuncionesparaConversindeVariables EnOpenBasicexistelaconversinimplcitadevariables,detalmaneraunavariablepuede cambiarsutipocuandoesasignadaaotradeltipodeseado,porejemplo: REM'Conversiondevariables OptionExplicit SubConversionImplicita DimAAsInteger DimBAsString A=100 B=A PrintB EndSub Sinembargo,aligualquelosotrosejemplosdeaccionesimplcitas,losresultadosdetrabajar deestamaneranosonsiemprelosdeseados,porestaraznesmejoremplearlasfunciones queconviertenlasvariablesdeformaexplicitadeuntipodedatosaotro: Nombre CStr CInt Descripcin ParmetrosdeEntrada

Convierteunavariabledecualquiertipoauna Unavariabledecualquiertipo cadenadetexto Convierteunavariabledecualquiertipoaun Unavariabledecualquiertipo

entero

si se intenta convertir una cadena de caracteres el resultado obtenido es 0 en sistemastipoUNIX

CLng

Convierteunavariabledecualquiertipoaun Unavariabledecualquiertipo tipoLong si se intenta convertir una cadena de caracteres el resultado obtenido es 0 en sistemastipoUNIX Convierteunavariabledecualquiertipoaun Unavariabledecualquiertipo tipoSimple si se intenta convertir una cadena de caracteres el resultado obtenido es 0 en sistemastipoUNIX Convierteunavariabledecualquiertipoaun Unavariabledecualquiertipo tipoDouble si se intenta convertir una cadena de caracteres el resultado obtenido es 0 en sistemastipoUNIX Convierteunavariabledecualquiertipoaun Una variable de cualquier tipoBoolean tipo.Siseconvierteelentero 1 el resultado es True, si se convierte el entero 0 el resultadoesFalse Convierteunavariabledetipostringaunade Una cadena que represente tipoentero unvalornumrico ConvierteunavariableatipoDate

CSng

CDbl

CBool

Val CDate

FuncionesparaValidacindelContenidodelasVariables En ocasiones al intentar convertir una variable a otro tipo el intrprete de Basic emite mensajesdeerrorydetienelaejecucindelprograma.Uncasoenelqueestoocurreesel siguiente:

OptionExplicit SubConversionExplicitaError DimMyVar2AsString DimMyVar5AsDate MyVar2="27022006" MyVar5=CDate(MyVar2) PrintMyVar5 EndSub Alintentarejecutarloseobtieneelsiguientemensajedeerror:

Existentresfuncionesbsicasparacomprobarelcontenidodelasvariables: Nombre IsNumeric IsDate IsArray Descripcin ParmetrosdeEntrada

Determinarsielcontenidode La variable que se desea unavariableesnumrico evaluar Determinarsielcontenidode La variable que se desea unavariableesunafecha evaluar Determinarsielcontenidode La variable que se desea unavariableesunarreglo evaluar

Empleandolasegundadeestasfuncionesesposiblemodificarelcdigoanteriorparaevitar elmensajedeerror: REM'Conversiondevariables OptionExplicit SubConversionExplicita

DimMyVar2AsString DimMyVar5AsDate MyVar2="27022006" IfIsDate(MyVar2)Then MyVar5=CDate(MyVar2) PrintMyVar5 Else Print "La variable no es una fecha, no puede ser convertida" EndIf EndSub

Lasvariablescuentancondiferentesnivelesdeacceso,dentrodeOpenBasicse habla de los siguientes: pblico, privado, global. Una variable privada es accesible nicamentedentrodelasubrutinadentrodelacualsedefini,mientrasqueunavariable pblica es accesible para todas las sub rutinas de un mdulo. Una variable global es accesibleparatodoslosmdulosdefinidosdentrodeunamismalibreraenOpenOffice.El accesoalasvariablespordefectoesdefinidocomoprivadoamenosqueseespecifiquelo contrario.

TrabajandoconDiferentesNivelesdeAcceso: Los siguientes ejemplos ilustran los diferentes resultados que se obtienen en un mismo programaalmodificarlosnivelesdeaccesodelasvariablesempleadas. REM'Modificandoelaccesoalasvariables OptionExplicit SubMain Dim MyVar1,MyVar2 As Integer 'Las variables son privadas por defecto MyVar1=10 MyVar2=1 PrintSumar(MyVar1,MyVar2) PrintRestar(MyVar1,MyVar2) PrintMyVar1 PrintMyVar2 EndSub

SubSumar(Input1,Input2AsInteger)AsInteger DimAuxAsInteger Aux=Input1+Input2 'MyVar1=0'semodificaelvalordelavariabledentrodeesta funcion Sumar=Aux EndSub SubRestar(Input1,Input2AsInteger)AsInteger DimAuxAsInteger Aux=Input1Input2 'MyVar2=0'semodificaelvalordelavariabledentrodeesta funcion Restar=Aux EndSub En esta primera versin del programa todo funciona como es de esperarse, las lneas comentadasquemodificanelvalordelasvariablesdefinidasenlasubrutinaMaindeben dejarsecomentadasparaqueelprogramapuedaserejecutado,delocontrarioaparecerun errorcomoelsiguiente:

Enelsegundoescenariolasvariableshansidodeclaradaspblicasylosresultadosdela ejecucincambianporcompleto: REM'Modificandoelaccesoalasvariables OptionExplicit 'lasvariablessonpublicassedeclaranporfueradelprocedimiento PublicMyVar1AsInteger PublicMyVar2AsInteger SubMain MyVar1=10 MyVar2=1 PrintSumar(MyVar1,MyVar2) PrintRestar(MyVar1,MyVar2) PrintMyVar1 PrintMyVar2

EndSub SubSumar(Input1,Input2AsInteger)AsInteger DimAuxAsInteger Aux=Input1+Input2 MyVar1=0'semodificaelvalordelavariabledentrodeesta funcion Sumar=Aux EndSub SubRestar(Input1,Input2AsInteger)AsInteger DimAuxAsInteger Aux=Input1Input2 MyVar2=0'semodificaelvalordelavariabledentrodeesta funcion Restar=Aux EndSub Laejecucindeesteprogramaarrojaahoralosresultados:11,1,0,0;larazndeestoes quelasvariablessonpblicasysepuedenmodificarencualquierpartedelprograma.

FuncionesparaAccesoaCadenas CuandosedeseatrabajarconvariablesdetipotextoOpenBasiccuentaconfuncionesque facilitanlabsquedayelaccesoalainformacindentrodestas. Funcin (parmetros) Left(Cadena,n) Descripcin Resultado

Devuelve los caracteres de Cadena Left(HolaMundo,5)=Hola queseencuentrenhastanposiciones despusdelinicio Devuelve los caracteres de Cadena Right(Hola Mundo,5) = queseencuentrenhastanposiciones Mundo antesdelfinal Devuelve n caracteres de Cadena Mid(HolaMundo,2,4)=ola contandoapartirdelaposicinori Devuelvelalongituddelacadena

Right(Cadena,n)

Mid(Cadena,ori,n) Len(Cadena)

FuncionesparaBsquedayReemplazodentrodeCadenas OpenBasiccuentaconlassiguientesfuncionesintegradasquepermitenlabsquedadentro devariablestipoStringyelreemplazoparcialototaldelcontenidodelasmismas: FuncinParmetros Descripcin Retorno

InStr ([Start As Long,] Text1 Realiza una bsqueda de la Un valor entero con la As String, Text2 As String[, cadena Text2 dentro de la posicindondeseencontrel Compare]) cadena Text1, a partir de la inicio de la coincidencia o 0 posicin Start o desde el encasodenoencontrarnada inicio de Text1 si este parmetro no se especifica. Encasodequeelparmetro opcionalComparevalga0la bsquedaesCaseSensitive Mid(TextAsString,StartAs Reemplaza la porcin de Long,LengthAsLong,TextR texto de Text que se AsString) encuentra entre la posicin StartylaposicinLengthpor TextR Elsiguienteejemploilustraunabsquedayreemplazosimpledentrodeunacadena: REM'Manipulaciondecadenas OptionExplicit SubBusquedaYReemplazo DimMiCadena1AsString DimReemplazoAsString MiCadena1="SeorJuanRamnVargas" Reemplazo="Doctor" PrintMiCadena1 Mid(MiCadena1,1,6,"Doctor")'laprimeraposiciondelacadenaes 1no0

PrintMiCadena1 EndSub

BuscaryReemplazarMejorado Elejercicioanteriorplanteaunnuevoproblema,cmohacerparaqualcambiarlapalabra Seor por Doctor se conserve el espacio entre el ttulo y el nombre, las respuestas brindadasporlosprimerosalumnosdeestecursoacontinuacin: Opcin1: REM'Manipulaciondecadenas OptionExplicit SubBusquedaYReemplazo DimMiCadena1AsString DimReemplazoAsString DimCadenaasString MiCadena1="SeorJuanRamnVargas" Reemplazo="Doctor" PrintMiCadena1 Mid(MiCadena1,1,6,"Doctor")'laprimeraposiciondelacadenaes 1no0 Cadena=Left(MiCadena1,6)+""+Right(MiCadena1,17) PrintCadena EndSub Opcin2: REM'Manipulaciondecadenas OptionExplicit SubBusquedaYReemplazo DimMiCadena1AsString DimReemplazoAsString

DimTamano,TamanoReemplazoAsInteger MiCadena1="SeorJuanRamnVargas" Reemplazo="Doctor" PrintMiCadena1 Tamano=Len(MiCadena1) TamanoReemplazo=Len(Reemplazo) Print Reemplazo + " " + Right (MiCadena1, Tamano TamanoReemplazo) EndSub

FuncinparadarFormatoalasCadenas Enocasionesluegodehaberrealizadolosclculosnecesarios paraobtenerunvalor,se desea presentar dicho valor de la forma ms adecuada posible al usuario final, para formatearlasvariablesdetextoypresentarlascomosedeseeseutilizalafuncinFormat: Format(Number[,FormatAsString]) Elformatoquesedeseadarseespecificacomounacadenadetexto,aestacadenasele conoceconelnombredeplantillaydentrodelamismaesposibleemplearlossiguientes smbolos:elnmerocero(0),elsmbolonmero(#),elpunto(.),lacoma(,)yelsmbolode moneda($): REM'Formatoanumero OptionExplicit SubPresentarSueldo DimSueldoCalculadoAsLong DimVisualizacion,PlantillaAsString SueldoCalculado = 5945670 'este valor es el sueldo de una persona

REMacontinuacionseledarandiferentesformatos REMparasupresentacion: REMelsimbolo$seempleaparaqueaparezcaenpantalla REMcomodinero,elsimbolo0serequiereparaqueelnumero REMseavisible Plantilla="$0" Visualizacion=Format(SueldoCalculado,Plantilla) PrintVisualizacion REMahoraseespecificaunaplantillamascomplejaenlacual REMseindicalaformaenlaquesedeseapresentarlacifra Plantilla="$#,###,###.00" Visualizacion=Format(SueldoCalculado,Plantilla) PrintVisualizacion EndSub

TrabajandoconFechas AunqueesposibleasignarunafechaaunavariabletipoDatemediantelaasignacindeuna cadenadelaformaYYYY/MM/DD,estoslofuncionaraenlossistemasparaloscualesse hayadefinidostecomoelformatodefechaautilizar.Paraevitarproblemasalahorade portaraplicacionesdeunequipoaotroodeunsistemaoperativoaotroesnecesarioutilizar lafuncinDateSerialqueincluyeOpenBasic.Susintaxisbsicaeslasiguiente:DateSerial (ao,mes,da). REM'TrabajoconFechas OptionExplicit SubFechasYHoras DimFechaNacimientoAsDate FechaNacimiento=DateSerial(1970,2,18) Print"FechadeNacimiento:"+FechaNacimiento EndSub Existe tambin la funcin TimeSerial que seemplea para definir registros de tiempo que sernalmacenadosenlasvariablestipoDate,susintaxisbsicaeslasiguiente:TimeSerial (hour,minute,second). REM'TrabajoconFechas OptionExplicit SubFechasYHoras DimFechaNacimientoAsDate DimHoraNacimientoAsDate

FechaNacimiento=DateSerial(1970,2,18) Print"FechadeNacimiento:"+FechaNacimiento HoraNacimiento=TimeSerial(2,15,00) Print"HoradeNacimiento:"+HoraNacimiento EndSub

QuHoraes? OpenBasiccuentacontresfuncionesquepermitensaberlafecha,lahorayelmomento actual(fecha+hora).Dichasfuncionesysusintaxisseexponenacontinuacin:

Funcin Date Time Now

Retorno Devuelvelafechaactual Devuelvelahoraactual Devuelvelafecha+horaactual

MensajesdeTexto Hastaelmomentolasalidadetodoslosprogramaspresentadosenelcursoseharealizado mediantelainstruccinPrint,estoestbienparacomenzaraentenderalgunosconceptos bsicosdeprogramacinsinembargodejamuchoquedesearalahoradeinteractuarconel usuariofinal11,poresosepresenta acontinuacinlafuncinMsgBoxlacualproveeuna formamsconvenientedemostrarinformacinenpantalla.

MsgBox(TextAsString[,TypeAsInteger[,DialogtitleAsString]]) La funcin MsgBox recibe tres parmetros de entrada, uno de ellos obligatorio correspondiente al texto que se desea mostrar los otros dos opcionales. El segundo parmetroesunnmeroenteroquesepuedeespecificarparasolicitaruntipoespecficode ventanaparaelusuario,losvaloresposiblesdeestesegundoparmetroson: 0:PresentaunaventanaconelbotnOKAceptarnicamente 1:PresentaunaventanaconlosbotonesAceptaryCancelar 2:Presentaundilogodeerrorconlosbotones:Abortar,Reintentar,Ignorar 3:PresentaunaventanaconlosbotonesSi,NoyCancelar 4:PresentaunaventanaconlosbotonesSi,No 5:PresentaunaventanaconlosbotonesReintentaryCancelar 16:Agregaunconodeparadaaldilogoqueseestpresentando 32:Agregaunconodeinterrogacinaldilogoqueseestpresentando 48:Agregaunconodeexclamacinaldilogoqueseestpresentando 64:Agregaunconodeinformacinaldilogoqueseestpresentando ElTercerparmetrodelafuncinesunacadenadetextoqueseusacomottulodelcuadro
11 Programmingtodayisaracebetweensoftwareengineersstrivingtobuildbiggerandbetteridiotproof programs,andtheUniversetryingtoproducebiggerandbetteridiots.Sofar,theUniverseiswinning.Rick Cook,TheWizardryCompiledtomadode: http://www.quotationspage.com/search.php3?homesearch=programming&sourceid=Mozillasearch

dedilogopresentadoalusuario.

DilogosBsicosconMsgBox Usandounodelosejemplosanterioressecambiarlaformadepresentarlainformacinal usuariousandoMsgBoxenlugardePrintyaprovechandolossmbolosespecialesparalos mensajesdeerror. REMIntroduccionalosprocedimientosyFunciones OptionExplicit SubMain'estaseralarutinacentraldelprograma DimValorCarroAsLong ValorCarro=20000000 DimFechaSOATAsDate FechaSOAT="08/05/2006" DimDebeRenovarSOATAsBoolean DebeRenovarSOAT=CalculaFecha(FechaSOAT) IfDebeRenovarSOAT=FALSEThen MsgBox("aunnoesnecesariorenovarelSOAT",0,"Resultados delaConsulta") Else IfCalculaValorAPagar(ValorCarro)<>0Then MsgBox("deberenovarelSOAT,elvalorapagaresde: "+CalculaValorAPagar(ValorCarro),48,"ResultadosdelaConsulta") EndIf

EndIf EndSub SubCalculaFecha(FechaAsDate)AsBoolean DimAuxAsDate Aux=Date'Deestaformaseasignalafechaactualauna variable IfAuxFecha<365Then'siaunnohapasadounanodesdela renovaciondelSOAT CalculaFecha=False Else CalculaFecha=True EndIf EndSub SubCalculaValorAPagar(ValorAsLong)AsDouble DimErrorAsBoolean IfValor<0Then negativo Error=True Else EndIf IfErrorThen MsgBox("Elvaloringresadonoesvlido",16,"Valor Incorrecto") ExitSub EndIf CalculaValorAPagar=Valor*1/100 EndSub Losresultadosdelaejecucindelcdigoanteriorsonvisualmentemsclarosparaelusuario finalquesiseemplealainstruccinPrint. 'Encasodequeelvalordelcarrosea

Esposibleespecificarcualdelosbotonesdeuncuadrodedilogosedebeactivar pordefecto,parahacerloseempleanlassiguientesreglas:sisedeseaelprimerbotnactivo pordefecto,alvalordeltipodedilogodebesumrsele128,sisedeseaqueseaelsegundo botnelactivopordefectodebesumrsele256adichovalory,sisedeseaqueseaeltercer botnlaopcinpordefectosesuma512alvalorqueidentificaeltipodecuadrodedilogo. Unejemplodeestoeselsiguientecdigo,enelcualalapareceruncuadroconlosbotones AceptaryCancelarsemuestracomoopcinpordefectoCancelar,esdecirelsegundobotn delaventana: MsgBox("aunnoesnecesariorenovarelSOAT",257,"Resultadosdela Consulta")

CapturadeDatosMedianteCuadrosdeDilogo Elsiguientepasoenestecursoconsisteencomenzaracapturarlosvaloresempleadosenla ejecucindelosprogramasdirectamentedesdeelusuario,enlugardehacerlomediantela declaracinencdigocomosehavenidopresentandohastaestepunto.Paracapturarlos datosdelusuarioseemplealafuncinInputBox:

InputBox(MsgAsString[,TitleAsString[,DefaultAsString[,x_posAsInteger,y_posAs Integer]]]]) Losparmetrosdeestafuncincorrespondena: Msg:elmensajequesedeseapresentaralusuariosolicitndoleunvalor Title:elttulodelaventana Default:elvalorpordefectoquedebemostrarseycapturarseencasodenorecibirentrada dedatosporpartedelusuario Losvaloresx_posyy_posseempleanparadefinirlaubicacindelaventanarelativaal escritoriodondeseestejecutandolaaplicacin.

CapturadedatosconInputBox REMIntroduccionalosprocedimientosyFunciones OptionExplicit SubMain'estaseralarutinacentraldelprograma DimValorCarroAsLong DimFechaSOATAsDate DimAuxAsString DimAux2DateAsDate 'Apartirdeesteejerciciolosvaloresserancapturados 'yluegoprocesados Aux=InputBox("Ingreseelvalordesuvehculo:","Clculode SOAT","1000000") REMDadoqueInputBoxdevuelveunstringseempleaunavariable Aux REMparaalmacenartemporalmentelainformacioncapturada,luego se REMempleanlasfuncionesdeconversionparallevarlaaltipo requerido ValorCarro=CLng(Aux) Aux2Date=Date Aux2Date=Aux2Date365 Aux=InputBox("Ingreselafechaenquerenovelseguro: ","ClculodeSOAT",Aux2Date) FechaSOAT=CDate(Aux) DimDebeRenovarSOATAsBoolean DebeRenovarSOAT=CalculaFecha(FechaSOAT) IfDebeRenovarSOAT=FALSEThen MsgBox("aunnoesnecesariorenovarel SOAT",257,"ResultadosdelaConsulta") Else

IfCalculaValorAPagar(ValorCarro)<>0Then MsgBox("deberenovarelSOAT,elvalorapagaresde: "+CalculaValorAPagar(ValorCarro),48,"ResultadosdelaConsulta") EndIf EndIf EndSub SubCalculaFecha(FechaAsDate)AsBoolean DimAuxAsDate Aux=Date'Deestaformaseasignalafechaactualauna variable IfAuxFecha<365Then'siaunnohapasadounanodesdela renovaciondelSOAT CalculaFecha=False Else CalculaFecha=True EndIf EndSub SubCalculaValorAPagar(ValorAsLong)AsDouble DimErrorAsBoolean IfValor<0Then 'Encasodequeelvalordelcarrosea negativo Error=True Else EndIf IfErrorThen MsgBox("Elvaloringresadonoesvlido",16,"Valor Incorrecto") ExitSub EndIf CalculaValorAPagar=Valor*1/100 EndSub

Tiempopararelajarse

Captulo4: UNO,laAPIdeOpenOffice: UNO:UniversalNetworkObjectsporsussiglaseninglsesunapoderosaAPI 12conlaque cuenta Open Office13,la cual puede ser utilizada desde diferentes lenguajes y brinda las herramientasnecesariasparalaconstruccindemacrosquerealicentareascomplejassobre documentoseinformacinexistente. Si bien Open Basic es un lenguaje por procedimientos, cuenta con los mecanismos necesariosparapoderinteractuarconlosobjetosdeUNO,astambinporelhechodeser UNOunconjuntodeobjetossehacenecesariointroducirenestepuntoalgunosconceptos delaprogramacinorientadaaobjetosquepermitirnentenderlasexplicacionesposteriores.

UtilizacindeUNOdesdeOpenBasic ParapoderutilizarlosobjetosdeUNOdesdeOpenBasicesnecesariodeclararunavariable deuntipodiferentealosvistoshastaahora: DimObjetoSimuladoAsObject Unavezcreadoelobjetosedebeinicializarasignndoleunservicio: ObjetoSimulado=createUnoService(com.sun.star.frame.Desktop) AlmomentodetrabajarcondocumentosenOpenOffice,seempleanconmayorfrecuencia lossiguientesservicios: com.sun.star.frame.Desktop:permiteabrir,importarycreardocumentos com.sun.star.document.OfficeDocument : permite guardar, exportar e imprimir los documentos

12 http://en.wikipedia.org/wiki/API 13 ParasermsexactoslaAPIdeOpenOfficeestbasadaenUNOperotienealgunasdiferencias,la informacinactualizadadelaAPIdeOpenOfficeestdisponibleenlneaenlasiguientedireccin: http://api.openoffice.org/

Losservicioscuentanconinterfaces,lasinterfacessoncoleccionesdemtodos(funciones). El servicio com.sun.star.document.OfficeDocument provee la interfaz com.sun.star.frame.XComponentLoaderlacualpermiteabrirdocumentos. El servicio com.sun.star.frame.Desktop se carga por defecto al momento de iniciar Open OfficeyparaaccederalbastaconinvocarlavariableglobalStarDesktop

CargadeunarchivoconOpenBasic ElsiguienteejemploilustralaformaenquesecargaundocumentoexistenteenOpenOffice para ejecutarlo exitosamente es indispensable que en el PC donde se corra exista un documentoconelnombrerequerido: REMCargarunarchivoconOpenBasic OptionExplicit SubMain DimDocAsObject DimUrlAsString DimDummy() Url="file:///home/mad/Temp/pruebaclase.odt"'formatoURL14 Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy()) EndSub

CreacindeunNuevoDocumento Ascomoesposiblecargarundocumentoexistenteesposiblecrearunnuevodocumento: REMCrearunnuevoarchivoconOpenBasic OptionExplicit SubMain DimDummy() DimUrlAsString


14 EnelsistemaoperativoMSWindowsestarutapodraversecomo:file:///C:/Mis%20Documentos/prueba.odt

DimDocAsObject Url="private:factory/swriter" Doc = StarDesktop.loadComponentFromURL(Url, "_blank", 0, Dummy()) EndSub

Tiempopararelajarse

Captulo5: TrabajandoconDocumentosdeTexto: Una vez presentados los conceptos bsicos sobre UNO se presenta a continuacin la informacinnecesariaparacomenzaratrabajarcondocumentosdetextodesdeOpenBasic.

ElementosqueComponenunDocumentodeTexto Enundocumentodetextoexisten4clasesbsicasdeinformacin:eltextocomotal,las plantillasquepuedanhaberseutilizadoparaelformato,loselementosdiferentesdetexto comotablas,grficos,ecuaciones,ylosparmetrosdeconfiguracinglobaldeldocumento. La forma en que se recorren los documentos de texto en Open Office es utilizando enumeraciones,elsiguienteejemploasumelaexistenciadeunarchivodetextoconprrafos enl: REMCargarunarchivoconOpenBasic OptionExplicit SubPruebaConDoc DimDocAsObject DimEnumAsObject DimElementoTextoAsObject 'Crearobjetodocumento Doc=StarDesktop.CurrentComponent 'Crearobjetoenumeracin Enum=Doc.Text.createEnumeration 'recorrerenbucletodosloselementosdeltexto WhileEnum.hasMoreElements ElementoTexto=Enum.nextElement If ElementoTexto.supportsService("com.sun.star.text.TextTable")Then MsgBox"Elbloqueactualcontieneunatabla." EndIf If ElementoTexto.supportsService("com.sun.star.text.Paragraph")Then MsgBox"Elbloqueactualcontieneunprrafo." EndIf Wend

EndSub

LaestructuradecontroldeflujoWhile...Wendresultaidealcuandoserequiere ejecutar unaoperacinsobre un conjuntodeelementoscuyotamaoesdesconocidode antemanoyresulta,porestomismoimposibleusarunFor...Next

SiseutilizalafuncinMsgBoxdelaformaenquesepresentaanteriormentese asumequelosvaloressiguientesson:0ysoffice

La instruccin ElementoTexto.supportsService permite saber si el objeto ElementoTexto soporta un servicio especfico. Al decir: If ElementoTexto.supportsService("com.sun.star.text.TextTable") se est preguntandosielobjetoElementoTextoesdeechounaTabladentrodeuntexto.

TrabajandoconlosPrrafosdeunTexto EsmomentodeintegrarlovistoanteriormenteconestanuevapartedelosobjetosdeUNO, el siguiente ejercicio presenta un programa que recorre un documento de texto y realiza ciertosreemplazossobreelcontenidodecadaunodelosprrafos. SubReemplazoEnDoc DimDocAsObject DimEnumeracionAsObject DimElementoTextoAsObject Doc=StarDesktop.CurrentComponent'trabajarsobreeldocumento actual Enumeracion=Doc.Text.createEnumeration WhileEnumeracion.hasMoreElements ElementoTexto=Enumeracion.nextElement If ElementoTexto.supportsService("com.sun.star.text.Paragraph")Then ElementoTexto.String = Reemplazar(ElementoTexto.String,"a","A")

ElementoTexto.String Reemplazar(ElementoTexto.String,"e","E") ElementoTexto.String Reemplazar(ElementoTexto.String,"i","I") EndIf Wend EndSub

= =

EstarutinarequiereunafuncinadicionalnodefinidaenOpenOffice: FunctionReemplazar(OrigenAsString,BusquedaAsString,ParteNueva AsString) DimResultadoAsString DimPosInicialAsLong DimPosActualAsLong Resultado="" PosInicial=1 PosActual=1 IfBusqueda=""Then Resultado=Origen Else DoWhilePosActual<>0 PosActual=InStr(PosInicial,Origen,Busqueda,0) IfPosActual<>0Then Resultado = Resultado + Mid(Origen,PosInicial,PosActualPosInicial) Resultado=Resultado+ParteNueva PosInicial=PosActual+Len(Busqueda) Else Resultado = Resultado + Mid(Origen, PosInicial, Len(Origen)) EndIf'Posicion<>0 Loop EndIf Reemplazar=Resultado EndFunction

UsarFunctionenlugardeSubalahoradedefinirunafuncinesmsunagua paraelprogramadory/oparaellectordelcdigo,yasehavistodeacuerdoconlosejemplos anteriores que definiendo funciones empezando por Sub, stas funciona sin ningn problema.

PropiedadesyMtodosdeunObjeto Los objetoscuentan con propiedades ymtodos, se ha venido haciendo uso de las dos cosasenlosejemplosanterioresyenestepuntoresultamsclaroilustrarcadaconcepto: Cuandoseusalainstruccin: ElementoTexto.supportsService("com.sun.star.text.Paragraph") SeestutilizandounmtododelobjetoElementoTexto,mejorandelobjetoUNOqueste representa.Losmtodossoncomolasfuncionesoprocedimientos,peroslopuedenser accedidosporobjetosdeunaclaseespecfica. Cuandoseusalainstruccin: ElementoTexto.String=Reemplazar(ElementoTexto.String,"a","A") Seestaccediendoauna propiedad delobjetoElementoTextodenominadaStringysele estcambiandoelvalordeacuerdoconelvalorderetornoenestecasodelafuncin Reemplazar.

Losprrafosdeuntextosesubdividenasuvezentantoselementoscomoformatos diferentes existan, por ejemplo la lnea: esta es una prueba de formatos representa en realidadmsdeunprrafo,unoporcadaformatodefinido.

ContandolosPrrafos Para el siguiente ejercicio cree un documento de texto que contenga una lnea como la presentada en la observacin anterior,es decir una donde se utilicen varios formatos de texto. SubCuantosParrafosHay DimContadorAsInteger DimDocAsObject

DimEnum1AsObject DimEnum2AsObject DimElementoTextoAsObject DimFragmentoTextoAsObject Doc=StarDesktop.CurrentComponent Enum1=Doc.Text.createEnumeration Contador=0 'bucleparatodoslosprrafos WhileEnum1.hasMoreElements ElementoTexto=Enum1.nextElement If ElementoTexto.supportsService("com.sun.star.text.Paragraph")Then Enum2=ElementoTexto.createEnumeration 'bucleparatodoslossubprrafos While Enum2.hasMoreElements FragmentoTexto = Enum2.nextElement Contador=Contador+1 Wend EndIf Wend MsgBox("Hay "+Contador+" prrafos en total",0,"Contador de Prrafos") EndSub

CursordentrodelDocumento Unobjetoquesirveconfinesilustrativosparacontinuarentiendomsacercadeestaadicin alOpenBasiceselobjetoTextCursorelcualpermitedesplazarsedentrodeundocumento. Nodebeconfundirseesteobjetoconelcursorvisiblequesepresentaalusuario,sondos conceptosdiferentes. La creacin de un objeto TextCursor se realiza de la siguiente manera las lneas no resaltadasseincluyenpuesnoseralgicopensarenuncursordetextosinundocumento sobreelcualtrabajar: DimDocAsObject DimCursorAsObject Doc=StarDesktop.CurrentComponent Cursor=TextDocument.Text.createTextCursor()

ElobjetoTextCursorcuentaconlossiguientesmtodosparadesplazarseaunladoyotro dentrodeundocumento: Mtodo goLeft(n,selecciona) goRight(n,selecciona) gotoStart(selecciona) gotoEnd(selecciona) gotoEndOfWord(selecciona) gotoNextWord(selecciona) Descripcin se mueve a la izquierda n caracteres, los selecciona si seleccionaesverdadero se mueve a la derecha n caracteres, los selecciona si seleccionaesverdadero sitaelcursoralcomienzodeldocumento sitaelcursoralfinaldeldocumento sitaelcursoralfinaldelapalabraactual sita el cursor al comienzo de la siguiente palabra en el prrafoactual

gotoStartOfWord(selecciona) sitaelcursoralcomienzodelapalabraactual

gotoPreviousWord(selecciona sita el cursor al comienzo de la palabra anterior en el ) prrafoactual TextCursorcuentaconotrosmtodosquepermitenelmovimientoentrelneasyprrafos,los cualessernexplicadosamedidaqueseutiliceneneldesarrollodeestecurso

AclaracionesNecesariasSobrelosConceptosExpuestosdeUNO Acontinuacin seaclaranalgunosdeloselementosquesehanvenido utilizandoenlos ltimosejemplos,conelfindecontinuarprofundizandoenelestudiodeltrabajoconUNO desdeOpenBasic. ServicioseInterfaces:unservicioesunacoleccinabstractadeinterfacesypropiedades. Unainterfazesunacoleccindemtodos. Elconceptoseaclaramuchomsconunaasociacinalavidareal,sisepiensaenun vehculocomoelserviciodeanlisis,puededecirsequeelvehculoofrecedosinterfaces bsicas: la interfaz del control de aceleracin y la interfaz del control de direccin. La

interfazdecontroldeaceleracincuentacondosmtodosbsicos:aceleracinyfrenado. Lainterfazdecontroldedireccincuentacondosmtodosbsicos:giroaladerechaygiro a la izquierda. Adicionalmente el servicio vehculo cuenta con las propiedades Color y NmerodeSillas.LoanteriorsepuederepresentargrficamenteenlenguajeUML15 dela siguienteforma:

Propiedades:laspropiedadessonlascaractersticasdeunservicio.Porejemploelservicio vehculopresentadoanteriormentepodratenerlapropiedad:ColorAzul.Laspropiedades siempresepresentanenparejasnombrevalor.Existentambinalgunaspropiedadesque sonenrealidadunarreglodevalores,porejemplolaspropiedadesdeundocumentodetexto odeunahojadeclculo. Mdulos: los mdulos en UNO agrupan servicios, interfaces, tipos, enumeraciones y estructurasdedatos.Algunosmdulosqueseutilizaneneltrabajodiarioson:text,table, drawingysheet.LaestructurafundamentalenqueseorganizanlosmdulosdeUNOse presentaacontinuacinconelfindeproveerunaideageneralallectorydeestaforma ayudarleacomprendermejorlosejerciciospreviosylosvenideros:

15 http://en.wikipedia.org/wiki/Unified_Modeling_Language

MdulosBsicosdeUNO LossiguientessonlosmdulosquemsseutilizanalmomentodeprogramarconOpen Basic16: 1. com.sun.star.chart:proveetodoslosserviciosparatrabajarcongrficosdedatos.El msutilizadoestalvezChartDocument(),elcualseutilizaparaespecificarlosdatos quedebenserrepresentadosgrficamenteascomolascaractersticasgeneralesdel grfico. 2. com.sun.star.drawing:ofrecetodoslosserviciosqueseempleanparadibujarlneas, crculos,polgones,etc. 3. com.sun.star.frame: brinda el servicio Desktop(), mediante el cual se pueden abrir documentosexistentesocrearnuevosdocumentos.
16 ParaaccederaladocumentacincompletadelaAPIparacadaunodelosmdulospuedeaccederala direccinweb:http://api.openoffice.org/docs/common/ref/com/sun/star/moduleix.html

4. com.sun.star.presentation: provee los servicios necesarios para trabajar con presentaciones. 5. com.sun.star.sheet: agrupa los servicios necesarios para trabajar con hojas de clculo. Uno de los servicios ms importantes dentro de los que ofrece es SpreadheetDocument(),elcualpermitetrabajarconestetipodedocumentos. 6. com.sun.star.table:proveelosserviciosqueseempleanparatrabajarcontablasen documentosdetextoyhojasdeclculo. 7. com.sun.star.text:agrupa losserviciosrequeridos paratrabajarcondocumentosde texto.ElservicioTextDocument()brindatodaslasinterfacesnecesariasparatrabajar conestetipodedocumentos.

ColeccionesyContenedores Algunos de los componentes de UNO se agrupan en Colecciones y/o Contenedores. Un ejemplo de esto lo constituyen las hojas en un libro de hoja de clculo, las cuales internamente son vistas como una coleccin de hojas de clculo. De forma similar un documentodetextoesenrealidadunacoleccindeprrafos. Existentresclasesdecoleccionesdiferentesdeacuerdoconeltipodeaccesoqueproveen: 1. Loselementosdelacoleccintienennombreyesposibleaccederacadaelemento porsunombre.Esteeselcasodeunlibrodehojadeclculo,enelcualesposibleir dehojaenhojautilizandoelnombrequesehayadesignadoacadaunadeestas. 2. Los elementos no tienen nombre pero pueden accederse mediante un ndice numrico. 3. Loselementosnotienennombreytampocoesposibleaccedermedianteunndice,es necesario recorrer completamente la coleccin. Este caso corresponde a las enumeracionesconlasquesetrabajaronlosdocumentosdetextodelosejemplos presentadosanteriormente.

ModificandoelEstilodelaPrimeraLetradeCadaPrrafo ElsiguienteejemplohaceusodelosconceptospresentadosydelobjetoTextCursorpara recorrerundocumentoymodificarlaprimeraletradecadaprrafodejndolaenNegrilla algosimilaraloqueseveenloscuentosinfantiles. SubCambiarLasPrimerasLetras REMlaideadeestamacroesquerecorraparrafoporparrafo REMundocumentodetextoymodifiquelaprimeraletradecada REMparrafodejandolaennegritay16puntos DimDocumentoAsObject DimCursorAsObject DimEnum1AsObject DimElementoTextoAsObject Documento=StarDesktop.CurrentComponent 'setrabajasobreeldocumentoactual Cursor=Documento.Text.createTextCursor() REM linea de depuracion para saber que puede hacerse con el cursor 'MsgBox(Cursor.dbg_properties,1) REMenestepuntoyasetieneeldocumentoyelcursor, REMsecomienzaahoraatrabajarparrafoporparrafo Enum1=Documento.Text.createEnumeration WhileEnum1.hasMoreElements ElementoTexto=Enum1.nextElement If ElementoTexto.supportsService("com.sun.star.text.Paragraph")Then REMsituarcursoralcomienzodelparrafo Cursor.gotoStartOfParagraph(False) REMseleccionarlaprimeraletra Cursor.goRight(1,True) REMcambiaranegrillalaletraseleccionada Cursor.charWeight=com.sun.star.awt.FontWeight.BOLD REMcambiareltamanoalaprimeraletra Cursor.charHeight=16 REMenviarelcursoralsiguienteparrafo Cursor.gotoNextParagraph(False) EndIf Wend

EndSub

Tiempopararelajarse

Captulo6: TrabajandoconHojasdeClculo: Open Basic cuenta con las herramientas necesarias para poder programar poderosas macrosquepermitanlaedicindehojasdeclculoascomolaexplotacindelainformacin almacenada en ellas. Apartir deeste captulosetrabajar conlasayudas dedesarrollo existentescuandoseaposiblehacerlo.

AccediendoaunaHojadeClculo Paratrabajarconlashojasdeclculoseutilizaelmdulocom.sun.star.sheetysuservicio SpreadsheetDocument().Paraelsiguienteejemplo se requiereundocumentode hojade textoquecontengaunahojaconelnombrenomina: SubCargarHojaXNombre DimDocAsObject DimHojaAsObject Doc=StarDesktop.CurrentComponent Hoja=Doc.Sheets.getByName("nomina") REMsiaunnoesclaroloquehaceesteejemplocambie REMelnombredelahojanominaporunoquenoexista EndSub Tambinesposiblecargarunahojadeunundocumentodehojadeclculomediantesu ndice: SubCargarHojaXIndice DimDocAsObject DimHojaAsObject Doc=StarDesktop.CurrentComponent Hoja=Doc.Sheets(1) 'MsgBox(Hoja.dbg_methods,1,"QuMtodosSoportaesteObjeto?") 'MsgBox(Hoja.dbg_properties,1,"Qu Propiedades Tiene este Objeto?") XRayHoja'XRayherramientadedepuracionparadesarrolladores REMacontinuacionsecambiaelnombredelahoja Hoja.setName("nuevonombre") EndSub

Filas,ColumnasyCeldas ComoresultaapenasnaturalOpenBasicproveemecanismosparaaccederalasfilas,las columnas y por supuesto las celdas de una hoja de clculo. Para acceder a las filas y columnas se utilizan los servicios: com.sun.star.table.TableColumns y com.sun.star.table.TableRows, para acceder a las celdas puede emplearse com.sun.star.table.getCellByPosition. Elsiguienteejemplohaceusodelostresserviciosenumeradosanteriormentepararealizar unanavegacinbsicasobreunahojadeclculomuysencilla: SubNavegacionSimple DimDocAsObject DimHojaAsObject DimFila1AsObject DimColumna1AsObject DimCeldaAsObject Doc=StarDesktop.CurrentComponent Hoja=Doc.Sheets(1) 'XRayHoja'XRayherramientadedepuracionparadesarrolladores REMacontinuacionsecambiaelnombredelahoja Hoja.setName("filasceldasycolumas") Fila1=Hoja.Rows(0) Columna1=Hoja.Columns(0) REMacontinuacionsemodificanlaspropiedadesvisiblesde REMlafilaylacolumnaseleccionadas Columna1.OptimalWidth=True Fila1.IsVisible=False REMacontinuacionseinsertaunnuevotexto Celda=Hoja.GetCellByPosition(0,5) 'XRayCelda MsgBox("ContenidoOriginal:"+Celda.getString,1,"InfoCelda") Celda.setString("Total") Celda=Hoja.GetCellByPosition(1,5) MsgBox("ContenidoOriginal:"+Celda.getString,1,"InfoCelda") 'XRayCelda Celda.setFormula("=sum(b1:b5)") EndSub

XRay:HerramientaparaDesarrollo EnlosejemplosanterioressehaobservadounalneacomoXrayNombreVariable,estalnea haceusodeunamacroqueresultamuytilalahoradeprogramarnuevasmacros,una macrodesarrolladaporBernardMarcellyyqueseconvierteenunavaliosaherramientapara poderaccederalaspropiedades,mtodoseinterfacesdecadaobjetoqueseempleaala horadeconstruirunprograma.XRayesunaherramientadeSoftwareLibre(licenciaLGPL 17) quepuedeserdescargadaenformadearchivosxwporrazonesdecompatibilidadconla versin anterior de la suite de Open Basic desde la siguiente direccin web: http://ooomacros.org/dev.php#101416enestamismadireccinseencuentrauninteresante conjuntodemacrosparaOpenOffice.Lasinstruccionesdeusoyelprocedimientode instalacinseencuentranenestemismoarchivoyunavezXRayseencuentraactivaenel sistemaesposibleusarlaparadepurarcualquierobjetodelaformaenquesehapresentado previamente.

ElProfesorAhoraCuentaconExcel Implementacindeunamacrosencillaquehaciendousodelosconceptospresentadosy los conocimientos que el lector pueda tener en Excel recree el ejercicio del profesor presentandoalcomienzodeestecurso,peroahoraleyendolascalificacionesdeunarchivo deHojadeClculoynosloparaunestudiante. Solucin1: SubProfeCuchillaMejorado REMprimeraparte:cargarlahojaconlascalificaciones DimDocAsObject DimHojaAsObject DimCeldaAsObject DimColumnaAsInteger DimContadorXAsInteger DimNumeroAlumnosAsInteger NumeroAlumnos=4
17 http://www.gnu.org/licenses/lgpl.html

Doc=StarDesktop.CurrentComponent Hoja=Doc.Sheets(2)'losindicescomienzanen0 REMparacadaalumnoobtengaelpromedio ForContadorX=1To4 Columna=ContadorX Celda=Hoja.GetCellByPosition(ContadorX,7) SELECTCASEColumna CASE1: Celda.setFormula("=AVERAGE(b2:b5)") CASE2: Celda.setFormula("=AVERAGE(c2:c5)") CASE3: Celda.setFormula("=AVERAGE(d2:d5)") CASE4: Celda.setFormula("=AVERAGE(e2:e5)") ENDSELECT NEXT EndSub EnestasolucinseempleaunCaseparadeterminarelpromedioquedeberealizarse: Solucin2: SubProfeCuchillaMejorado2 DimDocAsObject DimHojaAsObject DimFila1AsObject DimColumna1AsObject DimCeldaAsObject Doc=StarDesktop.CurrentComponent Hoja=Doc.Sheets(2) Fila1=Hoja.Rows(0) Columna1=Hoja.Columns(0) REMacontinuacionsemodificanlaspropiedadesvisiblesde REMlafilaylacolumnaseleccionadas Columna1.OptimalWidth=True ForContador=1To4 Celda=Hoja.GetCellByPosition(Contador,7) Celda.setFormula("=sum(" + chr(Contador+65) + "3:" +

chr(Contador+65)+"6)/4") Nextcontador EndSub Enestasolucinseemplealafuncinchrparaconvertirencarcterelvalordelasuma Contador+65yasestablecerdinmicamenteelvalorquedebeincluirseenlasuma Solucin3: SubProfeCuchillaMejorado3 DimDocAsObject DimHojaAsObject DimFila1AsObject DimColumna1AsObject DimCeldaAsObject Doc=StarDesktop.CurrentComponent Hoja=Doc.Sheets(2) Fila1=Hoja.Rows(0) Columna1=Hoja.Columns(0) Columna1.OptimalWidth=True ForContador=1To4 Celda=Hoja.GetCellByPosition(Contador,7) Celda.setFormula("=average(" + Celda.columns.ElementNames(0) +"3:"+Celda.columns.ElementNames(0) +"6)") Nextcontador EndSub FinalmenteenestasolucinseempleaelmtodoElementNamesparasaberelnombredela columnasobrelaqueseesttrabajando.

MejorandoloPresente Ahoraytomandocomobaselasideasdelosasistentesaestecurso18,sepresentauna versinmejoradadelejercicioanterior,enelcualnoslosetomaelnombredelacelda medianteElementNamessinoquepermitetrabajarconunnmeromuchosignificativamente


18 Aloscualesquieroagradecerpuessinsuesfuerzoycolaboracingranpartedelmaterialacpresentadono existira

mayordeestudiantesycalificaciones.Adicionalmentesepresentalaformadeincluirenel archivodeOpenOfficeSheetunbotnquellamelamacroparaquesuejecucinresultems sencillaparaelusuariofinal. Paraesteejerciciosesuponelaexistenciadeunarchivocomoelqueilustralasiguiente imagen:

SubProfeCuchillaReloaded DimDocAsObject DimHojaAsObject DimCeldaAsObject DimAux,CantidadEstudiantes,CantidadNotasAsDouble Doc=StarDesktop.CurrentComponent Hoja=Doc.Sheets(2)'seasumequelosdatosestanenla3rahoja Celda=Hoja.GetCellByPosition(0,7) Celda.CharColor=&HFFFFFF'laideaesqueloscaracteresnose vean Celda.setFormula("=COUNTA(c2:az2)") CantidadEstudiantes=Celda.getValue Celda=Hoja.GetCellByPosition(0,8) Celda.CharColor=&HFFFFFF'laideaesqueloscaracteresnose vean Celda.setFormula("=COUNTA(c1:c100)") 'XRayCelda CantidadNotas=Celda.getValue Aux=CantidadNotas+1 ForContador=1ToCantidadEstudiantes Celda=Hoja.GetCellByPosition(Contador+1,CantidadNotas+2) Celda.setFormula("=average(" + Celda.columns.ElementNames(0)+"3:"+Celda.columns.ElementNames(0) +Aux+")") Nextcontador EndSub

Ahoraelprofesorqueejecutaestamacropuedecalificaratodossusalumnosyobtenerel promediodealmenos90calificaciones.Parahacerlavidadelprofesormsfcilseincluir enlahojadeclculodesdelaquesellamalamacrounbotnpararealizardichaaccin. Para incluir un botn es necesario activar dentro de la hoja de clculo la barra de herramientasdeControlesparaFormas:

Unavezactivasepuedeverenlahojadeclculounelementocomoelsiguiente:

Parapoderincluirunnuevoelementodentrodelahojadeclculodebeactivarseelmodode edicinhaciendoclicksobreelbotn: Acontinuacinyparaincluirunbotndebedarseclicksobreelbotn: Luegodeestoelcursorcambiadeaspectoypermiteseleccionarlaregindondesedesea ubicarelbotn.Unavezubicadoelnuevobotnlahojadeclculosevecomoseilustraa continuacin:

Paramodificarlaspropiedadesdelbotnqueseagregbastacondarclickconelbotn derechosobresteyseleccionardelmencontextualqueaparecelaopcinControl,lacual

trae una ventana con dos pestaas, en la primera de ellas (General) puede definirse la cadenadetextoquesedeseamostrarenelbotnempleandoparatalfinelcampoLabel,en lasegundapestaa(Events)seutilizalaopcin...queaparecejuntoalaaccin:Mouse ButtonPressedparaaccederallistadodeMacrosdisponiblesyasociaraestaaccinla macrodeseada.

GenerandoGrficosaPartirdelosDatosExistentesenunaHojadeClculo ParaGenerarungrficoenCalcseemplealasecuencia: 1. Definicindelazonadondevaaaparecerelgrfico 2. Definicindelrangodedatosquesevaagraficar 3. Generacindeuntipodegrficaespecficaconsuspropiedadescorrespondientes Elsiguienteejemploasumelaexistenciadeunatablaconinformacindeltiposiguiente:

Bogot Manizales Pereira Cali Medelln

Hombres

20 12 9 10 3

Mujeres

5 12 13 10 2

El cdigo que se emplea para generar un Grfico de Barras para esta informacin se presentaacontinuacin: REM*****BASIC***** GlobalaRectAsNewcom.sun.star.awt.Rectangle GlobalmRangeAddress(0)AsNewcom.sun.star.table.CellRangeAddress GlobaloChartsAsObject Subchart_init DimDocAsObject DimHojaAsObject DimCeldaAsObject DimAux,CantidadEstudiantes,CantidadNotasAsDouble Doc=StarDesktop.CurrentComponent Hoja=Doc.Sheets(0)'seasumequelosdatosestanenla1rahoja

REMdefiniciondelazonadondeapareceraelgrafico aRect.X=8000'8cmaladerecha aRect.Y=1000'1cmhaciaabajo aRect.Width=12000'12cmdeancho aRect.Height=10000'10cmdealto REMdefiniciondelrangodelquesetomanlosdatos mRangeAddress(0).Sheet=0 mRangeAddress(0).StartColumn=0 mRangeAddress(0).StartRow=0 mRangeAddress(0).EndColumn=2 mRangeAddress(0).EndRow=5 oCharts=Doc.Sheets(0).Charts 'XRayoCharts EndSub Subchart1_sample chart_init() oCharts.removeByName("BarChart")'seeliminasiexisteunoprevio oCharts.addNewByName("BarChart",aRect,mRangeAddress(),TRUE,TRUE) EndSub Delamismamaneraesposibleincluirotrotipodegrficos: GrficosdeLnea: Subchart3_sample DimoChartAsObject chart_init() oCharts.addNewByName("LineDiagram",aRect,mRangeAddress(),TRUE, TRUE) oChart=oCharts.getByName("LineDiagram").embeddedObject oChart.diagram = oChart.createInstance("com.sun.star.chart.LineDiagram") oChart.diagram.DataRowSource = com.sun.star.chart.ChartDataRowSource.COLUMNS EndSub

AsociandolosMacrosaDocumentosEspecficos Hasta el momento se han desarrollado macros que se han guardado en los mdulos generales de Open Office, sin embargo en muchas ocasiones es necesario guardar las macrosenundocumentoquevaaserenviadoluegoaotrapersona.Parapoderadjuntar macrosaundocumentoesnecesariocrearunmdulodentrodeldocumentoydentrodel mismoingresarlaolasmacrosquesedeseanadjuntar.

BuscandoCadenas Unadelastareasqueregularmentesetienenquerealizareslabsquedadecadenassobre undocumentobienseaunahojadeclculooundocumentodetexto.Elsiguienteejemplo ilustraunabsquedasimpleenlacuallasmaysculasylasminsculasnoimportan: SubBuscar REMlaideaconestamacroesrecibirunacadenapor REMpartedelusuarioyluegorealizarlabsqueda REMSinenlacadenavieneun*serealizaunabsqueda REMporsemejanza DimCadenaAsString DimDoc DimHoja DimDescriptorBusqueda Doc=StarDesktop.CurrentComponent Hoja=Doc.Sheets(2) Cadena=InputBox("Ingresecadenaabuscar") DescriptorBusqueda=Hoja.createSearchDescriptor() REMahoraesnecesariofijarlaspropiedadesdelabusqueda DescriptorBusqueda.SearchString=Cadena 'XRayDescriptorBusqueda Resultado=Hoja.findFirst(DescriptorBusqueda) ' XRayResultado

IfResultado.String<>""Then MsgBox("La cadena se encuentra en el documento como: "+Resultado.String,1,"BUSCADOR") Else MsgBox("La cadena NO se encuentra en el documento",1,"BUSCADOR") EndIf ' XRayHoja

EndSub Tambin es posible realizar bsquedas que se vean afectadas por las maysculas y minsculas definidas por el usuario, para este fin se emplea la propiedad: SearchCaseSensitiveysedefineconelvalorTrue.

Peroquocurreenelresultadoanteriorsinoexisteunresultadoparalabsqueda? La expresin Resultado.String <> tiene un problema y es que implica la existencia de Resultado,peroencasodequeunabsquedanoretorneningnresultadoResultadoNO existe y el programa arrojara un error. Para solucionar este inconveniente se emplea la formulacinlgicaIfNOTconlafuncinisNull: SubBuscar REMlaideaconestamacroesrecibirunacadenapor REMpartedelusuarioyluegorealizarlabsqueda REMSinenlacadenavieneun*serealizaunabsqueda REMporsemejanza DimCadenaAsString DimDoc DimHoja DimDescriptorBusqueda Doc=StarDesktop.CurrentComponent Hoja=Doc.Sheets(2) Cadena=InputBox("Ingresecadenaabuscar") DescriptorBusqueda=Hoja.createSearchDescriptor() REMahoraesnecesariofijarlaspropiedadesdelabusqueda DescriptorBusqueda.SearchString=Cadena

DescriptorBusqueda.SearchCaseSensitive=True ' XRayDescriptorBusqueda

Resultado=Hoja.findFirst(DescriptorBusqueda) IfNOTisNull(Resultado)Then MsgBox("La cadena se encuentra en el documento como: "+Resultado.String,1,"BUSCADOR") Else MsgBox("La cadena NO se encuentra en el documento",1,"BUSCADOR") EndIf EndSub

DilogosPersonalizadosparaMacros Hastaelmomentolosdilogosqueempleanlasmacrospresentadas,correspondenalos elementosqueproveepordefectoOpenBasicparainteractuarconelusuario,sinembargo en muchas ocasiones este tipo de elementos no es suficiente o se desea una mayor flexibilidad.Paraalcanzarestaflexibilidadsepresentaacontinuacineldiseodedilogos personalizadosylaformacomopuedenasociarseconmacrosdesarrolladasenOpenBasic.

IntegrandounBuscadorenLneaaOO El siguiente ejemplo ha sido tomado del sitio web: http://www.linux.com/articles/56307 y servir como base del ejemplo siguiente en el que se incluirn los dilogos diseados manualmente. Supngasequesedeseaincluirunamacroenelsistemaquepermitabuscarenlneael significadodeunapalabraenparticular,paratalefectoserequierequelamacropermita seleccionarunapalabrayqueluegomedianteunnavegadorwebseconecteaunsitiocomo lawikipediayobtengasusignificado.

REM*****BASIC***** SubWikipediaLookup oDoc=thisComponent oLookup=oDoc.CurrentController.getViewCursor If oLookup.String ="" then MsgBox "Seleccione una palabra antes de ejecutarlamacro":End Shell("firefox",1,"http://en.wikipedia.org/wiki/"&oLookup.String) EndSub

Es importante resaltar como en este ejemplo se toma el documento actual llamando directamenteathisComponent,tambincomotodaladeclaracindelasvariablesserealiza deformaimplcita.

AadiendounDilogoalaMacroAnterior Si bien el ejemplo anterior es un cdigo til para incluir un buscador en lnea, puede mejorarse en gran medida con un cuadro de dilogo que permita seleccionar diferentes motores para realizar la bsqueda. El siguiente ejemplo tomado de: http://freetrans.blogspot.com/2007/03/poniendoenprcticaooobasic.html ilustra la forma de hacerestotodoelejemplosedesarrollarcomounalibrera. Paso 1:Cargar el Listado de Macros y Seleccionar la Opcin Organizer Para Crear una NuevaLibrera

Paso2:AccederalListadodeLibrerasDentrodelOrganizador

Paso3:CrearunaNuevaLibrera

Conlanuevalibreracreadadebeversealgocomolossiguientedesdeelorganizador:

Alhacerclicksobreelsmbolo+alaizquierdadelanuevalibrerasedespliegaelcontenido delamisma,dentrodelcualpordefectoapareceunprimermdulo:Module1,seprocede ahoraacreareldilogodeseado,paralocualseaccedealIDEdeOpenOfficedandoclick sobreelbotnEdit:

UnavezdentrodelIDEsedebehacerclickconelbotnderechosobrelapestaadelnuevo mduloyseseleccionaacontinuacinlasopcionesqueseilustranenlasiguienteimagen:

ComoresultadodeloanterioraparecerlainterfazparadiseodeDilogosdeOpenBasic enlacualseemplearnlasherramientasexistentesparacrearundilogosimpleconun

listadodesplegabledetresopcionesylosbotonesdeAceptaryCancelar:

Es muy importante editar las propiedades de los botones Aceptar y Cancelar y utilizarelcampoTipoparadefinireltipodebotnquesedeseausar:

Paso 4: Con el dilogo listo, se escribe la macro inspirada en la que se present anteriormenteparaquehagausodesteensuinteraccinconelusuario: REM*****BASIC***** SubLookupWithGUI() DimDialogAsObject,LibraryAsObject DimTheDialogAsObject,DialogFieldAsObject DimexitOKAsString,CurrentItemPosAsInteger DimMotorBusquedaAsString 'Losbotonesquesedefinaneneldialogodebenserdeltipo 'OKyCancelrespectivamenteparaquelaMacropuedafuncionar URLArray=Array("http://www.google.com.co/search?q=definicion%3A",_ "http://search.yahoo.com/search?p=",_ "http://es.wikipedia.org/wiki/Special:Search?search=") ThisDoc=ThisComponent LookupWord=ThisDoc.CurrentController.getViewCursor 'Validarquesehayaseleccionadoalgo IfLookupWord.String<>""Then exitOK=com.sun.star.ui.dialogs.ExecutableDialogResults.OK Library=DialogLibraries.GetByName("Buscador1") TheDialog=Library.GetByName("Dialog1") Dialog=CreateUnoDialog(TheDialog) 'XRayDialog'depuraciondeldialogo DialogField=Dialog.GetControl("ComboBox1")

'SeinsertanlasopcionesenelComboBox1 DialogField.addItem("Google",1) DialogField.addItem("Yahoo!",2) DialogField.addItem("Wikipedia",3) IfDialog.Execute=exitOKThen 'XRayDialogField'depuraciondelcombobox MotorBusqueda=DialogField.SelectedText SELECTCASEMotorBusqueda CASE"Google": Shell("firefox",1, URLArray(0) & LookupWord.String) CASE"Yahoo!": Shell("firefox",1, URLArray(1) & LookupWord.String) CASE"Wikipedia": Shell("firefox",1, URLArray(2) & LookupWord.String) CASEELSE: MsgBox("Seleccin Invalida",16,"Curso de Open Basic") ENDSELECT EndIf Dialog.Dispose Else MsgBox("Debe seleccionar una palabra antes de ejecutar esta macro",16,"CursoOpenBasic") EndIf EndSub

CalculadoraRPNprogramadaenOpenBasic A continuacin se presenta una macro que integra una calculadora RPN simple a Open Office.Eldilogoquerepresentadichacalculadoraeselsiguiente:

Solucin1:lasolucinmsbsicaaesteejercicionotieneencuentaconsideracionescomo quepodraocurrirsialusuarioledaporescribireneldisplaydelacalculadora,sinembargo sirveparailustrarlaideageneraldelejercicio: REM*****BASIC***** PublicDialogAsObject,LibraryAsObject PublicTheDialogAsObject,DialogFieldAsObject PublicButtonPressedAsObject PublicOperando1AsLong,Operando2AsLong,ResultadoAsLong SubMain 'DimDialogAsObject,LibraryAsObject 'DimTheDialogAsObject,DialogFieldAsObject 'DimButtonPressedAsObject Library=DialogLibraries.GetByName("CalculadoraSimple") TheDialog=Library.GetByName("Dialog1") Dialog=CreateUnoDialog(TheDialog) 'XRayDialog'depuraciondeldialogo

DialogField=Dialog.GetControl("TextField1") DialogField.setText("RPNReady") 'Calculadoraincializadaylistaparausarse IfDialog.execute=0Then'lacalculadorasecierracuandose cierralaventana Dialog.Dispose EndIf EndSub SubEnterPresionado DimAuxAsString 'setomaelvalorquehayeneldisplayy 'sedefinecomoprimeroperando DialogField=Dialog.GetControl("TextField1") Aux=DialogField.getText() 'seconviertelacadenaenEntero Operando1=CLng(Aux) 'selimpiaeldisplay DialogField.setText("") EndSub SubSumar DimAuxAsString 'setomaelvalorquehayeneldisplayy 'sedefinecomosegundooperando DialogField=Dialog.GetControl("TextField1") Aux=DialogField.getText() 'seconviertelacadenaenEntero Operando2=CLng(Aux) 'selimpiaeldisplay Resultado=0 Resultado=Operando1+Operando2 Aux=CStr(Resultado) DialogField.setText(Aux) EndSub SubRestar DimAuxAsString 'setomaelvalorquehayeneldisplayy 'sedefinecomosegundooperando DialogField=Dialog.GetControl("TextField1") Aux=DialogField.getText() 'seconviertelacadenaenEntero Operando2=CLng(Aux) 'selimpiaeldisplay

Resultado=0 Resultado=Operando1Operando2 Aux=CStr(Resultado) DialogField.setText(Aux) EndSub SubMultiplicar DimAuxAsString 'setomaelvalorquehayeneldisplayy 'sedefinecomosegundooperando DialogField=Dialog.GetControl("TextField1") Aux=DialogField.getText() 'seconviertelacadenaenEntero Operando2=CLng(Aux) 'selimpiaeldisplay Resultado=0 Resultado=Operando1*Operando2 Aux=CStr(Resultado) DialogField.setText(Aux) EndSub SubLimpiar 'Estafunciondejaen0todaslasvariables 'delcalculoyblanqueaeldisplay Operando1=0 Operando2=0 Resultado=0 DialogField.setText("") EndSub SubPintarNumero0 DimAuxAsString DialogField=Dialog.GetControl("TextField1") 'setomaloquehayaeneldisplayyseleconcatena 'el0aladerecha,salvosiesotro0 Aux=DialogField.getText IfAux<>"RPNReady"Then IfAux<>"0"Then Aux=Aux+"0" Else Aux="0" EndIf Else Aux="0" EndIf 'seactualizaeldisplay DialogField.setText(Aux) EndSub

SubPintarNumero1 DimAuxAsString DialogField=Dialog.GetControl("TextField1") 'setomaloquehayaeneldisplayyseleconcatena 'el1aladerecha Aux=DialogField.getText IfAux<>"RPNReady"Then IfAux<>"0"Then Aux=Aux+"1" Else Aux="1" EndIf Else Aux="1" EndIf 'seactualizaeldisplay DialogField.setText(Aux) EndSub .... SubPintarNumero9 DimAuxAsString DialogField=Dialog.GetControl("TextField1") 'setomaloquehayaeneldisplayyseleconcatena 'el1aladerecha Aux=DialogField.getText IfAux<>"RPNReady"Then IfAux<>"0"Then Aux=Aux+"9" Else Aux="9" EndIf Else Aux="9" EndIf 'seactualizaeldisplay DialogField.setText(Aux) EndSub Las soluciones 2 y 3 enviadas las dos por participantes de este curso resuelven el problemadeldisplay.

Solucin2,enviadaporYasserCamacho: REM*****BASIC***** PublicAuxAsString PublicDialog,Library,theDialog,DialogFieldAsObject Publicactual,Actual1,ActualUno,ActualOperadorAsString Publicoperando1,Operando2,ResultadoFinalAsLong SubMain Library=DialogLibraries.getByName("calculadora") theDialog=Library.getByName("Dialog1") Dialog=CreateUnoDialog(theDialog) DialogField=Dialog.getControl("Texto") 'XRayDialogField DialogField.enable=0'DeshabilitaeltecladodelPC IfDialog.execute=0Then Dialog.Dispose EndIf EndSub Subboton_cero DialogField=Dialog.getControl("Texto") 'XRayDialogField actual=DialogField.getText Ifactual="0"oractual=""Then DialogField.SetText("") Else DialogField.setText(actual+"0") EndIf EndSub Subboton_uno DialogField=Dialog.getControl("Texto") actual=DialogField.getText Ifactual="0"oractual=""Then DialogField.SetText("1") Else DialogField.setText(actual+"1") EndIf EndSub ... Subboton_nueve DialogField=Dialog.getControl("Texto") actual=DialogField.getText

Ifactual="0"oractual=""Then DialogField.SetText("9") Else DialogField.setText(actual+"9") EndIf EndSub Subboton_enter DialogField=Dialog.getControl("Texto") ActualUno=DialogField.GetText Operando1=CLng(ActualUno) DialogField.SetText("") 'Printoperando1 EndSub Subboton_clear DialogField=Dialog.getControl("Texto") Actual1=DialogField.GetText CuentaClear=Len(Actual1) IfCuentaClear>0Then Actual1=Left(Actual1,CuentaClear1) DialogField.SetText(Actual1) EndIf 'PrintActual1 'XRayActual1 EndSub Subboton_suma DialogField=Dialog.getControl("Texto") Actual2=DialogField.GetText Operando2=Clng(Actual2) IfNotIsNull(Operando1)Then ResultadoFinal=Operando1+Operando2 DialogField.SetText(ResultadoFinal) EndIf EndSub Subboton_resta DialogField=Dialog.getControl("Texto") Actual2=DialogField.GetText Operando2=Clng(Actual2) IfNotIsNull(Operando1)Then ResultadoFinal=Operando1Operando2 DialogField.SetText(ResultadoFinal) EndIf EndSub Subboton_multiplicacion

DialogField=Dialog.getControl("Texto") Actual2=DialogField.GetText Operando2=Clng(Actual2) IfNotIsNull(Operando1)Then ResultadoFinal=Operando1*Operando2 DialogField.SetText(ResultadoFinal) EndIf EndSub Solucin3,enviadaporFernandoMndezyJavierGarca: REM*****BASIC***** Publicoperando1,operando2asdouble Publicauxasstring Publicdialogfield,textoOperando1,textoOperando2,textoOperacionas object Publicdialogasobject,libraryasobject publicthedialogasobject Submain Library=DialogLibraries.getbyname("Standard") thedialog=Library.getByname("Calculadora_dg") Dialog=CreateUnoDialog(Thedialog) Ifdialog.execute=0then Dialog.Dispose endif Endsub subcero DialogField=Dialog.getcontrol("txtPantalla") dialogfield.enable=1 ifDialogfield.text="0"then Dialogfield.text="" endif DialogField.setText(Dialogfield.text+"0") dialogfield.enable=0 endsub subuno DialogField=Dialog.getcontrol("txtPantalla") dialogfield.enable=1

ifDialogfield.text="0"then Dialogfield.text="" endif DialogField.setText(Dialogfield.text+"1") dialogfield.enable=0 endsub ... subnueve DialogField=Dialog.getcontrol("txtPantalla") dialogfield.enable=1 ifDialogfield.text="0"then Dialogfield.text="" endif DialogField.setText(Dialogfield.text+"9") dialogfield.enable=0 endsub subenter DialogField=Dialog.getcontrol("txtPantalla") operando1=CDbl(dialogfield.text) Dialogfield.text="" textoOperando1=Dialog.getcontrol("lblOperando1") textoOperando1.text=cstr(Operando1) endsub subsuma DialogField=Dialog.getcontrol("txtPantalla") operando2=CDbl(dialogfield.text) Dialogfield.text=operando1+operando2 textoOperando2=Dialog.getcontrol("lblOperando2") textoOperando2.text=cstr(Operando2) textoOperacion=Dialog.getcontrol("lblOperacion") textoOperacion.text="+" endsub subresta DialogField=Dialog.getcontrol("txtPantalla") operando2=CDbl(dialogfield.text) Dialogfield.text=operando1operando2 textoOperando2=Dialog.getcontrol("lblOperando2") textoOperando2.text=cstr(Operando2) textoOperacion=Dialog.getcontrol("lblOperacion") textoOperacion.text="" endsub submultiplica DialogField=Dialog.getcontrol("txtPantalla") operando2=CDbl(dialogfield.text)

Dialogfield.text=operando1*operando2 textoOperando2=Dialog.getcontrol("lblOperando2") textoOperando2.text=cstr(Operando2) textoOperacion=Dialog.getcontrol("lblOperacion") textoOperacion.text="*" endsub subclear operando1=0 DialogField=Dialog.getcontrol("txtPantalla") DialogField.text="" textoOperando1=Dialog.getcontrol("lblOperando1") textoOperando1.text="" textoOperacion=Dialog.getcontrol("lblOperacion") textoOperacion.text="" textoOperando2=Dialog.getcontrol("lblOperando2") textoOperando2.text="" endsub

Tiempopararelajarse

Captulo7: IntroduccinaOpenBase: LaformabsicadeutilizacindeBaseresultarfamiliarparalaspersonasquehanvenido trabajando antesconotrasherramientas comoAccessoKexi,OOOBasecuentaconun asistente para la creacin de tablas que resulta adecuado para la mayora de las necesidadesdelosusuariosregulares.

ImplementandounSistemaparaControldeCitasBsico El siguiente ejercicio pretende alcanzar la implementacin de un sistema bsico para el controldecitasdeungrupodemdicos,elmodelobsicosobreelquesedesarrollarel sistemaeselsiguiente:

Paso1:CreacindelanuevabasededatosenOpenBase Paso2:Creacindelastablasmediantelavistadediseo.Paraevitarinconvenientescon lostiposdedatosINTEGERsesugiereusartiposdedatosNUMERICparaloscamposde cdula.Asimismosesugieredefinirdichoscamposcomolallaveprimariadelastablasque losincluyanlasllavesprimariassugeridasaparecenenelgrficoanteriorconunsmbolo

grficoalladoderecho. TablaPaciente:

TablaDoctor:

TablaCita:

Paso3:Creadasestastrestablasseprocedeacrearlasformasrequeridasparatrabajarcon ellas,conelfindeprobarquelodefinidohastaelmomentoestbien.Unabuenaideaala horadedisearlosformulariospodraserladedefinirelnombreparacadacontrol.Asimismo serecomiendaemplearcampostiposFormattedFieldcuandosedebeexigirunformatode entrada especfico, para cadenas de texto un TextBox es suficiente. No olvide asociar mediantelapestaaDatacadacuadroparaingresodedatosconelcampocorrespondiente enlabasededatos

Si al momento de disear la forma no se incluye la barra de navegacin, pero en las propiedadesdelaformasesolicitalamismaaparecercuandosedeseeusarlaforma:

Es posible copiar y pegar formas previamente diseadas para usarlas como base al momento de disear nuevas, esto puede significar un ahorro importante de tiempo, sin embargoesimportanteadecuarlaformaqueseestcopiandoalanuevatabla,susnuevos campos,etc...

Deestamaneralanuevaformarequeridaparaelingresodelainformacindelospacientes estlistaenmuypocotiempo:

Dadoquelosestadosdeafiliacindeunpacientesdebenservalorespredefinidosenun conjuntoX,resultabuenaideadejarestecampocomounlistadodeseleccinyalimentar dicholistadoconlosvaloresdeunatablaespecificadaparatalfin:

Atencin:lassiguientesimgenesaparecencuandosetieneactivoelasistentede controlesdentrodeldiseodelasformas: TanprontocomosedefineelnuevocontrolListBoxdentrodelaformaapareceelAsistentey comoprimerpasoesnecesarioseleccionarlatablaquealimentarlasopcionesdellistado:

Unavezdefinidalatablaquesedeseausar,elasistentepreguntaporelcampodelcualse debenobtenerlosvalores:

FinalmenteelAsistentedebesaberenquecampodelatablasobrelaquetrabajaresta forma sern guardados los valores seleccionados, asimismo necesita saber si se desea guardarelmismovalorqueseestpresentandoalusuarioenestecasoenparticularsera posiblequeelusuarioseleccionaraActivo,peroqueenlatablapacientesegrabaraelvalor de0:

Almomentodedisearlaformaparaelingresodecitasesrecomendableemplearcontroles tipoDateparacapturarlasfechas,estoscampospuedenconfigurarseparamanejarunrango yformatoespecfico,ascomoparaqueincluyanunbotndeirhaciaadelanteohaciaatrs bienseaporda,pormesoporao:

Hasta este punto no se han definido las relaciones para las 3 tablas que se han implementado,sinembargoresultaunabuenaideahacerloahorayactivarlasopcionesde eliminacinydeactualizacinencascada.

IntegracindeMacrosalosFormulariosdeBase Ahora se desea incluir algunas funcionalidades en el formulario para diligenciar las observacionesquerequierenhacerusodelovistodemacroshastaelmomentoydealgunos conceptosbsicosdeSQL.Paracomprenderlossiguientesejemplossepresentalaforma basesobrelaquesedesarrollarnlosmismos:

Ejemplo1:Macroquepinteelnmerodehistoriamdicaapartirdelacduladelpaciente. Lasiguientemacroseencargadecapturarelvalordigitadoenelcampocdulapacientetan prontocomoelcuadrodetextopierdeelfoco(paratalfinseasociaeleventoWhenLosing FocusdelcampodecdulapacienteconlamacroobtenerIdHistoriaClinica),conestevalor llamaalafuncinconsultaridxcedulalacualrealizaunaconsultaenlabasededatossobrela tabla HistoriaClinica para recuperar el nmero de historia correspondiente a la cdula digitada.Esmuyimportanteobservarlaformaenquesemanejanlascomillasdentrodelas sentenciasdeSQL: REM*****BASIC+BASE***** PublicDoc,Formularios,FormularioActual,Forma,Control,Componente AsObject

SubobtenerIdHistoriaClinica DimCedulaPaciente,idHistoriaAsString Doc=StarDesktop.CurrentComponent Formularios=Doc.getFormDocuments()'recuperarlosformulariosde labasededatosactual FormularioActual=Formularios.getByIndex(4)'accederalformulario quesedesea 'EnestemomentoestoyparadoenelobjetoFormularioFObservacion 'Ahoraobtengoloquehaydentrodeesteobjeto Componente = FormularioActual.getComponent.getDrawPage.getForms 'traerlasformasdentrodelformulario Forma=Componente.getByName("FObservacion")'coincideelnombrede laformaconeldelformulario 'Forma=Componente.getByIndex(0)'formaalternativa Control=Forma.getByName("CedulaPFormattedField") CedulaPaciente=Control.Text 'ahoradeborealizarlaconsultaenlabasededatosparasabera que 'historiaclinicacorrespondeestacedulayponerelvalorenel cuadro 'detexto idHistoria=consultarIdxCedula(CedulaPaciente) 'Ahoraquetengoelvalorlopintoenelcuadro Control=Forma.getByName("HistoriaIDTextBox") Control.setString(idHistoria) 'este es el valor que retorna la consulta EndSub FunctionconsultarIdxCedula(cedulaAsString)AsString DimConextoBaseDatosAsObject DimOrigenDatosAsObject DimConexionAsObject DimManejadorInteraccionasObject DimExpresionAsObject DimResultSetAsObject ContextoBaseDatos createUnoService("com.sun.star.sdb.DatabaseContext") OrigenDatos=ContextoBaseDatos.getByName("centromedico2") IfNotOrigenDatos.IsPasswordRequiredThen Conexion=OrigenDatos.GetConnection("","") Else ManejadorInteraccion createUnoService("com.sun.star.sdb.InteractionHandler") =

Conexion OrigenDatos.ConnectWithCompletion(ManejadorInteraccion) EndIf Expresion=Conexion.createStatement()

ResultSet = Expresion.executeQuery("SELECT ""id_historiaclinica"" FROM""HistoriaClinica""WHERE""cedula_paciente""="+cedula+"") 'XRayResultSet IfNotIsNull(ResultSet)Then IfResultSet.next<>FalseThen consultarIdxCedula=ResultSet.getString(1) Else consultarIdxCedula="" EndIf EndIf EndFunction Ejemplo2:Macroquepintelafechaactualcomovalorpordefectodelcampofecha Enestesegundoejemploseimplementalamacroquealmomentoenqueunusuarioactiva elcampoparaingresodefecha(paratalfinseasociaeleventoWhenReceivingFocusdel campodefechaconlamacroobtenerIdHistoriaClinica),pintaautomticamentelafechadel daactual: SubobtenerYPintarFecha 'Laideaconestamacroesquetanprontocomoelusuarioactiveel cuadro 'paraingresodelafechaleaparezcalafechadelda DimAuxAsDate Doc=StarDesktop.CurrentComponent Formularios=Doc.getFormDocuments() FormularioActual=Formularios.getByIndex(4) Componente=FormularioActual.getComponent.getDrawPage.getForms Forma=Componente.getByName("FObservacion") Control=Forma.getByName("FechaCitaFormattedField") Aux=Date

Control.Text=Aux EndSub

EjemplosdeProgramacindeMacrosconBasesdeDatos Conelfindeaclarareltemadedesarrollodemacrosqueinteractanconbasesdedatosen OpenBase,sepresentanacontinuacinunaseriedeejerciciosprcticos,elprimerodeellos hasidotomadodelaguaescritaporRobertoCBenitezyqueesposibledescargardesdeel siguienteURL:http://www.geocities.com/rbenitez22/OOo/index.html Ejemplo1:Consultasencillaquetraetodoslosregistrosdeunatabla.Seasumeparala ejecucindeesteejemploqueexisteunabasededatospreviamentecreadaconunatabla conalgunosdatosenella:

Luegoconelfindepoderescribiryprobarlasmacrosseincluyeenlabasededatosun formulariosimplecomoelqueseilustraacontinuacinyestandodentrodelseinvocael editor de macros.Todaslas macros quesevayanausar con unabase de datosdeben quedardentrodelarchivodedichabasededatos.

REM*****BASIC***** SubEjemplo1 REMSIMPLECONNECTION DimContext DimDB DimConn DimStmt DimResult DimstrSQLAsString 'Paso1:crearelcontextodebasededatos Context=CreateUnoService("com.sun.star.sdb.DatabaseContext") 'Paso2:definirlabasededatosausar DB=Context.getByName("basedeprueba") 'Paso3:establecerconexionconlabasededatos Conn=DB.getConnection("","") 'Paso4:crearelobjetoparaejecutarconsultasSQL Stmt=Conn.createStatement() 'Paso5:definirlasentenciaSQLaejecutar strSQL="SELECT""nombre_alumno""FROM""alumno"""'OJOconla formaenqueseescribenlascomillas 'Paso6:ejecutarlasentenciaytrabajarconelresultado Result=Stmt.executeQuery(strSQL) WhileResult.next() 'XRayResult MsgBox(Result.getString(1),0,"NombredelAlumno") 'el indice empleado en getString corresponde al indice de la columna 'enlatabla Wend Conn.close() EndSub Ejemplo2:Lasiguientemacroproveealsistemadelacapacidadrequeridaparapresentarun desplegable con los nombres de los estudiantes inscritos en un curso previamente seleccionado. LoprimeroqueserevisareslaformaenlaqueseconstruyelaconsultaSQL.Elformulario alqueseleconectarestamacroeselsiguiente:

Laideaesquecuandoelusuarioseleccioneuncursodellistadodesplegable1,enellistado desplegable2aparezcannicamentelosestudiantesinscritosendichocurso.Seasumeque enlabasededatossehancreadolastablasqueseilustranacontinuacinyqueexiste informacinenlasmismas:

Tablacalificacin

Tablacurso

Tablacurso_estudiante

Tablaestudiante

TablaProfesor

Lasrelacionesentrelastablassonlassiguientes:

Alarmarlaconsultaporpartespuedeentendersemejorelresultadofinal: Paso1:obtenerelcdigodeunamateriaconociendoelnombredelamisma: SELECTcodigo_cursoFROMcursoWHEREnombre_cursoLIKE'Matem%' Paso2:obtenerelcdigodelosestudiantesqueestntomandodichamateria: SELECTcodigo_estudianteFROMcurso_estudianteWHEREcodigo_curso=14001 Paso3:obtenerelnombredeestosestudiantesyreunirtodosloselementos: SELECT nombre_estudiante FROM estudiante WHERE codigo_estudiante IN (SELECT codigo_estudianteFROMcurso_estudianteWHEREcodigo_cursoIN(SELECTcodigo_curso FROMcursoWHEREnombre_cursoLIKE'Matem%')) Finalmenteelcdigodelamacrorequerida: FunctionmateriaSeleccionada(oEventAsObject) DimoButton,oModel,oParentForm,oListaEstudiantesAsObject DimmateriaSeleccionada,AuxSQL(0)AsString DimfuenteDesplegableAsVariant

oButton=oEvent.Source oModel=oButton.getModel() oParentForm=oModel.getParent() 'Paso1:determinarlamateriaseleccionada materiaSeleccionada=oButton.selectedItem 'Paso2:obtenerlafuenteoriginalconlaquesellenaellistado oListaEstudiantes=oParentForm.getByName("EstudiantesListBox") 'metodos obtenidos mediante XRay para consultar y modificar una propiedad 'setPropertyValue (aPropertyNameasstring,aValueas variant) 'getPropertyValue (PropertyNameasstring) AS variant 'Paso3:consultaquetraelosestudiantesdelcursoseleccionado AuxSQL(0)="SELECT""nombre_estudiante"",""codigo_estudiante""FROM ""estudiante"" WHERE ( ( ""codigo_estudiante"" IN ( SELECT ""codigo_estudiante"" FROM ""curso_estudiante"" WHERE ""codigo_curso"" IN ( SELECT ""codigo_curso"" FROM ""curso"" WHERE ""nombre_curso""LIKE'"+materiaSeleccionada+"'))))" oListaEstudiantes.setPropertyValue("ListSource",AuxSQL) 'Lafuentedeldesplegablehasidomodificada, 'peroeldesplegablenoseactualiza oListaEstudiantes.refresh() 'Ahoraeldesplegablesehaactualizado materiaSeleccionada=True EndFunction

MacrosyejerciciosconHojasdeClculo DadaunarchivodeCalccon3hojasdeclculoenl,sedeseaimplementarunbuscador quehaciendousodedilogosrecibaunacadenadetextoporpartedelusuarioylepermita seleccionargrficamentelahojadentrodelacualdesearealizarlabsqueda. Observacin importante: para que este ejemplo funcione debe implementarse sobre un archivodeCALCquecuentealmenoscontreshojas

Dilogo1:Bienvenidaalusuario Eldilogo1proveealusuariode3botonesdeaccinbsica,elprimeroseencargadellamar eldilogodebsqueda,elsegundoannocuentaconningunafuncionalidadyeltercerode losbotonesservirparacerrareldilogoprincipal. Dilogo1:

Dilogo2:

Elprimermdulodelejercicioseencargadepresentarlosdilogosanteriores: 'estamacrosecargaalmomentodeabrireldocumento 'http://www.oooforum.org/forum/viewtopic.phtml?t=57062&highlight=crea teunodialog OptionExplicit GlobaloDialog1asObject'pruebaconvariableGLOBAL GlobaloDialog2asObject'pruebaconvariableGLOBAL Subshow_Dialog1 'loadDialogneedsthelibraryanddialognames oDialog1=loadDialog("Standard","Dialog1") 'Nowrunthedialog oDialog1.execute EndSub Subshow_Dialog2 'loadDialogneedsthelibraryanddialognames oDialog2=loadDialog("Standard","Dialog2") 'Nowrunthedialog oDialog2.execute EndSub Subsalir oDialog1.endExecute() EndSub FunctionLoadDialog(LibnameasString,DialogNameasString,Optional oLibContainer) DimoLibasObject DimoLibDialogasObject DimoRuntimeDialogasObject IfIsMissing(oLibContainer)then oLibContainer=DialogLibraries EndIf oLibContainer.LoadLibrary(LibName) oLib=oLibContainer.GetByName(Libname) oLibDialog=oLib.GetByName(DialogName) oRuntimeDialog=CreateUnoDialog(oLibDialog) LoadDialog()=oRuntimeDialog EndFunction Elsiguientemduloeselencargadoderealizarlabsqueda,esimportantedestacarcomo estemdulohaceusodelasvariablesglobalesdefinidasenelmduloanteriorparapoder accederalosdilogosysuscomponentesinternos:

REMRutinaquerealizalabusquedadentrodelahoja Option Explicit 'recuerde incluir esta linea para evitar lios mas adelante SubBuscar 'Objetosrequeridos DimControlCampoTexto DimControlRadioButton(2)'ArreglodeBotones DimDocumentoCalc,HojaActiva,DescriptorBusqueda DimResultadoObtenido,ResultadoActual 'CadenasdeTextoRequeridas DimCadenaIngresadaAsString 'OtrasVariables DimContadorAux,IAsInteger 'Paso1:recibircadenaabuscar ControlCampoTexto=oDialog2.getControl("TextField1") CadenaIngresada=ControlCampoTexto.getText() 'Paso2:determinarenquehojabuscar ControlRadioButton(0)=oDialog2.getControl("HOptionButton1") ControlRadioButton(1)=oDialog2.getControl("HOptionButton2") ControlRadioButton(2)=oDialog2.getControl("HOptionButton3") 'XRayControlRadioButton ForContadorAux=0To2 IfControlRadioButton(ContadorAux).getState=TrueThen ExitFor EndIf NextContadorAux 'Paso3:buscar '3.1Obtenereldocumentoyluegoubicarseenlahojadeseadapara buscar DocumentoCalc=thisComponent HojaActiva=DocumentoCalc.getSheets.getByIndex(ContadorAux) 'XRayHojaActiva '3.2Buscarlacadenadentrodelahojaseleccionada 'Creardescriptordelabusqueda DescriptorBusqueda=HojaActiva.createSearchDescriptor()

'Configurareldescriptordelabusqueda 'XRayDescriptorBusqueda 'Cadenaabuscar DescriptorBusqueda.SearchString=CadenaIngresada 'Buscarsolopalabrascompletas 'DescriptorBusqueda.SearchWords=True 'Realizarlabusqueda ResultadoObtenido=HojaActiva.findAll(DescriptorBusqueda) 'Presentaralusuarioelnumeroderesultadosobtenidos IfNOTisNull(ResultadoObtenido)Then MsgBox "La cadena ingresada se encontr " + ResultadoObtenido.getCount()+"veces" 'Presentaralusariounaventanaquelepermitanavegarporlos resultados ResultadoActual=HojaActiva.findFirst(DescriptorBusqueda) ForI=1ToResultadoObtenido.getCount()1 MsgBox(ResultadoActual.String,1,"ResultadosdesuBusqueda") ResultadoActual = HojaActiva.findNext(ResultadoActual,DescriptorBusqueda) NextI MsgBox(ResultadoActual.String,1,"ResultadosdesuBusqueda") Else MsgBox"LacadenaingresadaNoseencontr" EndIf EndSub

AccediendoaDirectoriosyArchivos Elsiguienteejemploproveelosmecanismosrequeridospara: 1. Explorarundirectorioyobtenerlosarchivosquecontiene 2. Explorarundirectorioyrecuperaruntipoespecficodearchivos 3. Abrirunarchivoseleccionadoporelusuario Elejerciciosedesarrollasobreunformularioincluidoenunahojadeclculocomoelquese muestraacontinuacin:

LaprimeramacroeslaqueseasociaalbotnVerListadodeArchivos,lamismaseencarga de presentar en un MsgBox el listado de todos los archivos contenidos en un directorio especfico: SubListarArchivos REM Esta macro lista los archivos existentes en un directorio especifico REMTomadodelaGuadeProgramaciondeStarOffice8 DimArchivoSiguienteAsString DimTodosLosArchivosAsString TodosLosArchivos="" 'ArchivoSiguiente=Dir("C:\",0)

ArchivoSiguiente=Dir("/home/mad/Temp/rips/CC1/",0) WhileArchivoSiguiente<>"" TodosLosArchivos = TodosLosArchivos & Chr(13) & ArchivoSiguiente ArchivoSiguiente=Dir Wend MsgBoxTodosLosArchivos EndSub Lasiguientemacrohaceusodelmismoprincipio,peroahoraslotraelosarchivosdeuntipo especfico,eltipodelosarchivosatraerseespecificaenlainstruccinDirdelaforma*.ext SubListarArchivosExcel REM Esta macro lista los archivos existentes en un directorio especifico REMTomadodelaGuadeProgramaciondeStarOffice8 DimArchivoSiguienteAsString DimTodosLosArchivosAsString TodosLosArchivos="" 'ArchivoSiguiente=Dir("C:\",0) ArchivoSiguiente=Dir("/home/mad/Temp/rips/CC1/*.xls",0) WhileArchivoSiguiente<>"" TodosLosArchivos = TodosLosArchivos & Chr(13) & ArchivoSiguiente ArchivoSiguiente=Dir Wend MsgBoxTodosLosArchivos EndSub Ahorasepresentalamacroquecapturalaextensinqueelusuarioingreseenuncampode textoytraeslolosarchivosquecuentanconesaextensin: FunctionListarSolicitadosPorUsuario(senalAsObject) 'enesteejemplosehaceusodelamismaidea 'anterior,peroelfiltroloingresamanualmente 'elusuario DimControl1,ModeloControl1,FormaCalc,CuadroTexto DimextAsString DimArchivoSiguienteAsString DimTodosLosArchivosAsString Control1=senal.Source ModeloControl1=Control1.getModel() FormaCalc=ModeloControl1.getParent()

'XRayFormaCalc CuadroTexto=FormaCalc.getByName("ExtensionArchivo") 'XRayCuadroTexto ext = CuadroTexto.getPropertyValue("Text") 'equivale a: CuadroTexto.Text 'Lasiguienteesunaformaalternativavalida 'ext=CuadroTexto.String ' Se listan los archivos, pero solo los que tengan esta extension TodosLosArchivos="" 'ArchivoSiguiente=Dir("C:\",0) ArchivoSiguiente=Dir("/home/mad/Temp/rips/CC1/*."+ext,0) WhileArchivoSiguiente<>"" TodosLosArchivos = TodosLosArchivos & Chr(13) & ArchivoSiguiente ArchivoSiguiente=Dir Wend MsgBoxTodosLosArchivos ListarSolicitadosPorUsuario = True 'es importante devolver un valoralfinal EndFunction Lasiguientemacropresentaademsdelosnombresdelosarchivos,laspropiedadesde tamaoyltimafechademodificacinparacadaunodeellos: FunctionListarDetalleSolicitadosPorUsuario(sEmisorAsObject) 'enesteejemplosehaceusodelamismaidea 'anterior,peroelfiltroloingresamanualmente 'elusuario DimControl1,ModeloControl1,FormaCalc,CuadroTexto DimextAsString DimArchivoSiguienteAsString DimTodosLosArchivosAsString Control1=sEmisor.Source ModeloControl1=Control1.getModel() FormaCalc=ModeloControl1.getParent() CuadroTexto=FormaCalc.getByName("ExtensionArchivo") ext=CuadroTexto.getPropertyValue("Text") ' Se listan los archivos, pero solo los que tengan esta extension TodosLosArchivos="" 'ArchivoSiguiente=Dir("C:\",0)

ArchivoSiguiente=Dir("/home/mad/Temp/rips/CC1/*."+ext,0) WhileArchivoSiguiente<>"" 'http://www.asciitable.com/ TodosLosArchivos = TodosLosArchivos & Chr(13) & ArchivoSiguiente & Chr(9) & FileLen("/home/mad/Temp/rips/CC1/"+ArchivoSiguiente) & Chr(9) & FileDateTime("/home/mad/Temp/rips/CC1/"+ArchivoSiguiente) ArchivoSiguiente=Dir Wend MsgBoxTodosLosArchivos ListarDetalleSolicitadosPorUsuario = True 'es importante devolverunvaloralfinal EndFunction Finalmenteseincluyelamacroqueabreunarchivodeacuerdoconlaseleccinquerealiza elusuarioempleandoelcomponenteincluidoenlaformaparatalfin,lamismafueenviada porFernandoMndezyJavierGarca: FunctionSeleccionarArchivo(senalasobject) DimBoton,Modelo,Forma,CampoTextoasobject Dimruta,ruta2,letraasstring dimiasinteger Boton=Senal.Source Modelo=Boton.getModel() Forma=Modelo.getParent() CampoTexto=forma.getbyname("flsSelection") ruta=CampoTexto.text() fori=1tolen(ruta) letra=mid(ruta,i,1) ifletra="\"then letra="/" endif ruta2=ruta2+letra nexti DimUbicacionArchivoasstring DimoArchivo DimArgumentos()'Arreglodeobjetos UbicacionArchivo="file:///"&ruta2 oArchivo = starDesktop.LoadComponentFromURL(UbicacionArchivo,"_blank",0,argument os())

endFunction

TrabajandoconDataPilotyalternativaalDataPilot ParalosusuariosdelahojadeclculoMSExcel,trabajarcontablasdinmicas(otablas pivote)esunamasdesustareascotidianas,enCalcexisteunaalternativaadichastablasy elsiguienteejemplopretendeintroducirlasascomoanalizarlaformadeprogramarmacros queinteractenconellas. Para el siguiente ejercicio es necesario contar con una hoja de Calc que presente informacinacercadelaocupacindediferenteshotelesmesames:
Hotel Zuana Zuana Zuana Zuana Zuana Zuana Zuana Zuana Zuana Zuana Zuana Zuana Irotama Irotama Irotama Irotama Irotama Irotama Mes Ocupacin Enero 6369 Febrero 13008 Marzo 9473 Abril 7284 Mayo 6968 Junio 7016 Julio 8192 Agosto 5706 Septiembre 9759 Octubre 12641 Noviembre 5414 Diciembre 9319 Enero 14342 Febrero 7273 Marzo 9725 Abril 8845 Mayo 5610 Junio 6877

Se usar ahora la herramienta Data Pilot para crear un resumen de esta informacin y facilitarsuanlisis.LospasosparaconseguirunatabladinmicaenCalcapartirdeunahoja coninformacincomolasiguienteson: Paso1:ubicadoenlaesquinasuperiorizquierdadelahojaconlosdatosquedeseaanalizar, seleccionelaopcinData>DataPilot>Start

Paso2:paraestecasoenparticularseemplearcomofuentededatoslaseleccinactual, sinembargoesposibletambinespecificarotrafuenteregistradaenOpenOffice,locual indicaqueesposibleusarlosdatosdeunabasededatosparagenerarunDataPilot:

Paso3:despusdeestoaparecerelasistenteparalacreacindelDataPilotpresentandola siguienteinformacin:

Laideaconesteasistenteesarrastrarcadaunadelascolumnasdelrangoseleccionadoala posicin que tendrn en el DataPilot. Por ejemplo para que la tabla dinmica generada presentelainformacinresumidadelaocupacindebearrastrasteelcampoocupacinala posicinetiquetadacomoDataFields,sideseapresentarseestainformacinpormes,es posibleporejemploarrastrarelcampomesalaposicinColumnFieldsyparapermitiral usuariofiltrarovisualizarlainformacinporunHotelespecficodebearrastrarseelcampo HotelalaposicinPageFields,conloqueelDataPilotquedaconfiguradodelasiguiente manera:

FinalmentesedesplieganlasopcionesdisponiblesbajoelbotnMoreparaindicarqueel DataPilotgeneradosedeseaenunanuevahojadentrodelahojadeclculo:

Elresultadoobtenidoeselsiguiente:

Deestamanerasehaconseguidogenerarunresumendelainformacindelaocupacin totaldeloshotelesmesames,conlaposibilidaddeanalizarcadahotelenparticularoel conjuntototaldehoteles. Esimportanteaclararenestepuntoquesirealizaalgncambiosobrelainformacinbasedel DataPilotporejemplosemodificanlosvaloresdelasocupacionesoseincluyeunnuevo hotel,stenoseactualizadeformaautomtica,paraqueelDataPilotpresenteelresumen actualizadoesnecesariodarclickderechosobrelyseleccionarlaopcinRefresh.

MacroquemodificalosdatosdeunDataPilotylorefrescadeformaautomtica Elsiguienteejemplopresentalaformaenquepuedenmodificarselosdatosfuentedeun DataPilotyluegoactualizarautomticamenteelmismo: SubEjemplo6 'ModificarlosdatosempleadosporelDataPilotdelahoja2 'ActualizarelDataPilot 'Ocultarlahojadedatos DimdocumentoActivo,hojaActiva,Celda,dispatcher,view,frame DimIasInteger documentoActivo=thisComponent 'XRaydocumentoActivo hojaActiva=documentoActivo.getSheets.getByIndex(0) 'hojaActiva=documentoActivo.getSheets.getByIndex(0) 'hojaActiva.IsVisible=True 'seleccionarunrangodedatosparamodificar 'losdatosquesequierenmodificarestnenelrangoC2:C49 ForI=1To48 Celda=hojaActiva.getCellByPosition(2,I) Celda.setFormula("=RANDBETWEEN(5000;15000)") NextI 'losdatoshancambiado,refrescarelDataPilot 'tomado de: http://www.oooforum.org/forum/viewtopic.phtml?t=52897&highlight=datap ilot 'view es una representacion abstracta del controlador del doc abierto view=ThisComponent.CurrentController 'frameeslaventanacomotalenlaqueestoytrabajando 'Description 'representstheenvironmentforadesktopcomponent 'Framesaretheanchorsfortheofficecomponentsandtheyare thecomponents' 'linktotheoutsideworld.Theycreateaskeletonforthewhole officeapi

'infrastructurebybuildingframehierarchys.Thesehierarchies containsall 'currentlyloadeddocumentsandmakeitpossibletowalkduring thesetrees. frame=view.Frame'recuperaelframequetieneasociadoelcalc abierto 'Descriptioncom.sun.star.frame.DispatchHelper 'providesaneasywaytodispatchanURLusingonecallinstead ofmultipleones. dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") 'situarseenlahojaconeldatapilot hojaActiva=documentoActivo.getSheets.getByIndex(1) Celda=hojaActiva.getCellByPosition(0,0) view.select(Celda)'equivaleadarclicksobrelacolumnaconel findeactivarelDataPilot dispatcher.executeDispatch(frame, ".uno:RecalcPivotTable", "", 0,Array())'refrescaelDataPilot 'seocultalahojaconlosdatosqueusaeldatapilot hojaActiva=documentoActivo.getSheets.getByIndex(0) hojaActiva.IsVisible=False MsgBox("DataPilotActualizado",0,"OrderFromChaos!") EndSub

CuandoDataPilotnoessuficiente OcurrequeDataPilottienelalimitantedenopermitirlainclusindemsde8camposenlos campos de datos y para algunos escenarios es importante poder incluir ms de estos campos.SinembargoycomoocurretantasvecesenelmundodelSoftwareLibreya existeunasolucinaesteinconvenietedesarrolladaporIanLaurensonydisponibleensu sitio web: http://homepages.paradise.net.nz/hillview/OOo/MyDataPilot3.ods. MyDataPilot3esunamacroqueproveeunainteresantealternativaaDataPilotypermitela inclusindencamposenlosdatosquesedeseananalizar.

Instruccionesdeinstalacinserequierehaberdescargadopreviamenteelarchivoanterior: Paso1:SeleccionelaopcinTools>Macro>OrganizeMacros>OpenOffice.orgBasic Paso2:ClicsobreelbotnOrganizer Paso3:SeleccionelapestaaLibrariesyluegodeclicsobrelaopcinImport:

Paso4:seleccioneelarchivoMyDataPilot3.odscuandoaparezcaelexploradordearchivos

Paso5:SeleccionelaslibrerasquevienenincluidasenelarchivoydeclicsobreelbotnOk

DadoqueesposiblequeyaexistaenOpenOfficeunalibreraconelmduloStandardel siguientemensajedeerrorpuedeaparecer:

Siestoocurresimplementesedebeeditarestalibreradesdeelorganizadordemacrose incluirall19unasubrutinacomolasiguiente: SubCargarMyDataPilot BasicLibraries.LoadLibrary("MyDataPilot") subMyDataPilot EndSub

19 PorallsehacealusinaMyMacros&Dialogs.Standard

Enestamismaubicacinysiguiendolamismaideaesposibleincluirunamacroquecargue automticamentelosrayosX: SubLoadingXRayLibraries BasicLibraries.LoadLibrary("XrayTool") EndSub

SubformasenBase AunqueelsiguienteejemplonotienequeverconMacrosdirectamenteesunaopcinque proveeOpenBasequepuederesultarinteresanteparalaspersonasqueestnmigrandode MSOffice.Laideaesgenerarunaformaquepresentelainformacinnoslodeunatabla sinodetablasoconsultasquepuedanestarrelacionadasconesta,empleandoparatalfin lasSubFormas.Esteejemplosedesarrollasobrelamismabasededatosdelcolegioquese empleenunejercicioanterior. Paso 1: disear o definir en SQL una consulta que permita recuperar los estudiantes inscritos,susnombres,suscalificacionesyladescripcindelasmismasparaunamateria especfica.AunqueesposibledefinirestaconsultautilizandoSQLenocasionesypara aquellosquevienentrabajandoasdesdehacetiemporesultaconvenienteusarlavistade diseoparatalfin.Enlavistadediseoseaadenlastablassobrelasquesequiererealizar unaconsulta,sedefinenloscamposarecuperaryseintroducenloscriteriosquefiltranlos resultados obtenidos. La siguiente imagen ilustra un diseo que arroja un resultado aproximadoalaconsultadeseada:

Paso2:empleandoelwizard(asistente)generarunanuevaforma:

Laformacomotaltraerlainformacindelatablacurso,puesloquesedeseaesquealver uncursoaparezcanlascalificacionesquesehangeneradoenelmismo:

Acontinuacinseindicaquesedeseaincluirunasubformayquelamismaestarbasada entablasoconsultasexistentes:

Actoseguidoseseleccionalaconsultaqueacabadecrearsemediantelaherramientade diseoyseindicanloscamposdelamismaquesedeseanincluir:

Enestepuntosedebeindicarquerelacinexisteentrelainformacindelaformaprincipaly ladelasubforma,deestamaneraescomoserecuperarnlosestudiantesinscritosenun cursoespecficoysuscalificacionescuandosepresenteelregistrodedichocurso:

Yapartirdeestepuntoelrestodelprocedimientoessimple:

Elresultadodelanteriorejercicioeselsiguiente:

Ylacaractersticaquehaceposibleestoseencuentraenlaspropiedadesdelasubforma:

ProgramandoDilogosMultiStep Enocasionesesdeseablecontarconundilogoquepresenteendiferentespasosdiferente informacin, en lugar de contar con varios dilogos. Un ejemplo claro de esto son los AsistentesoWizardqueseobservanendiferentesocasionesalemplearOpenOffice.Para programarundilogodevariospasosesnecesariomodificarlapropiedadStepdelaventana principaldeldilogoyubicarencadaSteploscomponentesdeseados.Elsiguienteejemplo enviadoporFernandoMndezyJavierGarcailustraclaramentelaidea: Paso1deldilogo:

Paso2deldilogo:

Paso3deldilogo:

Obsrvesecomoeselmismodilogo,perocondiferentescontrolesdeacuerdoconelvalor que tenga la propiedad Pag (step) en un momento dado. Obsrvese tambin que dicha propiedadesunapropiedaddelaventanaquecontienealosdemselementos,ascomode cadaunodeloscontroles.Estoquieredecirqueparaveruncontrolendeterminadopasodel

dilogo,elvalordePage(step)delcontrolyelvalordelpasoeneldilogodebencoincidir. PorotrapartesisedeseacontarconunpardecontrolesdeltipoAnteriorSiguiente,los mismosdebenapareceralolargodetodoslospasosdeldilogo,paraestoscontrolesdebe fijarselapropiedadPage(step)en0. Lamacroqueseincluyeenesteejemploilustracomoesposiblenavegardeunpasoaotro medianteloscontrolesanteriormentemencionados: REM*****BASIC***** OptionExplicit PublicoDialog1asObject'solohayundialogocondiferentespasos SubMain EndSub FunctionlanzarMenu(senalAsObject) REMestafuncionlanzaeldialogodevariospasos REMyocultalaformadelaquesellama Dimemisor,modelo,forma Dimdialogo,libreria,visualizacionDialogo emisor=senal.Source modelo=emisor.getModel() forma=modelo.getParent() 'XRayforma'paradeterminarquemetodousarparaocultarla 'Acontinuacionsecargaeldialogoprincipal oDialog1=loadDialog("Standard","Dialog1") 'Nowrunthedialog oDialog1.execute EndFunction FunctionsiguientePaso(senalAsObject) DimcontrolSiguienteAsObject DimcontrolAnteriorAsObject dimiaslong i=ODialog1.model.step controlSiguiente=oDialog1.getControl("CommandButton1") controlAnterior=oDialog1.getControl("CommandButton2") ifi=3then controlSiguiente.Model.Enabled = NOT

controlSiguiente.Model.Enabled elseifi=1then controlAnterior.Model.Enabled controlAnterior.Model.Enabled endif

NOT

oDialog1.Model.Step=oDialog1.Model.Step+1 'XRaycontrolSiguiente siguientePaso=True EndFunction FunctionpasoAnterior(senalAsObject) DimcontrolSiguienteAsObject DimcontrolAnteriorAsObject dimiaslong i=ODialog1.model.step controlSiguiente=oDialog1.getControl("CommandButton1") controlAnterior=oDialog1.getControl("CommandButton2") ifi=4then controlSiguiente.Model.Enabled controlSiguiente.Model.Enabled elseifi=2then controlAnterior.Model.Enabled controlAnterior.Model.Enabled endif = = NOT NOT

oDialog1.Model.Step=oDialog1.Model.Step1 'XRayoDialog1 pasoAnterior=True EndFunction FunctionLoadDialog(LibnameasString,DialogNameasString,Optional oLibContainer) DimoLibasObject DimoLibDialogasObject DimoRuntimeDialogasObject IfIsMissing(oLibContainer)then oLibContainer=DialogLibraries EndIf oLibContainer.LoadLibrary(LibName) oLib=oLibContainer.GetByName(Libname) oLibDialog=oLib.GetByName(DialogName)

oRuntimeDialog=CreateUnoDialog(oLibDialog) LoadDialog()=oRuntimeDialog EndFunction

MakeaTableQuery,desdeOpenBase Para finalizar este curso se presenta a continuacin un par de macros que ilustran las capacidades que brinda Open Office y en especial Base, para desarrollar nuevas herramientasqueconeltiempopermitancontarconmacrosmuypoderosas.Seasumepara esteejemploqueexisteunabasededatosyquelamismacuentaconunatabladeclientesy unatabladeempleados.Laideacentraldelejemploespermitiralusuariofinalinteractuar conlabasededatosmedianteunformularioodilogo,deformaquenoaccedadirectamente alaestructuradelabasecomotal,paratalfinseincluyeunaformadentrodelabasede datoscondosbotonesenella,asociadosadosmacrosdiferentes,laprimeradeellostoma unatablaygeneraunacopiadelamismacontodoslosdatosincluidos,lasegundapresenta un formulario simple de consulta donde el usuario final puede realizar bsquedas por cadenasdetexto. Elformularioprincipallucedelasiguientemanera:

Eldilogoqueseproveeparalaprimeraconsultaeselsiguiente:

Laideaconestedilogoesqueelusuarioseleccioneunatabladentrodelasqueexistenen labasededatosyquealpresionarelbotnsiguientesegenereunarplicadelamismaen la base de datos, empleando para tal fin la sintaxis estndar de SQL. Se ha dividido el problema en dos sub rutinas, la primera de ellas se encarga de presentar el dilogo, la segundacapturaelnombredelatablaseleccionadayejecutalaoperacin: SubMakeTableQuery 'Estarutinatomaunaconsultasobreunatabla 'especificaygeneraunanuevatablaapartirdelosresultados 'obtenidos 'Serequiereundilogoenelcualelusuarioseleccionela 'tablasobrelacualquieretrabajar 'Ellistadodetablasseobtendraconsultandolabasede 'datoscomotal 'Paso1:establecerconexionconlabasededatosparaobtener 'ellistadodetablasdisponible: ContextoBaseDatos createUnoService("com.sun.star.sdb.DatabaseContext") OrigenDatos=ContextoBaseDatos.getByName("sisepuede") TablasDisponibles=OrigenDatos.getTables.getElementNames =

'XRayTablasDisponibles 'Paso2:cargareldialogoyenlalistadesplegable 'ingresarlosnombresdelastablasexistentes oDialog1=loadDialog("Standard","Dialog1") 'estopasaantesdepintarelDialogo ListaDesplegable=oDialog1.getControl("ComboBox1") ListaDesplegable.addItems(TablasDisponibles,0) 'Nowrunthedialog oDialog1.execute EndSub SubMakeTableQuery2 DimConsultaSQLAsString DimSQLRunner,ResultSet TablaSeleccionada=ListaDesplegable.getSelectedText ConsultaSQL = "SELECT * INTO CACHED ""copiade"+TablaSeleccionada+"""FROM"""+TablaSeleccionada+"""" 'Se crea a continuacion el objeto requerido para ejecutar consultassobrelaDB IfNotOrigenDatos.IsPasswordRequiredThen Conexion=OrigenDatos.GetConnection("","")'user,password Else ManejadorInteraccion = createUnoService("com.sun.star.sdb.InteractionHandler") Conexion = OrigenDatos.ConnectWithCompletion(ManejadorInteraccion) EndIf SQLRunner=Conexion.createStatement() ResultSet=SQLRunner.executeQuery(ConsultaSQL) EndSub

Porotraparte,eldilogoparalasegundaconsultaeselsiguiente:

Laideaenestaocasinesqueelusuariofinalescribaelapellidoopartedelapellidodel clientequedeseabuscarypresentarenelcuadrodetextodelaparteinferiorlosresultados obtenidos.Nuevamentesehadivididoelproblemaendospartes: SubClientLikeQuery1 'conexionconlabasededatosparaobtener ContextoBaseDatos createUnoService("com.sun.star.sdb.DatabaseContext") OrigenDatos=ContextoBaseDatos.getByName("sisepuede") oDialog2=loadDialog("Standard","Dialog2") 'Nowrunthedialog oDialog2.execute EndSub SubClientLikeQuery2 DimCriterioBusquedaAsString =

DimConsultaSQLAsString DimCadenaAuxAsString DimIAsLong DimSQLRunner,ResultSet,Aux 'Capturarlacadenaintroducidaporelusuario CuadroEntrada=oDialog2.getControl("TextField1") CriterioBusqueda=CuadroEntrada.getText() CuadroResultados=oDialog2.getControl("TextField2") 'XRayCuadroResultados 'Realizarunabusquedaporsemejanzasobrelatabla ConsultaSQL = "SELECT * FROM ""Customers"" WHERE ""LastName"" LIKE'"+CriterioBusqueda+"%'" 'Se crea a continuacion el objeto requerido para ejecutar consultassobrelaDB IfNotOrigenDatos.IsPasswordRequiredThen Conexion=OrigenDatos.GetConnection("","")'user,password Else ManejadorInteraccion = createUnoService("com.sun.star.sdb.InteractionHandler") Conexion = OrigenDatos.ConnectWithCompletion(ManejadorInteraccion) EndIf SQLRunner=Conexion.createStatement() ResultSet=SQLRunner.executeQuery(ConsultaSQL) 'XRayResultSet 'Presentarlosresultadosenelcuadroderesultados IfNotIsNull(ResultSet)Then WhileResultSet.next 'a continuacion se construye la cadena que se va a pintarenelcuadroderesultados ForI=0ToResultSet.getColumns.Count1 Aux=ResultSet.Columns.getByIndex(I) CadenaAux=CadenaAux+Chr(9)+Aux.getString() NextI CadenaAux=CadenaAux+Chr(13) CuadroResultados.setText(CadenaAux) Wend EndIf EndSub

Bibliografa: Estecursonohubierapodidodesarrollarsesinlaayudainvaluabledelassiguientesfuentes:

GuadeprogramacindeStarOffice8paraBASIC,SunMicrosystems,Inc.Junio2005 UsefulMacroInformationForOpenOffice,AndrewPitonyak,Enero2006 Forms&Dialogs,RobertoC.Benitez,2007 Creatingorderfromchaos,PeterKupferyRichardDetwiler,2007 Migrating from Microsoft Office to OpenOffice.org 1.1.1: A guide for intermediate to advancedusers.Varios,2004 DatabaseDevelopmentOpenOffice.org&OOBasic,RobertoC.Benitez,2006 StarOfceProgrammersTutorial,SunMicrosystems,Inc.,2000 OpenOffice.orgUserGuideforVersion2.x,Varios,2006

Porsupuestounagranpartedelasayudasseencuentranenlnea:

api:ProjectHome,http://api.openoffice.org/ FirstSteps,http://api.openoffice.org/docs/DevelopersGuide/FirstSteps/FirstSteps.xhtml OooMacros,http://ooomacros.org/dev.php#101416 Extensions development basic OpenOffice.org Wiki, http://wiki.services.openoffice.org/wiki/Extensions_development_basic#XRay_tool Traducciones Libres: Poniendo en prctica OpenOffice.org Basic, http://freetrans.blogspot.com/2007/03/poniendoenprcticaooobasic.html Spreadsheet Documents, http://api.openoffice.org/docs/DevelopersGuide/Spreadsheet/Spreadsheet.xhtml#1_1_ Overview OpenOffice.orgForumatOooForum.org,http://www.oooforum.org/ documentation:,http://documentation.openoffice.org/ Table of Contents OpenOffice 2 (Data) ooBase Tutorials fdb1main, http://sheepdogguides.com/fdb/fdb1main.htm How to use OpenOffice 2.0's database tool, http://searchenterpriselinux.techtarget.com/tip/0,289483,sid39_gci1148271,00.html OpenOffice.orgDatabaseExplained,http://www.pitonyak.org/database/ Spreadsheet Documents, http://api.openoffice.org/docs/DevelopersGuide/Spreadsheet/Spreadsheet.xhtml#1_5_ 1_Spreadsheet_View Office Development, http://api.openoffice.org/docs/DevelopersGuide/OfficeDev/OfficeDev.xhtml#1_1_1_2_1

_FrameControllerModel_Paradigm_in_OpenOffice.org IannzOpenOffice.orgpage,http://homepages.paradise.net.nz/hillview/OOo/

Agradecimientos: Estecursonohubierapodidodesarrollarsesinlaspersonasqueasistieronal,acadauno deellosgraciasporsucolaboracin,buennimoysobretodoporlaspreguntasycuestiones que permitieron desarrollar este curso en direcciones que en un comienzo parecan impensables. Estematerialnohabrapodidocompletarsesinlapacienciademiesposa,quiensoportmis largasjornadasdetrabajoenlanochedurantelosdasquepreparlaprimeraversinde estematerial.

You might also like