Mostrar mensagens com a etiqueta Open Office. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Open Office. Mostrar todas as mensagens

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

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á.


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, 25 de março de 2009

Macros para o BASE-Open Office


REM Macro semelhante ao AutoExec do ACCESS

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="SWITCHBOARD" '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

REM Macro generica para abrir qualquer forms

function OpenForm( formContainer as variant, oConnection as variant, sFormName as string) as variant
Dim aProp(1) As New com.sun.star.beans.PropertyValue
aProp(0).Name = "ActiveConnection"
aProp(0).Value = oConnection
aProp(1).Name = "OpenMode"
aProp(1).Value = "open"
OpenForm = formContainer.loadComponentFromURL(sFormName,"_blank",0,aProp())
end function

function getFormsTC() as variant
getFormsTC = thisComponent.Parent.getFormDocuments
end function

function getConnectionTC() as variant
getConnectionTC = thisComponent.Drawpage.Forms(0).ActiveConnection
end function

REM Macro para abrir um forms específico

sub OpenForm_fTESTE( oev as variant )
sFormName = "fTESTE" ' Mude aqui o nome do seu forms
OpenForm( getFormsTC, getConnectionTC, sFormName )
end sub

REM Macro generica para abrir qualquer report

function getConnectionTC() as variant
getConnectionTC = thisComponent.Drawpage.Forms(0).ActiveConnection
end function

function OpenReport( reportContainer as variant, oConnection as variant, sReportName as string) as variant
Dim aProp(1) As New com.sun.star.beans.PropertyValue
aProp(0).Name = "ActiveConnection"
aProp(0).Value = oConnection
aProp(1).Name = "OpenMode"
aProp(1).Value = "open"
OpenReport=reportContainer.loadComponentFromURL(sReportName,"_blank",0,aProp())
end function

function getReportsTC() as variant
getReportsTC = thisComponent.Parent.getReportDocuments
end function

REM Macro para abrir um report especifico

sub OpenReport_rREPORT1( oEv as variant )
sReportName="rREPORT1" ' Mude aqui o nome do seu Report
OpenReport( getReportsTC, getConnectionTC, sReportName )
end sub

REM Macro para abrir um formulário sem abrir a Base de dados

Sub openOnlyfMOVIMENTOS
oContexto = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oFonte = oContexto.getByName("contabilidade")'Mude aqui o nome da base de dados
oForms = oFonte.DatabaseDocument.FormDocuments
oAConnection = oFonte.getConnection("","")

Dim pProp(1) As New com.sun.star.beans.PropertyValue
pProp(0).Name = "ActiveConnection"
pProp(0).Value = oAConnection
pProp(1).Name = "OpenMode"
pProp(1).Value = "open"
oForm = oForms.loadComponentFromURL("fMOVIMENTOS", "_blank", 0, pProp())'Mude aqui o nome do seu formulário
End Sub


REM Macro para abrir um relatório sem abrir a base de dados

Sub openOnlyrMOVIMENTOS
oContexto = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oFonte = oContexto.getByName("contabilidade")'Mude aqui o nome da base de dados
oReports = oFonte.DatabaseDocument.ReportDocuments
oAConnection = oFonte.getConnection("","")

Dim pProp(1) As New com.sun.star.beans.PropertyValue
pProp(0).Name = "ActiveConnection"
pProp(0).Value = oAConnection
pProp(1).Name = "OpenMode"
pProp(1).Value = "open"

oReport = oReports.loadComponentFromURL("rMOVIMENTOS", "_blank", 0, pProp())' Mude aqui o nome do seu relatório
End Sub


REM Macro para apagar valores de uma tabela

Sub DeleteAllFromTEST_TABLE2

Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim Statement As Object
Dim ResultSet As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("teste")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("DELETE FROM TEST_TABLE2 WHERE ID = 2")
End Sub

REM Macro para inserir valores numa tabela

Sub InsertFromTEST_TABLE2
Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim Statement As Object
Dim ResultSet As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("teste")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("INSERT INTO TEST_TABLE2(ID,F1,F2,F3)VALUES (1,'a','abc','abcd')")
End Sub

REM Macro para inserir valores numa tabela provenientes de outra

Sub SelectInsertfromTEST_TABLE2
Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim Statement As Object
Dim ResultSet As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("teste")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("INSERT INTO TEST_TABLE2(ID,F1,F2,F3)SELECT ID, F1,F2,F3 FROM TEST_TABLE3")
End Sub

REM Macro para Alterar uma Tabela

sub UpdateTEST_TABLE2
Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim Statement As Object
Dim ResultSet As Object
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
DataSource = DatabaseContext.getByName("teste")
Connection = DataSource.GetConnection("","")
Statement = Connection.createStatement()
ResultSet = Statement.executeQuery("UPDATE TEST_TABLE2 SET F1=100, F2=200 WHERE ID=1")
End sub

terça-feira, 24 de março de 2009

Open Office 3.0 - Base



Quando se entra no BASE, tem-se a sensação que, de facto, tudo é muito parecido com o ACCESS, o programa de base de dados do MsOffice.

Realmente temos:

- Tabelas
- Consultas
- Formulários
- Relatórios

Módulos que existem no ACCESS, não temos aqui!!!
Veremos mais tarde que os módulos podem ser criados em livrarias e componentes.

Criar tabelas no BASE é bastante fácil (tem até um assistente!).

Consultas de selecção também é extremamente fácil e com uma interface (que depois produz o sql) também bastante parecida com o ACCESS, mas consultas de modificação, inserção ou eliminação, essas, pura e simplesmente, não existem!

Quando entramos nos formulários, também não se nota grande diferença se nos cingirmos ao trivial. Os wizards não são maus, se seguirmos os modelos que temos à disposição.
Notámos no entanto uma grande diferença entre o ACCESS e o BASE.
Alterar um formulário constituído com o assistente é extremamente difícil, pois os controlos parecem ter vontade própria e diminuir-lhes ou aumentar-lhes o tamanho, alinhá-los de uma forma pessoal, é tarefa que parece impossível.
Por outro lado, os wizards parecem restringir-se aos componentes principais porque, por exemplo, no ACCESS, ao arrastarmos um botão para um formulário o ACCESS sabe que há um conjunto de tarefas padrão (abrir outro formulário, imprimir um relatório, etc) que podemos querer executar ao premir esse botão e pergunta-nos logo qual queremos efectuar. Só se não for nenhuma das tarefas padrão precisamos escrever algum código.
Aqui não, teremos sempre que escrever o código das tarefas que queiramos levar a cabo!

Os relatórios parecem-nos a ferramenta mais pobre no que diz respeito ao BASE (mesmo com o Sun Report Builder o seu aspecto não tem nada a ver com os relatórios conseguidos com o ACCESS, embora com tempo e estudo (muito) se possam conseguir grandes melhoras).
Também aqui, quando construídos com o assistente, os controlos parecem ter vontade própria e dispô-los à nossa maneira é uma tarefa quase impossível.

Outra coisa que notámos falta no BASE, foi algo parecido com o Intellisense (que por ser patenteado pela Microsoft deve ser muito difícil de "imitar"!) e antevemos grandes dificuldades para quem queira fazer um programa mais ou menos ambicioso sem ter um curso de programação na linguagem.

Também falta no Base um utilitário para dividir os ficheiros em "Front End" e "Back End" para que o mesmo possa ser utilizado em ambiente de multi-utilizador.

Algo que também ainda nos suscita algumas dúvidas é se um projecto desenvolvido no Base num computador, o mesmo funcionará noutro, tal e qual, principalmente se o mesmo contiver macros.
Será que, tal como no ACCESS, o mesmo transporta consigo todas as funcionalidades?

Enfim, se tínhamos notado algumas dificuldades no CALC, no BASE, uffffffffffff!

Temos gasto horas (dias?) na net em busca de ajuda e...mesmo em inglês!

Mas já algo foi conseguido e será trazido aqui oportunamente.

terça-feira, 10 de março de 2009

Open Office 3.0 - Calc

Tal como prometemos iremos experimentar, a fundo, cada componente do Open Office.

Resolvemos começar pelo CALC, a folha de cálculo.

Como já díspunhamos de uma folha de cálculo para o Orçamento familiar elaborada em Excel, resolvemos elaborar, de raiz, a mesma folha de cálculo no Calc.

Assim, ao mesmo tempo que testávamos o Calc, fazíamos logo a comparação do Calc com o Excel.

A folha de cálculo será um esboço de um livro mensal, com várias folhas, onde constarão:


1ª. Folha

- Receitas do mês ( Ordenados, etc)

- Despesas do mês ( Habitação, transportes, etc.etc)

Uma Folha para cada rúbrica mensal, constituida por:

- Data do movimento

- Descrição do movimento

- Saidas

- Entradas

- Total de Entradas

- Total de Saidas

- Saldo

Última Folha

- Saldos de Despesas ( Habitação, transportes, etc)

- Saldos de Receitas (Bancos, caixa, devedores, etc)

A primeira página ficará ligada a cada primeira linha de cada página pelos valores destinados a cada rúbrica.

Cada página de cada rúbrica conterá uma tabela dinâmica que calculará os totais de entradas e saidas e, por diferença, calcularemos o saldo que, por sua vez ligaremos à página dos Saldos, à linha respectiva.

Na folha dos saldos haverá, claro, um total de receitas e um total de despesas, bem como uma diferença entre elas para sabermos, sempre, se tudo está certo (se a diferença for diferente de 0 é porque algo correu mal).

Vejamos entao como construimos o livro:

A primeira folha ficou assim:

Cada folha, referente a cada rúbrica ficou assim:

Ligámos a primeira folha com as seguintes, da seguinte forma:

  • Clickámos com o botão direito do rato no valor da rúbrica a copiar

  • Escolhemos o campo da página da rúbrica para onde queriamos colar o resultado (mais uma vez com o botao direito do rato) e escolhemos colar especial.

  • Quando nos apareceu o menu do "colar especial" assinalamos "colar ligação" e clickamos em "OK"

Calculámos os totais de entradas e saidas através de tabela dinâmica, da seguinte forma:

  • Seleccionámos as colunas de SAIDAS e ENTRADAS (seleccção dados pra tabela)

  • Fomos ao Menu Dados---->Assistente de Dados----> Iniciar:

  • Em Selecionar Origem escolhemos "Selecção actual"

Aqui encontrámos, de facto a grande diferença entre o CALC e o Excel, pois neste ponto, aparecer-nos ia um menu onde poderíamos escolher não só o esquema da tabela dinâmica, que nos aparece no CALC, como a suas opções e, entre elas, a opção de “actualizar ao abrir” que, por mais que procurássemos , não encontrámos no CALC.

  • Apareceu-nos o esquema da Tabela Dinâmica com os dados seleccionados (Saidas e Entradas) do lado direito

  • Arrastamos Saidas e Entradas para dentro de "Campos de Dados"

  • em "Mais" escolhemos o esquema da tabela e o local onde queríamos os resultados, ficando assim


Clickando com o botão direito do rato em cima da tabela dinâmica, e escolhendo “Actualizar” a tabela dinâmica actualiza-se

Depois de calculados os totais de entradas e saídas, pela sua diferença, calculamos os saldos.

Uma vez calculados os saldos em cada folha, procedemos à sua ligação com a folha dos saldos da mesma forma que procederamos á ligação da primeira folha com a folha de cada rúbrica, assim:

Na folha dos saldos procedemos então ao cálculo das receitas e das despesas.


Tudo isto para constactarmos que nos saímos perfeitamente no CALC em tudo o que faríamos no Excel, excepto no fazermos com que as tabelas dinamicas se actualizassem automaticamente, o que parecendo que não, é de uma grande importância, pois, suponhamos o que faria a minha mulher que não percebe nada de folhas de cálculo ( o que por acaso não acontece, mas como se trata de suponhamos) para ver qual era a nossa situação financeira em determinada altura?

Pois abriria a folha de cálculo e iria logo para a folha dos saldos que poderia não estar certa, bastando, para tanto, que eu, ao registar os últimos movimentos, me esquecesse de ter actualizado todas as tabelas dinâmicas.


PS: Se alguem quiser o exemplo construído é so deixar aqui o mail que enviarei directamente.