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í.
Aqui chegados, vamos então à forma que costumo utilizar para conseguir este objectivo:
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
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).
Com a macro criada, abrimos o documento do base onde queremos que a mesma seja utilizada e:
Vamos a Ferramentas → Personalizar e escolhemos o separador Eventos
Escolhemos o evento “Abrir Documento” e em “Atribuir” escolhemos a “Macro” que criámos.
Et Voilá.
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
ResponderEliminarMarcelo:
ResponderEliminarSe 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
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.
ResponderEliminarJuninho
ResponderEliminarAqui fica a macro:
Sub fechaForms
REM Macro generica para fechar qualquer forms
StarDesktop.CurrentComponent.CurrentController.Frame.close( true )
End Sub
João, está muito claro. Muito bom. Só que eu sou mesmo principiante!
ResponderEliminarPretendo 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
Alfredo
ResponderEliminarPara 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
Olá João, Muito Bom Dia
ResponderEliminarQuero 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
Olá João
ResponderEliminarNovamente 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
Olá Alfredo
ResponderEliminarDesde 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
Olá João
ResponderEliminarDe 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
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.
ResponderEliminarpor 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.
Este comentário foi removido pelo autor.
ResponderEliminarEste comentário foi removido pelo autor.
ResponderEliminarAchei 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