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


14 comentários:

  1. João, tutorial muito bom mesmo, sou totalmente iniciante no BrOffice Base, e mesmo assim consegui fazer os procedimentos, contudo, no procedimento de abrir o formulário não deu certo, acredito que seja pelo fato de não ter incluido o nome do formulário na macro no caso "prospects". Não coloquei pq fiquei em dúvida sobre como inserir na macro, sendo assim, se puder ajudar agradeço. Vlw e obrigado pelo tutorial

    ResponderEliminar
  2. Marcelo:

    Se construiu correctamente a macro, dela deverá constar a seguinte linha:

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

    Pois bem! É só mesmo substituir fMENU por prospects.

    Entendido?

    Abraço

    João

    ResponderEliminar
  3. existe uma macro para fechar formularios no base, porque eu estou desenvolvendo um projeto e queria criar um botao "fechar", mas nao encontro uma macro para fechar forms.

    ResponderEliminar
  4. Juninho

    Aqui fica a macro:

    Sub fechaForms

    REM Macro generica para fechar qualquer forms
    StarDesktop.CurrentComponent.CurrentController.Frame.close( true )
    End Sub

    ResponderEliminar
  5. João, está muito claro. Muito bom. Só que eu sou mesmo principiante!
    Pretendo criar uma macro para abrir um Relatorio a partir de um botão num formulário. Experimentei o seu código mas não resultou. Você poderia dar mais uma ajudinha? Muito obrigado.
    Alfredo

    ResponderEliminar
  6. Alfredo

    Para abrir um Relatório, deve usar estas macros, em conjunto:

    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

    A macro a chamar no evento "botão do rato premido" do botão é a sub OpenReport_rREPORT1.

    Estas e outras macros existem neste endereço:

    http://aversenosentendemos.blogspot.com/2009/03/macros-para-o-base-open-office.html

    ResponderEliminar
  7. Olá João, Muito Bom Dia
    Quero agradecer-lhe sinceramente a sua ajuda. Fiz como disse e deu tudo certinho.
    Muitíssimo obrigado. Bem Haja.
    Qualquer coisa que eu possa ajudar, fique à vontade.
    Alfredo

    ResponderEliminar
  8. Olá João
    Novamente venho pedir a sua ajuda.
    Com as suas macros lá consegui concluir a minha base de dados, parecendo-me que estava tudo a funcionar "na perfeição". Eis porém quando após isso, nova dificuldade se me deparou: tem a ver com a colocação em rede ( rede LAN) da BD, que é uma questão que ainda não consegui também resolver!
    Porém, neste momento, é outra a questão que lhe vou colocar: É que detectei um "mistério" que não consigo compreender de maneira nenhuma:
    Criei um formulário de entrada(abre com a sua macro do autoexec) e nesse formulário existem botões que, através das outras macros abrem os restantes forms e reports da BD. Tudo funciona e até parecia que estava tudo bem. Só que, reparámos que se carregar-mos informação abrindo os formulários a partir do formulário de entrada, essa informação não fica gravada. Pelo contrário, se abrir directamente clicando no formulário, então a informação já fica guardada. Da mesma forma, a informação é guardada mesmo que os formulários sejam abertos a partir dos botões do formulário de entrada, mas só se antes de fechar o ficheiro da BD minimizar o formulário de entrada e der um clic sobre o ícone de Tabelas ou se abrir a correspondente tabela, como p.e. para confirmar que a informação foi ali guardada! Estranho, não é?!
    Será que você me pode ajudar?

    Fico desde já muito grato pela sua atenção
    Cumprimentos,
    alfredo

    ResponderEliminar
  9. Olá Alfredo

    Desde já informo que não sou nenhum "especialista" em OpenOffice.
    Criei este blog para repartir os conhecimentos que tenho ido adquirindo no sentido de utilizar não só o OpenOffice como outros softwares gratuitos.

    Vamos então às suas questões:

    1. Trabalhar com o OpenOfice em rede, em modo normal, ao que sei, não adianta, pois o mesmo não é multi-utilizador. Existe no entanto uma forma de o tornar, como poderá ver no artigo
    http://aversenosentendemos.blogspot.com/2009/12/trabalhar-com-o-base-do-openoffice-e.html

    2. Agora quanto à questão de os registos não gravarem quando os forms são abertos a partir do menu inicial, confesso que isso é novidade para mim e agora também não tenho tempo para testar.
    Mesmo quando carregando no "gravar"?

    Confesso que já encontrei algumas "falhas" inexplicáveis no OpenOffice(como tenho saudades do Access) mas parto sempre do principio que o "defeito" é meu e não dele.

    Em todo o caso, nada melhor que por o caso aos verdadeiros "experts" do OpenOffice e, para isso, aqui lhe deixo o endereço de dois foruns (em ingles), que não sei se conhece:

    http://www.oooforum.org/forum/viewforum.phtml?f=10&sid=7fa0c8cba88b557cb08ea2d65e929bd4

    http://user.services.openoffice.org/en/forum/viewforum.php?f=13&sid=fdd6fed692720fd30feca2afcde531e0

    Um abraço

    João Mateus

    ResponderEliminar
  10. Olá João

    De facto já andei a pesquisar no forum do openoffice, mas não encontrei nada que me pudesse esclarecer quanto a esta questão.Também já vi o seu blog na parte da colocação em rede, mas também não consegui que funcionasse. Será que o problema terá a mesma origem?
    Coloquei os forms fora da BD(fiz cópias e gravei cá fora); liguei-os aos que estão dentro da BD e parece-me que isto assim funciona. Amanhã vou tentar, simplesmente colocar a BD num ficheiro partilhado ( é uma pequena rede) e ver se dá resultado.
    Depois eu digo qq coisa.

    Abraço e novamente muito obrigado pela sua atenção,
    alfredo

    ResponderEliminar
  11. Grande João, O openoffice e mas recentemente o libreoffice tem apresentado diferenças significativas então como sugestão para aprimorar o seu excelente blog, sugiro de coloque a versão do libreoffice que voce esta usando e na qual o macro foi testado.
    por exemplo o comando para abrir um formulario a partir da versão 3.2 ficou bem mais simples. estou meio emperrado em um projeto de migração do acess para o libreoffice e espero contar com as suas valiosas dicas.

    ResponderEliminar
  12. Este comentário foi removido pelo autor.

    ResponderEliminar
  13. Este comentário foi removido pelo autor.

    ResponderEliminar
  14. Achei muito bom o conteúdo do blog. Pretendo visitá-lo mais vezes. Após várias décadas sem escrever linhas em VBscript, deparo-me na atualidade com o "formato" do base sendo incrementado nas empresas.

    ResponderEliminar