Escolar Documentos
Profissional Documentos
Cultura Documentos
Ao
OpenOffice.orgBasic
por
Noelson Alves Duarte
CopyrightNoelsonAlvesDuarte
permitidaacpia,distribuioe/oumodificaodestedocumento,sobostermosdaGNU
Free Documentation License, Version 1.1 ou uma verso posterior publicada pela Free
SoftwareFoundation.Umacpiadalicenaacompanhaestedocumento.
Verso 2
ndice
1 Macros OpenOffice.org Basic............................................................................................................5
1.1 Introduo..................................................................................................................................5
1.2 Criando a Primeira Macro..........................................................................................................5
1.3 Executando a Primeira Macro....................................................................................................7
1.4 Compartilhando uma Macro......................................................................................................8
2 Dilogos Personalizados..................................................................................................................11
2.1 Introduo................................................................................................................................11
2.2 Criando um Dilogo ................................................................................................................11
2.3 Manipulando Eventos do Dilogo............................................................................................14
3 Pilotos Automticos.........................................................................................................................17
3.1 Introduo................................................................................................................................17
3.2 Criando um Piloto Automtico.................................................................................................17
3.3 Manipulando Eventos do Piloto Automtico...........................................................................19
4 Introduo a API do OpenOffice.org...............................................................................................21
4.1 Viso geral................................................................................................................................21
4.2 Objetos.....................................................................................................................................22
4.3 Definindo objetos.....................................................................................................................24
4.4 Criando um novo documento...................................................................................................26
5 Trabalhando com Documentos........................................................................................................28
5.1 Carregando Documentos..........................................................................................................28
5.2 Salvando Documentos..............................................................................................................30
5.3 Imprimindo Documentos..........................................................................................................31
5.4 Fechando Documentos.............................................................................................................33
5.5 Identificando os Documentos Abertos.....................................................................................34
6 Documentos do Writer.....................................................................................................................36
6.1 Introduo................................................................................................................................36
6.2 Editando texto..........................................................................................................................36
6.3 Movendo-se pelo texto............................................................................................................37
6.4 Formatando texto.....................................................................................................................41
6.5 Formatando com estilo ............................................................................................................43
6.6 Obtendo o objeto selecionado..................................................................................................47
6.7 Localizando objetos.................................................................................................................48
6.8 Busca e Substituio................................................................................................................50
6.9 Inserindo objetos......................................................................................................................52
6.10 Tabelas....................................................................................................................................53
6.11 Desenhos................................................................................................................................59
7 Documentos do Calc........................................................................................................................63
7.1 Introduo................................................................................................................................63
7.2 Planilhas...................................................................................................................................63
7.3 Editando...................................................................................................................................65
7.4 Navegando pelas Clulas..........................................................................................................67
7.5 Obtendo objetos selecionados..................................................................................................69
7.6 Formatando..............................................................................................................................70
Formatando Pargrafos e Caracteres........................................................................................70
Mesclando Clulas....................................................................................................................72
Inserindo Bordas......................................................................................................................72
Introduo ao OpenOffice.org Basic
Verso 2
Formatao Numrica..............................................................................................................73
Formatao Condicional...........................................................................................................74
7.7 Busca e Substituio................................................................................................................75
7.8 Ordenando................................................................................................................................77
7.9 Filtrando dados.........................................................................................................................78
7.10 Inserindo Subtotais.................................................................................................................80
7.11 Grficos..................................................................................................................................81
7.12 Seleo durante a execuo da macro....................................................................................85
7.13 Movimentando dados.............................................................................................................88
7.14 Dados de fontes externas.......................................................................................................89
Vnculos....................................................................................................................................89
Importando dados de um banco de dados................................................................................91
8 Banco de Dados...............................................................................................................................93
8.1 Introduo................................................................................................................................93
8.2 Fontes de Dados.......................................................................................................................93
8.3 Conexes..................................................................................................................................97
8.4 Estrutura do Banco de Dados..................................................................................................99
Tabelas......................................................................................................................................99
Chave Primria.......................................................................................................................104
ndices....................................................................................................................................105
Segurana...............................................................................................................................107
8.5 Registros................................................................................................................................108
Criando um RowSet...............................................................................................................108
Navegando pelos registros......................................................................................................110
Acessando os dados................................................................................................................111
Alterando os dados.................................................................................................................112
Obtendo Metadados do RowSet............................................................................................114
8.6 Consultas................................................................................................................................114
8.7 Comandos SQL......................................................................................................................117
8.8 Comandos SQL Preparados...................................................................................................119
8.9 Consultas Preparadas.............................................................................................................121
8.10 Vnculos...............................................................................................................................121
9 Apndice Linguagem Basic.........................................................................................................123
9.1 Primeiros Passos....................................................................................................................123
9.2 Elementos do Basic................................................................................................................125
Palavras reservadas.................................................................................................................125
Regras para nomes.................................................................................................................125
Comentrios...........................................................................................................................126
Tipos de dados internos..........................................................................................................126
Declarao de variveis..........................................................................................................127
Matrizes..................................................................................................................................127
Escopo das variveis..............................................................................................................128
Constantes simblicas.............................................................................................................129
Expresses..............................................................................................................................129
9.3 Fluxo de controle da execuo...............................................................................................132
Comando de deciso If ... Then..............................................................................................132
Comando de deciso Select Case...........................................................................................133
Comando de repetio While ... Wend...................................................................................134
Comando de repetio For ... Next........................................................................................135
2
Verso 2
Verso 2
Apresentao
EstedocumentooresultadodomeuesforoparaaprenderoOpenOffice.orgBasic.
Eleestfocado,principalmente,nasextensesdoOpenOffice.orgaoBasic,isto,naAPIdo
OpenOffice.org.Assimsendo,ascaractersticasbsicasdalinguagemdeprogramaoBasicno
seroabordadas.
SevocjprogramououconhecealgumdossaboresBasicedesejaescrevermacrosparao
OpenOffice.orgesteumbomlocalparacomear.Seno,recomendoprocuraralgumcursona
rede,esefamiliarizarcomoBasic,antesdeseaventurarnoOOoBasic.muitoimportante
dominarosfundamentosdeumalinguagemdeprogramao.
TodososexemplosdecdigofonteforamtestadoscomoOpenOffice.org,verso1.0.1,exceto
ospequenosblocosdecdigoforadassubrotinas.
Para utilizar este texto, o OpenOffice.org deve estar instalado em seu computador. Aps o
Captulo 3, recomendo que voc instale, tambm, o Manual de Referncia da API do
OpenOffice.org (consulte o captulo Mais Informaes). O Manual de Referncia sofre
atualizaesperidicasesuaversoatualizadaestdisponvel,tambm, paraconsultason
line.
Espero ter tempo para continuar aprendendo e acrescentando informaes teis aos
programadoresque,comoeu,nodominamalnguainglesa.Portanto,periodicamente,procure
pornovasversesdestedocumento.
Comoresultadodeumaaprendizagem, estaIntroduo,seguramente, contmmuitos errose
inconsistncias,esperocontarcomasuaajudaparacorriglos.
Em20dejunhode2003
OAutor
Consideraessobreaverso2destaIntroduo:
AinclusodeumcaptulosobreBancodeDados,deumapndicesobreaLinguagemBasicede
novasseesaolongodotexto,praticamentedobrandoonmerodepginas,meconvenceua
liberarestaIntroduocomoumanovaverso.
OOpenOffice.orgtambmevoluiu,e,nasuanovaverso,trazumgravadordemacros.Isto
ampliaaspossibilidadesdeprogramaoparaosusurioscomunse,tambm,paratodosaqueles
quedesejamaprenderaprogramar.
Porm,acreditoqueachaveparaaprogramaodoOpenOffice.org,estnoconhecimentoda
suaAPI.Estefoiocaminhoadotadodesdeaprimeiraversoe,dele,nopretendomeafastar.
Em25deagostode2003
OAutor
4
Verso 2
1.1 Introduo
UmamacroumprogramaescritonalinguagemOpenOffice.orgBasiccomafinalidadede
automatizartarefasdoOpenOffice.org.
AlinguagemOpenOffice.orgBasicmantmasprincipaiscaractersticasdasversesatuaisdo
BASIC,noquedizrespeitosintaxe,tiposdedados,operadores,comandos,funesinternas
eorganizaogeraldoprograma.Almdisto,oOpenOffice.orgBasicpermiteoacessoauma
grande quantidade de objetos, com seus mtodos e propriedades, especficos do
OpenOffice.org.
O OpenOffice.org tem um IDE (Integrated Development Environment Ambiente de
Desenvolvimento Integrado) completo, inclundo: edio de cdigo fonte, verificao de
erros,criaodedilogosegerenciamentodebibliotecas.
Verso 2
Verso 2
e) Observe, no editor Basic, a definio de uma subrotina Sub Main ... End Sub. Note
tambmqueaabaModule1estativa.
f)Digite(oucopieecole)ocdigofonteabaixoentreaslinhasSubMaineEndSub.
DimoDocumentoasObject
DimoTextoasObject
DimoCursorVistaasObject
DimoCursorasObject
DimsInserirasString
'solicitaotexto
sInserir=InputBox("Digiteotexto:","InserirTexto","")
'testasealgofoidigitado
ifsInserir=""then
exitsub
endif
'obtmomodelododocumento
oDocumento=ThisComponent
'obtmoservioTextdodocumento
oTexto=oDocumento.getText()
'obtmaposiodocursornaGUIecriaumcursordetexto
oCursorVista=oDocumento.getCurrentController().getViewCursor()
oCursor=oTexto.createTextCursorByRange(oCursorVista.getStart())
'insereotextonaposiocorrentedocursor
oTexto.insertString(oCursor,sInserir,FALSE)
Verso 2
Pronto,terminamosanossaprimeiramacro.Lembresequeelaestembutidanodocumento
Primeira_Macro.sxw.
Verso 2
Antesdeencerrarestaseo,retornejaneladoIDEBasic,parasimularmosumerrono
cdigofonte:
a)NapenltimalinhadecdigooTexto.InsertString(...)altereonomedavariveloCursor
paraoCurso.
b)Executeamacro.SurgeumacaixacomumamensagemdeerroeumbotoOK.Notequea
setadeacompanhamentodaexecuotornasevermelhanalinhaondeocorreoerro.Aps
clicaremOKaexecuodamacrofinalizadaealinhacomoerropermaneceselecionada.
Figura3:Errodeexecuo
c)CorrijaonomedavariveldeoCursoparaoCursor.FecheoIDEBasic.
SalveodocumentoPrimeira_Macro.sxw.
Noprximopasso,veremoscomodisponibilizarumamacroparatodososdocumentosdo
OpenOffice.org.
Verso 2
Figura5:InserirBibliotecas
10
Verso 2
11
Dilogos Personalizados
Verso 2
2 Dilogos Personalizados
2.1 Introduo
OOpenOffice.orgBasicpermiteacriaodeDilogosPersonalizados,atravsdeumeditor
deDilogosintuitivoepoderoso.
Dilogos so uma excelente soluo para interao com o usurio, permitindo que o
programadordesenheumainterfacegrficaconsistenteparaobteroupassarinformaesao
operador.
12
Verso 2
Dilogos Personalizados
Figura6:EditordeDilogos
VejamosafinalidadedealgunsconesexistentesnoquadrodeControles.
Etiquetausadoparacolocaretiquetasnodilogo.
Botousadoparacolocarbotesnodilogo.
Caixadetextopermiteinserirumacaixadetextonumdilogo.
Propriedadesexibeajaneladepropriedadesdocontroleselecionado.Serativadoquando
algum controle for selecionado. Alm da edio das propriedades, permite associar
procedimentos(cdigo)aeventosocorridosnocontrole.
Ativarmododetesteexibeodilogocomoseestivesseemexecuo.
InserirControlesnumDilogoumaoperaoemtrspassos:
1) ativaroconedocontrolenoquadrodecontroles;
2) definirareadodilogoondeocontroleserposicionado.Paraistopressioneoboto
esquerdodomouseearrasteformandoumretngulo,emseguida,libereobotodomouse;
3) definiraspropriedadesdocontrole.
Quando um controle adicionado ao dilogo, o OpenOffice.org Basic automaticamente
defineumvalorpadroparacadapropriedade.Paraexibiraspropriedadesdeumcontrole
Introduo ao OpenOffice.org Basic
13
Dilogos Personalizados
Verso 2
selecionado,cliquesobreoconePropriedadesoucliqueduasvezessobreocontrole.Note,
tambm,queajanelaPropriedadespossuiumabarraderolagemparavisualizao.
Figura7:JanelaPropriedades
Vamostrabalharemnossodilogo:
a)Selecioneodilogovazio,clicandonasuabordaexterna.Notequeaparecemmarcasem
tornodomesmo.Podemosusarestasmarcaspararedimensionaronossodilogo.
b)CliquenoconePropriedadesparaexibirasuajanela,comonafiguraacima.Nocampo
TtuloabaGeraldigiteInserirFraseetecleEnter.CliquenobotoSubirdePropriedades
eobserveottulododilogo.
c) Adicione um controle Etiqueta ao dilogo. Para isto, clique no cone Etiqueta, em
seguidadefinaumretngulonapartesuperiordodilogo.Definaasuapropriedadettulopara
Digiteotexto.
d) Coloque uma Caixa de Texto no dilogo, logo abaixo da etiqueta. Observe a sua
propriedade Nome: TextField1. No cdigo fonte, nos referimos a um controle pela sua
propriedade Nome, da a sua importncia. Note, tambm, que este controle no tem a
propriedadeTtulo.
e)Vamoscolocardoisbotes,ladoalado,naparteinferiordodilogo,abaixodacaixade
texto.DefinaosseusttulosparaOKeCancelar.
f)Ajusteodilogoeseuscontrolesdemodoquefiquemcomaaparnciadafiguraabaixo.
14
Verso 2
Dilogos Personalizados
Figura8:DilogoInserirFrase
Bem,terminamosonossodilogo.Vamosverificarasuaaparnciaquandoemexecuo.
CliquesobreoconeAtivarmododetestenoquadrodecontrolese,apsobservarodilogo,
cliqueemseuconeFecharpararetornaraoeditor.
Naprximaseo,daremosfuncionalidadeaonossoDilogo.
PrivateoDialogoasVariant
SubdlgExecutaDialogo
oDialogo=createUnoDialog(DialogLibraries.Standard.Dialog1)
oDialogo.execute()
EndSub
SubdlgCancelaDialogo
oDialogo.endExecute()
EndSub
SubdlgInserirFrase
15
Dilogos Personalizados
Verso 2
DimoDocumentoasObject
DimoTextoasObject
DimoCursorVistaasObject
DimoCursorasObject
DimsFraseasString
oDialogo.endExecute()
'noteareferenciaaocontroleTextField1dodialogo
sFrase=oDialogo.Model.TextField1.Text
ifsFrase=""then
exitsub
endif
'obtmomodelododocumento
oDocumento=ThisComponent
'obtmoservioTextdodocumento
oTexto=oDocumento.getText()
'obtmaposiodocursornaGUIecriaumcursordetexto
oCursorVista=oDocumento.getCurrentController().getViewCursor()
oCursor=oTexto.createTextCursorByRange(oCursorVista.getStart())
'insereotextonaposiocorrentedocursor
oTexto.insertString(oCursor,sFrase,FALSE)
EndSub
16
Verso 2
Dilogos Personalizados
Figura9:DilogoAtribuirmacro
Agora,repitaospassosacimaparaatribuiroprocedimentodlgCancelaDialogoaoeventoAo
Iniciar,dobotoCancelardonossodilogo.
ParaoOpenOffice.orgBasic,oprimeiroprocedimentonomduloopontodeentradada
macro. Logo, a Sub dlgExecutaDialogo ser automaticamente executada toda vez que
executarmosanossamacro.
Teste a macro e o dilogo personalizado, clicando sobre o cone Executar, na barra de
ferramentasdoIDEBasic.Digiteumafrasequalquernacaixadetextododilogoeclique
sobreobotoOk.Apsaexecuodamacro,verifiqueseafrasefoiadicionadacorretamente
aodocumento.
Noprximocaptulo,vamostransformaronossodilogosimplesnumPilotoAutomtico.
17
Pilotos Automticos
Verso 2
3 Pilotos Automticos
3.1 Introduo
UmPilotoAutomticoumDilogoexibidoemvriospassos.umaformaeficientede
guiarousurionaexecuodeumatarefa.
OOpenOffice.orgtraz,emsuainstalaopadro,vriosPilotosAutomticos.Verifiqueo
funcionamentodeumdeles,selecionandoArquivoPilotoAutomticoCarta.
Verso 2
Pilotos Automticos
CliquenoconeBoto,noquadrodecontroleseadicionedoisnovosbotesnodilogo,lado
aladoeesquerdadobotoOk.
Selecioneoboto CommandButton3,cliquenocone Propriedades edefinaapropriedade
Titulopara<<Voltar,altereovalordapropriedadeAtivadodeSimparaNo.
SelecioneobotoCommandButton4edefinaasuapropriedadeTituloparaPrximo>>.
SelecioneobotoOkealtereoseuTtuloparaConcluir.
Selecioneodilogo(cliquenasuabordaexterna)edefinaasuapropriedadePgina(Step)
para1(um).
SelecioneocontroleEtiquetaedefinaasuapropriedadePginapara1(um).
SelecioneocontroleCaixadeTextoedefinaasuapropriedadePginapara1(um).
Agora, retoque a primeira pgina do Piloto Automtico, tornandoa semelhante figura
abaixo.
Figura10:PrimeiraPginadoDilogodoPilotoAutomtico
Bem,vamosprosseguiremnossoprojeto,desenhandoaPgina2doPilotoAutomtico.
Selecione o dilogo e altere a propriedade Pgina para 2 (dois). Note que os controles
EtiquetaeCaixadeTextodesaparecem,poiselespertencemPgina1.Osbotes,quetma
pginaiguala0(zero),continuamvisveis.
Adicioneuma Etiqueta napartesuperioresquerdadodilogoedefinaoseu Ttulo para
Selecioneaposio.Observequeapropriedadepginaiguala2(dois),omesmovalordo
dilogo.
CliquesobreoconeBotodeOpo,noquadrodecontroles,eponhatrsbotesdeopo,
napartesuperiordireitadodilogo,umabaixodooutro.
DefinaoTtulodoprimeirobotodeopoparanoCursoreasuapropriedadeEstadopara
Selecionado.DefinaoTtulodosegundobotodeopoparanoIncio.DefinaoTtulodo
terceirobotodeopoparanoFinal.
19
Pilotos Automticos
Verso 2
Agora,ajusteoscontrolesdasegundapginadoPilotoAutomtico,tornandoasemelhante
figuraabaixo.NotequeobotodeoponoCursoropadro.Aativaoedesativaodos
botesVoltarePrximoserfeitaemtempodeexecuo(pelocdigofonte).
Figura11:SegundaPginadoDilogodoPilotoAutomtico.
ParafinalizarodesenhodoPilotoAutomtico,selecioneodilogoeretorneparaaPgina1
(um), pois oOpenOffice.org, como padro, exibe a ltima pgina acessada no Editor de
Dilogos.
Na prxima seo, veremos o cdigo fonte necessrio para dar funcionalidade ao Piloto
Automtico.
SubdlgProximoDialogo
oDialogo.Model.Step=2
oDialogo.Model.CommandButton3.Enabled=true
oDialogo.Model.CommandButton4.Enabled=false
EndSub
SubdlgVoltarDialogo
oDialogo.Model.Step=1
oDialogo.Model.CommandButton3.Enabled=false
oDialogo.Model.CommandButton4.Enabled=true
EndSub
Antesdeinserirafrase,precisamosverificaraposio,selecionadanosegundopasso(botes
deopo)etrataressaescolhaadequadamente.
20
Verso 2
Pilotos Automticos
'aposiodafrasenoincioounofinal
ifoDialogo.Model.OptionButton2.State=1then
oCursor.gotoStart(FALSE)
elseifoDialogo.Model.OptionButton3.State=1then
oCursor.gotoEnd(FALSE)
endif
Agora,vamosligarosprocedimentosaoseventosquenosinteressam.
Alterneparaoeditordedilogos.
SelecioneobotoVoltarecliquenoconePropriedades.SurgeajanelaPropriedades,clique
naabaEventose,emseguida,cliquenoboto direitadocampodoeventoAoIniciar.
Surgeajanela Atribuirmacros comoevento AoIniciar selecionado.Narvore Macros,
expanda as entradas Primeira_Macro.sxw e Standard, clique sobre Module1. Surge a
relaodeprocedimentosdomdulo,selecioneoprocedimento dlgVoltarDialogo eclique
sobreobotoAtribuir.Parafecharajanela,cliquenobotoOK.
Seguindoospassosacima,atribuaoprocedimentodlgProximoDialogoaoeventoAoIniciar
dobotoPrximo.
Executeamacroeverifiquesetudoocorreucomooesperado.
Agora,vocpodeseaventurarescrevendosuasprpriasmacros.Comoumpontodepartida,
consulteoprximocaptuloembuscadeinformaescomplementares.
21
Verso 2
22
Verso 2
Asestruturassotiposdedadoscontendocampos,domesmotipoouno,agrupadossobum
mesmonome.Comoexemplo,vamosestudaraestrutura<com.sun.star.awt.Size>,utilizada
pordiversosserviosdaAPI.Eladefineotamanhodeumobjetoecontmdoiscampos:
Struct<com.sun.star.awt.Size>
Width
valordotipolongo(Long),especificandoalargura
Height
valordotipolongo(Long),especificandoaaltura
Umaestruturapodeincluiroutrasestruturasouobjetoscomocampos.
Podemosdeclararumavarivelsimplesouumvetordotipoestrutura,comoabaixo:
DimvTamanhoAsNewcom.sun.star.awt.Size
'declaraumavarivelsimples
DimvetorTam(2)AsNewcom.sun.star.awt.Size 'declaraumvetorpara3elementos
DimvTam()AsNewcom.sun.star.awt.Size
'declaraumvetorvazio
OcomandoAsNewutilizadoemdeclaraesdetiposdedadosnosuportadointernamente
peloBasic.Note,ainda,aespecificaocompletadotipodedado.
Oacessoaoscamposdaestruturasedatravsdooperadorponto(.)comoem:
'defineosvaloresdoscamposdaestruturaSizevTamanho
vTamanho.Width=2000
vTamanho.Height=1000
'ou,ainda
nAltura=vTamanho.Height
'acessoaoscamposdeumvetordeestrutura
vetorTam(0).Width=5000
vetorTam(0).Height=2500
Umaenumeraocontmumarelaodeconstantescomvaloresinteirosconsecutivos.Por
exemplo,aenumerao<com.sun.star.awt.PushButtonType>definetipospossveisparaum
boto,soeles:
STANDARD
comportasecomoumbotopadro
OK
comportasecomoumbotoOk
CANCEL
comportasecomoumbotoCancelar
HELP
comportasecomoumbotoAjuda
Normalmente,osvaloresdeumaenumeraosoutilizadoscomopropriedadesdeobjetos,
comoabaixo:
oBotao1.PushButtonType=com.sun.star.awt.PushButtonType.STANDARD
PushButtonType uma propriedade do objeto boto. Devemos fornecer a especificao
completaparaonomedaconstante.
Umgrupodeconstantestambmcontmvaloresparaconstantesrelacionadas,contudoeles
no so, necessariamente, consecutivos. A atribuio das constantes de um grupo a uma
varivelsegueomesmopadrodasenumeraes.
23
Verso 2
4.2 Objetos
Jdissemosqueumservioumaespecificaodeumobjeto,queenglobaumconjuntode
interfacesepropriedades.Umainterfaceumacoleodemtodos.Umapropriedadeum
valorquedeterminaumacaractersticadeumservio.
Deumamaneiraerrnea,umobjetocomoumaestruturaque,almdoscamposcomuns,
pudesse conter campos especiais definindo procedimentos. Os campos comuns seriam as
propriedades e os especiais os mtodos. Se voc quiser descobrir o porqu da palavra
errnea,procurealgumtextointrodutriosobreprogramaoorientadaaobjetos.
VamosanalisaroservioSpreadsheet,domdulo<com.sun.star.sheet>,querepresentauma
PlanilhanumdocumentodoCalc,parafixarosconceitos.
<com.sun.star.sheet.Spreadsheet>:
Incluioservio:
<com.sun.star.sheet.SheetCellRange>
Exportadiversasinterfaces,entreelas:
<com.sun.star.sheet.XSpreadsheet>
<com.sun.star.container.XNamed>
Possuiaspropriedades:
IsVisible AsBoolean
PageStyle AsString
Umainterfaceolocalaondeosmtodosdosobjetossodefinidos.Noexemploacima,a
interfaceXSpreadsheetdefinemtodosquecriamumcursorparaumaextensodeclulas,
soeles:
createCursor
criaumcursorparatodaaplanilha
createCursorByRange
criaumcursorparaumaextensodeclulas
UmmtodocorrespondeaumprocedimentodalinguagemBasic.
Existeoutracaractersticadasinterfacesquedevesercitada.Umainterfacepodeserderivada
apartirdeoutra(superinterface).Nestecaso,elaherdaosmtodosdasuperinterface.Como
exemplo,vejamosahierarquiadainterfaceXSpreadsheet:
com.sun.star.uno.XInterface
|___com.sun.star.table.XCellRange
|___com.sun.star.sheet.XSheetCellRange
|___com.sun.star.sheet.XSpreadsheet
NotequeXSpreadsheetdefinidaapartirdainterfaceXSheetCellRange,queporsuavez
derivada de XCellRange. A conseqncia prtica disto : todos os objetos que oferecem
XSpreadsheetsuportamosmtodosdeXCellRangeeXSheetCellRange.
Uma propriedade define uma caracterstica de um objeto. Por exemplo, a propriedade
IsVisible,acima, determinaseaplanilha aqueserefereserounovisvelnainterface
grfica.
24
Verso 2
ObservequeSpreadsheetincluioservioSheetCellRange,istosignificaqueosmtodosdas
suasinterfacese,tambm,assuaspropriedadessosuportadasporSpreadsheet.
Jvimosqueoacessoaoscamposdeumaestruturasedatravsdooperadorponto(.),isto
tambmseaplicaaosmtodosepropriedadesdeumobjeto.Ento,supondoquetemosuma
variveloPlanilha1,dotipoobjetoSpreadsheet,podemosescrever:
oCursor=oPlanilha1.createCursor() 'criaumcursorabrangendotodaaplanilha
bVisivel=oPlanilha1.IsVisible
'atribuiabVisivelovalordapropriedadeIsVisible
Devemoslembrarqueummtodopodeounoretornarumvalor.Noprimeirocasoelesse
assemelhamsfunese,nosegundo,ssubrotinasdoBasic.
Existempropriedadesquesorepresentadasporestruturas.UmadasmaisutilizadasnaAPI
doOpenOffice.orgaestrutura<com.sun.star.beans.PropertyValue>,comquatrocampos,
entreosquaisopar:
Name
Value
cadeiacomonomedapropriedade(sensvelamaisculas/minsculas).
tipodedadoVariantcomovalordapropriedade.
Oparmetrodafunoaespecificaocompletaparaoservio.Todososserviosiniciam
comcom.sun.star,emseguidavemonomedomdulo,nestecaso,framee,porfim,onome
doservioDesktop.Note,tambm,queaespecificaopassadacomoumacadeia.
Apsachamada,podemosverificarseoserviofoicriadocom:
IfisNull(oDesktop)Then
'Erronacriaodoservio
EndIf
ExistemserviosquepodemsercriadosatravsdechamadasamtodosdaAPI.Porexemplo,
um documento do Writer pode conter objetos como texto e desenhos. Os servios que
representamestesobjetospodemsercriadosdeduasmaneiras:
Naprimeira,usamosummtodoexclusivoparaestafinalidade:
oObjetoTexto=oDocumento.getText()
OmtodogetText,retornaumobjetocomocontedotextodeumdocumentodoWriter.
Introduo ao OpenOffice.org Basic
25
Verso 2
Nasegunda,podemoschamarumdosmtodosdogerentedeservios:
oObjetoLinha=oDocumento.createInstance(com.sun.star.drawing.LineShape)
OmtodocreateInstancecriaoobjeto(servio)especificadocomoparmetro.
Umservio(objeto)pode,tambm,serpartedaspropriedadesdeumoutroobjeto.Nestecaso,
eleserobtidocomooresultadodeumachamadaaomtodogetPropertyValue():
oPropriedade=oObjeto.getPropertyValue(Nome_da_Propriedade)
OmtodogetPropertyValueretornaumobjeto,seovalordapropriedadeforumobjeto.
Diversosserviossodependentesdeumcontexto.Porexemplo,vocnopodecriaruma
clula fora de uma planilha. Outros servios no precisam de um ambiente para operar.
Existem, ainda, servios que no oferecem nenhuma interface, servindo unicamente para
obteredefinirpropriedades.
OBasicofereceduaspropriedadesquefacilitamoacessoaservios,soelas:
StarDesktop equivalente ao objeto retornado por uma chamada funo
createUnoService(com.sun.star.frame.Desktop).Digiteocdigoabaixonumanovasub
rotina,executeeobserveoresultado:
MsgBoxStarDesktop.Dbg_SupportedInterfaces
'
'omesmoque:
'
DimoDesktop
oDesktop=CreateUnoService("com.sun.star.frame.Desktop")
MsgBoxoDesktop.Dbg_SupportedInterfaces
ThisComponentretornaoobjetodocumentoquecontmocdigoBasic,existeapenasem
documentosdoWriter,Calc,ImpressouDraw.Algumasdesuasinterfacesdependemdotipo
dedocumento.
DimoDocumentoAsObject
oDocumento=ThisComponent
OOOoBasictemtrspropriedadesmuitoteisparaainspeodeobjetos,soelas:
Dbg_SupportedInterfaces
retornaasinterfacessuportadaspeloobjeto
Dbg_Properties
retornaaspropriedadesdoobjeto
Dbg_Methods
retornaosmtodossuportadospeloobjeto
Paraobterestaspropriedades,useaforma Objeto.Propriedade.Porexemplo,verifiqueas
interfacessuportadaspelomodelodedocumento,executandoocdigoabaixo:
SubMain
26
Verso 2
MsgBoxThisComponent.Dbg_SupportedInterfaces
EndSub
Ainterfacecom.sun.star.lang.XServiceInfopossuiosmtodosabaixo,teisparainspeode
servios:
getImplementationName()AsString
retornaonomedeimplementaodoservio
supportsService(sNomeAsString)AsBoolean
retornaTrueseoserviosNomeforsuportado
getSupportedServiceNames()AsString()
retornaumconjuntodecadeiascomosnomesdosserviossuportados,inclusiveosindiretos
Vamosusarasfacilidadesdeinspeodeobjetos,oferecidaspeloOpenOffice.orgBasic,para
verificaroservioSpreadsheet.NumdocumentodoCalc,crieamacroabaixoeexecutea
observandoasada:
SubservicoSpreadsheet
'exibeinfodoservioSpreadsheet
oDocumento=ThisComponent
oSheet=oDocumento.Sheets(0)
'serviossuportados
sServ=oSheet.getSupportedServiceNames()
sMsg=""
Fori=0ToUBound(sServ())
sMsg=sMsg+sServ(i)+Chr$(10)
Nexti
MsgBoxsMsg
'interfacessuportadas
MsgBoxoSheet.Dbg_SupportedInterfaces
'mtodos
MsgBoxoSheet.Dbg_Methods
'propriedades
MsgBoxoSheet.Dbg_Properties
EndSub
Duranteaexecuo,seroexibidososservios,interfaces,mtodosepropriedadessuportadas
peloobjetoSpreadsheet.
Naprximaseo,vamosapresentarumexemplo,queutilizadiversosconceitosapresentados
nestecaptulo.
27
Verso 2
AsubrotinaSubcriaNovoDocumento,abaixo,executaestastarefasapropriadamente.
'
'Criaumnovodocumentoapartirdeummodelo
'
SubcriaNovoDocumento
DimoDesktopAsVariant
DimoDocumentoAsObject
DimmPropArquivo(0)AsNewcom.sun.star.beans.PropertyValue
DimsUrlAsString
'criaoobjetooDesktop
oDesktop=createUnoService("com.sun.star.frame.Desktop")
'defineaURLdoarquivomodelo,ALTEREparaseusistema
sUrl="file:///D:/nad/openoffice/documentation.stw"
'defineapropriedadeAsTemplateparaTrue
mPropArquivo(0).Name="AsTemplate"
mPropArquivo(0).Value=True
'criaoobjetooDocumento
oDocumento=oDesktop.loadComponentFromURL(sUrl,"_blank",0,mPropArquivo())
'INSERIRCDIGOPARASALVARAQUI(estamacroserreutilizadaadiante)
EndSub
AslinhasiniciadaspelocomandoDimdeclaramtodasasvariveisusadaspelasubrotina.
Paracarregarumarquivo,usamosomtodoloadComponentFromURL(),quedefinidopor
umainterface(XComponentLoader)doservio Desktop.Ento,precisamos deumobjeto
UNODesktop,declaradonalinhaDimoDesktopAsVariant.Aqui,otipoVariantsegueuma
recomendaodoDevelopersGuideparaadeclaraodeobjetosUNO.
AvarivelsUrl(tipoString)recebeaespecificaocompletadocaminhoparaoarquivo.Ser
passadacomoparmetrodomtodoloadComponentFromURL().
O mtodo loadComponentFromURL() retorna um objeto Document. A linha Dim
oDocumentoAsObjectreservamemriaparaesteobjeto.
O mtodo loadComponentFromURL(), recebe uma sequncia de propriedades como
parmetro.Alinha DimmPropArquivo declaraedefineumvetorpara estasequncia.A
definio do objeto feita com o operador New seguido do tipo de objeto (As New
com.sun.star.beans.PropertyValue).
AlinhaoDesktop=createUnoService(...)seencarregadacriaodoobjetoDesktop.
A linha oDocumento = oDesktop.loadComponentFromURL(...) carrega o documento de
acordocomos parmetros eretornaumobjetodotipoDocument. Notequeasequncia
mPropArquivopassadacomoargumentoseguidade().Oparmetro_blanksignificaque
umnovoquadrosercriadoparaodocumento.
Pronto,agoradigite(oucopieecole)aSubcriaNovoDocumento,alterandoavarivelsUrl
paraconterumcaminhocompletodoseusistema,eexecuteamacroparaverseuresultado.
No prximo captulo, aprenderemos mais sobre programao com documentos do
OpenOffice.org.
28
Verso 2
b)DefiniraURL
Vocdevefornecerumacadeiadecaracterescomaespecificaocompletadocaminhodo
documento,casoestejaabrindoumdocumentoexistente,naforma:
file:///caminho_completo_do_arquivo
Paranovosdocumentos,criadosapartirdomodelopadro,existemURLsprdefinidas,que
devemserusadasdeacordocomotipodedocumento:
URL
Descrio
private:factory/swriter
private:factory/scalc
private:factory/sdraw
private:factory/simpress
c)Definiraspropriedadesdodescritordemdia
Odescritordemdiaumservio(com.sun.star.document.MediaDescriptor)quedefinecomo
umrecursodevesercarregado.Aspropriedadesdodescritorsodefinidasnumasequncia
com.sun.star.beans.PropertyValue.Declareumvetorparaasequncia,deacordocomo
nmerodepropriedadesaalterar,comoabaixo:
'declaraumvetorvazio,paraefeitodepassagemcomoparmetro
DimmPadrao()
'defineumvetorpara1propriedade(ndice0)
DimmPropArquivo(0)AsNewcom.sun.star.beans.PropertyValue
mPropArquivo(0).Name="AsTemplate"
mPropArquivo(0).Value=True
'defineumvetorpara2propriedades(ndices0e1)
DimmPropriedades(1)AsNewcom.sun.star.beans.PropertyValue
29
Verso 2
Seguemasdescriesdealgumaspropriedades(existemvrias):
Propriedade
Tipo
Descrio
AsTemplate
FilterName
String
JumpMark
String
Hidden
Overwrite
ReadOnly
Unpacked
Password
String
d)Definiroquadrodedestino
oframeondeodocumentosercarregado/criado,sejexistirumquadrocomonome
especificado,eleserusado,senoumnovosercriado.
Osnomesprdefinidos,aseguir,nuncadevemserusadoscomonomedequadros:_blank;
_default;_self;_parent;_tope_beamer.Use_blankparacriarumnovoquadro.
e)Definiroflagdebusca
umaconstantequedefineotipodealgoritmousadoparaencontraroquadrodedestino.Use
umvalor0paradesconsiderar.
f)ChamaromtodoloadComponentFromURL()
Estemtodo,doobjetoDesktop,carregaocomponentedefinidopelaURL,dentrodoquadro
dedestino.Vejamosseusdetalhes:
loadComponentFromURL(URLAsString,
FrameDestinoAsString,
FlagBuscaAsLong,
Propriedades()As<com.sun.star.beans.PropertyValue>)
OvalorderetornoumobjetoXComponentouNullemcasodeerro.
Eisumexemplodechamada:
30
Verso 2
oDocumento=oDesktop.loadComponentFromURL(sUrl,"_blank",_
0,mPropArquivo())
Istotudo,analisenovamenteocdigodaSubcriaNovoDocumento,docaptuloanterior.
DocumentosabertoscomloadComponentFromURL(),devemusarosmtodosstoreAsURL
oustoreToURL.
Comoexemplo,digite(oucopieecole)ocdigofonteabaixo,apsalinha
'INSERIRCDIGOPARASALVARAQUI
31
Verso 2
Temos,ainda,osmtodosabaixo,relacionadoscomatarefadesalvararquivos:
isModified()AsBoolean
RetornaTrueseorecursofoimodificado,senoretornaFalse.
hasLocation()AsBoolean
RetornaTrueseoarquivojexiste(foigravado),senoretornaFalse.
GetLocation()AsString
RetornaumaStringcomaURLdorecurso.
isReadonly()AsBoolean
RetornaTrueseforsomenteleitura,emcasocontrrioretornaFalse
Aseguir,temosumfragmentodecdigomaiselaboradoparasalvararquivos:
If(oDocumento.isModified)Then
If(oDocumento.hasLocationAnd(NotoDocumento.isReadOnly))Then
oDocumento.store()
Else
oDocumento.storeAsURL(sURL,mPropArquivo())
EndIf
EndIf
32
Verso 2
Este mtodo retorna uma sequncia com o descritor da impressora corrente. O descritor
(PrinterDescriptor) contmafiladeimpressoeasdefinies daimpressora,conformea
tabelaabaixo:
Propriedade
Descrio
Name
PaperOrientation
PaperFormat
PaperSize
IsBusy
CanSetPaperSize
SubobtemDescritorImpressora
DimoDocAsObject
DimoDescImprAsVariant
DimsMsgAsString
oDoc=ThisComponent
'obtemovetordeestruturasPrinterDescriptor
oDescImpr=oDoc.getPrinter()
'obtemtamanhodovetordeestruturas
iNrEstruturas%=UBound(oDescImpr)
'extraiosnomesdaspropriedadesdaimpressora
Forn=0ToiNrEstruturas%
sMsg=sMsg+oDescImpr(n).Name+""
Nextn
'exibeosnomesdaspropriedades
MsgBoxsMsg,0,"PropriedadesImpressora"
'obtemeexibeovalordapropriedadePageFormat
'A3=0;A4=1;Letter/Carta=5;...
MsgBoxoDescImpr(2).Value
'verificasePageFormatpodeseralterada
IfoDescImpr(6).ValueThen
MsgBox"FormatodaPgina,podeseralterado!"
'entoalteraparaA4
oDescImpr(2).Value=1
Else
MsgBox"FormatodaPgina,nopodeseralterado!"
EndIf
'exibeovalordePageFormatnovamente
33
Verso 2
MsgBoxoDescImpr(2).Value
EndSub
OcdigoacimachamaomtodogetPrinter()paraobteraspropriedades daimpressora
corrente.Emseguida,nolaoFor...Next,extraiosnomesdecadapropriedade.E,mais
abaixo,obtmealteraoformatodapgina,sepossvel.
setPrinter(aImpressoraAsVariant<com::sun::star::beans::PropertyValue>)
Atribuiumanovaimpressoraaodocumento.Podeimplicarnumareformatao.
Aspropriedadesdaimpressorasoasmesmasdatabelaacima.
print(xOpcoesAsVariant<com::sun::star::beans::PropertyValue>)
Imprimeodocumentodeacordocomasopesdeimpresso(PrintOptions)emxOpcoes.
Estasopessodescritasnatabelaaseguir:
Opo
Descrio
CopyCount
FileName
Collate
Pages
Vejamosalgunsexemplosdecdigofonte.Paraimprimirumdocumento:
'imprimirodocumentocomasdefiniescorrentes
DimaOpcoes()
oDocumento.print(aOpcoes())
Paraimprimirsomenteaspginas1;3;58e12.
DimaOpcoes(0)
aOpcoes(0).Name=Page
aOpcoes(0).Value=1;3;58;12
ThisComponent.print(aOpcoes())
Paraimprimirnumaimpressoraquenoapadro,vocprecisaalterarapropriedadeName
daimpressoraechamarsetPrinterdefinindoumanovaimpressora,comoabaixo:
DimmImpressora(0)AsNewcom.sun.star.beans.PropertyValue
DimaOpcoes()'somenteparapassaroparmetro
34
Verso 2
'
mImpressora(0).Name="Name"
mImpressora(0).value="Segunda_Impressora"
'defineanovaimpressoraparaoobjeto,
'podeocorrerumaformataododocumento
oDocumento.setPrinter=mImpressora()
'imprimecomasopcoespadro
oDocumento.print(aOpcoes())
AcrescentealinhaacimaapsaltimalinhadaSubcriaNovoDocumento(),executeamacro
eobserveoresultado.
b)AbertopelainterfacedoOpenOffice.org
SeodocumentofoicarregadocomocomandoArquivoAbrirdoOpenOffice.orgeno
houveadefiniodeumobjetoDocument,useapropriedadeThisComponent,comoabaixo:
ThisComponent.dispose()
Cuidado,omtododispose()descartatodasasalteraesefetuadasnodocumento.Portanto,
antes de chamlo, certifiquese de gravlas. Ou, ainda, use isModified() para alertar o
usurio.
Existemmaneirasmaissegurasparacontrolarofechamentodecomponentes,pormesto
almdoescopodestaIntroduo.
35
Verso 2
SubexibeComponentes
DimoComponentesAsVariant
DimoCompAsVariant
DimsURLAsString
DimsTipoAsString
oComponentes=StarDesktop.getComponents().createEnumeration()
n=0
DoWhile(oComponentes.hasMoreElements())
oComp=oComponentes.nextElement()
'nemtodoscomponentessomodeloscomumaURL
IfHasUnoInterfaces(oComp,"com.sun.star.frame.XModel")Then
sURL=oComp.getURL()
IfoComp.SupportsService("com.sun.star.sheet.SpreadsheetDocument")Then
sTipo="Calc"
ElseIfoComp.SupportsService("com.sun.star.text.TextDocument")Then
sTipo="Writer"
ElseIfoComp.SupportsService("com.sun.star.drawing.DrawingDocument")Then
sTipo="Draw"
ElseIfoComp.SupportsService("com.sun.star.formula.FormulaProperties")Then
sTipo="Math"
Else
sTipo="Outro"
EndIf
MsgBoxsTipo+Chr$(13)+sURL
EndIf
n=n+1
Loop
MsgBox"Componentes:"+Str$(n)
EndSub
36
Verso 2
Documentos do Writer
6 Documentos do Writer
6.1 Introduo
Neste captulo, veremos como efetuar tarefas simples de processamento de texto, como:
edio,formatao,buscaesubstituio.
Vamos abordar o assunto atravs de exemplos prticos, com uma breve explicao dos
aspectosmaisimportantes.
UmdocumentodoWritercontmprincipalmentetexto,organizadoempargrafosetabelas.
Almdesteselementosbsicos,elesuportamolduras,objetosembutidos,campos,grficos,
marcadores, ndices e muitos outros objetos. Estes dados compreendem um modelo de
documento.
Atravsdomodelo,podemosmanipularosdadosindependentementedasuarepresentao
visual. Para lidar com o aspecto visual do documento, o modelo dispe de um objeto
controlador.
Alguns elementos de um documento (grficos, molduras, etc) so nomeados e esto
ancoradosnumpargrafo,caractereoupgina.Ospargrafosnorecebemumnomeenem
umndice,demodoqueseuacessodevesersequncial.
oDoc=ThisComponent
oTxt=oDoc.getText()
sStr="Estauma"
oTxt.setString(sStr)
oTxtRange=oTxt.getEnd()
37
Documentos do Writer
Verso 2
sStr="cadeiadecaracteres"
oTxtRange.setString(sStr)
EndSub
Nesteexemplo,usamosainterfaceXTextRangeparaeditartexto.Eisosseusmtodos:
getText()AsText
retornaumobjetoText
getString()AsString
retornaaStringcontidanoobjeto
setString(sStrAsString)
defineaStringcomoocontedodoobjeto
getStart()AsObject<TextRange>
retornaumobjetoTextRangeapontandoparaoinciodoobjetochamador
getEnd()AsObject<TextRange>
retornaumobjetoTextRangeapontandoparaofinaldoobjetochamador
Inicialmente, chamamos o mtodo getText ( ), que retorna um objeto Text, este passo
correspondeaoitemb)acima.
Emseguida,nalinha oTxt.setString(sStr),definimosumacadeiadecaracteresparaonosso
objetoText,istosignificaquetodoocontedododocumentoobjetooTxtsersubstitudo
pela cadeia sStr de setString. Antes de inserir mais texto, precisamos obter o final do
contedodeoTxtcomachamadaaomtodogetEnd()eusarestenovoobjetoTextRange
parainserirmaistexto.AtravsdomtodogetStart,poderamosinserirtextonoincio.
Note,ainda,queasvariveisdosserviosTexteTextRangesodeclaradascomoObject.
Ateno,oTxttambmumTextRange,assimpodemossubstituiravariveloTxtRangepelo
encadeamentodemtodosabaixo:
oTxt.getEnd().setString(sStr)
Esteprocessodeediomuitolimitado.Podemosapenassubstituirtodoocontedodotexto
einserirtextonoincioounofinaldodocumento.
Verso 2
Documentos do Writer
NoWriter,almdocursordetexto,temosainda:cursordepalavra,cursordesentenae
cursordepargrafo,todosderivadosdocursordetexto.
Vejamos,agora,asinterfacesemtodosusadosparaflexibilizaraediodetexto.
AinterfaceXSimpleText,derivadadeXTextRange,usadanacriaodocursordetexto,na
inserodecadeiasedecaracteresdecontrole,elapossuiosseguintesmtodos:
createTextCursor()AsObject<TextCursor>
Retornaumobjetocursordetexto(noinciodocontedo)
createTextCursorByRange(aPosAsTextRange)AsObject<TextCursor>
Criaumobjetocursordetextonaposioespecificadanoparmetro
insertString(aPosAsTextRange,sStrAsString,bFlagAsBoolean)
Insereacadeianaposio.SebFlagforTrueocontedodeaPossersubstitudoporsStr,
senosStrseracrescentadanofinaldeaPos.
insertControlCharacter(aPosAsTextRange,iCharAsInteger,bFlagAsBoolean)
InsereumcaracteredecontrolenaposioaPos.
OservioTextCursor,atravsdainterfaceXTextCursor,provmtodosparaocontroledo
estadoemovimentaodocursor.
a)Mtodosparamoverocursor:
goLeft(iNrCharAsInteger,bExpandeAsBoolean)AsBoolean
moveocursorparaaesquerdaiNrCharcaracteres
goRight(iNrCharAsInteger,bExpandeAsBoolean)AsBoolean
moveocursorparaadireitaiNrCharcaracteres
gotoStart(bExpandeAsBoolean)
moveocursorparaoinciodotexto
gotoEnd(bExpandeAsBoolean)
moveocursorparaofinaldotexto
gotoRange(xRangeAs<TextRange>,bExpandeAsBoolean)
moveouexpandeocursorsobreoobjetoTextRange
Emtodososmtodosacima,sebExpandeforTrueoalcancedocursorserexpandido.
b)Mtodosparacontrolaroestadodocursor:
collapseToStart()
moveaposiodofinaldocursorparaoseuincio
collapseToEnd()
moveaposiodoinciodocursorparaoseufinal
isCollapsed()AsBoolean
retornaTrueseasposiesinicialefinaldocursorforemiguais
As interfaces XWordCursor, XSentenceCursor e XparagraphCursor, todas derivadas de
XTextCursor,tambmfornecemmtodosparacontroleemovimentodocursor.
39
Documentos do Writer
Verso 2
a)MtodosdeXWordCursor:
gotoNextWord(bExpandeAsBoolean)AsBoolean
gotoPreviousWord(bExpandeAsBoolean)AsBoolean
gotoEndOfWord(bExpandeAsBoolean)AsBoolean
gotoStartOfWord(bExpandeAsBoolean)AsBoolean
isStartOfWord()AsBoolean
isEndOfWord()AsBoolean
b)MtodosdeXSentenceCursor:
gotoNextSentence(ExpandeAsBoolean)AsBoolean
gotoPreviousSentence(bExpandeAsBoolean)AsBoolean
gotoStartOfSentence(bExpandeAsBoolean)AsBoolean
gotoEndOfSentence(bExpandeAsBoolean)AsBoolean
isStartOfSentence()AsBoolean
isEndOfSentence()AsBoolean
c)MtodosdeXParagraphCursor:
gotoStartOfParagraph(bExpandeAsBoolean)AsBoolean
gotoEndOfParagraph(bExpandeAsBoolean)AsBoolean
gotoNextParagraph(bExpandeAsBoolean)AsBoolean
gotoPreviousParagraph(bExpandeAsBoolean)AsBoolean
isStartOfParagraph()AsBoolean
isEndOfParagraph()AsBoolean
Antesdeapresentarumexemplo,vejamososcaracteresdecontrolequepodemserinseridos
num documento do Writer. Na interface grfica, eles so chamados de caracteres no
imprimveisetmfunesespeciaisnaapresentaofinaldodocumento.
Parafacilitaroseuemprego,estescaracteresestodefinidoscomoconstantes,nogrupode
constantes com.sun.star.text.ControlCharacter. Eles podem ser inseridos no texto com o
mtodo insertControlCharacter () oucomopartedocontedodeumacadeia,nestecaso,
usandooseucdigoUnicode.
Eisumarelaodoscaracteresdecontrolecomosseusrespectivoscdigos:
PARAGRAPH_BREAK Insere uma quebra de pargrafo
0x000D
LINE_BREAK
0x000A
HARD_HYPHEN
SOFT_HYPHEN
0x00AD
HARD_SPACE
0x00A0
40
No tem
Verso 2
Documentos do Writer
Vamos encerrar esta seo com um exemplo demonstrando o emprego de alguns dos
conceitosemtodosapresentados.
AtiveoIDEBasic,digite(oucopieecole)ocdigofonteaseguireexecuteasubrotinaSub
processaTexto.Elainseretexto,caracteresdecontroleeumaquebradepginanumnovo
documentosemnome.Depois,selecionaesubstituiduaspalavrasporumacadeiavazia.
SubprocessaTexto
DimoDesktopAsVariant
DimoDocAsObject
DimoCursorAsObject
DimoTextoAsObject
DimmPropArquivo()
DimsStrAsString
oDesktop=createUnoService("com.sun.star.frame.Desktop")
oDoc=oDesktop.loadComponentFromURL("private:factory/swriter",_
"_blank",0,mPropArquivo())
oTexto=oDoc.getText()
oCursor=oTexto.createTextCursor()
sStr="Esteotextodoprimeiropargrafododocumento"
WithoTexto
'insereotextonaposiocorrentedocursor
.insertString(oCursor,sStr,False)
'insereumpargrafo
.insertControlCharacter(oCursor,_
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False)
.insertString(oCursor,"Esteosegundopargrafo",False)
.insertControlCharacter(oCursor,_
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False)
EndWith
'insereumanovapgina
oCursor.gotoStartOfParagraph(True)
oCursor.breakType=com.sun.star.style.BreakType.PAGE_BEFORE
oTexto.insertString(oCursor,"Estounumanovapgina.",False)
'moveocursorsemexpanso
oCursor.gotoStart(False)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(False)
oCursor.gotoNextWord(False)
'moveocursorexpandindo,i.,selecionatextodo
oCursor.gotoNextWord(True)
oCursor.gotoNextWord(True)
'substituiotextoentreoincioeofinaldocursor
oTexto.insertString(oCursor,"",True)
EndSub
41
Documentos do Writer
Verso 2
Descrio
CharFontName
CharFontStyleNa
me
CharFontFamily
Contm
a
famlia
(com.sun.star.awt.FontFamily)
CharHeight
CharUnderline
Contm
o
valor
do
(com.sun.star.awt.Underline)
CharWeight
Contm
o
valor
do
(com.sun.star.awt.FontWeight)
CharPosture
Contm
o
valor
da
(com.sun.star.awt.FontSlant)
CharFlash
CharStrikeout
Define
o
tipo
de
(com.sun.star.awt.FontStrikeout)
CharRotation
42
da
fonte
caractere
do
conforme
sublinhado
peso
da
fonte
postura
da
fonte
risco
do
caractere
Verso 2
Documentos do Writer
Natabelaacima,asrefernciasaomdulocom.sun.star.awt,contmpossveisvalorespara
asrespectivaspropriedadesdoscaracteres.
Oserviocom.sun.star.style.ParagraphPropertiesdefineaspropriedadesdospargrafos.A
tabelaabaixoapresentaalgumas:
Propriedade
Descrio
ParaAdjust
ParaBackColor
ParaRightMargin
ParaTopMargin
ParaBottomMargi
n
ParaStyleName
LeftBorder
Define
a
borda
esquerda,
(com.sun.star.table.BorderLine )
opcional
RightBorder
Define
a
borda
direita,
(com.sun.star.table.BorderLine )
opcional
TopBorder
Define
a
borda
superior,
(com.sun.star.table.BorderLine )
opcional
BottomBorder
Define
a
borda
inferior,
(com.sun.star.table.BorderLine )
opcional
BorderDistance
vertical
43
Documentos do Writer
Verso 2
NoteaatribuiodapropriedadeCharPostureaumvalorenumeradoREVERSE_ITALICe,
ainda,aalteraodoestilodepargrafoparaStyleNameparaHeading.Emsetratandode
programao, os nomes permanecem em ingls, diferindo dos nomes apresentados pelo
OpenOffice.orgnoCatlogodeEstilos.
Pginas
Pargrafos
Caracteres
Molduras
(
(
(
(
estilo_1,
estilo_1,
estilo_1,
estilo_1,
estilo_2,
estilo_2,
estilo_2,
estilo_2,
...,
...,
...,
...,
estilo_n
estilo_n
estilo_n
estilo_n
)
)
)
)
Verso 2
Documentos do Writer
Estilos de Numerao
Oserviocom.sun.star.style.StyleFamiliescontmasfamliasdeestilosdeumdocumento,
paraobterestacoleofaa:
DimoFamiliasEstilosAsObject
oFamiliasEstilos=ThisComponent.getStyleFamilies()
Numdocumentotexto,umachamadaaomtodogetElementNames()retornaumvetorcom
osnomesdasseguintesfamlias:
CharacterStyles
ParagraphStyles
FrameStyles
PageStyles
NumberingStyles
estilosdecaracteres
estilosdepargrafos
estilosdemolduras
estilosdepginas
estilosdenumerao
Oserviocom.sun.star.style.Styledefineascaractersticasdeumestilo,paraobterumestilo
acesseopeloseundice,porexemplo,seoobjetooEstParagrafosfoidefinido,comoacima:
oEstilo=oEstParagrafos(1)
retornaosegundoestilodentrodacoleodeestilosdepargrafos.
AAPIdoOpenOffice.orgprovinterfacesparafacilitaroacessoaelementosdeumadada
coleo.Aotrabalharcomestilosprecisamosconhecerosmtodos:
con.sun.star.container.XNameAcess
getByName(sNomeAsString)AsVariant
getElementNames()AsaStrings()
hasByName(sNomeAsString)AsBoolean
con.sun.star.container.XIndexAcess
getCount()AsLong
getByIndex(nIndiceAsLong)AsVariant
con.sun.star.container.XNameContainer
insertByName(sNomeAsString,oElementoAsVariant)
removeByName(sNomeAsString)
45
Documentos do Writer
Verso 2
Descrio
BackColor
LeftMargin
RightMargin
TopMargin
BottomMargin
IsLandscape
PageStyleLayout
Determina
o
layout
(com.sun.star.style.PageStyleLayout)
Size
Width
Height
da
pgina
FooterLeftMargin
Verso 2
Documentos do Writer
AsubrotinaSubexibeEstilosPagina,aseguir,implementaonossoexemplo:
SubexibeEstilosPagina
DimoDocAsObject
DimoFamiliaEstilosAsObject
DimoEstilosPaginaAsObject
DimoPaginaPadraoAsObject
DimmNomesEstilosPaginaAsVariant
DimsEstiloAsString
DimsMsgAsString
oDoc=ThisComponent
'obtmaFamliadeEstilos(noteousodeoDoc)
oFamiliaEstilos=oDoc.StyleFamilies
'obtmosEstilosdePgina
oEstilosPagina=oFamiliaEstilos.getByName("PageStyles")
'exibequantidadedeestilosdepgina
MsgBoxoEstilosPagina.Count
'obtmeexibeosnomesdosestilosdepginas
mNomesEstilosPagina=oEstilosPagina.getElementNames()
Forn=LBound(mNomesEstilosPagina)ToUBound(mNomesEstilosPagina)
sMsg=sMsg+mNomesEstilosPagina(n)+""
Nextn
MsgBoxsMsg,0,"EstilosdePginas"
'obtmoEstilodepginaPadro(Standard)
oPaginaPadrao=oEstilosPagina.getByName("Standard")
'testandootamanhodapgina
lLPag=oPaginaPadrao.Size.Width
lAPag=oPaginaPadrao.Size.Height
MsgBoxStr$(lLPag)+""+Str$(lAPag)
EndSub
Adestacar,oacessopelondicedentrodolaoFor...Next,oacessonomeadoaoestiloda
pginaStandardeoacessopropriedadeSize.
Note,ainda,achamadaaomtodogetStylesFamilies():
oFamiliaEstilos=oDoc.StylesFamilies
noOpenOffice.orgBasicvocpodeomitirogeteosetaoprogramarpropriedades.
Esteexemplopodeserusadocomomodeloparadiversasoperaescomestilos.
Duranteaformataodetexto,comumacriaoeaplicaodenovosestilos.Estauma
tarefasimplesdeexecutardentrodeumamacro.Paraistodevemosseguirospassos:
a)Obterasfamliasdeestilosdodocumento;
b)Obterafamliadogrupoaondesercriadoonovoestilo;
c)Criarumainstnciadoobjetodonovoestilo;
d)Acrescentaronovoestiloaogrupo;
e)Definiraspropriedadesdonovoestilo;
f)Aplicaronovoestilo.
47
Documentos do Writer
Verso 2
Vamos retomar a subrotina Sub processaTexto e acrescentar cdigo fonte para criar e
aplicarumnovoestilodepargrafo.Digite(oucopieecole)ocdigoabaixo,apsaltima
linhadaSubprocessaTexto,executeamacroeobserveasdefiniesdeestilodoprimeiro
pargrafododocumento.
'
'cdigoparanovoestilo
'
DimoFamiliasEstilosAsObject
DimEstilosParagrafoAsObject
DimoNovoEstiloAsObject
'obtemasfamiliasdeEstilos
oFamiliasEstilos=oDoc.StyleFamilies
'obtemosestilosdepargrafos
EstilosParagrafo=oFamiliasEstilos.getByName("ParagraphStyles")
'criaumnovoestilodeparagrafo
oNovoEstilo=oDoc.createInstance("com.sun.star.style.ParagraphStyle")
'acrescentaonovoestilocomonome"novo_estilo"
EstilosParagrafo.insertByName("novo_estilo",oNovoEstilo)
'defineaspropriedadesdoestilo
oNovoEstilo.Name="novo_estilo"
oNovoEstilo.CharFontName="Arial"
oNovoEstilo.CharHeight=16
oNovoEstilo.ParaAdjust=com.sun.star.style.ParagraphAdjust.CENTER
oNovoEstilo.CharWeight=com.sun.star.awt.FontWeight.BOLD
'entao,aplicaonovoestiloaoprimeiroparagrafo
oCursor.gotoStart(FALSE)
oCursor.gotoEndOfParagraph(TRUE)
oCursor.paraStyleName="novo_estilo"
Acima,devesenotaracriaodeumnovoobjeto,nocasoumainstnciadeumestilode
pargrafo, com a chamada ao mtodo createInstance ( ... ). E, ainda, as definies das
propriedadesdonovoestilo.
da Objeto retornado
Texto
Clulas de tabela
Caixa de texto
48
Verso 2
Documentos do Writer
Grfico
Desenho
Paraseleodetexto,omtodogetCurrentSelection()operadaseguinteforma,:
a)senadaestiverselecionado,retornaumobjetoTextRangecomaposiodocursordavista;
b)numaseleosimples,retornaumobjetoTextRangecomaseleo;
c)numaseleomltipla,retornaobjetosTextRangeparaocursordavistaeparacadauma
dasselees.
Noexemploabaixo,obtemosascadeiasselecionadas,umaoumaissemltiplaseleo,e
mudamosacordecadaumaparavermelha:
SubprocessaSelecao
DimoDocAsObject
DimoSelAsObject
DimoCurTxtAsObject
oDoc=ThisComponent
oSel=oDoc.getCurrentSelection()
Fori=0TooSel.Count1
oCurTxt=oSel(i)
oCurTxt.CharColor=RGB(255,0,0)
Nexti
MsgBoxoSel.Count
EndSub
Noteoacessoaosobjetosselecionadosatravsdeumndiceeacriaodeumcursordetexto
antesdamudanadecor.
Paraextrairacadeiaselecionada,chameomtodogetString(),comoabaixo:
sCadeia=oSel(i).getString()
Sevocquiseraplicaralgumaaonapalavrasobocursordavista,faa:
IfLen(oSel(0).getString())=0Then
oCurTxt=oSel(0).Text.createTextCursorByRange(oSel(0).getStart())
oCurTxt.gotoStartOfWord(False)
oCurTxt.gotoEndOfWord(True)
EndIf
Analisecomosedacriaodocursordetexto.Emseguida,comoexerccio,faacomquea
SubprocessaSeleoapliqueacortambmnapalavrasobocursordavista.
AAPIdoOpenOffice.orgtem,ainda,ainterfacecom.sun.star.view.XSelectionSupplier,que
implementaalgunsmtodosdeseleopelainterfacegrfica,entreeles:
select(oObjetoAsObject)AsBoolean
Introduo ao OpenOffice.org Basic
49
Documentos do Writer
Verso 2
sepossvel,selecionaoobjetooObjetonainterfacegrfica
getSelection()oObjetoAsVariant
obtmaseleonainterfacegrfica,poderetornarumobjetoouumacoleodeobjetos
Estesmtodospodemserchamadosatravsdocontroladorcorrentedomodelo(vejaotrecho
decdigoabaixo).
Existem, ainda, dois mtodos que podem ser teis para a identificao do contedo
selecionado,soeles:
getImplementationName()AsString
retornaonomedaimplementaodoobjeto
getName()AsString
retornaonomedoobjeto,seomesmofornomeado,casodegrficosetabelas.
DimoControladorAsObject
oControlador=oDoc.getCurrentController()
oSel=oControlador.getSelection()
sNomeImpl=oSel.getImplementationName()
sNome=oSel.getName()
Agora, altere a Sub processaSelecao, para alertar o usurio quando ele selecionar algo
diferentedetexto(dica,usegetImplementationName).
Verso 2
Documentos do Writer
AinterfaceXIndexAccessdefineosmtodosaseguir:
getByIndex(iIndiceAsLong)AsObject
retornaoobjetonaposiaoiIndicedacoleo
getCount()AsLong
retornaonmerodeobjetosdacoleo
AinterfaceXEnumerationAccessdefineomtodo:
createEnumeration()AsObject<com.sun.star.container.XEnumeration>
retornaumobjetoXEnumeration
AinterfaceXEnumerationimplementaosmtodosabaixo:
hasMoreElements()AsBoolean
retornaTrueseaindaexistemelementosnorecipiente
nextElement()AsVariant
retornaoprximoelemento
Alocalizaosimples,bastachamaromtodoapropriadoeaseguir,usaroacessonomeado
ouindexadoparaobteroobjeto.
Asubrotina SublocalizaGraficos,abaixo,exibeosnomesdetodososobjetosgrficosdo
documento:
SublocalizaGraficos
DimoGraficosAsObject
DimoGraficoAsObject
DimnAsInteger
oGraficos=ThisComponent.getGraphicObjects()
Forn=0TooGraficos.Count1
oGrafico=oGraficos(n)
MsgBoxoGrafico.getName()
Nextn
MsgBox"Grficosnodocumento:"+Str$(oGraficos.Count)
EndSub
Paraapagarumgrficodoseudocumento,vocpodeusaroblocodecdigo:
oGrafico=oGraficos.getByName(Grfico2)
oGrafico.dispose()
Noexemploaseguir,quedemonstraacriaodeumaenumerao,exibimosocomandode
cadaumdoscamposdeumdocumento:
SublocalizaCampos
DimoCamposAsObject
DimoCampoAsObject
DimnAsInteger
51
Documentos do Writer
Verso 2
oCampos=ThisComponent.getTextFields().createEnumeration()
n=0
DoWhile(oCampos.hasMoreElements())
oCampo=oCampos.NextElement()
MsgBoxoCampo.getPresentation(True)
n=n+1
Loop
MsgBox"Camposnodocumento:"+Str$(n)
EndSub
Descrio
SearchBackwards
52
Verso 2
Documentos do Writer
Propriedade
Descrio
SearchCaseSensitive
SearchWords
SearchStyles
Noexemploaseguir,vamoslocalizar,nodocumento,todasasocorrnciasdacadeia()e
trocaracordafonteparavermelha.Digite(oucopieecole)ocdigoabaixoeexecuteasub
rotina.
SubbuscaTodas
DimoDocAsObject
DimoDescBuscaAsObject
oDoc=ThisComponent
oDescBusca=oDoc.createSearchDescriptor()
oDescBusca.SearchWords=True
oDescBusca.setSearchString("()")
oResultado=oDoc.findAll(oDescBusca)
Forn%=0TooResultado.Count1
oResultado(n%).CharColor=RGB(255,0,0)
Next
MsgBox"Ocorrnciasde"+oDescBusca.getSearchString()+_
+Str$(oResultado.Count)
EndSub
Atarefaacimapode,tambm,serexecutadacomosmtodosfindFirstefindNext:
oResultado=oDoc.findFirst(oDescBusca)
DoUntilIsNull(oResultado)
oResultado.CharColor=RGB(250,100,50)
oResultado=oDoc.findNext(oResultado,oDescBusca)
Loop
53
Documentos do Writer
Verso 2
Eisumexemplosimplesdebuscaesubstituio:
SubsubstituiTodas
DimoDocAsObject
DimoDescritorAsObject
oDoc=ThisComponent
oDescritor=oDoc.createReplaceDescriptor()
oDescritor.setSearchString("()")
oDescritor.setReplaceString("()")
n=oDoc.replaceAll(oDescritor)
MsgBoxn
EndSub
Notequenotemosummtodoparasubstituiointerativa.Porm,atravsdabuscaeedio,
possvelimplementar,comfacilidade,esteprocedimento.
Parainserirnaposiodocursordainterfacegrfica,crieocursordetextoapartirdocursor
davista.
Ainserodearquivosgrficosumpoucomaiscomplicada,paraissovocdeve:
a)criarumobjetogrfico;
b)definirassuaspropriedades;
c)inseriroobjeto.
ObserveasubrotinaSubinserirGraficoaseguir:
SubinserirGrafico
DimoTxtAsObject
DimoCursorTxtAsObject
DimoGraficoAsObject
DimsURLAsString
oTxt=ThisComponent.getText()
54
Verso 2
Documentos do Writer
oCursorTxt=oTxt.createTextCursor()
oGrafico=ThisComponent.createInstance("com.sun.star.text.GraphicObject")
sURL="file:///D:/NAD/OPENOFFICE/HOWTO/FIGURAS/DIALOGO.JPG"
oGrafico.GraphicURL=sURL
oGrafico.AnchorType=com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
oTxt.insertTextContent(oCursorTxt.getStart(),oGrafico,False)
EndSub
6.10 Tabelas
Umatabelaumconjuntodeclulasorganizadasporlinhasecolunas,ondecadaclulatem
umnome,normalmenteindicadoporletrasenmeros.Asletrasreferemsescolunaseos
nmerosslinhas.Contudo,seexistiremclulasmescladasoudivididas,oconceitodecoluna
poderdesaparecereoesquemadenomeaotornasecomplicado.
Umaclulapodecontertextosimples(cadeiasenmeros),grficos,frmulasecamposcom
vriascaractersticasdeformatao.
Umatabelarecebeumnomeniconodocumento,podendoservircomoorigemparagrficos,
teroseucontudoordenadoeserautomaticamenteformatada.
AAPIdoOpenOffice.orgtemdiversosservioseinterfacesparalidarcomtabelas,vejamos
asprincipais.
A interface com.sun.star.text.XTextTable encarregase do gerenciamento de tabelas num
documentoecontmosmtodosabaixo:
initialize(nLinhasAsLong,nColunasAsLong)
Inicializaumatabela,recebeonmerodelinhasecolunascomoparmetros.
getCellNames()AsObject<Strings>
Obtmosnomesdasclulas,retornaumconjuntodecadeias
getCellByName(sNomeCelulaAsString)AsObject<com.sun.star.table.XCell>
Obtmaclulanomeadanoparmetro,retornaumobjetoXCell
getRows()AsObject<com.sun.star.table.XTableRows>
Obtmaslinhasdatabela,retornaumobjetoparaXTableRows.
getColumns()AsObject<com.sun.star.table.XTableColumns>
Obtmascolunasdatabela,retornaumobjetoparaXTableColumns.
Introduo ao OpenOffice.org Basic
55
Documentos do Writer
Verso 2
createCursorByCellName(sNomeCelulaAsString)AsObject<XTextTableCursor>
Criaumcursordetabelaposicionadonaclulanomeadanoparmetro
OservioTextTablepossuidiversaspropriedades,eisalgumasdelas:
Propriedade
Descrio
LeftMargin
RightMargin
Split
TableBorder
Verso 2
Documentos do Writer
splitRange(nQuantAsInteger,bHorizAsBoolean)AsBoolean
Mtodosparafundiredividirclulas.
Atravs do servio TextTableCursor podemos efetuar a formatao das clulas, pois, ele
incluiosserviosCharacterPropertieseParagraphProperties.
Ainterfacecom.sun.star.table.XCellRangedefineosmtodosabaixoparalidarcomextenses
declulas:
getCellByPosition(nColunaAsLong,nLinhaAsLong)AsObject<XCell>
getCellRangeByPosition(nEsq,nSup,nDir,nInf)AsObject<XCellRange>
getCellRangeByName(sRangeAsString)AsObject<XCellRange>
Oserviocom.sun.star.table.CellRangeincluicom.sun.star.table.CellProperties,quedefineas
propriedadesdeumaoumaisclulas.Eisalgumas:
Propriedade
Descrio
CellBackColor
HoriJustify
Alinhamento horizontal
CellHoriJustify)
VertJustify
Alinhamento vertical
CellVertJustify)
IsTextWrapped
Orientation
RotateAngle
TableBorder
TopBorder
BottomBorder
LeftBorder
RightBorder
NumberFormat
CellProtection
do
do
contedo
contedo
da
da
clula
(enum
clula
(enum
Ainterfacecom.sun.star.table.XCellofereceosmtodosabaixoparamanipularocontedode
umaclula:
getFormula()AsString
setFormula(sFormulaAsString)
Introduo ao OpenOffice.org Basic
57
Documentos do Writer
Verso 2
mtodosparaobteroudefinirafrmuladeumaclula
getValue()AsDouble
setValue(nValorAsDouble)
mtodosparaobteroudefinirovalordeumaclula
getType()AsLong<com.sun.star.table.CellContentType>
retornaotipodocontedodeumaclula,comoenumeradoemCellContentType
getError()AsLong
retornaoerrodeumaclula,tilpararastrearerrosemfrmulas
Onomedeumatabelapodeserobtidooudefinidocomosmtodosaseguir,dainterface
com.sun.star.container.XNamed:
getName()AsString
setName(sNomeTabelaAsString)
Ocontedodeumatabelapodeserordenadocomainterfacecom.sun.star.util.XSortablee
seusmtodos:
createSortDescriptor()AsVariant<com.sun.star.beans.PropertyValue>
retornaumdescritorparaaspropriedadesdaordenao
sort(xDescritorAsVariant<com.sun.star.beans.PropertyValue>)
executaaordenaoconformeodescritor
Seguemalgumasdaspropriedadesdodescritordeordenao(SortDescriptor):
Propriedade
Descrio
IsCaseSensitive
SortAscending
SortColumns
Oserviocom.sun.star.table.TableSortDescriptorincluioservioSortDescriptorepossuias
propriedadesabaixo:
Propriedade
Descrio
SortFields
Descreve
os
campos
<com.sun.star.util.SortField>
MaxFieldCount
Orientation
Define
a
orientao
<com.sun.star.table.TableOrientation>
ContainsHeader
58
de
da
ordenao
ordenao
Verso 2
Documentos do Writer
horadeapresentarumexemplo.Inicialmente,vamoscriar,inicializareinserirumatabela,
comcincolinhasetrscolunas,noinciododocumentocorrente.Depois,vamosdefiniros
ttulosdascolunas.Digiteocdigoabaixo,executeeobserveoresultado:
SubcriaTabela
DimoTxtAsObject
DimoTabAsObject
'
'cria,inicializaeinsereatabelanoiniciododocumento
oTxt=ThisComponent.getText()
oTab=ThisComponent.createInstance("com.sun.star.text.TextTable")
oTab.initialize(5,3)
oTxt.insertTextContent(oTxt.createTextCursor(),oTab,FALSE)
'
'preencheosttulosdascolunas(clulasA1,B1eC1)
DimoCelulaAsObject
oCelula=oTab.getCellByName("A1")
oCelula.setString("ColunaA")
oCelula=oTab.getCellByName("B1")
oCelula.setString("ColunaB")
oCelula=oTab.getCellByName("C1")
oCelula.setString("ColunaC")
EndSub
PrimeirocriamosoobjetotabelacomcreateInstance(),depoisdefinimosaslinhasecolunas
com initialize (), inserimos a tabela no documento com uma chamada ao mtodo
insertTextContent()e,ento,obtemoscadaumadasclulasdocabealhoedefinimososeu
contedo.
Oblocodecdigoabaixodemonstraoempregodocursordetabela,navegao,formataoe
mesclagemdeclulas.AcrescenteoSubcriaTabela.
'
'criaumcursordetabelanaclulaCellNames(0)=A1
DimoCurTabAsObject
oCurTab=oTab.createCursorByCellName(oTab.CellNames(0))
'selecionaasclulasA1,B1eC1
oCurTab.gotoStart(False)
oCurTab.goRight(2,True)
'AplicaoestilodepargrafoTtulonaseleo
oCurTab.paraStyleName="Heading"
'exibeonomedaextensoselecionada(range)
'Noteaformadeapresentao(invertida)
MsgBoxoCurTab.getRangeName()
'
'nomeiaascelulasapartirdalinha2e
'escrevenmerodalinhanacolunaC
DimsNomes()AsVariant
DimsNomeCelulaAsString
sNomes=Array("A","B","C")
Fori%=1To4
Forj%=1To3
sNomeCelula=sNomes(j%1)+Str$(i%+1)
oCelula=oTab.getCellByName(sNomeCelula)
If(j%1=2)Then
'defineumvalornumricoparaaclula
oCelula.setValue(i%+1)
Else
59
Documentos do Writer
Verso 2
oCelula.setString(sNomeCelula)
EndIf
Nextj%
Nexti%
'
'defineumafrmula(somadeC2atC4)paraaclulaC5
oCelula=oTab.getCellByName("C5")
oCelula.setFormula("sum<C2:C4>")
'
'fundeasclulasA5eB5emudaseucontedo
oCurTab.gotoCellByName("A5",False)
oCurTab.goRight(1,True)
oCurTab.mergeRange()
oCelula=oTab.getCellByName("A5")
oCelula.setString("Total")
NoteacriaodocursordatabelacomcreateCursorByCellNames(...),ousodocursorpara
formatao, ousodosmtodossetValue()esetFormula()easeleoemesclagemdas
clulasA5eB5.
Noprximoblocodecdigo,veremosaordenaodeumaextensodeclulas(A2:C4)da
nossatabela.BastainserirocdigonaSubcriaTabelaeexecutarparaveroresultado.
'
'ordenadeA2atC4
DimoCampoOrd(0)AsNewcom.sun.star.util.SortField
DimoDescrOrdAsVariant
DimoExtensaoAsObject
'
'defineaextensoaserordenada
oExtensao=oTab.getCellRangeByName("A2:C4")
'defineocampodeordenaoesuaspropriedades
oCampoOrd(0).Field=0
oCampoOrd(0).SortAscending=False
oCampoOrd(0).FieldType=com.sun.star.util.SortFieldType.ALPHANUMERIC
'criaodescritordeordenao
oDescrOrd=oTab.createSortDescriptor()
'defineaspropriedadesdodescritor
oDescrOrd(0).Name="SortFields"
oDescrOrd(0).Value=oCampoOrd()
oDescrOrd(1).Name="ContainsHeader"
oDescrOrd(1).Value=False
oDescrOrd(2).Name="SortColumns"
oDescrOrd(2).Value=False
'ordenaaextenso
oExtensao.sort(oDescrOrd())
Notequeiniciamoscom adeclaraodasvariveis,criamosumaextensodeclulascom
umachamadaaomtodogetCellRangeByName(),definimosaspropriedadesdocampode
ordenao,criamosodescritoredefinimosassuaspropriedades(ocampodeordenao
umapropriedadedodescritor)e,finalmente,invocamosomtodosort()paraexecutarasua
tarefa.
Antes de terminar esta seo, vejamos como se d o acesso s tabelas existentes num
documentotexto.OprocessoomesmojvistonaseoLocalizandoObjetos.
OmtodogetTextTables()dainterfaceXTextTablesSupplierretornaumacoleocontendo
astabelasdodocumento.Elepercorreodocumentodoincioparaofinal.
60
Verso 2
Documentos do Writer
getTextTables()AsObject<com.sun.star.container.XNameAccess>
Oexemploabaixodemonstraalocalizaodastabelasdeumdocumento,depoisobtmas
coleesdelinhasecolunasdatabelacomonomeTabela3.
SublocalizaTabelas
DimoTabelasAsObject
DimoTabelaAsObject
DimoLinhasAsObject
DimoColunasAsObject
DimnAsInteger
oTabelas=ThisComponent.getTextTables()
Forn=0TooTabelas.Count1
oTabela=oTabelas.getByIndex(n)
MsgBoxoTabela.getName()
Nextn
MsgBox"Tabelasnodocumento:"+Str$(oTabelas.Count)
'
If(oTabelas.hasByName(Tabela3))Then
oTabela=oTabelas.getByName("Tabela3")
oLinhas=oTabela.getRows()
oColunas=oTabela.getColumns()
MsgBoxStr$(oLinhas.Count)+""+Str$(oColunas.Count)
EndIf
EndSub
Lembreseque,paraacessarumatabela,vocdeveconheceroseunomeouoseu ndice
dentrodacoleoe,emseguida,chamaromtodogetByName()ougetByIndex().
Apsobteratabeladesejada,useastcnicasjapresentadasparaeditaroseucontedo.
6.11 Desenhos
AAPIdoOpenOffice.orgpossuidiversosservioseinterfacesparaoperaescomdesenhos
num documento, atravs de uma macro. Nesta seo, veremos como usar alguns destes
servioseinterfaces.
Oserviocom.sun.star.text.Shape,contmmuitaspropriedadesrelacionadasaosobjetosde
desenho,seguemalgumasdelas:
Propriedade
Descrio
AnchorType
Tipo da ncora
HoriOrient
Orientao horizontal
VertOrient
Orientao vertical
LeftMargin
Margem esquerda
RightMargin
Margem direita
TopMargin
Margem superior
61
Documentos do Writer
BottomMagin
Verso 2
Margem inferior
usadoparadesenharcrculoseelipses
usado para desenhar
usadoparadesenharlinhas
Verso 2
Documentos do Writer
Ainterfacecom.sun.star.drawing.XDrawPageSupplierdefineomtodoabaixoparaobtera
pginadedesenhododocumento:
getDrawPage()AsObject<com.sun.star.drawing.DrawPage>
ParaamanipulaodedesenhosnoWritereCalc,oOpenOffice.orgutilizaosmecanismos
bsicosdedesenhodoDraw.Umadasprincipaisdiferenas,quenoDrawexistemvrias
pginasdedesenho,enquantonoWriterexisteapenasuma.
Vejamoscomoinserirdesenhosnumdocumento,atravsdeumamacroqueusaalgunsdos
mtodosepropriedadesapresentados.CrieumdocumentodoWriteredigiteocdigofonte
abaixonoIDEBasic,emseguidaexecuteamacroeobserveoresultado.
SubcriaDesenho
'
DimoDocAsObject
DimoTextoAsObject
DimoCursorAsObject
DimoRetangAsObject
DimoElipseAsObject
DimoPagDesAsObject
DimoTamanhoAsNewcom.sun.star.awt.Size
DimoPontoAsNewcom.sun.star.awt.Point
oDoc=ThisComponent
oTexto=oDoc.getText()
oCursor=oTexto.createTextCursor()
'inseredoisnovospargrafosnofinaldotexto
oCursor.gotoEnd(False)
oTexto.insertControlCharacter(oCursor,_
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False)
oTexto.insertControlCharacter(oCursor,_
com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False)
oCursor.gotoPreviousParagraph(False)
'criaumobjetoretnguloeumobjetoelipse
oRetang=oDoc.createInstance("com.sun.star.drawing.RectangleShape")
oElipse=oDoc.createInstance("com.sun.star.drawing.EllipseShape")
'defineotamanhodoretnguloeelipse
oTamanho.Height=4000
oTamanho.Width=10000
oRetang.setSize(oTamanho)
oRetang.Name="Ret_1"
oTamanho.Height=3000
oTamanho.Width=6000
oElipse.setSize(oTamanho)
oElipse.Name="Eli_1"
'defineaposiodoretnguloadireitadaelipse
oPonto.X=6100
oPonto.Y=0
oRetang.setPosition(oPonto)
'defineancoranopargrafo
oRetang.AnchorType=com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
oElipse.AnchorType=com.sun.star.text.TextContentAnchorType.AT_PARAGRAPH
'inserenaposiodocursordetexto
oTexto.insertTextContent(oCursor,oElipse,FALSE)
63
Documentos do Writer
Verso 2
oTexto.insertTextContent(oCursor,oRetang,FALSE)
oPosRet=oRetang.getPosition()
MsgBoxStr$(oPosRet.X)+""+Str$(oPosRet.Y)
'criaumalinha
oLinha=oDoc.createInstance("com.sun.star.drawing.LineShape")
'defineotamanhodalinha
oTamanho.Height=30
oTamanho.Width=6000
oLinha.setSize(oTamanho)
'defineaposiodalinha
oPonto.X=6000
oPonto.Y=10000
oLinha.setPosition(oPonto)
'obtmapginadedesenhododocumento
oPagDes=oDoc.getDrawPage()
'adicionaalinhanaprimeirapgina
oPagDes.add(oLinha)
'
EndSub
Comeamosinserindopargrafosnofinaldotexto,aseguircriamosdoisobjetosdedesenho,
um retngulo e uma elipse, definimos a suas propriedades e usamos o mtodo
insertTextContent()paraadicionarosobjetosnodocumento.Depois,criamosumalinha,
obtemosapginadedesenhododocumentoeadicionamosalinhacomomtodoadd().
Paraencerrarestaseo,vejamosumexemploqueidentificaosobjetosdedesenhoexistentes
nonossodocumento.Crieamacroabaixonumdocumentocontendodesenhos,moldurase
grficos.Emseguidaexecuteeobserveasada.
SubobtemDesenhos
'
'obtemoutrosobjetosalmdedesenhos,ex:molduras
'
DimoDocAsObject
DimoPageAsObject
oDoc=ThisComponent
oPage=oDoc.getDrawPage()
sMsg=""
nNrDes=oPage.getCount()
Fori=0TonNrDes1
oShape=oPage.getByIndex(i)
'obtemnomesedefinidonacriao
'sMsg=sMsg+oShape.getName()+chr$(10)
sMsg=sMsg+oShape.getShapeType()+chr$(10)
Nexti
MsgBoxsMsg+Str$(nNrDes)
EndSub
Note que outros objetos baseados no servio Shape, como molduras, tambm so
identificados. O mtodo getName(), somenteretornaonome,seoobjeto foinomeado
duranteacriaododesenho.
64
Verso 2
Documentos do Calc
7 Documentos do Calc
7.1 Introduo
UmdocumentodoCalccontmumaoumaisfolhasdeplanilhas.Cadaplanilhaformadapor
clulasorganizadasemlinhasecolunas,demodobemparecidocomodeumatabelado
Writer. Estas clulas contm, basicamente, texto, que pode representar uma cadeia de
caracteres,umvalornumrico,umcampoouumafrmula.
Cadaumdoselementosacima(documento,planilhaeclula),possuicaractersticasprprias.
Algumas podem ser alteradas, como por exemplo: estilo de pgina, formato numrico,
pargrafoefonte.
Almdas tarefas comuns de edio, podemos aplicar, sobreocontedo de umaplanilha
operaescomo:ordenao,filtragem,subtotalizao,geraodegrficos,etc.
Podemos,tambm,inserir,numaplanilha,objetoscomoimagens,desenhos,dadosdeuma
fonteexternaeobjetosOLE.
Comovocjdeveternotado,dadoariquezaeopoderdasoperaescomdocumentosdo
Calc,asuaprogramaoumassuntoextenso.Nasprximassees,tentareiapresentaro
bsico.
7.2 Planilhas
AsfunesbsicasjabordadasnocaptuloTrabalhandocomDocumentos,podemserusadas
tambmcomdocumentosdoCalc.Assim,estaseovaicobriralgumasoperaessobreas
folhasdasplanilhasdeumdocumentodoCalc.
Omdulo com.sun.star.sheet,daAPIdoOpenOffice.org,contm os principais servios,
interfacesegruposdeconstantesrelacionadoscomplanilhas.
OservioSpreadsheetDocumentrepresentaomodelodeumdocumentodoCalc,contendo
atributos e uma ou mais planilhas. A interface XSpreadsheetDocument prov o mtodo
getSheets(),queretornaumacoleocomasplanilhasdodocumento.
getSheets()AsObject<com.sum.star.sheet.XSpreadsheets>
Osobjetosdestacoleopodemseracessadospelosseusnomesoundices.Podemos,ainda,
criarumaenumeraoeusaroacessoseqncial.
AinterfaceXSpreadsheets,retornadaporgetSheets(),defineosmtodosabaixo:
insertNewByName(sNomeAsString,iPosicaoAsInteger)
moveByName(sNomeAsString,iDestinoAsInteger)
copyByName(sNomeOrigemAsString,sNomeCopiaAsString,iPosicaoAsInteger)
65
Documentos do Calc
Verso 2
Parafixarosconceitosacima,noexemploaseguir,vamoscriarumdocumentoeefetuar
algumasoperaescomplanilhas.
SubcriaDocCalc
DimoDeskAsVariant
DimoDocAsObject
DimmProp()AsVariant
DimsURLAsString
'criadocumentodoCalc
oDesk=createUnoService("com.sun.star.frame.Desktop")
sUrl="private:factory/scalc"
oDoc=oDesk.LoadComponentFromURL(sUrl,"_blank",0,mProp())
'exibeapropriedadecasasdecimaispadrododocumento
MsgBoxoDoc.StandardDecimals
'
'navegapelasplanilhasexistentesnodocumento
DimoPlanilhasAsObject
DimoPlanilhaAsObject
DimsMsgAsString
'
oPlanilhas=oDoc.getSheets()
sMsg=""
Forn=0TooPlanilhas.Count1
oPlanilha=oPlanilhas.getByIndex(n)
sMsg=sMsg+oPlanilha.getName()+Chr$(13)
Nextn
MsgBoxsMsg+Str$(oPlanilhas.Count)
'acessonomeado
IfoPlanilhas.hasByName("Planilha2")Then
oPlanilha=oPlanilhas.getByName("Planilha2")
MsgBoxoPlanilha.PageStyle
EndIf
'insereumafolhanoincio
oPlanilhas.insertNewByName("Planilha4",0)
MsgBoxoPlanilhas.Count
'moveparaofinal
oPlanilhas.moveByName("Planilha4",4)
EndSub
Noteosparmetrosparaacriaododocumento,oacessoaosobjetosdacoleoeousodos
mtodosparainseriremoverumafolhadeplanilha.
O servio SpreadsheetView fornece funcionalidades relacionadas vista corrente de um
documento do Calc. Ele inclui o servio SpreadsheetViewSettings, que define algumas
propriedadesdecadaumadasplanilhasdodocumentoe,asuainterfaceXspreadsheetView,
trazosmtodosaseguir,paraadefiniodaplanilhaativanodocumento:
getActiveSheet()AsObject<XSpreadsheet>
setActiveSheet(oPlanilhaAsObject<XSpreadsheet>)
Lembresequeasoperaesrelacionadascomainterfacegrficasogerenciadaspeloobjeto
controladordodocumento.
DigiteocdigofonteabaixonofinaldaSubcriaDocCalc,executeeobserveoresultado.
66
Verso 2
Documentos do Calc
'ativaaPlanilha4naGUI
IfoPlanilhas.hasByName("Planilha4")Then
MsgBoxoDoc.getCurrentController().getActiveSheet().getName()
oPlanilha=oPlanilhas.getByName("Planilha4")
oDoc.getCurrentController().setActiveSheet(oPlanilha)
EndIf
Inicialmente,exibimosonomedaplanilhaativae,ento,selecionamosaplanilhadenome
Planilha4.
ComojdemonstradonocaptuloDocumentosdoWriter,podemosalterarocontedodeum
documentoindependentedainterfacegrfica.
7.3 Editando
Paraeditarocontedodeumaoumaisclulas,devemosteremmenteoseguinte:
a)obteraplanilhaondeseencontramasclulasaeditar;
b)obterumaextensocontendoasclulasaseremeditadas,estepassoopcional,poisuma
planilhaumaextensodeclulas;
c)obteraclulaaeditar;
d)definirocontedodaclula.
Oitem a)devesersolucionado comousodomtodo getSheets (),associadoaoacesso
nomeado,indexadoouenumerado,comodemonstradonaseosobrePlanilhas.
Asferramentasparasolucionarositensb),c)ed)tambmjforamapresentadasnaseo
sobreTabelaseenvolveosmtodosdasinterfacesXCellRangeeXCell.
Mtodosdainterfacecom.sun.star.table.XCellRange:
getCellByPosition(nColunaAsLong,nLinhaAsLong)AsObject<XCell>
getCellRangeByPosition(nEsq,nSup,nDir,nInf)AsObject<XCellRange>
getCellRangeByName(sRangeAsString)AsObject<XCellRange>
Devemoslembrarqueaposiodeumaclula,dentrodeumaextenso(range),relativaao
inciodaextenso.
Mtodosdainterfacecom.sun.star.table.XCell:
getFormula()AsString
setFormula(sFormulaAsString)
getValue()AsDouble
setValue(nValorAsDouble)
getType()AsLong<com.sun.star.table.CellContentType>
getError()AsLong
Pararelembrar,vejamosumexemplodeediodocontedodasclulasdeumaplanilha.
Digiteocdigoabaixo,executeeobserveoresultado.
Introduo ao OpenOffice.org Basic
67
Documentos do Calc
Verso 2
SubeditaPlanilha
DimoDeskAsVariant
DimoDocAsObject
DimmProp()AsVariant
DimsURLAsString
'
'criadocumentodoCalc
oDesk=createUnoService("com.sun.star.frame.Desktop")
sUrl="private:factory/scalc"
oDoc=oDesk.LoadComponentFromURL(sUrl,"_blank",0,mProp())
'
'editaclulasdaplanilha
DimoPlanilhaAsObject
DimoCelulaAsObject
DimsTitCol()AsString
'escreveostitulosdascolunas
sTitCol=Array("CDIGO","MATERIAL","QUANT","P.UNIT","P.TOTAL")
oPlanilha=oDoc.getSheets().getByIndex(0)
Fori%=0To4
oCelula=oPlanilha.getCellByPosition(i%,0)
oCelula.setString(sTitCol(i%))
Nexti%
'
'preencheasclulascomtexto,valoreformula
Fori%=1To6
Forj%=0To4
oCelula=oPlanilha.getCellByPosition(j%,i%)
If(j%=0)Then
Ifi%<4Then
oCelula.setString("A"+Str$(i%))
Else
oCelula.setString("A"+Str$(i%3))
EndIf
ElseIf(j%=1)Then
oCelula.setString("Materialdeconstruo"+Str$(i%))
ElseIf(j%=2)Then
oCelula.setValue(i%*j%)
ElseIf(j%=3)Then
oCelula.setValue(100*Rnd())
Else
sLinha=Trim$(Str$(i%+1))
sFormula="=C"+sLinha+"*"+"D"+sLinha
oCelula.setFormula(sFormula)
EndIf
Nextj%
Nexti%
'resumo
oCelula=oPlanilha.getCellByPosition(0,7)
oCelula.setString("CUSTOTOTAL")
'
sFormula="=Sum(E1:E6)"
oCelula=oPlanilha.getCellByPosition(4,7)
oCelula.setFormula(sFormula)
'
EndSub
Noteque,nasegundachamadadomtodosetFormula(),definimosafrmulausandoonome
deumafunoemingls.Parautilizarosnomesdasfunesexibidospelainterfacegrfica,
useapropriedadeFormulaLocal,doserviocom.sun.star.sheet.SheetCell.,porexemplo:
68
Verso 2
Documentos do Calc
oCelula=oPlanilha.getCellByPosition(4,7)
sFormula="=Soma(E1:E6)"
oCelula.FormulaLocal=sFormula
OservioSheetCelldefineasseguintespropriedades:
Propriedade
Descrio
Position
Size
FormulaLocal
FormulaResultType
ConditionalFormat
ValidationLocal
Naprximaseo,trataremosdacriaoeempregodeumcursor,outrafuncionalidadedos
documentosdoCalc.
69
Documentos do Calc
Verso 2
oPlan=oDoc.getSheets().getByIndex(0)
oCursor=oPlan.createCursorByRange(oPlan.getCellByPosition(0,0))
70
Verso 2
Documentos do Calc
'suportaXSpreadSheet
MsgBoxoCursor.getSpreadsheet().getName()
'editaalgumasclulas
'notequeaposiodaclularelativa
oCursor.getCellByPosition(0,0).setFormula("ClulaA1")
oCursor.gotoNext()
oCursor.getCellByPosition(0,0).setFormula("ClulaB1")
oCursor.gotoNext()
oCursor.getCellByPosition(0,0).setFormula("ClulaC1")
'moveocursor5celulasabaixo
oCursor.gotoOffSet(0,5)
oCursor.getCellByPosition(0,0).setFormula("AbaixodeC1")
oCursor.CharHeight=16
'obtmtodaareaemuso
oCursor.gotoStartOfUsedArea(False)
oCursor.gotoEndOfUsedArea(True)
'obtemeexibeoendereodocursor(ndices)
oEnd=oCursor.getRangeAddress()
MsgBoxStr$(oEnd.Sheet)+Str$(oEnd.StartColumn)+Str$(oEnd.StartRow)
MsgBoxStr$(oEnd.Sheet)+Str$(oEnd.EndColumn)+Str$(oEnd.EndRow)
EndSub
Aqui,usamosomtodocreateCursorByRange(),maspoderamosterusadocreateCursor().
Note que, para definir o contedo de uma clula, devemos obtla chamando o mtodo
getCellByPosition (),comaposio relativa aoincio daextensodeclulas docursor.
Observe,ainda,comosedaseleoeidentificaodareausadapelaplanilha.
Otrechodecdigoaseguirobtmumaextensodeclulascontnuasselecionadaeexibeos
ndicesdaplanilha,colunainicialefinal,linhainicialefinal.
'paraumaextenso:com.sun.star.sheet.CellRange
oExt=oDoc.getCurrentSelection()
71
Documentos do Calc
Verso 2
oEnd=oExt.getRangeAddress()
MsgBoxStr$(oEnd.Sheet)+Str$(oEnd.StartColumn)+Str$(oEnd.StartRow)
MsgBoxStr$(oEnd.EndColumn)+Str$(oEnd.EndRow)
Podemos,ainda,obteraseleodeextensesdeclulasnocontnuas,numamesmaplanilha
ouem planilhas diferentes, obloco de cdigo fonte abaixo lida com esta situao. Num
documentodoCalc,selecioneextensesnocontnuas,crieamacroeexecuteparavera
sada.
SubselecaoExtensoes
DimoDocAsObject
DimoExtsAsObject
oDoc=ThisComponent
'oExtssuportacom.sun.star.sheet.SheetCellRanges
oExts=oDoc.getCurrentSelection()
MsgBoxoExts.getCount()
oEnd=oExts.getRangeAddresses()
Forn=0ToUBound(oEnd)
MsgBoxStr$(oEnd(n).Sheet)+Str$(oEnd(n).StartColumn)+Str$(oEnd(n).StartRow)
Nextn
MsgBoxoExts.getRangeAddressesAsString()
EndSub
72
Verso 2
Documentos do Calc
AAPIdoOpenOffice.orgofereceoutrasfuncionalidades,comoaseleodeumaextensode
clulas durante a execuo de uma macro, a serem abordadas em outras sees deste
documento.
7.6 Formatando
AapresentaofinaldeumtrabalhomuitoimportanteeoCalcofereceumavastagamade
possibilidadesparanosauxiliarnaformataodosnossosdocumentos.
Descrio
Height
OptimalHeight
IsVisible
IsStartOfNewPage
Descrio
Width
OptimalWidth
IsVisible
IsStartOfNewPage
Outraspropriedadesparaaformataodeclulassocobertaspelosservios:
com.sun.star.table.CellProperties
com.sun.star.table.TableBorder
Introduo ao OpenOffice.org Basic
73
Documentos do Calc
Verso 2
com.sun.star.table.BorderLine
O servio CellProperties contm diversas propriedades. As mais importantes foram
apresentadasnocaptuloDocumentosdoWriter,naseosobreTabelas.
Vamosaplicaralgumaformataoaoexemplocriadopela SubeditaPlanilha.Adicioneo
cdigofonteabaixonofinaldasubrotina,executeeobserveasada:
'Formatao
DimoExtensaoAsObject
DimoLinhaAsObject
DimoColunaAsObject
'
'formatapargrafosecaracteres
oExtensao=oPlanilha.getCellRangeByPosition(0,0,5,0)
oExtensao.CharHeight=12
oExtensao.CharWeight=com.sun.star.awt.FontWeight.BOLD
oExtensao.ParaAdjust=com.sun.star.style.ParagraphAdjust.CENTER
'ajustaaalturadalinha1
oLinha=oPlanilha.getRows().getByIndex(0)
oLinha.OptimalHeight=True
'ajustaalarguradacolunaB
oColuna=oPlanilha.getColumns().getByIndex(1)
oColuna.OptimalWidth=True
Adestacar,omtododerecuperaodelinhasecolunas,viaacessoindexado.
Mesclando Clulas
Numaplanilha,podemosmesclarclulas,ainterface com.sun.star.util.XMergeable define
osmtodosabaixo,comestafinalidade:
merge(bMergeAsBoolean)
SebMergeTruemesclaareadoobjeto,senosepara.
getIsMerged()AsBoolean
RetornaTrueseareadoobjetoestivermesclada,senoretornaFalse
Inserindo Bordas
Outroaspectoimportantenaapresentaodeumaplanilhaacolocaodebordasemtorno
dasclulas.OservioCellPropertiescontmasseguintespropriedades,quedefinemotipo
debordadeumaclulaouextensodeclulas:
Popriedade
Descrio
TableBorder
TopBorder
BottomBorder
RightBorder
74
Verso 2
Documentos do Calc
LeftBorder
Oprincipalelementodecadaumadestaspropriedadesaestrutura BorderLine,contendo,
dentreoutros,oscamposColoreOuterLineWidthparaacoreaespessuradalinha.Paraa
propriedadeTableBorder,podemosdefinirquatrolinhas:TopLine,BottomLine,RightLine
eLeftLine.
Prosseguindocomonossoexemplo,vamosmesclaralgumasclulase,depois,definirbordas
paraanossaplanilha.AcrescenteocdigofonteaseguirnasubrotinaSubeditaPlanilhae
observeoresultadodaexecuo:
'mesclaclulas
oExtensao=oPlanilha.getCellRangeByPosition(0,7,3,7)
oExtensao.merge(True)
'DefineBorda
DimoBordaAsNewcom.sun.star.table.TableBorder
DimoLinBordaAsNewcom.sun.star.table.BorderLine
'
oExtensao=oPlanilha.getCellRangeByPosition(0,0,4,7)
'defineaespessuraeacordalinhadaborda
oLinBorda.OuterLineWidth=30
oLinBorda.Color=CLng("&H000099")
oExtensao.setPropertyValue("TopBorder",oLinBorda)
oExtensao.setPropertyValue("RightBorder",oLinBorda)
oExtensao.setPropertyValue("LeftBorder",oLinBorda)
oExtensao.setPropertyValue("BottomBorder",oLinBorda)
'defineeaplicaumaTableBorder
oLinBorda.OuterLineWidth=100
oLinBorda.Color=CLng("&HAABBCC")
oBorda.TopLine=oLinBorda
oBorda.BottomLine=oLinBorda
oBorda.RightLine=oLinBorda
oBorda.LeftLine=oLinBorda
oBorda.IsTopLineValid=True
oBorda.IsBottomLineValid=True
oBorda.IsRightLineValid=True
oBorda.IsLeftLineValid=True
oExtensao.setPropertyValue("TableBorder",oBorda)
Inicialmentedefinimosasbordasdetodasasclulasde oExtensao,depoisaplicamosuma
bordanaextenso.NoteoscamposIs...ValiddefinidoscomoTrue.
Formatao Numrica
OOpenOffice.orgpossuidiversascategoriasdeformataonumrica.Cadacategoriapossui
vrios
formatos
prdefinidos.
Atravs
da
interface
com.sun.star.util.XNumberFormatsSupplier podemos ler, modificar e adicionar novos
formatosaosnossosdocumentos.
AinterfaceXNumberFormatsSuppliercontmosmtodosabaixo:
getNumberFormats()AsObject<com.sun.star.util.XNumberFormats>
getNumberFormatsSettings()AsObject<com.sun.star.beans.XPropertySet>
Introduo ao OpenOffice.org Basic
75
Documentos do Calc
Verso 2
EntreosmtodosdainterfaceXNumberFormats,temos:
getByKey(nChaveAsLong)AsObject<XPropertySet>
queryKeys(nCategoriaAsLong,nLocalAsLong,bInserirAsBoolean)AsaVetor()
queryKey(sFormatoAsString,nLocalAsLong,bProcuraAsBoolean)AsLong
addNew(sFormatoAsString,nLocalAsLong)AsLong
Ainterfacecom.sun.star.util.XNumberFormatTypescontmmtodosparaobterondicede
algunsformatosprdefinidos.Aqui,usaremosomtodo:
getStandardFormat(nTipoASLong,nLocalAsLong)AsLong
Ogrupodeconstantescom.sun.star.util.NumberFormatdefinevalorespara,dentreoutras,
asseguintescategorias:DATE,TIME,CURRENCY,NUMBER,DATETIME.
O servio CellProperties contm a propriedade NumberFormat, que define o tipo
formataonumricadeumaclulaouextensodeclulas.
Vejamosumexemploilustrativo.NumdocumentodoCalc,crieamacroabaixo,executeae
observeoresultado.
SubexibeFormatosNumericos
DimoDocAsObject
DimoFormatosAsObject
DimmChavesAsVariant
DimmPropAsVariant
DimoLocalAsNewcom.sun.star.lang.Locale
oDoc=ThisComponent
oFormatos=oDoc.getNumberFormats()
oSettings=oDoc.getNumberFormatSettings()
oInfo=oSettings.getPropertySetInfo()
oProp=oInfo.getProperties()
MsgBoxUBound(oProp)
Forn=0ToUBound(oProp)
MsgBoxoProp(n).Name
Nextn
mChaves=oFormatos.queryKeys(0,oLocal,FALSE)
MsgBoxUBound(mChaves)
mProp=oFormatos.getByKey(11).getPropertyValues()
'obtemosnomesdaspropriedades
sMsg=""
Forn=0ToUBound(mProp)
sMsg=sMsg+mProp(n).Name+Chr$(13)
Nextn
MsgBoxsMsg
'exibeovalordeFormatString
MsgBoxmProp(0).Value
EndSub
76
Verso 2
Documentos do Calc
Agora, vamos retornar nossa subrotina Sub editaPlanilha para aplicar formatao
numricaemalgumasclulas.Adicioneocdigoabaixo,executeeobserveasada:
'FormatosNumricos
DimoFormatosAsObject
DimaLocal()AsNewcom.sun.star.lang.Locale
'obtemosformatosnumericosdomodelo
oFormatos=oDoc.getNumberFormats()
'obtmondicedoformatopadroparaMOEDA
n%=oFormatos.getStandardFormat(com.sun.star.util.NumberFormat.CURRENCY,aLocal())
'obtemumaextensodeclulas
oExtensao=oDoc.getSheets().getByIndex(0).getCellRangeByPosition(3,1,4,6)
'alteraoformatopadroparaMOEDA
oExtensao.NumberFormat=n%
'obtmumaclulaealteraparaMOEDA
oCelula=oPlanilha.getCellByPosition(4,7)
oCelula.NumberFormat=n%
Noteadeclaraodosobjetos,ousodomtodogetStandardFormat()eousodapropriedade
NumberFormatparaalteraraformataodasclulas.
Formatao Condicional
O servio com.sun.star.sheet.SheetCellRange contm as seguintes propriedades para
formataocondicional:
conditionalFormat
definecondiesparaformataocondicional
conditionalFormatLocal definecondieslocaisparaformataocondicional
Ainterface XSheetConditionalEntries provosmtodosaseguirparaoperaescomas
condiesdeformatao:
addNew(mCond()As<com.sun.star.beans.PropertyValue>)
oparmetromCondumvetorcomasseguintesentradas:
Operatorcomospossveisvalores,definidosemcom.sun.star.sheet.ConditionOperator
NONE,EQUAL,NOT_EQUAL,GREATER,GREATER_EQUAL,
LESS,LESS_EQUAL,BETWEEN,NOT_BETWEEN,FORMULA
Formula1contendoumacadeiacomumvaloroufrmula
Formula2contendoumvaloroufrmula,usadaquandoooperadorforBETWEEN
StyleNamecontendoumnomedeestilodeformataodeclula
removeByIndex(nIndiceAsLong)
removeacondionIndice
clear()
limpaascondiesatuaisdeformatao
AcrescenteocdigoabaixonofinaldaSubeditaPlanilha,executeeobserveasada:
77
Documentos do Calc
Verso 2
'FORMATAOCONDICIONAL
'
DimmCond(2)AsNewcom.sun.star.beans.PropertyValue
DimoEntradasAsVariant
'obtemumaextensodeclulas
oExtensao=oDoc.getSheets().getByIndex(0).getCellRangeByPosition(4,1,4,6)
'obtmaformataocondicionalcorrente
oEntradas=oExtensao.getPropertyValue("ConditionalFormat")
'defineaspropriedadesdeumacondioparaformatao
mCond(0).Name="Operator"
mCond(0).Value=com.sun.star.sheet.ConditionOperator.GREATER
mCond(1).Name="Formula1"
mCond(1).Value="500"
mCond(2).Name="StyleName"
mCond(2).Value="Result"
'limpaascondioesexistentes
oEntradas.clear()
'adicionaanovacondio
oEntradas.addNew(mCond())
'aplicaaformataocondicional
oExtensao.setPropertyValue("ConditionalFormat",oEntradas)
Nestecdigo,aplicamosoestiloResultadoseovalordaclulaformaiorqueR$500,00.
Podemos,tambm,aplicarestilosdeformataodeclulasdefinidospelosusurios.
Descrio
SearchBackwards
SearchCaseSensitive
78
Verso 2
Documentos do Calc
Propriedade
Descrio
SearchWords
SearchStyles
Vejamosumexemplodebusca:crieumnovodocumentodoCalc,preenchaalgumasclulas
comotextoTOTALeTOTALGERAL,emseguidacrieamacroabaixoeexecute.
SubbuscaTexto
DimoDocAsObject
DimoDescBuscaAsObject
DimoPlanilhaAsObject
oDoc=ThisComponent
oPlanilha=oDoc.Sheets(0)
oDescBusca=oPlanilha.createSearchDescriptor()
oDescBusca.SearchWords=True
oDescBusca.setSearchString("TOTAL")
oResultado=oPlanilha.findFirst(oDescBusca)
i=0
DoUntilIsNull(oResultado)
oResultado.CharColor=RGB(250,100,50)
oResultado=oPlanilha.findNext(oResultado,oDescBusca)
i=i+1
Loop
MsgBox"Ocorrnciasde"+oDescBusca.getSearchString()+""+Str$(i)
EndSub
79
Documentos do Calc
Verso 2
oPlanilha=oDoc.Sheets(0)
oDescritor=oPlanilha.createReplaceDescriptor()
oDescritor.setSearchString("TOTALGERAL")
oDescritor.setReplaceString("Total")
n=oPlanilha.replaceAll(oDescritor)
sMsg=oDescritor.getSearchString()+por+oDescritor.getReplaceString()
MsgBoxsMsg+=+Str$(n)
EndSub
Notequedevemosexecutarabuscaeasubstituionumaextensodeclulas.Nosexemplos,
utilizamostodaaplanilha.
7.8 Ordenando
Para a ordenao de uma extenso de clulas, devemos utilizar os mesmos conceitos e
serviosjapresentadosnaseoTabelas,docaptulosobreDocumentosdoWriter.
Seguem,abaixo,osprincipaismtodosepropriedadesutilizadosnestatarefa.
Mtodosdainterfacecom.sun.star.util.XSortable:
createSortDescriptor()AsVariant<com.sun.star.beans.PropertyValue>
sort(xDescritorAsVariant<com.sun.star.beans.PropertyValue>)
Algumasdaspropriedadesdodescritordeordenao(SortDescriptor):
Propriedade
Descrio
IsCaseSensitive
SortAscending
SortColumns
Oserviocom.sun.star.table.TableSortDescriptorincluioservioSortDescriptorepossui
aspropriedadesabaixo:
Propriedade
Descrio
SortFields
Descreve
os
campos
<com.sun.star.util.SortField>
MaxFieldCount
Orientation
Define
a
orientao
<com.sun.star.table.TableOrientation>
ContainsHeader
80
de
da
ordenao
ordenao
Verso 2
Documentos do Calc
Noprximoblocodecdigo,veremosaordenaodeumaextensodeclulas(A2:E7),do
documentocriadopelaSubeditaPlanilha.Digiteocdigoabaixonofinaldamacro,execute
eobserveasaida.
'=================================
'ORDENANDOUMAEXTENSODECLULAS
'=================================
DimoCampoOrd(0)AsNewcom.sun.star.util.SortField
DimoDescrOrdAsVariant
'
'defineaextensoaserordenada(A2:E7)
oExtensao=oDoc.getSheets().getByIndex(0).getCellRangeByPosition(0,1,4,6)
'defineocampodeordenaoesuaspropriedades
oCampoOrd(0).Field=0
oCampoOrd(0).SortAscending=True
oCampoOrd(0).FieldType=com.sun.star.util.SortFieldType.ALPHANUMERIC
'criaodescritordeordenao
oDescrOrd=oExtensao.createSortDescriptor()
'defineaspropriedadesdodescritor
oDescrOrd(0).Name="SortFields"
oDescrOrd(0).Value=oCampoOrd()
oDescrOrd(1).Name="ContainsHeader"
oDescrOrd(1).Value=False
oDescrOrd(2).Name="SortColumns"
oDescrOrd(2).Value=False
'ordenaaextenso
oExtensao.sort(oDescrOrd())
Notequeiniciamoscom adeclaraodasvariveis,criamosumaextensodeclulascom
umachamadaaomtodogetCellRangeByPosition(),definimosaspropriedadesdocampode
ordenao,criamosodescritoredefinimosassuaspropriedades(ocampodeordenao
umapropriedadedodescritor)e,finalmente,invocamosomtodosort()paraexecutarasua
tarefa.
seTrue,destinguemaisculaseminsculas
seTrue,asentradasduplicadasseroexcludas
filtraporLinhasouColunas(TableOrientation)
81
Documentos do Calc
ContainsHeader
CopyOutputData
OutputPosition
Verso 2
aprimeiralinhaoucolunaumcabealho
seTrue,oresultadosercopiadoparaoutrolocal
localdacpia(estruturaCellAddress)
comoseraconexocomacondioanterior(Or/And)
acolunausadanacondio
operadorcondicional(FilterOperator)
seTrue,ovalordocampo(Field)numrico
valordocampo,usarseIsNumericforTrue
cadeiadecaracteres,usarseIsNumericforFalse
Ospassosnecessriosparafiltrardadosnumaplanilhaso:
a)obteraextensodeclulasaserfiltrada;
b)definiraestruturadoscamposcomoscritriosdofiltro;
c)criaredefinirosdadosdodescritordofiltro;
d)aplicarofiltro.
Vejamosumtrechodecdigofontequeaplicaumfiltrosimplesnumaextensodeclulas.
SubaplicaFiltro
DimoDocAsObject
DimoPlanAsObject
DimoExtAsObject
DimoDescFiltroAsVariant
DimoCamposFiltro(0)AsNewcom.sun.star.sheet.TableFilterField
oDoc=ThisComponent
oPlan=oDoc.getSheets().getByIndex(0)
oExt=oPlan.getCellRangeByPosition(0,1,4,6)
'defineaestruturaTableFilterField
oCamposFiltro(0).Field=4
oCamposFiltro(0).IsNumeric=True
oCamposFiltro(0).Operator=
com.sun.star.sheet.FilterOperator.GREATER_EQUAL
oCamposFiltro(0).NumericValue=300
'criaodescritordofiltrovazio(True)
oDescFiltro=oExt.createFilterDescriptor(True)
'defineocampodefiltro
oDescFiltro.setFilterFields(oCamposFiltro())
'aplicaofiltro
82
Verso 2
Documentos do Calc
oExt.filter(oDescFiltro)
'
MsgBox"OKparafiltrarCaracteres"
'redefineaestruturaTableFilterField
oCamposFiltro(0).Field=0
oCamposFiltro(0).IsNumeric=False
oCamposFiltro(0).Operator=com.sun.star.sheet.FilterOperator.GREATER
oCamposFiltro(0).StringValue="A1"
'criaumdescritordefiltrovazio(True)
oDescFiltro=oExt.createFilterDescriptor(True)
'defineocampodefiltro
oDescFiltro.setFilterFields(oCamposFiltro())
'aplicaofiltro
oExt.filter(oDescFiltro)
EndSub
inserequebradepginaapscadasubtotal
consideraletrasmaisculas/minsculas
seTruepermiteadefiniodeumalistaparaordenao
alistaparaordenao,seEnableUserSortListforTrue
defineseocontedodoscamposseroordenados
seTrueordenaocrescente(dependedeEnableSort)
Almdaspropriedadesacima,odescritordeveconteroscamposdesubtotais.Ainterface
XSubTotalDescriptorprovmtodosparaadicionaroulimparcampos:
addNew(aColunas()As<SubTotalColumn>,nColGrupoAsLong)
adicionaoscamposaodescritor,nColGrupoespecificaacolunabaseparaagrupamento
Introduo ao OpenOffice.org Basic
83
Documentos do Calc
Verso 2
clear()
removetodososcamposdesubtotaisdoobjeto
Aestruturacom.sun.star.sheet.SubTotalColumncontmoselementos:
Column
Function
ndicedacolunaasubtotalizar
otipodesubtotal,definidoemcom.sun.star.sheet.GeneralFunction
Ospassosnecessriosparaadicionarlinhascomsubtotaisnumaextensodeclulasso:
a)obteraextensodeclulasasersubtotalizada;
b)definiraestruturadoscamposdesubtotal;
c)criaredefinirosdadosdodescritordesubtotal;
d)aplicaraoperaodesubtotal.
Vejamosumtrechodecdigofontequeaplicaumsubtotalnumaextensodeclulas.
SubaplicaSubTotal
DimoDocAsObject
DimoPlanAsObject
DimoExtAsObject
DimoDescSubTotalAsVariant
DimoCamposSubTotal(0)AsNewcom.sun.star.sheet.SubTotalColumn
oDoc=ThisComponent
oPlan=oDoc.getSheets().getByIndex(0)
oExt=oPlan.getCellRangeByPosition(0,0,4,6)
'defineaestruturaSubTotalColumn
oCamposSubTotal(0).Column=4
oCamposSubTotal(0).Function=com.sun.star.sheet.GeneralFunction.SUM
'criaodescritordosubtotal
oDescSubTotal=oExt.createSubTotalDescriptor(True)
'adicionaocamposubtotaleacolunabase
oDescSubTotal.addNew(oCamposSubTotal(),0)
'aplicaosubtotal
oExt.applySubTotals(oDescSubTotal,True)
EndSub
7.11 Grficos
UmgrficoumdocumentoembutidonumoutrodocumentodoOpenOffice.org.AAPIdo
OpenOffice.orgcontmdiversosservioseinterfacesparaageraodegrficos,apartirdos
dadoscontidosnumaplanilha.
Oserviocom.sun.star.table.TableChartssuportaosmtodosdasinterfacesXTableCharts,
XIndexAccesseXEnumerationAccess.
Mtodosdainterfacecom.sun.star.table.XTableCharts:
addNewByName(sNomeAsString,
84
Verso 2
Documentos do Calc
oAreaAsObject<com.sun.star.awt.Rectangle>,
oExt()AsObject<com.sun.star.table.CellRangeAddress>,
bTitColAsBoolean,bTitLinAsBoolean)
Adicionaogrficonacoleodegrficosdaplanilha.Osseusparmetrosso:
sNome
oArea
oExt
bTitCol
bTitLin
onomedogrfico
area(retngulo)aondeogrficoserplotado
aextensodeclulascomosdados
seTrue,osdadosdalinhasuperiorserousadosnalegendadogrfico
seTrue,osdadosdaprimeiracolunaserousadoscomottulosnoeixo
removeByName(sNomeAsString)
removeogrficocomonomesNomedacoleo.
Oserviocom.sun.star.table.TableChartsuportaainterfaceXTableChartcomosmtodos:
getHasColumnHeaders()AsBoolean
setHasColumnHeaders(bTituloColunaAsBoolean)
getHasRowHeaders()AsBoolean
setHasRowHeaders(bTituloColunaAsBoolean)
getRanges()AssExtensoes()<CellRangeAddress>
setRanges(sExtensoes()AsObject<CellRangeAddress>)
Umdocumento grfico contm uma referncia para umafonte dedados,um diagrama e
algumas propriedades como ttulo, subttulo e legenda. O servio ChartDocument o
modelo do documento grfico e suporta as interfaces XChartDocument, XPropertySet e
XMultiServiceFactory.Elepossuiasseguintespropriedades:
HasMainTitle
HasSubTitle
HasLegend
SeTrue,exibeottuloprincipal
SeTrue,exibeosubttulo
SeTrue,exibealegenda
Ainterfacecom.sun.star.chart.XChartDocumentprovosmtodos:
getTitle()As<com.sun.star.drawing.XShape>
getSubTitle()As<com.sun.star.drawing.XShape>
getLegend()As<com.sun.star.drawing.XShape>
getArea()As<com.sun.star.beans.XPropertySet>
getDiagram()As<com.sun.star.chart.XDiagram>
setDiagram(oDiagramaAs<com.sun.star.chart.XDiagram>)
getData()As<com.sun.star.chart.XChartData>
attachData(oDadosExternosAs<com.sun.star.chart.XChartData>)
Odiagramaoobjetoquecontmaformadogrfico,baseadanoservio Diagramesuas
interfacesXDiagrameXPropertySet.Diferentestiposdediagramaspodemsercriadoscomo
mtodocreateInstance(),dainterfaceXMultiServiceFactory.Eisalgunsserviosparatipos
dediagramas:
Introduo ao OpenOffice.org Basic
85
Documentos do Calc
Verso 2
com.sun.star.chart.BarDiagram
com.sun.star.chart.LineDiagram
com.sun.star.chart.PieDiagram
com.sun.star.chart.AreaDiagram
com.sun.star.chart.XYDiagram
PodemosalterarapropriedadeDiagramdeumgrficocomocdigoaseguir:
oDiagrama=oGraf.createInstance("com.sun.star.chart.PieDiagram")
oGraf.setDiagram(oDiagrama)
Oserviocom.sun.star.chart.Diagramtemaspropriedadesabaixo:
DataRowSource
DataCaption
defineseasriededadosporlinhasoucolunas
definecomoalegendadosdadosserexibida
Paracriarumgrficodevemosseguirospassosabaixo:
a)definirosdadosaseremexibidosnogrfico;
b)definirarearetangularaondeogrficoserdesenhado;
c)adicionarogrficocoleo;
d)recuperaroobjetogrficoembutido.
e)definiraspropriedadesdogrfico.
Vejamosumexemplosimples.Digiteamacroaseguireexecuteparaverasada:
SubcriaGrafico
DimoDeskAsVariant
DimoDocAsObject
DimmProp()AsVariant
DimsURLAsString
'criadocumentodoCalc
oDesk=createUnoService("com.sun.star.frame.Desktop")
sUrl="private:factory/scalc"
oDoc=oDesk.LoadComponentFromURL(sUrl,"_blank",0,mProp())
'editaclulasdaplanilha
DimoPlanilhaAsObject
DimoCelulaAsObject
DimsTitCol()AsString
'escreveostitulosdascolunas
sTitCol=Array("Perodo","Computador","Perifrico","Servio","Total")
oPlanilha=oDoc.getSheets().getByIndex(0)
Fori%=0To4
oCelula=oPlanilha.getCellByPosition(i%,0)
oCelula.setString(sTitCol(i%))
Nexti%
'preencheasclulascomtexto,valoreformula
Fori%=1To4
Forj%=0To4
oCelula=oPlanilha.getCellByPosition(j%,i%)
If(j%=0)Then
oCelula.setString(Str$(i%)+"Trim")
ElseIf(j%>0Andj<4)Then
86
Verso 2
Documentos do Calc
oCelula.setValue(1000*Rnd())
Else
sExt="B"+Trim$(Str$(i%+1))+":"+"D"+Trim$(Str$(i%+1))
sFormula="=Soma("+sExt+")"
oCelula.FormulaLocal=sFormula
EndIf
Nextj%
Nexti%
'
'insereumgrficodecolunas
DimoRetAsNewcom.sun.star.awt.Rectangle
DimoEndExt(0)AsNewcom.sun.star.table.CellRangeAddress
DimoGraficosAsObject
'defineonomedogrfico
sNome="Trimestral"
'defineoendereodaextensodeclulascomosdados
oEndExt(0).Sheet=0
oEndExt(0).StartColumn=0
oEndExt(0).StartRow=0
oEndExt(0).EndColumn=3
oEndExt(0).EndRow=4
'defineareadogrfico
oRet.X=1000
oRet.Y=3000
oRet.Width=12000
oRet.Height=12000
'obtmacoleodegrficosdaPlanilha1
oGraficos=oPlanilha.Charts
'adicionaumgrficocoleo
oGraficos.addNewByName(sNome,oRet,oEndExt(),True,True)
'defineaspropriedades(Titulo)
oGraf=oGraficos.getByName(sNome).getEmbeddedObject()
oGraf.Title.String="FaturamentoTrimestral"
oGraf.HasSubTitle=True
oGraf.SubTitle.String="Ano2003"
EndSub
Comeamospreenchendoasclulascomosdados,depois,definimosonomedogrfico,a
extensodeclulascomosdadosearea(retngulo)aondeogrficoserplotado.Apsestes
passos preliminares, obtemos a coleo dos grficos da planilha e adicionamos o nosso
grficonacoleo,comumachamadaaomtodoaddNewByName().Finalmente,obtemos
oobjetogrficoembutido,comumachamadaaomtodogetByName()associadaaomtodo
getEmbeddedObject()e,ento,alteramosalgumaspropriedadesdogrfico.
Aproveitandooexemploacima,vamosmostrarcomoalterarapropriedadeDiagramdeum
grfico.AcrescenteocdigofonteabaixoaofinaldaSubcriaGraficoeexecuteparacriar
umgrficodotipoPizza,representandoosdadosdalinha2daplanilha.
'CriandoumgrficodotipoPizza
DimoExtPizza(1)AsNewcom.sun.star.table.CellRangeAddress
'
MsgBox"OKparaumaPizza"
'removeogrficodebarras
oGraficos.removeByName(sNome)
sNome="GrafPizza"
'defineoendereodaextensodeclulascomlegendas
oExtPizza(0).Sheet=0
oExtPizza(0).StartColumn=0
87
Documentos do Calc
Verso 2
oExtPizza(0).StartRow=0
oExtPizza(0).EndColumn=3
oExtPizza(0).EndRow=0
'defineoendereodaextensodeclulascomdados
oExtPizza(1).Sheet=0
oExtPizza(1).StartColumn=0
oExtPizza(1).StartRow=1
oExtPizza(1).EndColumn=3
oExtPizza(1).EndRow=1
'adicionaumgrficocoleo
oGraficos.addNewByName(sNome,oRet,oExtPizza(),True,True)
'defineaspropriedades
oGraf=oGraficos.getByName(sNome).getEmbeddedObject()
oGraf.Diagram=oGraf.createInstance("com.sun.star.chart.PieDiagram")
oGraf.Diagram.DataRowSource=com.sun.star.chart.ChartDataRowSource.ROWS
oGraf.Title.String="1Trimestre2003"
Observequetemosumvetordeestruturas CellRangeAddress,ondeoprimeiroelemento
contmosdadosdalegendadogrficoeosegundoosdadosaseremrepresentados.Note
tambmamudanadapropriedade Diagramcomumachamadaaomtodo createInstance
()eamudanadapropriedadeDataRowSourcedodiagrama.
Note,ainda,queofatodepodermosdefinirumvetorCellRangeAddress,indicaquepodemos
ter extenses de clulas, consecutivas ou no, contendo os dados a serem representados
graficamente.
Ainterfacecom.sun.star.sheet.XRangeSelectionprovosseguintesmtodos:
startRangeSelection(aProp()AsObject<com.sun.star.beans.PropertyValue>)
iniciaoprocessodeseleodaextensodeclulas
abortRangeSelection()
abortaoprocessodeseleo
addRangeSelectionListener(oListAs<com.sun.star.sheet.XRangeSelectionListener>)
adicionaumlistenerparamonitorarotrminoouocancelamentodaseleo
removeRangeSelectionListener(oListAs<com.sun.star.sheet.XRangeSelectionListener>)
88
Verso 2
Documentos do Calc
removeolistenerespecificadonoparmetro
addRangeSelectionChangeListener(oListAs<XRangeSelectionChangeListener>)
adicionaumlistenerparamonitorarmudanasduranteaseleo
removeRangeSelectionChangeListener(oListAs<XRangeSelectionChangeListener>)
removeolistenerdemudanasespecificadonoparmetro
Ainterface com.sun.star.sheet.XRangeSelectionListener especificaosmtodos abaixo,a
seremdefinidospelousurio,usandooBasic:
done(aEventoAs<com.sun.star.sheet.RangeSelectionEvent>)
contmocdigoaserexecutadoapsotrminodaseleo
aborted(aEventoAs<com.sun.star.sheet.RangeSelectionEvent>)
contmocdigoaserexecutadoapsocancelamentodaseleo
Aestruturacom.sun.star.sheet.RangeSelectionEventcontmoelementoRangeDescriptor,
queumarepresentaotextualdaextensodeclulasselecionadas.
Devemos criar uma instncia do listener chamando a funo createUnoService ( ) do
OpenOffice.orgBasic,eisasuasintaxe:
createUnoService(sPrefixoAsString,sListenerAsString)AsObject
sPrefixo:oprefixousadononomedosmtodosdolistener.Ocaracteresublinhado
deveseroltimodoprefixo(ex:listen_).
sListener:onomedainterfacedolistener
retornaumobjetolistener,cujosmtodospodemserusadosnamacro.
Bem,jtemostodasasferramentasnecessriasparaexecutaranossatarefa.Vejamoscomo
uslasatravsdeumexemplosimplesdeseleo.
Abra uma nova planilha e salvea, em seguida crie um novo mdulo para a macro, isto
porqueusamosvariveisPblicasemnossamacro.Finalmente,digiteocdigofonteabaixo
(oucopieecole)nonovomdulo.Ativeaplanilhaeexecuteamacro,surgeumacaixade
dilogosolicitandoaseleodaextenso,useomouseouotecladoparaselecionar.Apsa
seleo,apropriedadeCharHeightdaextensoseralterada.
'
'seleodeumaextensoduranteaexecuodamacro
'usandoXRangeSelectionListener
'
PublicaListenerAsObject
PublicaResultAsString
PublicbSelecaoAsBoolean
SubMain
'
DimoDocAsObject
DimoDocViewAsObject
DimoPlanAsObject
DimaProp(2)AsNewcom.sun.star.beans.PropertyValue
'
oDoc=ThisComponent
oDocView=oDoc.getCurrentController()
89
Documentos do Calc
Verso 2
'defineumouvinte(listener)
SetaListener=CreateUnoListener("oList_",_
"com.sun.star.sheet.XRangeSelectionListener")
'adicionaoouvinte
oDocView.addRangeSelectionListener(aListener)
'defineaspropriedadesparaaseleo
aProp(0).Name="InitialValue"
aProp(0).Value=""'"$Planilha1.$A$1:$B$2"
aProp(1).Name="Title"
aProp(1).Value="Selecionea"
aProp(2).Name="CloseOnMouseRelease"
aProp(2).Value=True
'iniciaoprocessodeseleo
bSelecao=False
oDocView.startRangeSelection(aProp())
DoWhile(bSelecao=False)
'aguardaaseleo
Loop
'removeoouvinte(listener)
oDocView.removeRangeSelectionListener(aListener)
'operasobreoresultadodaseleo
If(bSelecao=TrueAndLen(aResult)>0)Then
MsgBoxaResult
oPlan=oDocView.getActiveSheet()
oRange=oPlan.getCellRangeByName(aResult)
oRange.CharHeight=20
Else
MsgBox"Seleorecusada"
EndIf
'
EndSub
'Mtodosdainterfacecom.sun.star.sheet.XRangeSelectionListener
'done()
SuboList_done(oEvent)
'obtemonomedaextenso
aResult=oEvent.RangeDescriptor
bSelecao=True
EndSub
'aborted()
SuboList_aborted(oEvent)
bSelecao=True
EndSub
SuboList_disposing()
'implementaomnima
EndSub
Inicialmentedefinimosalgumasvariveispblicas,depoisobtemosavistadodocumento,
pois a seleo ocorre na vista e chamamos a funo createUnoListener para criar uma
instnciadainterfaceXRangeSelectionListener,noteoprefixocomosublinhadonofinal.
Aps a criao, registramos o listener com addRangeSelectionListener, como se
estivessemosdizendoaoOpenOffice.org:ei,temosumnovomonitordeseleoparaavista
destedocumento.
90
Verso 2
Documentos do Calc
Definimos ento, as propriedades iniciais para a nossa seleo, note que o valor da
propriedade CloseOnMouseRelease True, e atribuimos o valor False para o sinalizador
bSelecao. Depois, chamamos o mtodo startRangeSelection passando o vetor com as
propriedadesiniciais.
Aseguir,nolaoDoWhile...Loop,aguardamosaseleodousurio.Amacrosabandona
olaoquandoovalordebSelecaoforTrue.Istosacontecenosmtodosdone()eaborted()
dolistener.EstesmtodossochamadosautomaticamentepeloOpenOffice.orgnofinalou
nocancelamentodaseleo,isto,quandoousuriocompletaraseleo,liberandooboto
domouseouquandoelefecharodilogodeseleo.
Terminadaaseleo,removemosolistenercomomtodoremoveRangeSelectionListener
e,finalmente,processamosoresultadodanossaseleo.
AlmdasubrotinaMain,temos,emnossamacro,assubrotinasabaixo:
SuboList_done(oEvent)
SuboList_aborted(oEvent)
SuboList_disposing()
correspondeaomtododone()dainterface
correspondeaomtodoaborted()dainterface
chamadanaremoodolistener
Nasubrotinadone(),atribuimosadescriotextualdaseleovarivelpblicaaResult,
atravs do elemento RangeDescriptor da estrutura oEvent, e, depois, definimos o nosso
sinalizadorbSelecaoparaTrue.
Nasubrotinaaborted(),apenasdefinimosonossosinalizadorbSelecaoparaTrue.
NoteousodoprefixodecreateUnoListenerantecedendoosnomesdosmtodosdainterface.
AAPIdoOpenOffice.orgcontmmuitasinterfacesqueusamlisteners.muitoimportante
quetodososmtodosdainterfacesejamimplementadoscomoBasic.Quandonenhumaao
fornecessria,faaumaimplementaomnima,comoemoList_disposing().
91
Documentos do Calc
Verso 2
copiaogrupodeclulasdemOrigparamDestnomesmodocumento.
moveRange(mDestAs<com.sun.star.table.CellAddress>,
mOrigAs<com.sun.star.table.CellRangeAddress>)
moveogrupodeclulasmOrigparamDest,ocontedodemOrigapagado.
removeRange(mEnderecoAs<com.sun.star.table.CellRangeAddress>,nModoAsInteger)
remove o grupo de clulas de mEndereco; os valores de nModo esto definidos na
enumerao<com.sun.star.sheet.CellDeleteMode>:
NONE
nenhumaclulasermovida
UP
asclulasabaixodasclulasapagadassomovidasparacima
LEFT
asclulasdireitadasclulasapagadassomovidasparaaesquerda
ROWS
aslinhasabaixodasclulasapagadassomovidasparacima
COLUMNS ascolunasdireitadasclulasapagadassomovidasparaaesquerda
estasconstantesdefinemodeslocamentodasclulasadjacentes.
Agora,umexemplosimplesparademonstraroempregodestescomponentesdaAPI.
SubcopiaExtensao
'exemplointerfacesheet.XCellRangeMovement
DimoDocAsObject
DimoPlanAsObject
DimoExtAsObject
DimmDestAsNewcom.sun.star.table.CellAddress
DimmEndAsNewcom.sun.star.table.CellRangeAddress
oDoc=ThisComponent
oExt=oDoc.getCurrentSelection()
oPlan=oExt.getSpreadsheet()
mEnd=oExt.getRangeAddress()
mDest.Sheet=1 'Planilha2
mDest.Column=0
mDest.Row=0
'copyRangecopiatambmaformataodaclula
oPlan.copyRange(mDest,mEnd)
'
EndSub
Aqui,obtemosaseleocorrenteecopiamosparaaPlanilha2,tendocomoorigemaclula
A1.ObservequeomtodocopyRangechamadoapartirdoobjetoSpreadsheet.
92
Verso 2
Documentos do Calc
Vnculos
O servio < com.sun.star.sheet.SpreadsheetDocument > contm as propriedades abaixo,
relacionadascomvnculosnoutrosdocumentos:
SheetLinks contmacoleodevnculosdeplanilhasnodocumento
AreaLinks contmacoleodevnculosdereasnodocumento
DDELinks contmacoleodevnculosDDEdodocumento
Estascoleespodemserobtidascomoabaixo:
oDoc=ThisComponent
oVinculos=oDoc.SheetLinks
documento
'obtmosvnculosdeplanilhado
Ainterface<com.sun.star.sheet.XSheetLinkable>possuiosseguintesmtodosparadefinir
vnculoscomplanilhasdeoutrosdocumentos:
getLinkMode()As<com.sun.star.sheet.SheetLinkMode>
setLinkMode(nModoAs<com.sun.star.sheet.SheetLinkMode>)
obtmoudefineomododovnculo
getLinkUrl()AsString
setLinkUrl(sURLAsString)
obtmoudefineaURLdorecurso(odocumentovinculado)
getLinkSheetName()AsString
setLinkSheetName(sPlanilhaAsString)
obtmoudefineonomedaplanilhadentrododocumentovinculado
link(sURLAsString,sPlanilhaAsString,sFiltroAsString,sOpcoesAsString,
nModoAs<com.sun.star.sheet.SheetLinkMode>)
criaumvnculocomumaplanilha,emoutrodocumento,seelenoexistir
OsvalorespossveisparaLinkMode,estoem<com.sun.star.sheet.SheetLinkMode>:
NONE
semvnculo
NORMAL copiaosvaloreseasfrmulas
VALUE
copiaosvalores,inclusiveoresultadodasfrmulas
EisalgunsnomesdefiltrosdoOpenOffice.org:
StarOfficeXML(Calc) documentosdoCalcnoformatoXML
MSExcel97
documentosdoExcel97/2000/XP
MSExcel95
documentosdoExcel5.0/95
Paraestesfiltros,podemospassarumacadeiavaziacomoopodofiltro.
Vejamosumexemplo:
SubvinculoPlanilha
'
93
Documentos do Calc
Verso 2
DimoDocAsObject
DimoPlanAsObject
'
oDoc=ThisComponent
oPlan=oDoc.Sheets(0)
'editesURLparaseusistema:
sURL="file:///d:/nad/openoffice/Intro_OOo_Basic/novo_mat/editaPlan.sxc"
sOrigem="Planilha1"
sFiltro="StarOfficeXML(Calc)"
sOpcoes=""
'defineomodo
nModo=com.sun.star.sheet.SheetLinkMode.NORMAL
'estabeleceovnculo
oPlan.link(sURL,sOrigem,sFiltro,sOpcoes,nModo)
'desativaovnculo
oPlan.setLinkMode(com.sun.star.sheet.SheetLinkMode.NONE)
'
EndSub
Notequedefinimososparmetroseestabelecemosovnculo.Apsexecutarestamacro,a
planilhavinculadasercarregadaparaodocumento.
Almdeplanilhas,possvelvincularumaoumaisreasdeumdocumentoexternoaum
outrodocumento.
Aprincipalinterfaceusadaparaisto,<com.sun.star.sheet.XAreaLinks>,temosmtodos:
insertAtPosition(aPosAs<com.sun.star.table.CellAddress>,sArqAsString,
sFonteAsString,sFiltroAsString,sFiltroOpAsString)
insereumareavnculadanacoleo.Osparmetrostemossignificados:
aPos
posiodaclulainicialnodocumentodedestino(estrutura).
sArq
Urldorecurso(documentodeorigem).
sFonte
endereodareanodocumentodeorigem(porex:Planilha1.A1:D10).
sFiltro
nomedofiltrousadoparaconverterosdados.
sFiltroOp opesparaofiltro
asopesdefiltrosoespecficasparaalgunstiposdefiltro.
removeByIndex(nIndex)
removeareavinculadadacoleo.
Vamosapresentarumexemplosimples,demonstrandoestapossibilidade:
SubvinculoArea
'
DimoDocAsObject
DimoPlanAsObject
DimoLinksAsObject
DimaPosAsNewcom.sun.star.table.CellAddress
oDoc=ThisComponent
oPlan=oDoc.Sheets(1)
sURL="file:///d:/nad/openoffice/Intro_OOo_Basic/novo_mat/editaPlan.sxc"
sFonte="Planilha1.A1:E8"
sFiltro="StarOfficeXML(Calc)"
sOpcoes=""
'defineaorigemdareanodestino
94
Verso 2
Documentos do Calc
aPos.Sheet=1
aPos.Column=0
aPos.Row=0
'obtmcoleo
oLinks=oDoc.AreaLinks
'insereumvnculocomareasFonte
oLinks.insertAtPosition(aPos,sURL,sFonte,sFiltro,sOpcoes)
'removeoultimolink
oLinks.removeByIndex(oLinks.Count1)
'
EndSub
Inicialmentedefinimososparmetros,depoisobtemosacoleodevnculos,adicionamoso
novovnculoe,porfim,removemosovnculo.
Seumvnculopermanecerativo,naprximacargadodocumentodestino,ooperadorser
informadodasuaexistnciaequestionadosedeseja,ouno,atualizlos.
Descrio
SourceType
DatabaseName
SourceObject
OsvalorespossveisparaSourceTypeso(com.sun.star.sheet.DataImportMode):
NONE
SQL
TABLE
nadaserimportado
umcomandoSQLserpassadoparaSourceObject
onomedeumatabelaserpassadoparaSourceObject
95
Documentos do Calc
QUERY
Verso 2
onomedeumaconsultadafontededadosserpassadoparaSourceObject
Agoraumexemplo.AmacroabaixoimportatodososregistrosresultantesdocomandoSQL
paraumaplanilha.
SubimportaDadosParaPlanilha
'
DimoCelOrigemAsObject
DimoDescritorAsVariant
DimsFonteDadosAsString
DimsOrigemDadosAsString
DimiTipoAsLong
'obtemacluladaorigemnaplanilha
oCelOrigem=ThisComponent.Sheets(1).getCellByPosition(0,0)
'criaumdescritordeimportao
oDescritor=oCelOrigem.createImportDescriptor(True)
'inicializavariveis
iTipo=com.sun.star.sheet.DataImportMode.SQL
sFonteDados="Bibliography"
sOrigemDados="Select*Frombiblio"
'defineaspropriedadesdodescritor
oDescritor(0).Name="DatabaseName"
oDescritor(0).Value=sFonteDados
oDescritor(1).Name="SourceType"
oDescritor(1).Value=iTipo
oDescritor(2).Name="SourceObject"
oDescritor(2).Value=sOrigemDados
'importaosdados
oCelOrigem.doImport(oDescritor())
'
EndSub
96
Verso 2
Banco de Dados
8 Banco de Dados
8.1 Introduo
OOpenOffice.orgtrazumpoderososistemadeconexocombancodedados.Oseuprincipal
objetivooferecerumaindependnciadeplataforma,permitindooacessoabancodedados
dediversosfabricantes.
OmecanismoqueoOpenOffice.orgusaparaatingiroseuobjetivochamadoSDBC(Star
DatabaseConnectivity),quepermiteaescritadedriversSDBCespecficosparadiferentes
fontes de dados. Estes drivers podem, inclusive, usar padres de acesso a dados bem
estabelecidos,comoODBCeJDBC.
Destemodo,qualquerbancodedadosquesuporteumdospadresacima,podeserdefinido
como uma fonte de dados para o OpenOffice.org. O OpenOffice.org tambm acessa,
nativamente,tabelasdoDbaseePlanilhasdoCalc,comofontededados.
DentreasfacilidadesdeacessoabancodedadosdoOpenOffice.orgpodemoscitar:ousoda
SQL(LinguagemdeConsultaEstruturada)paraconsultaseousodevnculoseformulrios
baseadosemdocumentosdoOpenOffice.org.
Sevocnotemexperinciacombancodedados,antesdecontinuar,procuresefamiliarizar
comasferramentasgrficasdoOpenOffice.orgparaacessoafontededados.SelecioneVer
NavegadorFontedeDados.Nestajanela,podemosselecionarumafontededadosregistrada
e operar sobre suas tabelas, consultas e vnculos. Para administrar as fontes de dados,
selecioneFerramentasFontedeDados.
97
Banco de Dados
Verso 2
Outroserviodalinhadefrente com.sun.star.sdb.DataSource,querepresentaumobjeto
fontededados.Eletemvriaspropriedadeseoferecediversasinterfaces.
98
Verso 2
Banco de Dados
Antes de adicionar uma nova fonte de dados ao contexto, precisamos criar um objeto
DataSource.Istopodeserfeitodeduasmaneiras:
oFonte=oDataContext.createInstance()'emdesuso
oFonte=createUnoService(com.sun.star.sdb.DataSource)
Paraobter,apagarouregistrarumafontededadosnocontextodebancodedados,devemos
usarosmtodosdainterfacecom.sun.star.uno.XNamingServicedoobjetoDatabaseContext.
getRegisteredObject(sNomeAsString)As<com.sun.star.uno.XInterface>
retornaoobjetofontededadoscomonomesNome
registerObject(sNomeAsString,oFonteAs<com.sun.star.uno.XInterface>)
registraoobjetooFontecomoumafontededadoscomonomesNome
revokeObject(sNomeAsString)
revogaafontededadoscomonomesNome
Eisalgumasdaspropriedadesdoserviocom.sun.star.sdb.DataSource:
Propriedade
Descrio
Name
URL
User
Password
Senha do usurio
Vamosretomaronossoexemploeacrescentarcdigoparaadicionarumanovafontededados
aocontextodebancodedados.Acrescenteocdigoabaixona SubcontextoBancoDados,
executeamacroeverifique,atravsdeFerramentasFontedeDados,seanovafontefoi
criada.
'ADICIONAUMANOVAFONTEDEDADOS
DimoFonteAsVariant
'criaumainstanciadefontededados
oFonte=createUnoService("com.sun.star.sdb.DataSource")
'oFonte=oContexto.createInstance()
'testaseafontejestregistrada
IfoContexto.hasByName("Minha_Fonte")Then
MsgBox"Minha_Fontejregistrada!"
ExitSub
Else
'registraanovafontenocontexto
oContexto.registerObject("Minha_Fonte",oFonte)
'defineapropriedadeURL>>>>ALTEREPARAOSEUSISTEMA<<<<
99
Banco de Dados
Verso 2
oFonte.setPropertyValue("URL",_
"sdbc:dbase:file:///D:/NAD/OPENOFFICE/BDados")
EndIf
100
Verso 2
Banco de Dados
'
'verificaconsultas
oConsultas=oFonte.getQueryDefinitions()
IfoConsultas.getCount()>0Then
MsgBoxStr$(oConsultas.getCount())+"consultasdefinidas"
Else
MsgBox"Nenhumaconsultadefinida."
EndIf
'
'verificavnculos
oVinculos=oFonte.getBookmarks()
IfoVinculos.getCount()>0Then
MsgBoxStr$(oVinculos.getCount())+"vnculosdefinidos"
Else
MsgBox"Nenhumvnculodefinido."
EndIf
'
EndSub
Note que as tabelas a serem visualizadas pela fonte de dados uma propriedade de
DataSource,enquantoasconsultasevnculossoobtidosatravsdemtodosespecficos.
8.3 Conexes
Atomomento,trabalhamosdentrodocontextodebancodedados.Seanossatarefaestiver
relacionadacomosdadosarmazenadosnobancodedadosoucomasuaestrutura,devemos
estabelecerumaconexocomomesmo.
Umaconexoumcanaldecomunicaoentreousurioeobancodedados,permitindoa
transfernciadedadosentreeles.EsteoprincipalobjetivodoservioDataSourcee,para
isto,dispedasseguintesinterfacesemtodos:
Ainterfacecom.sun.star.sdb.XCompletedConnection,possuiomtodo:
connectWithCompletion(oManipAs<com.sun.star.task.XInteractionHandler>)
As<com.sun.star.sdbc.XConnection>
tentaestabelecerumaconexocomobancodedados,senecessrio,solicitainformaes.
Ainterfacecom.sun.star.sdbc.XDataSource,temosseguintesmtodos:
getConnection(sUserAsString,sSenhaAsString)
As<com.sun.star.sdbc.XConnection>
tentaestabelecerumaconexocomobancodedados.
setLoginTimeout(iSegundosAsLong)
defineoperodo,emsegundos,paratentarestabeleceraconexo
getLoginTimeout()AsLong
obtmoperodo,emsegundos,paratentardeestabeleceraconexo
Os mtodos connectWithCompletion () e getConnection () retornam um objeto, que
representaumaconexo.Esteobjeto,porsuavez,suportaoutrosservioseinterfaces.
101
Banco de Dados
Verso 2
Umadasprincipaisinterfacesdoserviocom.sun.star.sdb.ConnectionXConnection,com
mtodosparadiversasoperaes.Aseguir,algunsdeles:
setAutoCommit(bSinalAsBoolean)
getAutoCommit()AsBoolean
commit()
rollback()
isClosed()AsBoolean
getMetaData()As<com.sun.star.sdbc.XDatabaseMetaData>
setReadOnly(sSinalAsBoolean)
isReadOnly()AsBoolean
Ainterfacecom.sun.star.sdbc.XDatabaseMetaData,retornadaporgetMetaData(),define
vrios mtodos para obter informaes sobre o banco de dados e sua estrutura. Seguem
alguns:
getUserName()AsString
getDatabaseProductName()AsString
getDriverName()AsString
getTables()As<com.sun.star.sdbc.XResultSet>
getColumns()As<com.sun.star.sdbc.XResultSet>
getNumericFunctions()AsString
getStringFunctions()AsString
getSystemFunctions()AsString
getTimeDateFunctions()AsString
supportsExpressionsInOrderBy()AsBoolean
supportsGroupBy()AsBoolean
supportsOuterJoins()AsBoolean
supportsStoredProcedures()AsBoolean
Vejamosumexemplo,queestabeleceumaconexocomumafontededados,obtmeexibe
metadados.Digiteocdigofonteabaixoeexecuteamacro.
SubobtemMetaData
'
DimoContextoAsVariant
DimoFonteAsObject
'criaocontextodebasesdedados
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados(usaacessonomeado)
oFonte=oContexto.getByName("Minha_Fonte")
'fazaconexocomafontededados
DimoConexaoAsObject
'
IfoFonte.IsPasswordRequired()Then
DimoManipAsVariant
oManip=createUnoService("com.sun.star.sdb.InteractionHandler")
oConexao=oFonte.ConnectWithCompletion(oManip)
Else
oConexao=oFonte.getConnection("","")
102
Verso 2
Banco de Dados
EndIf
'obtemmetadados
DimoMetaDataAsObject
oMetaData=oConexao.getMetaData()
'exibemetadados
MsgBoxoMetaData.getURL()+Chr$(10)+_
oMetaData.isReadOnly()+Chr$(10)+_
oMetaData.supportsANSI92EntryLevelSQL()+Chr$(10)+_
oMetaData.supportsSelectForUpdate()+Chr$(10)+_
oMetaData.getMaxColumnNameLength()
'
EndSub
Noteque,seumasenhaforrequerida,usamosomtodoconnectWithCompletion(),seno
chamamos getConnection ().Apsestabeleceraconexo,chamamos getMetaData()para
obterosmetadados.Nofinal,chamamosalgunsmtodosdeXDatabaseMetaDataparaexibir
informaesdobancodedados.
O servio Connection inclui, tambm, o servio com.sun.star.sdbcx.DatabaseDefinition,
comoutrasinterfaces.Porenquanto,nosinteressa com.sun.star.sdbcx.XTablesSupplier e
seumtodo:
getTables()As<com.sun.star.container.XNameAccess>
retornaumcontainercomastabelasativasnafontededados.
Eisumachamadaaestemtodo:
'obtemacoleodetabelas(ativas)dafontededados
oTabelas=oConexao.getTables()
Nasprximassees,apresentaremosoutrosmtodossuportadospeloobjetoConnection.
Tabelas
Astabelassoosprincipaiscomponentesdaestruturadeumbancodedadosetmumasrie
depropriedadeseelementosassociados.Entreelespodemoscitar:colunas,chavesprimriase
ndices.
Opontodeentradaparaoperaescomoalteraoerecuperaodeinformaesdetabelas
soosservioscom.sun.star.sdbcx.Tableecom.sun.star.sdb.Table.Elespossuemalgumas
interfacesepropriedades.
Introduo ao OpenOffice.org Basic
103
Banco de Dados
Verso 2
Entreassuaspropriedades,todassomenteleitura,temos:
Propriedade
Descrio
Privileges
Name
CatalogName
SchemaName
Description
Type
Ogrupodeconstantes com.sun.star.sdbcx.Privilege,definealgunsprivilgiosdeoperao
sobre uma tabela: SELECT, INSERT, UPDATE, CREATE, ALTER, DELETE, DROP,
READ,REFERENCE.
Oserviocom.sun.star.sdb.DataSettingscontmpropriedadesrelacionadascomaexibio
dosdadosdatabela,comofiltroeordenao.Eisalgumas:
Propriedade
Descrio
Filter
ApplyFilter
Order
AstabelasdeumafontededadossoobtidasatravsdoobjetoConnectionedomtodo
getTables,japresentado,comoabaixo:
oConexao=oFonte.getConnection(,)
oTabelas=oConexao.getTables()
Oserviocom.sun.star.sdbcx.Columntrazpropriedades(somenteleitura),quedescrevemas
caractersticasdeumacoluna.Entreasquais:
Propriedade
104
Descrio
Name
O nome da coluna
Type
O
tipo
de
dado
( com.sun.star.sdbc.DataType )
Precision
Scale
IsAutoIncrement
da
coluna
Verso 2
Banco de Dados
IsCurrency
Description
Descrio da coluna
Obtemosascolunasdeumatabelapelainterfacecom.sun.star.sdbcx.XColumnsSupplier:
getColumns()As<com.sun.star.container.XNameAccess>
retornaumrecipientecomascolunasdatabela.
Ainterfacecom.sun.star.sdbcx.XKeysSuppliereseumtodo:
getKeys()As<com.sun.star.container.XIndexAccess>
retornaumrecipientecomaschavesdatabela.
Ainterfacecom.sun.star.sdbcx.XIndexesSupplierforneceosndicesdeumatabela:
getIndexes()As<com.sun.star.container.XNameAccess>
retornaumrecipientecomosndicesdatabela.
Ainterfacecom.sun.star.sdbcx.XRenameusadapararenomearumatabela:
rename(sNovoNomeAsString)
renomeiaoobjeto
Ainterfacecom.sun.star.sdbcx.XAlterTabletemosmtodos:
alterColumnByName(sNomeAsString,oDescAs<com.sun.star.beans.XPropertySet>)
alterColumnByIndex(iIndAsLong,oDescAs<com.sun.star.beans.XPropertySet>)
ambosalteram umacoluna, oprimeiro peloNomeeosegundopelo ndice, oparmetro
oDesccontmodescritordacolunacomasnovaspropriedades.
Vejamos um exemplo, que apresenta informaes sobre as tabelas da fonte de dados
Bibliography,distribudacomoOpenOffice.org.
SubexibeInfoTabelas
'
DimoContextoAsVariant
DimoFonteAsObject
'criaocontextodebasesdedados
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados
oFonte=oContexto.getByName("Bibliography")
'fazaconexocomafontededados
DimoConexAsObject
oConex=oFonte.getConnection("","")
'obteminfosobretabelasecolunas
DimoTabelasAsObject
DimoTabAsObject
DimoColunasAsObject
DimoColAsObject
'obtemacoleodetabelas(ativas)dafontededados
oTabelas=oConex.getTables()
'
Fori=0TooTabelas.Count1
'obtematabelapeloseundice
oTab=oTabelas.getByIndex(i)
105
Banco de Dados
Verso 2
sMsg="TABELA:"+oTab.getName()+Chr$(10)+"COLUNAS:"
'obtemacoleodecolunasdatabela
oColunas=oTab.getColumns()
sNomeColunas=oColunas.getElementNames()
'
Forj=0ToUBound(sNomeColunas)
oCol=oColunas.getByName(sNomeColunas(j))
sTipo=oCol.getPropertyValue("TypeName")
sMsg=sMsg+Chr$(10)+sNomeColunas(j)+""+sTipo
Nextj
MsgBoxsMsg
'
Nexti
'
EndSub
Apsaconexo,pegamosacoleodetabelascomgetTables.Aseguir,paracadatabela,
obtemos as suas colunas com getColumns e os nomes com getElementNames. Depois,
visitamoscadacolunaobtendoapropriedadeTypeName.Nofinal,exibimosasinformaes
databela.
Paraacriao deumatabela, dispomos doservio com.sun.star.sdbcx.TableDescriptor,
quecontmaspropriedadesabaixo:
Propriedade
Descrio
Name
CatalogName
SchemaName
Description
Oserviocom.sun.star.sdbcx.ColumnDescriptortemvriaspropriedades,seguemalgumas:
Propriedade
106
Descrio
Name
O nome da coluna
Type
O
tipo
de
dado
( com.sun.star.sdbc.DataType )
Precision
Scale
IsAutoIncrement
IsNullable
Define
o
nulo
da
( com.sun.star.sdbc.ColumnValue )
Description
da
coluna
coluna
Verso 2
Banco de Dados
Ainterface com.sun.star.sdbcx.XDataDescriptorFactory,criaumdescritordedadospara
umdadoobjeto,atravsdomtodo:
createDataDescriptor()As<com.sun.star.beans.XPropertySet>
retornaumdescritordedadosparaoobjetoassociado. Porexemplo:sechamadoporum
containerdetabelas, criaumdescritordetabela;sechamado porumobjetocontendoas
colunasdeumatabela,criaumdescritordecoluna.
Ainterfacecom.sun.star.sdbcx.XAppend,usadaparacriareadicionarumnovoobjetonum
recipiente,contmomtodo:
appendByDescriptor(oDescAs<com.sun.star.beans.XPropertySet>)
criaumnovoobjeto,usandoodescritoroDesc,eadicionaesteobjetoaumrecipiente.
Demonstrandoousodestasinformaes,vamoscriarumamacroparaadicionarduastabelas
nafontededadosMinha_Fonte,criadaanteriormente.
SubcriaTabelasMinhaFonte
'
DimoContextoAsVariant
DimoFonteAsVariant
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados
IfoContexto.hasByName("Minha_Fonte")Then
oFonte=oContexto.getByName("Minha_Fonte")
Else
MsgBox"Noexiste,saindo..."
ExitSub
EndIf
'fazaconexocomafontededados
DimoConexAsObject
oConex=oFonte.getConnection("","")
'obtemtabelasdafontededados
oTabelas=oConex.getTables()
'criaumdescritordedadosparaatabelaamigos.dbf
oTab=oTabelas.createDataDescriptor()
'definepropriedadenome
oTab.Name="amigos"
'obtemcolunasdatabela
oColunas=oTab.getColumns()
'criaumdescritordedadosparaumacoluna
oCol=oColunas.createDataDescriptor()
'defineaspropriedadesda1a.coluna
oCol.Name="CODIGO"
oCol.Type=com.sun.star.sdbc.DataType.DECIMAL
oCol.Precision=5
'adicionaacolunaaocontainerdecolunas
oColunas.appendByDescriptor(oCol)
'definepropriedadesda2a.coluna(oColpreservaosvalores)
oCol.Name="NOME"
oCol.Type=com.sun.star.sdbc.DataType.VARCHAR
oCol.Precision=50
oColunas.appendByDescriptor(oCol)
'definepropriedadesda3a.coluna
oCol.Name="ANIV"
oCol.Type=com.sun.star.sdbc.DataType.DATE
oColunas.appendByDescriptor(oCol)
107
Banco de Dados
Verso 2
'
'adicionaatabelaAmigosaocontainerdetabelas
oTabelas.appendByDescriptor(oTab)
'
'criaumdescritordedadosparaatabelafones.dbf
oTab=oTabelas.createDataDescriptor()
'definepropriedadenome
oTab.Name="fones"
'obtemcolunasdatabela
oColunas=oTab.getColumns()
'criaumdescritordedadosparaumacoluna
oCol=oColunas.createDataDescriptor()
oCol.Name="CODIGO"
oCol.Type=com.sun.star.sdbc.DataType.DECIMAL
oCol.Precision=5
oCol.Description="Cdigodoamigo"
oColunas.appendByDescriptor(oCol)
oCol.Name="FONE"
oCol.Type=com.sun.star.sdbc.DataType.VARCHAR
oCol.Precision=15
oCol.Description="Fonedoamigo"
oColunas.appendByDescriptor(oCol)
'
'adicionaatabelaaocontainerdetabelas
oTabelas.appendByDescriptor(oTab)
'
'encerraaconexo
oConex.dispose()
'
EndSub
Apsaconexo,chamamosomtodogetTables,queretornaumcontaineroTabelas,comas
tabelas ativas na fonte de dados. Depois, criamos o descritor oTab, da nova tabela e
chamamosomtodogetColumns,criandoocontainervazio oColunas,paraascolunasda
nova tabela. A seguir, o descritor oCol criado, suas propriedades definidas e, depois,
adicionado a oColunas. Isto repetido para cada nova coluna, aproveitando o mesmo
descritor.Emseguida,acrescentamosodescritordanovatabelaaocontaineroTabelas.Por
fim,repetimosoprocessoparaumasegundatabelae,paraevitarproblemas,encerramosa
conexo.
Chave Primria
Umachaveprimriaquaseobrigatoriaembancosdedadosrelacionais,principalmenteno
suportedealgumasoperaescomointegridadereferencial.
Atravsdoserviocom.sun.star.sdbcx.Key,queofereceasinterfacesXColumnsSuppliere
XDataDescriptorFactory,podemosextrairasinformaesdeumachaveprimria.Elepossui
aspropriedadesabaixo,todassomenteleitura:
Propriedade
Name
108
Descrio
Nome da chave
Introduo ao OpenOffice.org Basic
Verso 2
Banco de Dados
Type
ReferencedTable
UpdateRule
DeleteRule
Ostipospossveisparaumachaveestodefinidosemcom.sun.star.sdbcx.KeyType.
Asregrassodefinidasemcom.sun.star.sdbc.KeyRule,porex:CASCADE,RESTRICT,etc.
Oserviocom.sun.star.sdbcx.KeyColumn,incluioservioColumnetemapropriedade:
RelatedColumn
nomedacolunarelacionadanumatabelaexterna
Paraacriaodechavesprimrias,temososerviocom.sun.star.sdbcx.KeyDescriptor,que
inclui o servio Descriptor, oferece a interface XColumnsSupplier e tem as mesmas
propriedadesdoservioKey,acima,semarestriodesomenteleitura.
Oserviocom.sun.star.sdbcx.KeyColumnDescriptor,incluioservioDescriptor, etemas
propriedades:
Propriedade
Descrio
Name
RelatedColumn
Otrechodecdigoabaixo(notestado),criaumachaveprimriaparaumatabela:
'
'CdigoparacriarumaChavePrimria
'
'obtemorecipientecomaschaves
oChaves=oTabela.getKeys()
'criaumdescritorparaachaveprimria:
oChave=oChaves.createDataDescriptor()
'definepropriedadesdachave
oChave.setPropertyValue("Type",com.sun.star.sdbcx.KeyType.PRIMARY)
'obtemascolunasdanovachave
oColunasChaves=oChave.getColumns()
'craiumdescritor(sprecisoum)
oColChave=oColunasChaves.createDataDescriptor()
'defineapropriedade
oColChave.setPropertyValue("Name","ID")
'adicionaacolunachave
oColunasChaves.appendByDescriptor(oColChave)
'adicionaachave
oChaves.appendByDescriptor(oChave)
'adicionaatabelaaocontainerdetabelas
oTabelas.appendByDescriptor(oTabela)
109
Banco de Dados
Verso 2
Normalmente,estaoperaoexecutadaduranteacriaodanovatabela,motivodaltima
linhadecdigo.
ndices
Atravsdoserviocom.sun.star.sdbcx.Index,podemosobterinformaessobreumndicede
tabela.EleforneceasinterfacesXDataDescriptorFactoryeXColumnsSupplierepossuias
propriedadesaseguir:
Propriedade
Descrio
Name
Nome do ndice
Catalog
IsUnique
IsPrimaryKey
IsClustered
Oserviocom.sun.star.sdbcx.IndexColumn,quetambmincluioservioColumn,representa
ascolunasdeumndiceetemapropriedade:
IsAscending
SeTrue,aordemascendente
Acriaodenovosndicessedpeloserviocom.sun.star.sdbcx.IndexDescriptor,queinclui
oservioDescriptor,suportaainterfaceXColumnsSupplieretemaspropriedades:
Propriedade
Descrio
Name
Catalog
IsUnique
IsClustered
Descrio
Name
IsAscending
Vejamosumexemploqueadicionaumndiceparaatabelaamigos.dbf,criadaanteriormente.
110
Verso 2
Banco de Dados
SubcriaIndiceAmigos
'
DimoContextoAsVariant
DimoFonteAsVariant
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados
IfoContexto.hasByName("Minha_Fonte")Then
oFonte=oContexto.getByName("Minha_Fonte")
Else
MsgBox"Fontenoexiste,saindo..."
ExitSub
EndIf
'fazaconexocomafontededados
DimoConexAsObject
oConex=oFonte.getConnection("","")
'obtemtabelasdafontededados
oTabelas=oConex.getTables()
IfoTabelas.hasByName("amigos")Then
'obtmatabelaamigos.dbf
oTabela=oTabelas.getByName("amigos")
Else
MsgBox"Tabelanoexiste,saindo..."
ExitSub
EndIf
'
'obtmosindicesdatabela
oIndices=oTabela.getIndexes()
'criaumdescritorparaumnovoindice
oIndice=oIndices.createDataDescriptor()
'definepropriedadesdonovoindice
oIndice.setPropertyValue("Name","ami_cod")
oIndice.setPropertyValue("IsUnique",True)
'obtemascolunasdoindice
'oColunas=oIndice.getColumns()
oColunas=oIndice.Columns
'criaumdescritordecolunaparaoindice
oColuna=oColunas.createDataDescriptor()
'defineaspropriedadesdacoluna
oColuna.setPropertyValue("Name","CODIGO")
oColuna.setPropertyValue("IsAscending",True)
'adicionaanovacolunaaocontainerdecolunas
oColunas.appendByDescriptor(oColuna)
'adicionaoindiceaosindicesdatabela
oIndices.appendByDescriptor(oIndice)
'
'fechaaconexo
oConex.dispose()
'
EndSub
Algicaparaacriaodendicesamesmajapresentadaparaachaveprimria,comuma
diferena:umndicenopodeseradicionadoaumdescritordetabela.
Antes de prosseguir, procure, nos exemplos que acompanham esta Introduo, a Sub
criaIndiceFone e comande a sua execuo, para criar um arquivo ndice para a tabela
fones.dbf.NotequeestendicetemapropriedadeIsUniquedefinidacomoFalse.
Introduo ao OpenOffice.org Basic
111
Banco de Dados
Verso 2
Segurana
Existem outros elementos, associados estrutura do banco de dados. Vamos apresentar,
brevemente,osrelacionadoscomasuasegurana.
Oserviocom.sun.star.sdbcx.Group,representaumacontaparaumgrupodeusurios.Ele
temapropriedadeNome(nomedogrupo)eofereceasseguintesinterfaces:
Interfacecom.sun.star.sdbcx.XUsersSuppliercomomtodo:
getUsers()
retornaosusuriosdoobjeto
Interfacecom.sun.star.sdbcx.XAuthorizablequedefineosmtodos:
getPrivileges()
obtmosprivilgiosdeacessoaoobjeto
getGrantablePrivileges()
obtm os privilgios, quepodem ser concedidos a
outros
grantPrivileges()
concedeosprivilgios
revokePrivileges()
revogaosprivilgios
Oservio com.sun.star.sdbcx.Userrepresenta umusurio doobjeto. Possuiapropriedade
Name(nomedousurio)eofereceasinterfacesabaixo.
Ainterfacecom.sun.star.sdbcx.XUserdefineomtodo:
changePassword(sSenhaAtualAsString,sNovaSenhaAsString)
alteraasenhadousurio
Ainterfacecom.sun.star.sdbcx.XGroupsSuppliercomomtodo:
getGroups()
retornaacoleodegruposdoobjeto
ParaacriaodeGruposeUsurios,temososserviosGroupDescriptoreUserDescriptor.O
raciocniogeralomesmojvistonestaseoparaoutrosdescritores.
Finalmente,vamoslembrarqueainterfacecom.sun.star.sdbc.XDatabaseMetaData,fornece
umavastaquantidadedeinformaessobreobancodedados.Eladefinediversosmtodos,
algunsjapresentadosnaseoConexo.
8.5 Registros
A manipulao dos dados contidos numa tabela pode ser efetuada por duas abordagens
diferentes.Aprimeira,utilizaoservioRowSeteusadaparafontesregistradasnocontexto
dedadosdoOpenOffice.org.Asegunda,atravsdeumacomunicaodiretacomobancode
dados,usandoumobjetoStatement.Nestaseoveremosapenasaprimeiradelas.
112
Verso 2
Banco de Dados
Criando um RowSet
OservioRowSetutilizaumaconexoparaoperarsobretabelas,consultasecomandosSQL.
Antesdeuslo,precisamosdefinirassuaspropriedadeseento,executaroseucomando.
Oserviocom.sun.star.sdb.RowSetincluiosservios<sdbc.RowSet>e<sdb.ResultSet>,
oferecealgumasinterfacesetmumagrandequantidadedepropriedades.
EisalgumaspropriedadesdeRowSet:
Propriedade
Descrio
ActiveConnection
DataSourceName
Command
o comando
CommandType
CommandType
O
tipo
de
comando,
sdb.CommandType >
Filter
Order
RowCount
IsRowCountFinal
IsNew
ser
executado,
depende
definido
em
de
<
IsModified
Se True, indica que o registro corrente foi alterado
Asquatroltimaspropriedadessoapenasparaleitura.
Ogrupo<com.sun.star.sdb.CommandType>defineasseguintesconstantes:
TABLE
QUERY
COMMAND
indicaqueCommandreceberonomedeumatabela
indicaqueCommandreceberonomedeumaconsulta
indicaqueCommandreceberumcomandoSQL
Ainterface<XResultSetAccess>defineomtodo:
createResultSet()As<com.sun.star.sdbc.XResultSet>
retornaumobjeto<ResultSet>
Oserviocom.sun.star.sdbc.RowSet,includoem<sdb.RowSet>,ofereceoutrasinterfaces
edefineoutraspropriedades.Entreelas:
Propriedade
Introduo ao OpenOffice.org Basic
Descrio
113
Banco de Dados
Verso 2
MaxRows
User
Password
ResultSetType
O
tipo
do
resultado,
de
com.sun.star.sdbc.ResultSetType >
Senecessriologon,definaaspropriedadesUserePassword,antesdaexecuo:
<
oRowSet.setPropertyValue("User","Maria")
oRowSet.setPropertyValue("Password","senha_de_Maria")
Ainterface<sdbc.XRowSet>define,entreoutros,omtodo:
execute()
preencheoobjetoRowSetcomosdados
Ainterface<sdbc.XColumnLocate>permitealocalizaodecolunascomomtodo:
findColumn(sNomeColAsString)AsLong
apartirdonomedacoluna,retornaoseundicenoobjetoRowSet.
Ainterface<sdbc.XParameters>usadaparadefinirparmetrosemconsultaspreparadas.
OsseusmtodostmaformasetXXXondeXXXotipodedadodacoluna.
VamosaumexemplodecriaodeumRowSet,utilizandoatabelabiblio,dafontededados
Bibliography,distribudacomoOpenOffice.org.
SubcriaRowSet
'
DimoRowSetAsVariant
'criaRowSet
oRowSet=createUnoService("com.sun.star.sdb.RowSet")
'definepropriedadesparaconexocomafontededados
oRowSet.setPropertyValue("DataSourceName","Bibliography")
oRowSet.CommandType=com.sun.star.sdb.CommandType.TABLE
'paraTABLE,passamosonomedatabela
oRowSet.setPropertyValue("Command","biblio")
'executa
oRowSet.execute()
'verificasecursorjestnofinaldoresultado
MsgBox"Ocontadorestnofim:"+_
oRowSet.getPropertyValue("IsRowCountFinal")
'posicionanofinal
oRowSet.last()
'verificadenovo
MsgBox"Ocontadorestnofim:"+_
oRowSet.getPropertyValue("IsRowCountFinal")
'exibetotalderegistrosnoresultado
MsgBox"H"+Str$(oRowSet.getPropertyValue("RowCount"))+_
"registros!"
'destroioresultado
oRowSet.dispose()
'
EndSub
114
Verso 2
Banco de Dados
Noteque,parausaroRowSetprecisamos:criarumobjeto,definirassuaspropriedadese,
ento,chamaromtodoexecute().
Aps a criao do objeto RowSet, podemos operar sobre os seus registros, usando as
funcionalidadesdoservioResultSet.
Acessando os dados
AinterfaceXRowdefinediversosmtodosparaacessoaosdados,entreeles:
getString(nColunaAsLong)AsString
Introduo ao OpenOffice.org Basic
115
Banco de Dados
Verso 2
getBoolean(nColunaAsLong)AsBoolean
getInt(nColunaAsLong)AsInteger
getFloat(nColunaAsLong)AsSingle
getDouble(nColunaAsLong)AsDouble
getDate(nColunaAsLong)As<com.sun.star.util.Date>
getTime(nColunaAsLong)As<com.sun.star.util.Time>
getTimestamp(nColunaAsLong)As<com.sun.star.util.DateTime>
retornaocontedodacolunanColuna
wasNull()AsBoolean
seTrue,indicaquealtimacolunalidacomgetXXX()contmumNULL
Agora,umexemplodenavegaoeacessoaosdadosdeumRowSet,criadoatravsdeum
comandoSQL:
SubobtendoDadosRowSet
'
DimoRowSetAsVariant
'criaRowSet
oRowSet=createUnoService("com.sun.star.sdb.RowSet")
'definepropriedadesparaconexocomafontededados
oRowSet.setPropertyValue("DataSourceName","Bibliography")
oRowSet.CommandType=com.sun.star.sdb.CommandType.COMMAND
'seCOMMANDpassamosumcomandoSQL
sCmdSQL="SELECTIDENTIFIER,AUTHOR,TITLEFROMbiblio"
oRowSet.setPropertyValue("Command",sCmdSQL)
'executa
oRowSet.execute()
'obtemindicesdascolunas
nIdent=oRowSet.findColumn("IDENTIFIER")
nTitle=oRowSet.findColumn("TITLE")
sMsg="LINHA:IDENT:TTULO(S)"+Chr$(10)
'posicionacursoapsltimoregistro
oRowSet.afterLast()
'percorreosregistros,doltimoparaoprimeiro
DoWhile(oRowSet.previous())
'obtemnmerodalinha
sLinha=Str$(oRowSet.getRow())+""
'obtmocontedodascolunasIDENTIFIEReTITLE
sIdent=oRowSet.getString(nIdent)
sTitle=oRowSet.getString(nTitle)
sMsg=sMsg+sLinha+sIdent+":"+sTitle+Chr$(10)
Loop
'exibeosdados
MsgBoxsMsg
'destroioRowSet
oRowSet.dispose()
'
EndSub
ObservequeocomandoSQLrecuperatrscolunasdatabela biblio,masexibimosapenas
duas.
116
Verso 2
Banco de Dados
Alterando os dados
AinterfaceXResultSetUpdate,definemtodosparaaatualizaodosregistros:
insertRow()
insereoregistronoResultSetenobancodedados,deveestarnomododeinsero.
updateRow()
atualizaosdadosdoregistro.
deleteRow()
deletaoregistrocorrente.
cancelRowUpdates()
cancelaaatualizaodoregistro,seaoperaoforsuportada.
moveToInsertRow()
ativaomododeinsero,guardandoaposiodoregistroatual.
moveToCurrentRow()
retornaparaoregistroatualquandonomododeinsero.
AinterfaceXRowUpdatedefinemtodosparaatualizarosdadosdalinha.Eisalguns:
updateString(nColunaAsLong,sCadAsString)
updateBoolean(nColunaAsLong,bValorAsBoolean)
updateInt(nColunaAsLong,iValorAsInteger)
updateFloat(nColunaAsLong,fValorAsSingle)
updateDouble(nColunaAsLong,dValorAsDouble)
updateDate(nColunaAsLong,oDataAs<com.sun.star.util.Date>)
updateTime(nColunaAsLong,oHoraAs<com.sun.star.util.Time>)
updateTimestamp(nColunaAsLong,oDataHoraAs<com.sun.star.util.DateTime>)
updateNull(nColunaAsLong)
atualizaocontedodacolunanColuna,conformeotipodedado.
Vejamosumexemplo,queinserecincoregistrosnatabelaamigos.dbf,dafontededados
Minha_Fonte,criadaanteriormente.
SubinsereLinhasRowSet
'
DimoRowSetAsVariant
'criaRowSet
oRowSet=createUnoService("com.sun.star.sdb.RowSet")
'definepropriedadesparaconexocomafontededados
oRowSet.setPropertyValue("DataSourceName","Minha_Fonte")
oRowSet.CommandType=com.sun.star.sdb.CommandType.TABLE
oRowSet.setPropertyValue("Command","amigos")
'executa
oRowSet.execute()
'definenovosdados
DimrelAmig()'relaodenomesdeamigos
DimrelAniv()'relaodedatasdeaniversrio
DimdsDataAsNewcom.sun.star.util.Date
relAmig=Array("Ana","Maria","Jos","Maria","MrioXXX")
117
Banco de Dados
Verso 2
relAniv=Array("10/05/80","01/02/86","05/06/81","05/06/81","20/03/78")
'iniciaainserodaslinhas
ForI=0To4
'ativamododeinsero
oRowSet.moveToInsertRow()
ForJ=1To3
If(J=1)Then
'preenchebufferparacolunatipoDECIMAL
oRowSet.updateInt(J,I+1)
ElseIf(J=2)Then
'preenchebufferparacolunastipoVARCHAR
oRowSet.updateString(J,relAmig(I))
Else
'convertedestringparadata
dAniv=DateValue(relAniv(I))
'preenchecamposdaestrutura(com.sun.star.util.Date)
dsData.Day=Day(dAniv)
dsData.Month=Month(dAniv)
dsData.Year=Year(dAniv)
'preenchebufferparacolunastipoDATE
oRowSet.updateDate(J,dsData)
EndIf
NextJ
'escrevebuffernatabela,saindodomododeinsero
oRowSet.insertRow()
NextI
MsgBox"Registrosinseridos:"+Str$(oRowSet.getRow())
'
'destroioresultado
oRowSet.dispose()
'
EndSub
118
Verso 2
Banco de Dados
oRowSet.beforeFirst()
DoWhile(oRowSet.next())
sNome=oRowSet.getString(2)'colunaNOMEasegunda
IfsNome="MrioXXX"Then
oRowSet.updateString(2,"Mrio")
oRowSet.updateRow()
ExitDo
EndIf
Loop
MsgBoxrowUpdated()
'
'destroioresultado
oRowSet.dispose()
'
EndSub
Inicialmente,apagamosoregistroduplicadoeemseguida,localizamosecorrigimosonome
nacoluna,omtodoupdateRowgravaasalteraesdeupdateString.
8.6 Consultas
Apsacriaodeumafontededados,podemosdefinirearmazenarconsultasutilizadascom
frequnciaparaarecuperaodedados.
O principal servio envolvido nesta tarefa com.sun.star.sdb.Query, que inclui outros
servioseoferecealgumasinterfaces.
Oserviocom.sun.star.sdb.QueryDefinition,contmalgumaspropriedades,como:
Introduo ao OpenOffice.org Basic
119
Banco de Dados
Verso 2
Propriedade
Descrio
Name
Command
EscapeProcessing
Oserviocom.sun.star.sdb.DataSettings,contm propriedadesrelacionadascomaexibio
dosdadosejfoiapresentadonaseoTabelas.
Ainterfacecom.sun.star.sdbcx.XDataDescriptorFactory,defineomtodo:
createDataDescriptor()As<com.sun.star.beans.PropertySet>
craiumdescritordedadosparaoobjeto.
Ainterfacecom.sun.star.sdbcx.XRenameusadapararenomearobjetos,atravsdomtodo:
rename(sNovoNomeAsString)
renomeiaoobjeto.
Ainterfacecom.sun.star.sdbcx.XColumnsSupplierobtmascolunasdoobjetocomomtodo:
getColumns()As<com.sun.star.container.XNameAccess>
retornaascolunascontidasnoobjeto.
Adefiniodeconsultas,sedatravsdainterfaceXQueryDefinitionsSuppliereseumtodo:
getQueryDefinitions()As<com.sun.star.container.XNameAccess>
retornaumcontainercomasdefiniesdasconsultas.
O container retornado suporta o mtodo createInstance( ) para a criao de uma nova
consultaoupodemos,ainda,usarafunoBasiccreateUnoService.
VejamosumexemploquedefineumaconsultaparaafontededadosMinha_Fonte.
SubcriaConsulta
DimoContextoAsVariant
DimoFonteAsObject
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
oFonte=oContexto.getByName("Minha_Fonte")
'obtemorecipientecomasdefiniesdeconsultas
DimoDefConsAsObject
oDefCons=oFonte.getQueryDefinitions()
'criaumainstanciaparaumaconsulta
DimoConsultaAsObject
oConsulta=oDefCons.createInstance()
'OU:
'oConsulta=createUnoService("com.sun.star.sdb.QueryDefinition")
'defineaspropriedades
oConsulta.Command="SELECT*FROMamigos"
'insereaconsultanorecipiente
oDefCons.insertByName("Consulta_1",oConsulta)
120
Verso 2
Banco de Dados
'verifica
MsgBoxoDefCons.hasByName("Consulta_1")
'
EndSub
Observe que no necessrio estabelecer uma conexo para definir novas consultas. As
propriedadesaseremdefinidas,soasmesmasdoservioQueryDefinition,japresentadas.
Consultaspodemsercriadas,ainda,atravsdoservioQueryDescriptoresuasinterfaces.A
lgicasimilarquelajapresentadanacriaodendicesparatabelas.
O acesso s consultas, aps estabelecer uma conexo, pode ocorrer atravs da interface
XQueriesSuppliereseumtodo:
getQueries()As<com.sun.star.container.XNameAccess>
retornaumcontainercomasconsultas.
Oexemploaseguir,criaumaconexocomafontededadoseobtmascolunasdaconsulta
armazenadaanteriormente.
SubexibeColunasConsulta
DimoDbContAsVariant
DimoDbFonteAsObject
oDbCont=createUnoService("com.sun.star.sdb.DatabaseContext")
oDbFonte=oDbCont.getByName("Minha_Fonte")
'fazaconexocomafontededados
DimoDbConAsObject
oDbCon=oDbFonte.getConnection("","")
'obtemorecipientecomasconsultas
DimoDefConsAsObject
oDefCons=oDbCon.getQueries()
'obtemaconsultaesuascolunas
DimoConsultaAsObject
DimoColunasAsObject
oConsulta=oDefCons.getByName("Consulta_1")
oColunas=oConsulta.getColumns()
'obtemnomedacolunaetipodedado
DimoColAsObject
DimsNomes()AsString
sNomes=oColunas.getElementNames()
sMsg=""
Fori=LBound(sNomes)ToUBound(sNomes)
oCol=oColunas.getByName(sNomes(i))
sMsg=sMsg+sNomes(i)+""+_
oCol.getPropertyValue("TypeName")+Chr$(10)
Nexti
MsgBoxsMsg+"Total:"+Str$(i)+"Colunas"
EndSub
Aexecuodeumaconsultaocorreatravsdoservio<RowSet>,demodoanlogoaoj
apresentadonaseosobreRegistros.Vejamosumexemplo.
SubexecutaConsulta
'
DimoRowSetAsVariant
121
Banco de Dados
Verso 2
'criaRowSet
oRowSet=createUnoService("com.sun.star.sdb.RowSet")
'definepropriedadesparaconexocomafontededados
oRowSet.setPropertyValue("DataSourceName","Minha_Fonte")
oRowSet.CommandType=com.sun.star.sdb.CommandType.QUERY
'seQUERYpassamosonomedeumaconsulta
oRowSet.setPropertyValue("Command","Consulta_1")
'executa
oRowSet.execute()
'obtemindicesdascolunas
nIdent=oRowSet.findColumn("CODIGO")
nNome=oRowSet.findColumn("NOME")
sMsg="LINHA:CODIGO:NOME(S)"+Chr$(10)
'percorreosregistros
DoWhile(oRowSet.next())
'obtemnmerodalinha
sLinha=Str$(oRowSet.getRow())+""
'obtmocontedodascolunasCODIGOENOME
sIdent=oRowSet.getInt(nIdent)
sNome=oRowSet.getString(nNome)
sMsg=sMsg+sLinha+sIdent+":"+sNome+Chr$(10)
Loop
'exibeosdados
MsgBoxsMsg
'destroioRowSet
oRowSet.dispose()
'
EndSub
OnicoaspectoadestacarCommandTypedefinidacomoQUERYeapassagemdonome
daconsultaparaCommand.AsfuncionalidadesdeRowSetsoasmesmasjapresentadas
anteriormente.
Comoinformao,aAPIdoOpenOffice.orgoferece,tambm,ferramentasparaacomposio
de consultas, atravs do servio com.sun.star.sdb.SQLQueryComposer e da interface
XSQLQueryComposerFactory.
obtmomximodelinhas,se0nohlimitao
Introduo ao OpenOffice.org Basic
Verso 2
Banco de Dados
CursorName
nomedocursorSQL,dependedobancodedados
ResultSetConcurrency retornaotipodeconcorrncia(emResultSetConcurrency)
ResultSetType
defineacapacidadederolagem(emResultSetType)
EscapeProcessing
SeTrueocomandoSQLnosermodificadopeloparser
Osseguintesvaloressodefinidosemcom.sun.star.sdbc.ResultSetConcurrency:
READ_ONLY
nopodeseratualizado
UPDATABLE
podeseratualizado
Osvaloresabaixosodefinidosemcom.sun.star.sdbc.ResultSetType:
FORWARD_ONLY
SCROLL_INSENSITIVE
SCROLL_SENSITIVE
ocursorsemoveparaadiante
ambasasdirees,insensvelamudanas
ambasasdirees,sensvelamudanas
Ainterface<com.sun.star.sdbc.XStatement>usadaparaaexecuodecomandosSQLe
obtenodoresultadodocomando.Possuiosmtodos:
executeQuery(sCmdSQLAsString)AsResultSet
executaumcomandoqueretornaumresultadosimples(umResultSet)
executeUpdate(sCmdSQLAsString)AsLong
executaumcomandoSQLdeatualizao,paracomandosDDLretornazero.
execute(sCmdSQLAsString)AsBoolean
executaumcomandoSQLquepoderetornarmltiplosresultados
getConnection()
retornaaconexoqueoriginouestecomando.
A interface < com.sun.star.sdbc.XMultipleResults > usada para verificar mltiplos
resultadosdeumcomandoSQL.Defineosmtodos:
getResultSet()As<ResultSet>
retornaoresultadocorrente
getUpdateCount()AsLong
retornaocontadorderesultados
getMoreResults()AsBoolean
moveparaoprximocomando
VejamosumexemplodeusodoservioStatement,queoperasobreatabelaamigos,dafonte
dedadosMinha_Fonte,retornandoascolunasNOMEeANIVdosregistroscomCODIGO
maiorouiguala2.
SubexemploSQLSelect
'
DimoContextoAsVariant
DimoFonteAsObject
'criaocontextodebasesdedados
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados
oFonte=oContexto.getByName("Minha_Fonte")
'fazaconexocomafontededados
123
Banco de Dados
Verso 2
DimoConexaoAsObject
oConexao=oFonte.getConnection("","")
'obtemoresultadodeumaconsulta
DimoComandoAsObject
DimoResultadoAsObject
oComando=oConexao.createStatement()
'defineocomandoSQL
sCmdSQL="SelectNOME,ANIVFromamigosWhereCODIGO>=2"
'executaocomando
oResultado=oComando.executeQuery(sCmdSQL)
'percorreoresultado
sMsg=""
n=0
DoWhile(oResultado.next())
sMsg=sMsg+oResultado.getString(1)+Chr$(10)
n=n+1
Loop
MsgBoxsMsg+"Linhas:"+Str$(n)
'
EndSub
Verso 2
Banco de Dados
Oservio<com.sun.star.sdbc.PreparedStatement>oferecediversasinterfaces,entreelas:
A interface < com.sun.star.sdbc.XPreparedStatement > tem funcionalidade similar a
XStatementedefineosmtodos:
executeQuery()AsResultSet
executeUpdate()AsLong
execute()AsBoolean
getConnection()
Todoscomfuncionalidadeigualaosdainterface<XStatement>,massemparmetros.
Ainterface<com.sun.star.sdbc.XParameters>,encarregasedadefiniodosvaloresdos
parmetros,contendovriosmtodos,entreosquais:
setBoolean(nIndiceAsLong,bValorAsBoolean)
setInt(nIndiceAsLong,nValorAsLong)
setFloat(nIndiceAsLong,fValorAsSingle)
setDouble(nIndiceAsLong,dValorAsDouble)
setString(nIndiceAsLong,sValorAsString)
setDate(nIndiceAsLong,stValorAs<com.sun.star.util.Date>)
setTime(nIndiceAsLong,stValorAs<com.sun.star.util.Time>)
setTimestamp(nIndiceAsLong,stValorAs<com.sun.star.util.DateTime>)
DefineovalordoparmetronIndice.Elessonumeradosnaordememqueaparecemno
comandoSQL.
clearParameters()
limpaosvaloresdosparmetrosimediatamente
Jdispomosdoselementosparaapresentarumexemploilustrativo:
SubparametroSQLSelect
'
DimoContextoAsVariant
DimoFonteAsObject
'criaocontextodebasesdedados
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
'obtemafontededados
oFonte=oContexto.getByName("Minha_Fonte")
'fazaconexocomafontededados
DimoConexaoAsObject
oConexao=oFonte.getConnection("","")
'defineocomandoSQLparametrizado
sCmdSQL="Select*FromamigosWhereCODIGO>=?"
'preparaocomando
DimoComandoAsObject
oComando=oConexao.prepareStatement(sCmdSQL)
'defineovalordoparmetro
nValor=2
oComando.setInt(1,nValor)'ocampoDECIMAL
'obtemoresultadodaconsulta
DimoResultadoAsObject
oResultado=oComando.executeQuery()
'percorreoresultado
sMsg=""
n=0
125
Banco de Dados
Verso 2
DoWhile(oResultado.next())
sMsg=sMsg+oResultado.getString(2)+Chr$(10)
n=n+1
Loop
MsgBoxsMsg+"Linhas:"+Str$(n)
'liberaosrecursos
oComando.close()
'
EndSub
indicaquesComandoreceberonomedeumatabela
indicaquesComandoreceberonomedeumaconsulta
indicaquesComandoreceberumcomandoSQL
Apsapreparaodocomando,eledeverserexecutadocomumdosmtodosdainterface
XPreparedStatement. Se a consulta ou o comando SQL tiver parmetros, cada um deles,
deverserdefinidocomomtodosetXXX,apropriadoaoseutipodedado.
Oblocodecdigoaseguir,demonstraestaabordagem:
'preparaocomando
DimoComandoAsObject
'Consulta_2estarmazenadanafontededados:
'Select*FromamigosWhereCODIGO>=?
sComando="Consulta_2"
nTipo=com.sun.star.sdb.CommandType.QUERY
oComando=oConexao.prepareCommand(sComando,nTipo)
'defineovalordoparmetro
nValor=2
oComando.setInt(1,nValor)'ocampoDECIMAL
'obtemoresultadodaconsulta
DimoResultadoAsObject
oResultado=oComando.executeQuery()
126
Verso 2
Banco de Dados
'percorreoresultado
Observeque:sComandodependedenTipo,omtodoprepareCommandretornaumobjeto
PreparedStatementeadefiniodoparmetrodaconsultasegueopadroanterior.
8.10 Vnculos
Alm de tabelas e consultas, uma fonte de dados permite a definio de vnculos com
documentos do OpenOffice.org. Este documentos podem conter formulrios ou outros
objetos,comocampos,dependentesdeumbancodedados.
Oacessoaosvnculospossivelatravsdainterfacecom.sun.star.sdb.XBookmarksSuppliere
seumtodo:
getBookmarks()As<com.sun.star.container.XNameAccess>
retornaumcontainercom.sun.star.sdb.DefinitionContainer,contendoosvnculosdafontede
dados.
Podemos adicionar ou remover elementos do container, usando os mtodos de
XNameContainer.
insertByName(sNomeAsString,sMarcadorAsVariant)
sNomeonomedovnculoesMarcadoraURLdodocumento.
removeByName(sNomeAsString)
sNomeonomedovnculo
Osmarcadoresdevemconterocaminhocompletododocumentonaformafile:///caminho.
Paramanteraconsistncia,umexemplo:
SubvinculosFonteDados
DimoContextoAsVariant
DimoFonteAsVariant
DimoVinculosAsObject
'
oContexto=createUnoService("com.sun.star.sdb.DatabaseContext")
oFonte=oContexto.getRegisteredObject("Minha_Fonte")
'obtemocontainercomosvnculos
oVinculos=oFonte.getBookmarks()
'adicionaumnovomarcador
sURL="file:///D:/NAD/OPENOFFICE/TESTMACROS.SXW"
oVinculos.insertByName("Meu_Novo_Vinculo1",sURL)
'obtmasURLsdosvnculos
sMsg=""
ForI=oVinculos.getCount()To1Step1
sMsg=sMsg+"URL:"+oVinculos.getByIndex(I1)+Chr$(10)
NextI
MsgBoxsMsg
'
EndSub
Aqui,adicionamosumvnculonafonteMinha_Fontee,emseguidaextramosasURLsdos
vnculosregistradosnafontededados.
127
Banco de Dados
Verso 2
DepossedaURLdeumdocumento,podemoscarreglo,conformeoexplicadonocaptulo
TrabalhandocomDocumentos,usandoomtodo:
loadComponentFromURL(lista_de_parametros)
consulteocaptuloTrabalhandocomDocumentos,paramaisdetalhes.
128
Verso 2
sHora=Hour(Now)
sNome=InputBox("DigiteoseuNome:","Caixadeentrada","Operador")
If(sHora>6AndsHora<18)Then
sSauda="BomDia!"
Else
sSauda="BoaNoite!"
EndIf
MsgBoxsSauda+sNome
VocacaboudecriarumamacrochamadaMain.Vamosexecutaramacro:selecione,nabarra
demenu,FerramentasMacro.NodilogoMacro,cliquesobreobotoExecutar.Surge
umacaixadeentrada,solicitandooseunome,digiteoecliquesobreobotoOk.Surgirum
129
Verso 2
dilogocomumasaudao,cliqueem Ok paraencerraraexecuodamacro.Seocorrer
algumerro,reviseocdigodigitadoerecomece.
Vamosanalisar,passoapasso,onossocdigofonte:
REM*****BASIC*****
Estalinhacontmumcomentrio.Comentriosnosoexecutados.
SubMain
EstalinhadeclaraedefineumasubrotinachamadaMainedeveestaracompanhadadeuma
linhaEndSub.Entreasduaslinhasdevevirocdigofontequedfuncionalidadeasub
rotina.
DimsNomeAsString'varivelparaguardaronome
DimsSaudaAsString'varivelparaguardarasaudao
DimsHoraAsInteger'varivelparaguardarahoradosistema
Estaslinhas declarameinicializam as variveis queserousadasnamacro.O apstrofe
marcaoinciodecomentriosnumalinhadecdigo.
sHora=Hour(Now)
Aqui,chamamosduasfunesinternasdoBasic.AfunoNow,obtmahoracompletado
sistema(hh:mm:ss).Afuno Hour recebeovalorretornadoporNoweextraisomentea
hora.Emseguida,ovalorobtidoporHour(ahora)armazenadonavarivelsHora.Neste
contexto,osinaldeigual(=)chamadooperadordeatribuio.Tudoqueestiverdolado
direitodooperadordeatribuiorecebeonomedeexpresso,nestecasoHour(Now).
sNome=InputBox("DigiteoseuNome:","Caixadeentrada","Operador")
EstalinhachamaafunoInputBox,doBasic,queapresentaacaixadedilogoparalidar
comaentradadonomedooperador.Notequepassamostrscadeiasdecaracteresparaesta
funo. Estes valores (as cadeias) so chamados de parmetros da funo. O primeiro
parmetroumamensagemparaooperador,osegundoottulododilogoeoterceiroo
valorpadrodacaixadetexto.AfunoInputBoxretornaocontedodacaixadetextose
vocclicarsobreobotoOk,seno(cliquesobreobotoCancelarouFechar)retornauma
cadeiavazia.Apsencerrarodilogo,ovalorretornadoseratribudovarivelsNome.
Ainda,sobreparmetros,podemosdizerqueafunoNownotmparmetroequeafuno
Hourrecebeumparmetro.
If(sHora>6AndsHora<18)Then
Aqui,iniciamosaexecuodeum comandodedeciso.EstamosdizendoaoBasic: se o
valorarmazenadonavarivel sHoraformaiorque6emenorque18ento executeo
prximoblocodecdigo.Ossinais>e<sochamadosoperadoresrelacionais.Apalavra
Andchamadadeoperadorlgico.Ocontedoentreparntesesumaexpressocomposta
queseravaliadacomoVerdadeira(True)ouFalsa(False).Elaserverdadeira,seambasas
expresses(sHora>6;sHora<18)foremverdadeiras.
sSauda="BomDia!"
A expresso Bom Dia! ser atribuda a sSauda, se a expresso da linha anterior for
avaliadacomoverdadeira(True).
130
Verso 2
Else
Seno,aexpressofoiavaliadacomofalsa(False),executeoprximoblocodecdigo.
sSauda="BoaNoite!"
AexpressoBoaNoite!atribudavarivelsSauda.
EndIf
EstalinhaindicaofinaldocomandodedecisoIF...THEN...ELSE...ENDIF.
MsgBoxsSauda+sNome
EstalinhachamaasubrotinaMsgBox,doBasic,queexibeumacaixademensagemparao
operador.Elarecebeumparmetro,nestecasoaexpressosSauda+sNome.Osinal(+),
nestecontexto,chamadodeoperadordeconcatenao,poisjuntaascadeiasdecaracteres
guardadasnasvariveissSaudaesNome.CliquesobreobotoOKparafecharacaixade
mensagem.
EndSub
Estalinhaindicaotrminodasubrotina,iniciadanalinhaSUBMain.Noesquea,uma
linhaSUB...precisaestarassociadaaumalinhaENDSUB.
Neste tpico, voc aprendeu diversos conceitos (esto em negrito) relacionados com a
linguagemBasic.Sealgumpontonofoicompreendido,executenovamenteoexemploeleia
opassoapasso,tentandoassociaroqueocorreuduranteaexecuocomaslinhasdecdigo.
Palavras reservadas
Umapalavrareservadaumidentificador(nome)utilizadointernamentepelalinguagem
Basic. As palavras reservadas do Basic so aquelas usadas nos seus comandos, nas suas
funesinternas,nassuasconstantesenosseusoperadores.Abaixo,algunsexemplos:
BEEP
CALL
SUB
FOR
NEXT
EXIT
WHILE
DO
STR$
TRIM$
SQR
AND
OR
PI
comandodoBasic
comandodoBasic
comandodoBasic
partedeumcomandodoBasic
partedeumcomandodoBasic
partedecomandosdoBasic
partedecomandosdoBasic
partedecomandosdoBasic
funodoBasic
funodoBasic
funodoBasic
operadordoBasic
operadordoBasic
constantedefinidapeloBasic
131
Verso 2
Oprincipalsobreestaspalavras:elasnopodemserusadascomonomesparaidentificar
variveis,constantesouprocedimentosdefinidospeloprogramador.
Comentrios
Numa macro, as linhas iniciadas por apstrofe ou pela palavra reservada REM ( de
REMarker)soconsideradascomocomentrios,portantonosoprocessadas.
'Istoumcomentrio
REMOcdigoabaixoinicializaasvariveisdeambiente
Oscomentrios(comapstrofe)podemsercolocadosnafrentedeumalinhadecdigo.
DIMcoord_XAsDouble'varivelparaguardaracoordenadaXdoponto
DIMcoord_YAsDouble'varivelparaguardaracoordenadaYdoponto
132
Verso 2
Osvaloresdeduplaprecisovariamnafaixade1.797693134862315E308a4.94066E324,
paravaloresnegativosoupositivos.
Moeda(CURRENCY)
Osvaloresdestetipovariamde922.337.203.685.477,5808at922.337.203.685.477,5807.
Booleano(BOOLEAN)
OsvaloresdestetipopodemserTrue(verdadeiro)ouFalse(falso)
Data(DATE)
Podemcontervaloresdedataetempoarmazenadosnumformatointerno.
Cadeiasdecaracteres(STRING)
Umacadeiapodeconterat64000caracteres(64Kb).
Declarao de variveis
PodemosdeclararvariveisexplicitamentecomapalavrareservadaDIM,domodoabaixo:
DIMnome_da_variavelAStipo_de_dado
Ou:
DIMnome_da_variavelseguidodocaractereindicadordotipodedado
nome_da_variavelumnomedefinidopeloprogramador,conformeasregrasdenomeao.
Exemplos:
DIMvarInteiraASINTEGER
DIMvarInteira%
DIMvarIntLongoASLONG
DIMvarIntLongo&
DIMvarStringASSTRING
DIMvarString$
DIMvarSingleASSINGLE
DIMvarSingle!
DIMvarDuplaASDOUBLE
DIMvarDupla#
DIMvarPrecoASCURRENCY
DIMvarPreco@
'Declaraumavariavelinteira
'Declaraumavariavelinteira(%)
'Declaraumavariavellonga
'Declaraumavariavellonga(&)
'Declaraumavariavelstring
'Declaraumavariavelstring($)
'Declaraumavariavelrealsimples
'Declaraumavariavelrealsimples(!)
'Declaraumavariavelrealdupla
'Declaraumavariavelrealdupla(#)
'Declaraumavariavelmoeda
'Declaraumavariavelmoeda(@)
Podemosdeclararumavarivel,nomomentodoseuemprego,acrescentandoocaracterede
tipoaonomedavarivel,comonosexemplosabaixo:
UmInteiro%=1500
UmLongo&=2195678
MeuNome$=JOSDEANDRADE
UmRealSimples!=15.555
UmRealDuplo#=coordEne*sin(30)
'declarauminteiro
'declarauminteirolongo
'declaraumacadeia
'declaraumrealsimples
'declaraumrealduplo
SeotipodedadonoforindicadoavarivelserassumidacomoSingle.
Ovalordeumavariveldeclaradaser0paratiposnumricos,umacadeianulaparaStringse
FalseparaBoolean.
133
Verso 2
recomendveladeclaraoexplcitadasvariveisdeumprograma,bemcomoaescolhade
nomessignificativosparaasmesmas.Paraforaradeclaraodetodasasvariveis,usea
linhadecomandoabaixo,noinciodomdulo:
OPTIONEXPLICIT
Matrizes
Matrizescontmumgrupodevariveiscomcaractersticascomunsecomomesmotipode
dado.Comumamatrizpodemosusarumsnomedevariveleacessarosvaloresdeum
elementousandoumndice.Umamatriztemumlimiteinferioreumlimitesuperioremcada
dimenso.Os ndices sovalores inteiros (negativos oupositivos).At16.368elementos
podemserendereados.
Matrizessoestruturasdedadosprpriasparausodentrodelaos.
Exemplosdeempregodematrizes:
DimnomeDePonto(30)ASString'Vetorpara31nomesdepontos(0a30)
DimcoordPonto3D#(30,2)'Matrizde2dimensescom31linhase
'3colunas(X,YeZ)dotipoDouble
'Atribuindovalores
nomeDePonto(0)=Ponto01
'atribuiacadeiaao1o.elemento
dovetor
nomeDePonto(30)=Ponto31
'atribuiacadeiaaoltimo
elementodovetor
'Acessandovalores
coordX=coordPonto3D(9,0) 'obtmovalordalinha10,coluna1
coordY=coordPonto3D(9,1) 'obtmovalordalinha10,coluna2
coordZ=coordPonto3D(9,2) 'obtmovalordalinha10,coluna3
OsndicesinferioresuperiorpodemserdefinidoscomaclusulaTO,porexemplo:
DimsNomes$(1To30)'Declaravetorpara30(1a30)nomes
DimmatrizA%(1To5,1To3)'Declaramatrizde5linhasX3colunas
Podemosdeclararumamatrizcujotamanhoserdeterminadoposteriormente.
DimnomePonto$()
'Declaraumvetordetamanhodesconhecido
Apsconheceronmerodepontos,podemosredimensionarovetorcomREDIM:
NumeroPontos=100
RedimnomePonto(numeroPontos)
'redimensionaovetorpara101nomes(0a100)
REDIMapagaocontedodovetor,sequisermosaumentarotamanhodovetorpreservando
seucontedo,devemosusaraclusulaPRESERVE,vejaabaixo:
REDIMPRESERVEnomePonto(200)'aumentade100para200conservandoocontedo
Verso 2
elaservisvelapenasdentrodasubrotinaoufuno,portantolocal.Sefordeclaradaforade
qualquersubrotinaoufunocomocomandoPUBLIC,elaservisvelportodasassub
rotinasefunesdamacro,sendoassimumavarivelpblicadessamacro.Sefordeclarada
foradeumasubrotinaoufunocomocomandoGLOBAL,elaservisvelportodasas
macros,isto,preservaoseuvalorapsotrminodaexecuodamacro.
Exemplosdoescopodevariveis:
GlobalcorElementoAsInteger'visvelportodasasmacros
PublicestiloLinhaAsInteger'visvelapenasnestamacro
SubtrocaValor(valor1%,valor2%)
Dimtemp%'tempvisvelapenasemtrocaValor
'...outroscomandos
EndSub
SubMain
Dimvar1AsInteger'visvelapenaspelaSubMain
pesoLinha%=2'visvelapenaspelaSubMain
'...outroscomandos
EndSub
Adeclaraodeumavarivelpblicadeveserfeitaantesdequalquersubrotinaoufunona
macro.
As variveis locais existem apenas enquanto a subrotina ou funo, na qual elas foram
declaradas,soexecutadas.
Constantes simblicas
Parafacilitaraleituradeumamacro,osvaloresliterais(1000,S,2.718),usadosaolongo
damesma,devemserdeclaradoscomoconstantessimblicas,comocomandoCONST,fora
dequalquersubrotinaoufuno,assim:
'declaraodeconstantes
ConstNR_PONTOS%=1000'nmerodepontos=1000
ConstSIM$=S'constanteSIM=S
ConstBASE_NATURAL#=2.718'baselog.naturais
Posteriormente,podemosusarestasconstantesnumaexpresso,nolugardosseusvalores
literais,porexemplo:
DIMcoordX(NR_PONTOS)AsDouble'declaravetorcom1001elementos
valor#=valor1*BASE_NATURAL'bemmaiscompreensvel!
If(Resposta$=SIM)Then
'seresposta=Sento
'executeoscomandos
EndIf
Apsadeclaraodeumaconstante,oseuvalornopodersermudadodentrodoprograma.
Constantessimblicasfacilitamamanutenodoprograma,poisvocprecisaalterarapenaso
seuvalor,emvezdetodasasocorrnciasdovalorliteraldentrodoprograma.
135
Verso 2
OOpenOffice.orgBasicpossuiasseguintesconstantesprdefinidas(PI,True,False).
Expresses
Umaexpressoumaconstante,umavarivel,umafuno,ouqualquercombinaodestas,
separadas por operadores e parnteses, escrita segundo as regras do Basic e passvel de
avaliao.Seguemosprincipaiselementosencontradosemexpresses.
OperadordeAtribuio
Oresultadodeumaexpressopodeseratribuidoaumavarivelcomousodooperadorde
atribuio,osinaldeigual(=).Notequenestecontexto,osinaldeigualnosignificauma
comparao,massimumaatribuio,isto,oresultadodaexpressodoladodireitodosinal
seratribudovariveldoladoesquerdodosinal.Exemplos:
'declaraasvariveisdiametroeraio
Dimdiametro#,raio#
'atribuiovalor2.0aoraio(2.0umaexpresso)
raio=2.0
'atribuioresultadodaexpresso(2*raio)adiametro
diametro=2*raio
OperadoresAritmticos
So usados com operandos numricos e produzem resultados numricos. Os operandos
podem ser constantes numricas, variveis numricas ou funes que retornam valores
numricos.Osoperadoresso:
Operador
Usado para
Operandos
Somar expresses
Subtrair expresses
Multiplicar expresses
Exponenciao
Mod
^
Exemplos:
'valor=0.5(noteque5e10sopromovidosaDouble)
valor#=5/10
'cos()umafunointernadoBasic
cosTeta#=cos(1.555)
'PIumaconstantedoBasic
area#=2*PI*raio^2
'r,a,b,c,d,esovariveisnumricas
r=(a+b)*(cd/e)
136
Verso 2
OperadoresdeConcatenaodeCadeias
Sousadosparajuntarduasoumaiscadeiasdecaracteres.
Operador
Usado para
&
Exemplos:
preNome$=Menino
sobreNome$=Maluquinho
nomeCompleto$=preNome&&sobreNome
OperadoresRelacionais(Comparao)
SousadosparacompararexpresseseoresultadoumBooleano,True(1)ouFalse(0).
Operador
=
<>
Usado para
As expresses so iguais ?
Asexpressessodiferentes?
>
<
>=
<=
Nacomparaodestrings,maisculassodiferentesdeminsculas,porpadro.
Exemplos:
'seRioSPfor>oresultadodaexpressoTrue,senoFalse
resultado=(RioSP>RioBH)
'seRaio1for=aRaio2oresultadoTrue,senoFalse
resultado=(Raio1=Raio2)
OperadoresLgicos
Se usados com operandos Booleanos e/ou expresses Booleanas, resultam num valor
Booleano.Seusadoscomoperandosnumricos,executamumaoperaobitabit,resultando
numvalornumrico.
Operador
Introduo ao OpenOffice.org Basic
Usado para
Operandos
137
NOT
Verso 2
AND
XOR
EQV
IMP
OR
Exemplos:
'
'resultadoTrue,seas2expressesforemTrue
'FIM_ARQUIVOumaconstantedefinidaanteriormente
resultado=(NrPtos<1000AndNotFIM_ARQUIVO)
'
'resultadoTruesea1a.oua2a.forTrue
'EOF()umafunodoBasic
resultado=(NrPtos<1000OrNotEOF())
Paraexemplosdeoperaobitabit,consulteaajuda(Help)online.
PrecednciadosOperadores
Uma expresso pode ser composta por mais de um operador. A ordem na qual estes
operadoressoavaliadoschamaseprecednciadosoperadores,damaiorparaamenortemos:
()
Parnteses
^
Exponenciaco
*,/
Multiplicaoediviso
\
Divisointeira
Mod
Mdulo
+,
Somaesubtrao
=,<>,>,<,>=,<=
Operadoresrelacionais
Not,And,Or,Xor,Eqv,Imp
Operadoreslgicosnestaordem
Para forar a avaliao de uma expresso podemos, sempre, usar parnteses (maior
precedncia).
Exemplo:
valor1=6+6/3
valor2=(6+6)/3
138
'apsavaliaovalor1=8
'apsavaliaovalor2=4
Verso 2
'seafor>queb,ento
'armazeneovalordeanavariavelmaior
'seno
'armazeneovalordebnavariavelmaior
'fimse
ExemplodaterceiraformadocomandoIF:
If(botao=Ok)Then
mens$=OKpressionado
ElseIf(botao=Cancela)Then
mens$=CANCELApressionado
Else
139
Verso 2
mens$=AJUDApressionado
EndIf
ExemplodeSelectCaseavaliandovalores:
SelectCasecorElemento
Case0To2,6,8'casocores0,1,2,6ou8
'executaesteblocodecomandos
Case3To5'casocores3,4ou5
'executaesteblocodecomandos
Case9'casocor9
'executaesteblocodecomandos
EndSelect
140
Verso 2
Nesteexemplo,obtemosapastacorrenteetodososnomesdearquivos,comatributonormal,
nela existentes. As funes CurDir, Dir e Str$ so internas ( do Basic ). Note que na
primeirachamadadafunoDir,passamosdoisparmetrosenasprximaschamadas,dentro
dolao,nopassamosnenhumparmetro.
141
Verso 2
NEXTContador'aqui,Contadoropcional
OcomandoFor...Nextfuncionadaseguintemaneira:
Ovalor_inicialatribudovarivelContador,depoiseletestaocontadorcomovalor_final,
seoresultadodotesteforTrue,oscomandosdentrodolaoseroexecutados,emseguida
Contadorserincrementadocomvalor_incrementoeumnovotesteserexecutado,atquese
obtenhaumvalorFalseparaoteste,conformeasregras:
Paravalordoincrementopositivo,otesteserTrueseContador<=valor_final.
Paravalordoincrementonegativo,otesteserTrueseContador>=valor_final.
SeaclusulaSTEPforomitidaovalor_incrementoser1.
OtestecomIFdeveserusadosequisermossairdolaoantesqueContadorbatacomo
valor_final.
ExemplodeFor...Next:
'Inicializarumvetorde100elementos
'
Subexemplo_For_Next
DimVetor(1To100)AsInteger
DimIAsInteger
'
'paraIvariandode1a100comincremento1
ForI=1To100
'Iusadocomondicedovetoretambmnaexpresso
Vetor(I)=I*2
NextI'vaiparaaprximaavaliaodeI
'exiberesultadodasomado1oeltimoelementos
MsgBoxStr$(Vetor(1)+Vetor(100))
'
EndSub
Aqui,definimosumvetorcom100elementos,comondiceinicialem1eofinalem100(se
vocnoespecificarondiceinicial,oOOoBasicadotaozero).Depois,entramosnolaoe
atribumosvalores(I*2)paraoselementosdovetor.Terminamosexibindoasomados
primeiroeltimoelementosdovetor.
OcomandoFor...Nextmuitoeficienteedeveserusadosemprequesoubermosonmero
derepetiesdolao.
PodemosaninharcomandosFor...Next(muitotilparaoperaescommatrizes).
Verso 2
EXITDO'saidolao
ENDIF
LOOP'retornaparaoDo
Segunda,testenoinciodocomandocomWHILE
DOWHILE(expresso) 'faaENQUANTOexpressoforTrue
'executablocodecomandos
LOOP'retornaparaoDo
Terceira,testenoinciodocomandocomUNTIL:
DOUNTIL(expresso)'faaATqueaexpressosejaTrue
'executablocodecomandos
LOOP'retornaparaoDo
Quarta,testenofinaldocomandocomWHILE:
DO'faa
'executablocodecomandos
LOOPWHILE(expresso)'ENQUANTOexpressoforTrue
Quinta,testenofinaldocomandocomUNTIL:
DO'faa
'executablocodecomandos
LOOPUNTIL(expresso)'ATqueexpressosejaTrue
Emtodasasmaneiraspodemoscolocarumtestenointeriordolao,paraabandonlocomo
comandoEXITDO.NotequenasformasiniciadassomentecomoDO,olaoserexecutado
pelomenosumavez.OsComandosDo...Looppodemseraninhados.
ExemplodeDo...Loop,comotestedaexpressonoincio:
DoWhile(NotEof())'faaenquantonoforFimdeArquivo
'leiaalinha
'processealinha
Loop'fimdolao
ExemplodeDo...Loop,comotestedaexpressodentrodolao:
Do'faa
'obtemnomePonto
IfIsNull(nomePonto)Then'senomedopontofornulo
ExitDo'saiadolao
EndIf'fimse
'processaoponto
Loop'fimlao
143
Verso 2
Comandos
UmcomandoumacombinaodeelementosdoBasic,escritodeacordocomasregrasde
sintaxedalinguagem.Algunspodemocorreremqualquerpartedoprograma,outrosno.Os
comandossoosresponsveispelafuncionalidadedosprocedimentos.
Normalmenteumcomandocabenumaslinha,casocontrriopodemosusarosublinhado,
paraindicarqueocomandocontinuanaprximalinha.Ocaracteredecontinuaonopode
serusadodentrodeumacadeia(string).Vejaoexemplo:
Informe$=Estaumalinhadecomandoquecontinua+_
naprximalinha
Numamesmalinha,podemosescrevermaisdeumcomando,usandoocaracteredoispontos,
comoseparadordecomandos.Abaixo,temostrscomandosdeatribuio:
i=0:j=1:sinal=False
Sub-rotinas
SubrotinasdevemserdefinidaspelocomandoSUB...ENDSUB,daseguintemaneira:
SUBNome_Da_Rotina(Lista_De_Parmetros)
'
'DeclaraodevariveisLocais
'Comandosdasubrotina
'
ENDSUB
A Lista_de_Parmetros, so os valores, separados por vrgula, que a rotina recebe para
executaroseutrabalhoedevemconteraespecificaodetipo.Porexemplo:
SUBMinhaSub(par1AsInteger,par2AsDouble,par3AsString)
144
Verso 2
Seumdosparmetrosforumavariveldamacrooseunomenalistadasubrotinapode(e
deve)serdiferentedonomedavarivelnamacro.
Exemplodesubrotinaquetrocaosvaloresdeduasvariveis:
SUBTrocaValores(valor1AsDouble,valor2AsDouble)
'
DimtempAsDouble
'
temp=valor1
valor1=valor2
valor2=temp
'Notequeapesardenoretornarvalores,asvariveispassadas
'comoparmetrosforamalteradaseestasalteraessero
'visveisnarotinaquechamarTrocaValores
'
ENDSUB
Exemplodesubrotinaquerecebetrsparmetroseosimprimeapsformatao:
SubImprimePonto(nomePto$,coordX#,coordY#)
DimcadeiaAsstring
'formataacadeia,incluindovrgulas,usacontinuaodelinha(_)
cadeia=Ltrim$(Rtrim$(nomePto))+,+Str$(coordX)+_
,+Str$(coordY)
'imprime
Printcadeia
'
EndSub
O comando EXIT SUB pode ser usado dentro de uma subrotina para abandonla
imediatamente.
Funes
AdefiniodeumafunofeitaentreoscomandosFUNCTION...END FUNCTION,
comoabaixo:
FUNCTIONNomeFuncao(ListaParametros)AsTipoRetornado
'declaraodasvariveislocais
'comandosdafuno
NomeFuncao=expresso_Retorno
'NOESQUEA!
ENDFUNCTION
Notequeumafunoretornaovalordeumaexpressonumavariveldenomeigualaonome
dafuno.
O comando EXIT FUNCTION pode ser usado dentro de uma funao para abandonla
imediatamente.
Exemplodeumafunoquecalculaovolumedeumaesfera,apartirdoseuraio:
Introduo ao OpenOffice.org Basic
145
Verso 2
FUNCTIONVolumeEsfera(raioAsDouble)AsDouble
'
DimdiametroAsDouble
'
diametro=2*raio
VolumeEsfera=(PI/6)*diametro^3
'NOTE:nomedafunoVolumeEsfera;nomedavarivel:VolumeEsfera
'
ENDFUNCTION
Passagem de Parmetros
Apassagemdeparmetrosparasubrotinasefunespodeserfeitadeduasmaneiras,por
referncia(padro)ouporvalor.Quandoumparmetro(varivel)passadoporreferncia,
qualqueralteraoemseucontedoserrefletidanarotinachamadora.Seapassagemforpor
valor, as alteraes na varivel sero descartadas quando o procedimento terminar a sua
execuoeovalororiginalserpreservado.Matrizessopassadassempreporreferncia.
Parapassarumparmetroporvalor,nadefiniodoprocedimento,useapalavraBYVAL,
antesdonomedoparmetro,ou,seBYVALomitida,coloqueavarivelentreparnteses,na
chamada,vejaabaixo:
SUBImprimePonto(BYVALcadeia$,X#,Y#)
cadeia=Ltrim$(Rtrim$(cadeia)+,+Str$(X)+,+Str$(Y)
Printcadeia
'amudanaemcadeia,serdescartadanotrminodaSub
ENDSUB
Chamada de Procedimentos
Achamadaaumprocedimentodependedoseutipo,sesubrotinaoufuno.Comoumasub
rotinanoretornavalores,elanoprecisaserusadacomopartedeumaexpresso.Juma
Funo(sempreretornaumvalor),deveserusadanumaexpresso.
Formasdechamadasdesubrotina:
'UsandoocomandoCALLcomousemparnteses
CALLImprimePonto(nomePonto,coordX,coordY)
CALLImprimePontonomePonto,coordX,coordY
'SemocomandoCALL,comousemparnteses.
ImprimePonto(nomePonto,coordX,coordY)
ImprimePontonomePonto,coordX,coordY
Seasubrotinanotiverparmetrosnoprecisousarosparnteses.
Formasdechamadadefunes:
'chamaafunoareaCirculoearmazenaovalordaareanavariavelareCirc
146
Verso 2
areCirc=areaCirculo(raio)
'chama2funcoes,areaCirculo()eStr$()ovalorretornadoseratribudoacadeia
cadeia=Str$(areaCirculo(raio))
'chama2funcoes,Sqr()eDistancia()ovalorretornadoseratribudoaraizDist
raizDist=Sqr(Distancia(x1,y1,x2,y2))
Exemplodechamadasdesubrotinasefunes:
SubchamadaProcedimentos
CallUneCadeiasSub("Meu","exemplosub1")
CallUneCadeiasSub"Meu","exemplosub2"
UneCadeiasSub("Meu","exemplosub3")
UneCadeiasSub"Meu","exemplosub4"
'
Dimcad$
cad$=UneCadeiasFunction$("Meu","exemplofunction1")
MsgBoxcad$
EndSub
SubUneCadeiasSub(cad1$,cad2$)
MsgBox(cad1$+cad2$)
EndSub
FunctionUneCadeiasFunction$(cad1$,cad2$)
UneCadeiasFunction$=cad1$+cad2$
EndFunction
COMENTRIOS(BreveDescrio,NomedaMacro,Autor,Data,Chamada,Outros)
DECLARAODEVARIVEISPBLICAS(Public...)
DECLARAODEVARIVEISPRIVADAS(Private...)
DEFINIODECONSTANTESSIMBLICAS(Const...)
DEFINIODOPROCEDIMENTOPRINCIPAL(SubMain)
DEFINIODASSUBROTINASDAMACRO(Sub...EndSub)
DEFINIODASFUNESDAMACRO(Function...EndFunction)
Nesteapndice,cobrimosapenasobsicosobrealinguagemBasic.Sevocconseguiuchegar
nesteponto,acreditequeestaptoaexplorarsozinhooutraspotencialidadesdalinguagem.
147
Verso 2
OOpenOffice.orgBasictemumagrandequantidadedecomandosefunes,todosmuito
bemdocumentados naAjudaonline,distribuda comopacote. EstandonoIDEBasic,
bastapressionarateclaF1eummundodeinformaesseapresentarsuafrente.
148
Verso 2
Mais informaes
10 Mais informaes
10.1 Na rede
OpenOffice.org:OlardoOpenOffice.org
http://www.openoffice.org
http://www.openoffice.org.br
ProjetodeDocumentaodoOpenOffice.org:
http://documentation.openoffice.org
OpenOffice.orgforDevelopershttp://website.openoffice.org/developer
EsteolocalparaquemestinteressadoemdesenvolvimentocomoOpenOffice.org.Aqui,
vocencontra:
OpenOffice.org1.0.2Developer'sGuide(~12Mb)
ManualdeRefernciadaAPIdoOpenOffice.org(~8Mb)
StarOffice6.0BasicProgrammer'sGuide(~1Mb)
StarOffice5.2Programmer'sTutorial(~1Mb)
ExemplosdoDeveloper'sGuide(~1Mb)
OOoDocs.Orghttp://www.ooodocs.org
Documentao,fruns(inclusivesobreMacros)enotciasdoOpenOffice.org.
OOOForum.Orghttp://www.oooforum.org
FrunsdoOpenOffice.org,inclusivesobreMacroseAPI.
OOExtrashttp://ooextras.sourceforge.net
Repositriodemodelos,macroseassistentesparaoOpenOffice.org.Baixetodasasmacrose
estudeocdigofonteparaaprendermais.
Pitonyak.orgwww.pitonyak.org/
AndrewPitonyakeseuscolaboradoresmerecemanossagratido.Estapginacontmum
excelentedocumentosobremacrosesobrealinguagemBasic.Consulteaperiodicamente.
EDVSystemeKienleinhttp://kienlein.com/pages/oo.html
ContmoDevGuide,comexemplosdoDeveloper'sGuideeomduloInspectumaexcelente
ferramentaparaanlisedeobjetos.OutroachadooDbMonitor,umaplicativoOOoBasic
completo,paraacessoaBancosdeDados.
149
Mais informaes
Verso 2
150
Verso 2
11.1 Crditos
Autordolayoutgrficodomodelo:MirtoSilvioBusico<m.busico@ieee.org>
Autordotextoexplanatriodomodelo:GianlucaTurconi<luctur@openoffice.org>
11.2 Agradecimentos
ASunMicrosystems,IncpeloapoioparaacriaoedesenvolvimentodoOpenOffice.org.
A SunMicrosystems,Inc,maisumavez,peladisponibilizaodadocumentaosobrea
APIdoOpenOffice.org,semaqualestetrabalhonoseriapossvel.
A todos os voluntrios que, com os seus trabalhos, contribuem para o crescimento do
OpenOffice.org.
Aos coordenadores do OpenOffice.org Projeto Brasil, pela publicao da Introduo,
principalmente,aGustavoBuzzattiPacheco,peloapoioesugestes.
AIsmaelFanlopelatraduodaverso1destedocumentoparaoEspanhol.
11.3 Licena
permitidaacpia,distribuioe/oumodificaodestedocumento,sobostermosdaGNU
Free Documentation License, Version 1.1 ou uma verso posterior publicada pela Free
SoftwareFoundation.Umacpiadalicenaacompanhaestedocumento,consulteoarquivo
FDL.TXT.Sevocnorecebeuumacpiadestearquivo,porfavorinformeaoautorouao
webmasterdositequedisponibilizouestedocumento.
Copyright2003NoelsonAlvesDuarte.
151