terça-feira, 8 de fevereiro de 2011

quinta-feira, 27 de janeiro de 2011

Testando o Base do OpenOffice 3.3 RC10

Vinha utilizando o seguinte código para obviar ao facto de o “Base” não possuir querys de update, delete e insert:


Sub Contabiliza

Dim DatabaseContext As Object

Dim DataSource As Object

Dim Connection As Object

Dim Statement As Object

Dim ResultSet As Object

'Inicia o processo de contabilização

Msgbox "A iniciar o processo de Contabilização"

'Limpa todos os movimentos contabilisticos

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")

DataSource = DatabaseContext.getByName("contabilidade")

Connection = DataSource.GetConnection("","")

Statement = Connection.createStatement()

ResultSet = Statement.executeQuery("DELETE FROM ""tMOVIMENTOS_CONTA"";")

'Contabiliza os movimentos a Débito

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")

DataSource = DatabaseContext.getByName("contabilidade")

Connection = DataSource.GetConnection("","")

Statement = Connection.createStatement()

ResultSet = Statement.executeQuery("INSERT INTO ""tMOVIMENTOS_CONTA""(""ID_MOV"",""COD_CONTA"",""DATA_MOV"",""DESC_MOV"",""DEBITO"",""CREDITO"")SELECT ""ID_MOV"",""CONTA_DEB"" AS ""COD_CONTA"",""DATA_MOV"",""DESC_MOV"",""VALOR"" as ""DEBITO"",0 AS ""CREDITO"" FROM ""tMOVIMENTOS"";")

'Contabiliza os movimentos a Crédito

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")

DataSource = DatabaseContext.getByName("contabilidade")

Connection = DataSource.GetConnection("","")

Statement = Connection.createStatement()

ResultSet = Statement.executeQuery("INSERT INTO ""tMOVIMENTOS_CONTA""(""ID_MOV"",""COD_CONTA"",""DATA_MOV"",""DESC_MOV"",""DEBITO"",""CREDITO"")SELECT ""ID_MOV"",""CONTA_CRED"" AS ""COD_CONTA"",""DATA_MOV"",""DESC_MOV"",0 as ""DEBITO"",""VALOR"" AS ""CREDITO"" FROM ""tMOVIMENTOS"";")

Msgbox "Processo de contabilização concluído"

End Sub


O mesmo funcionou perfeitamente com a base de dados aberta até à versão 3.2.1


Nos testes que tenho efectuado com a RC10 da versão 3.3, vinha dando o seguinte erro na linha

“DataSource = DatabaseContext.getByName("contabilidade")”:

Erro de execução de basic

Ocorreu um erro de excepção

Type:com.sun.start.container.nosuchelentexception

Message:contabilidade”

Acontecia que, na mesma linha, se substituisse “contabilidade” por uma base de dados não aberta, o erro deixava de ocorrer, o que me levava a crer que o erro apenas ocorria quando estava a agir dentro da propria base de dados.

Alteração surgida com a implementação da versão 3.3? Quase de certeza!

Assim sendo, pensei:

  • Será que alguem me pode ajudar a encontrar o código correcto para proceder às mesmas operações?

Então decidi recorrer aos foruns que conheço e com a ajuda do RPG ( aqui ) consegui encontrar o código correcto para efectuar os comandos pretendidos na base de dados aberta e que é o seguinte:


'Limpa todos os movimentos contabilisticos
Connection=thisdatabasedocument.CurrentController.activeconnection
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("DELETE FROM ""tMOVIMENTOS_CONTA"";")


E tudo funcionou perfeitamente!

Por isso aqui fica, para quem sinta o mesmo problema e, como eu, encontre dificuldades em encontrar respostas em português.



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