quarta-feira, 24 de novembro de 2010

Macro para guardar valor de campo ListBox em variável no Base do OpenOffice


Sub Listbox_select
oDoc = thisComponent
oController = oDoc.getCurrentController()
oform =odoc.drawpage.forms.getbyindex(0)
oList = oForm.getByName("produt")
oListCtr = ThisComponent.CurrentController.GetControl(oList)
oTextCtr = oListCtr.SelectedItem
oPosCtr = oListCtr.SelectedItempos'Este é o valor a guardar
msgbox oTextCtr
msgbox oPosCtr
prod=oPostCtr
End Sub

quarta-feira, 6 de outubro de 2010

Maximizar forms no Base do OpenOffice


As seguinte macros, usadas em conjunto, maximizam um forms para full screen.


sub onWhenLoading( oEvent as object )
MaximizeFrame( oEvent.Source.Parent.Parent.CurrentController.Frame)
end sub

Declare Function ShowWindow Lib "user32" _
(ByVal lHwnd As Long, _
ByVal lCmdShow As Long) As Boolean

sub MaximizeFrame( aFrame as object )
dim frame
dim window
dim handle
window = aframe.getContainerWindow()
handle = window.getWindowHandle(dimarray(), 1)
REM 1=WIN32
ShowWindow( handle, 3 )
end sub

A macro "sub onWhenLoading" deve ser linckada ao evento "durante o carregamento" do forms.


terça-feira, 21 de setembro de 2010

Abrir forms ao abrir um documento do Base do OpenOffice




Esta é uma questão que tenho visto posta em vários foruns e que, portanto, interessará a muitos dos actuais ou futuros utilizadores do Open Office.

Realmente , é normal que depois de atingirmos um determinado nível de programação com o Open Office sejamos nós a desenvolver as aplicações e outros a utilizá-las e não tem nenhum cabimento que, ao abrir uma aplicação, o utilizador seja atirado para o modo de desenho e ter que trabalhar a partir daí.


O mais indicado será que ao utilizador, ao entrar na aplicação , lhe seja logo apresentado um “menu”, para que o mesmo possa, a partir daí, efectuar as suas tarefas.

Aqui chegados, vamos então à forma que costumo utilizar para conseguir este objectivo:

  1. Crio um formulário com os diversos botões que me permitam aceder (atraves de macros, assunto tratado no artigo “Macros para o Base-Open Office”) aos outros formulários ou relatórios

  1. Crio uma macro que associo à abertura do documento e faço abrir o formulário referido no ponto 1

Para criar a macro siga os passos indicados em “Macro para fechar o Openoffice” e crie a seguinte macro:

Sub AutoExec

On Error Goto HandleError

Dim LastFrame As Object

Dim NumFrames As Integer

Static FormDocs As Object

Dim DBDoc As Object

Dim ImpName As String

Dim DataSource As Object

Dim Conn As Object

Dim Args(1) As New com.sun.star.beans.PropertyValue

Dim FormName As String

Dim FormDoc As Object

FormName="fMENU" 'Mude aqui para o Forms de Abertura da Aplicação

ImpName="com.sun.star.comp.dba.ODatabaseDocument"

NumFrames=StarDesktop.Frames.Count

LastFrame=StarDesktop.Frames.getByIndex(NumFrames-1)

If LastFrame.Frames.Count>1 Then

Exit Sub

End If

If Not (LastFrame.Controller.Model.ImplementationName=ImpName) Then

Exit Sub REM not a db doc

End If

DataSource=LastFrame.Controller.DataSource

DBDoc=DataSource.DatabaseDocument

FormDocs=DBDoc.FormDocuments

Conn=DataSource.getConnection("","") REM no user/password

Args(0).Name="ActiveConnection" : Args(0).Value=Conn

if FormDocs.hasByName(FormName) Then

FormDoc=FormDocs.loadComponentFromURL(FormName,"_self",2,Args() )

FormDoc.CurrentController.Frame.ContainerWindow.setFocus()

End If

HandleError:

If Err<>0 Then

Exit Sub

End If

End Sub

Preferimos criar esta macro numa biblioteca a um nível superior pois a mesma irá servir, no futuro, para todas as aplicações criadas no Open Office (se quisermos utilizá-la numa outra máquina podemos sempre exportá-la como ocx) mas a mesma pode ser criada no módulo da aplicação (isso foi testado).

  1. Com a macro criada, abrimos o documento do base onde queremos que a mesma seja utilizada e:

  2. Vamos a Ferramentas → Personalizar e escolhemos o separador Eventos

  3. Escolhemos o evento “Abrir Documento” e em “Atribuir” escolhemos a “Macro” que criámos.


Et Voilá.


segunda-feira, 14 de dezembro de 2009

Trabalhar com o Base do OpenOffice e HSQLDB não embutido

Instale e configure o HSQLDB no Windows(Veja aqui como fazê-lo).

Trabalhar em Modo Standalone

Com o Hsqldb devidamente configurado abra o OpenOffice:

- Vá a Ferramentas > Opções > Java > Classpath e adicione o Arquivo C:\hsqldb\lib\hsqldb.jar


- Feche o Openoffice e volte a abri-lo de novo

- Abra o Base e Seleccione "Estabelecer ligação a uma base de dados ja existente"

- Escolha a ligação "JDBC"



- Em URL da origem de dados indique :hsqldb:file:«caminho para a base de dados»;default_schema=true;shutdown=true;hsqldb.default_table_type=cached;get_column_name=false

- Em Classe de Controlador JDBC indique : org.hsqldb.jdbcDriver



- Teste a classe

- Em Nome de utilizador indique : sa


- Teste a ligação

- Indique que pretende que o assistente registe a base de dados


- Clique em "Terminar"

- Dê o nome à Base à base de dados


Trabalhar em modo Servidor


Os passos são, bàsicamente, os mesmos que trabalhar em modo Standalone, só que:

1. É preciso levantar antecipadamente o Servidor

2. Mudar o URL da origem dos dados para hsqldb:hsql://localhost:59999/«nome da base de dados»;default_schema=trueshutdown=true;hsqldb.default_table_type=cached;get_column_name=false


Pronto, neste momento pode começar a trabalhar com a sua base de dados como se o estivesse a fazer no modo normal do Openoffice.

Se isto não é o primeiro passo para começar a trabalhar em ambiente multi-utilizador, então não sei qual será.

quarta-feira, 4 de novembro de 2009

Macro para fechar o OpenOffice


Esta macro foi, sem dúvida, das mais dificeis de encontrar e de adaptar, pois tem que ser criada dentro de uma biblioteca (quem percebe mais de Openoffice sabe bem do que estamos a falar) por isso para quem está menos familiarizado com a ferramenta, aqui vai, passo a passo, a forma de o conseguir:

1. Com o OpenOffice aberto vá a a Ferramentas>Macros>Organizar Caixas de Dialogo

2. Abra o separador Bibliotecas (fica situado em "As minhas macros e caixas de dialogo")



3. Click em "Novo" para criar uma nova biblioteca

4. Dê o nome à biblioteca (Neste caso "Exemplo")



5. Abra o separador módulos e, com a biblioteca seleccionada, click em novo



6. Dê o nome ao módulo (Neste caso "accoes")



7. Com o nome do módulo seleccionado, click em "Editar"


8. Com o módulo editado cole o seguinte código

Sub FechaOffice

dim cmdShell As String
dim retour As Double

ThisComponent.Parent.store()

' Indicar o caminho completo para a sua macro
cmdShell = "soffice.exe macro:///Exemplo.accoes.Fecha()"
Shell(cmdShell,2)

End sub

Sub Fecha()
stardesktop.terminate
End Sub


9. Crie uma nova base de dados e registe-a

10. Crie um formulário e arraste para ele um "Botão de accão" (Neste caso "Sair")



11. Com o botão seleccionado click duas vezes nele para exibir as suas propriedades



12. Nas "Propriedades" do botão, seleccione a aba "Eventos" e em "Botão do rato premido" direccione para ele a macro "FechaOffice" que criou:


13. Feche o OpenOffice, salve as alterações

14. Teste a execução do que criou


NOTA: Funciona em Windows Vista e OpenOffice 3.1.1

quarta-feira, 29 de julho de 2009

Será que não é possivel utilizar o Base do OpenOffice em ambiente multi-utilizador?


Em primeiro lugar - numa forma, ou, mais precisamente num contexto, está correto.

Este contexto particular, é quando se utiliza uma base para criar todos os arquivos, isto é, os formulários, consultas, relatórios e as próprias tabelas de armazenamento de dados num único arquivo. Só que este não é o único contexto em que o Base pode ser utilizado.

Antes de falar do Base num ambiente multi-utilizador, porém, vamos perder um minuto com o MS Access a trabalhar no mesmo ambiente.

O MS Access também pode ser utilizado como um monolítico arquivo contendo os formulários, consultas, relatórios, tabelas e base de dados e código VBA. É possível construir esse arquivo e colocá-lo numa unidade compartilhada e mapear outros PC's de forma que os mesmos possam “ver” este arquivo e, ao fazê-lo, ter múltiplos utilizadores a partilhar o acesso a essa base de dados. Mas isso coloca uma grande sobrecarga sobre a rede e sobre o computador que hospeda o arquivo. Nessa configuração o número real de utilizadores a que se pode dar privilégios de leitura/gravação e acesso simultâneo à base de dados da aplicação é bastante limitada.

Na verdade, não é considerada a forma adequada para implementar um sistema multi-utilizador MS Acccess. Pelo contrário, é comum a rotina de o dividir em front end (formulários, consultas, relatórios e código VBA), e back-end (tabelas de armazenamento de dados reais) acabando por criar dois arquivos separados fisicamente.

Normalmente, isso produz um arquivo *. mdb (ou *. accdb), o "back-end", que depois é armazenado no disco partilhado e um ou mais arquivos *. mde , os "front-end" .Ideal para efeitos de desempenho e para aumentar o número de utilizadores simultâneos que podem ser suportados num arquivo *. mde separado .

A Microsoft criou uma série de ferramentas só para ajudar a fazer isso e dedicou uma boa parte do espaço nos seus sites de apoio ao MS Access explicando como usar e como implantá-los desta forma. Juntamente com estas ferramentas Microsoft também fornece as ferramentas necessárias para o “upsize” da sua base de dados *. mdb ou *. accdb (o seu backend) para SQL Server, contendo os dados reais .

Então - agora vamos olhar o Base.

O OpenOffie.org Base é, arquitectonicamente, diferente do MS Access no que diz respeito à base de dados e ao motor utilizado.

O MS Access pré 2007 tem sempre o MS Jet Database Engine envolvido, mesmo quando se está 'ligando' através para uma base de dados SQL Server.

Essa é a velha arquitectura *. mdb. Nas últimas versões do MS Access utilizando o tipo de arquivo *. accdb o motor já não é MS Jet, mas ainda é um único motor que está sendo utilizado, enquanto um arquivo *accdb é usado.

No Base, por outro lado, é o arquivo *.odb que contrata directamente uma ligação a uma base de dados. O motor de base de dados é o HSQLdb RDBMS, distribuído com OpenOffice.org, capaz de armazenar as suas tabelas embutidas no arquivo *.odb. Mas, fundamentalmente, o Base está tratando isto como apenas mais uma opção para um motor de base de dados - de modo que se poderia, facilmente, ter uma base de dados HSQLdb ,utilizando o motor , funcionando em modo de arquivo em disco, com os dados armazenados no arquivos separados num diretório, ou correr, como uma rede acessível partilhada num 'servidor'. Pode-se também usá-lo para se conectar a qualquer motor de base de dados ( JDBC ou ODBC ou ADO)

Ao usar o Base, para "ligar" a uma rede de base de dados destes motores (que poderia ser realmente no seu localhost), o arquivo *.odb preenche , na realidade,o mesmo papel que o arquivo MDE no MS Acess. Por outras palavras, permite que se armazenem os formulários, consultas, relatórios e, após o OpenOffice. 3.0, as bibliotecas de script, directamente dentro do arquivo. Com as anteriores versões do OpenOffice(e ainda no 3.0, se se quiser), os scripts eram armazenados em separado, em biblioteca de arquivos compartilháveis.

Nesta implantação multi-utilizador do Base poder-se-á colocar uma cópia deste arquivo *.odb em cada computador que esteja usando o base de dados aplicativo. Mais uma vez, isso é análogo ao regime recomendado para implantação MS Access também oferece a capacidade de cada utilizador criar as suas próprias cópias locais de consultas e relatórios.

Existe porém uma diferença, isto é, quando os *. mdb ou *. accb do arquivo de compartilhamento é usado pelos diferentes arquivos *. mde existe um intermediário de dados do motor a ser utilizado (MS Jet, por exemplo) mas quando se implementar os arquivos *.odb em várias máquinas a ligar a um servidor de rede de dados é a ligação directa - não há meio passo para os dados a tomar.

A próxima diferença é de custo, evidentemente. No caso do MS Access é dizer que cada utilizador tem que ter uma licença para o MS Access ou que exista uma licença para desenvolvimento e distribuição das suas base de dados. Se se desejar utilizar o SQL Server como base de dados então tem-se o custo da base de dados e os custos de um servidor MS Windows para a executar. (Até podemos supor que um deles já exista)

Para OpenOffice.org e Base. 5, 10 ou 100 utilizadores, realmente não interessa.

Assim - Base em um ambiente multi-utilizador? Sim - ainda não é comum e, de certeza, existem lacunas no conjunto, em comparação com MS Access, mas a aplicação é um conjunto muito mais à frente hoje em dia, do que foi quando se estreou com o OpenOffic 2.0 e, com o 3.1 e extensões disponíveis, como o Sun Report Builder, não será preciso esperar demasiado para que haja uma muito simples e directa resposta a essa questão - simplesmente - "Sim, pode-se fazê-lo" - o facto é que a resposta é – "Sim pode-se fazer isso hoje, mas você vai ter em mãos uma tarefa árdua..."

(Tradução livre de texto em inglês.Veja o original aqui)

quinta-feira, 23 de abril de 2009

Usar o controle Calendário no Base do Open Office


1. Arraste um campo de data para o formulário
2. Click duas vezes no controle para o editar
3. No separador "Geral" assinale "Pendente" como "Sim"


Assim poderá usar o calendário para escolher a data que pretende (ver figura acima)