Botão para abrir formulário no LibreOffice-Base - Macros
Se você está começando a utilizar o LibreOffice Base, talvez tenha encontrado dificuldades para abrir um formulário a partir de um botão localizado em outro formulário. Essa tarefa pode parecer ainda mais complicada para quem está acostumado com os assistentes e recursos automatizados do Microsoft Access.
Diferentemente do Access, o LibreOffice Base exige a criação de uma macro para que um botão possa abrir outro formulário. Após criar a macro, basta associá-la ao evento "Ao aprovar ação" do botão para que ela seja executada quando o usuário clicar nele.
Para criar a macro, com o LibreOffice Base aberto, acesse o menu Ferramentas >> Macros >> Organizar Macros >> LibreOffice Basic. Na janela exibida, navegue até Minhas Macros >> Standard >> Module1. Em seguida, clique no botão "Editar", localizado no lado direito da janela, para abrir o editor de macros. Depois disso, insira o código apresentado a seguir:
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
sub abrirformulario( oev as variant )
sFormName = "nome_do_formulario"
OpenForm( getFormsTC, getConnectionTC, sFormName )
end sub
Substitua o texto "nome_do_formulario" pelo nome do formulário que deseja abrir. Após inserir a macro no editor, salve as alterações e feche a janela de edição.
O próximo passo é associar a macro ao botão que executará a ação. Para isso, abra o formulário que contém o botão de pressão e clique com o botão direito do mouse sobre ele. No menu exibido, selecione "Controle" e, em seguida, acesse a aba "Eventos".
Na lista de eventos, localize a opção "Ao aprovar ação". Selecione esse evento e associe a ele a função criada anteriormente (abrirformulario). Confirme a configuração, salve o formulário e teste o funcionamento do botão.
Se tudo foi configurado corretamente, ao clicar no botão de pressão o formulário especificado será aberto automaticamente.
Observação: esse procedimento descrito neste tutorial foi testado na versão LibreOffice 3.5.4.2
ATUALIZAÇÃO
Para a versão mais recente do LibreOffice, versão 6.2.7.1 (x64), segue o código:
REM ***** BASIC *****
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
sub abrirformulario1( oev as variant )
sFormName = "nome_do_formulario_1"
OpenForm( getFormsTC, getConnectionTC, sFormName )
end sub
sub abrirformulario2( oev as variant )
sFormName = "nome_do_formulario_2"
OpenForm( getFormsTC, getConnectionTC, sFormName )
end sub
sub abrirformulario3( oev as variant )
sFormName = "nome_do_formulario_3"
OpenForm( getFormsTC, getConnectionTC, sFormName )
end sub
#######################################
Outras macros importantes:
Botão para fechar formulário:
Sub FecharFormulario
thisComponent.CurrentController.Frame.close( true )
End Sub
Botão para fechar programa:
Sub FecharPrograma
stardesktop.terminate
End Sub
Para a versão mais recente do LibreOffice, versão 6.2.7.1 (x64), segue o código:
REM ***** BASIC *****
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
sub abrirformulario1( oev as variant )
sFormName = "nome_do_formulario_1"
OpenForm( getFormsTC, getConnectionTC, sFormName )
end sub
sub abrirformulario2( oev as variant )
sFormName = "nome_do_formulario_2"
OpenForm( getFormsTC, getConnectionTC, sFormName )
end sub
sub abrirformulario3( oev as variant )
sFormName = "nome_do_formulario_3"
OpenForm( getFormsTC, getConnectionTC, sFormName )
end sub
#######################################
Outras macros importantes:
Botão para fechar formulário:
Sub FecharFormulario
thisComponent.CurrentController.Frame.close( true )
End Sub
Botão para fechar programa:
Sub FecharPrograma
stardesktop.terminate
End Sub

Olá! Obrigado pelo post ajudou bastante... Agora, você poderia me ajudar a abrir um relatório de dentro do formulário, porém somente com os dados que estão apresentados no momento e não de todas as linhas do banco? Desde já agradeço!
ResponderExcluirfunciona direitinho no openOffice 4.1.1
ResponderExcluiragora continuar aprendendo pra poder polir ainda mais minha base de dados...
muito obrigado!!!
Eu criei um botão usando macro no libreoffice draw e ele está saindo na impressão, e quando eu tiro ele de sair na impressão ele não vai pro pdf o que eu posso fazzer nessa situação?
ResponderExcluircomo faço para fechar um formulário utilizando as macros?
ResponderExcluirEstou precisando criar um formulário no libreoffice que retorna o endereço a partir de um CEP digitado pelo usuário. Poderia me dar um norte com implementar isso?
ResponderExcluirEstou precisando criar um formulário no libreoffice que retorna o endereço a partir de um CEP digitado pelo usuário. Poderia me dar um norte com implementar isso?
ResponderExcluirValeu mesmo! Muito obrigado pela preciosa dica.
ResponderExcluir