Professional Documents
Culture Documents
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?
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.
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
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
DimVar1#
Moneda
DimVar1AsCurrency
DimVar1@
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:
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
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
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
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
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
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
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
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
entero
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:
Determinarsielcontenidode La variable que se desea unavariableesnumrico evaluar Determinarsielcontenidode La variable que se desea unavariableesunafecha evaluar Determinarsielcontenidode La variable que se desea unavariableesunarreglo evaluar
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.
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)
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
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")
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
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
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
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")
= =
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
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.
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:
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.
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
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:
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:
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
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:
Unavezdefinidalatablaquesedeseausar,elasistentepreguntaporelcampodelcualse debenobtenerlosvalores:
FinalmenteelAsistentedebesaberenquecampodelatablasobrelaquetrabajaresta forma sern guardados los valores seleccionados, asimismo necesita saber si se desea guardarelmismovalorqueseestpresentandoalusuarioenestecasoenparticularsera posiblequeelusuarioseleccionaraActivo,peroqueenlatablapacientesegrabaraelvalor de0:
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") =
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
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:
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
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
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
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:
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.
Paso4:seleccioneelarchivoMyDataPilot3.odscuandoaparezcaelexploradordearchivos
Paso5:SeleccionelaslibrerasquevienenincluidasenelarchivoydeclicsobreelbotnOk
DadoqueesposiblequeyaexistaenOpenOfficeunalibreraconelmduloStandardel siguientemensajedeerrorpuedeaparecer:
19 PorallsehacealusinaMyMacros&Dialogs.Standard
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:
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
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)
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.