Pannello di Controllo Moderatore ]

Registrazione database

Discussioni sulle caratteristiche di database

Registrazione database

Messaggioda Akrobaticone » sabato 8 gennaio 2011, 13:37

Il database creato con Base va registrato affinche funzioni correttamente
vorrei automatizzare con una macro la procedura così da evitare la registrazione manuale la prima volta che lo si apre
tempo fa ne avevo già parlato e mi era stato suggerito di usare ThisComponent.location
ma non riesco a capire come usarlo
Qualche suggerimento?
Grazie in anticipo per le risposte
LibreOffice 3.3.2
Ubuntu 10.10
Akrobaticone
 
Messaggi: 93
Iscritto il: mercoledì 31 marzo 2010, 8:09

Re: Registrazione database

Messaggioda r.vanoni » sabato 8 gennaio 2011, 19:15

Cosa significa va registrato? Io non l'ho mai fatto e ha sempre funzionato. Forse intendi questo?
viewtopic.php?f=13&t=827
indica Risolto se ok
Ubuntu, ooo.3.2
r.vanoni
 
Messaggi: 32
Iscritto il: lunedì 29 novembre 2010, 15:40

Re: Registrazione database

Messaggioda Akrobaticone » sabato 8 gennaio 2011, 19:31

No no è risolto
la registrazione serve per far funzionare correttamente le macro e altre cose
intendo quella che si fa in
Strumenti->Opzioni->Openoffice.Org Base->Database
La vorrei automatizzare affinchè la prima volta che si apre il DB non sia necessario girare per menù
LibreOffice 3.3.2
Ubuntu 10.10
Akrobaticone
 
Messaggi: 93
Iscritto il: mercoledì 31 marzo 2010, 8:09

Re: Registrazione database

Messaggioda Akrobaticone » lunedì 10 gennaio 2011, 10:40

Un primo passo potrebbe essere quello di conoscere il percorso del file del database
Come posso fare per ottenerlo tramite una macro e inserirlo in una variabile?
LibreOffice 3.3.2
Ubuntu 10.10
Akrobaticone
 
Messaggi: 93
Iscritto il: mercoledì 31 marzo 2010, 8:09

Re: Registrazione database

Messaggioda marcofoc » lunedì 10 gennaio 2011, 10:55

Ma il tuo problema qual'è?
Inserito una volta (registrato), l'hai disponibile per sempre..
Non esistono buoni maestri senza buoni allievi...
Avatar utente
marcofoc
 
Messaggi: 235
Iscritto il: martedì 12 ottobre 2010, 15:48
Località: Arzignano (VI)

Re: Registrazione database

Messaggioda Akrobaticone » lunedì 10 gennaio 2011, 11:34

Il database lo vorrei distribuire ad altri e vorrei evitare di far compiere ulteriori operazioni
inoltre conoscere il percorso del file mi permetterebbe di migliorare il codice delle macro
LibreOffice 3.3.2
Ubuntu 10.10
Akrobaticone
 
Messaggi: 93
Iscritto il: mercoledì 31 marzo 2010, 8:09

Re: Registrazione database

Messaggioda marcofoc » lunedì 10 gennaio 2011, 22:47

ho chiesto su un altro forum..
ti incollo la risposta e fai le prove..
non conosco le macro e il linguaggio di cui sono composte..

> Allora, se io volessi distribuire un mio file database .odb, c'è una
> maniera per fare in modo che si registri in automatico, magari al
> primo avvio?

Che io sappia solo con una macro.

Tipo questa:

sub registradatabase

oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
sName = "nomecompletodelfiledeltuodatabase.odb"
oDataSource = oBaseContext.getByName(sName)
oBaseContext.registerObject("Nomedeldatabase", oDataSource)

end sub


Dimenticavo che c' una piccola difficolt .
Tu non puoi sapere a priori nomecompletodelfiledeltuodatabase.odb.

Ci dovuto al fatto che non puoi sapere a priori il path del file del
data base dell'utente finale.

Questa informazione la puoi ottenere ad esempio cos (ma solo se la
macro contenuta nel file .odb):

Doc = thiscomponent
If (Doc.hasLocation()) Then
sDocURL = Doc.getURL()
End If
Non esistono buoni maestri senza buoni allievi...
Avatar utente
marcofoc
 
Messaggi: 235
Iscritto il: martedì 12 ottobre 2010, 15:48
Località: Arzignano (VI)

Re: Registrazione database

Messaggioda xergio » martedì 11 gennaio 2011, 0:08

Qui c'è un po' di tutto (prende il percorso del database dalla .oxt, copia il database in una nuova directory creata apposta e registra il database in OOo), anche se ci sono altri metodi.
n.b.: ci sono delle stringhe da modificare secondo necessità, in particolare il nome del db e il codice univoco della .oxt

Codice: Seleziona tutto   Espandi visualeStringi visuale
'***Set db**********************************
Sub recDb
sDb = "edil"
oContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
If Not ( oContext.hasByName(sDb) ) Then
   If GetGUIType=1 Then
      path = convertFromUrl(ENVIRON("HOMEDRIVE") & ENVIRON("HOMEPATH"))   
      Else
      path = convertFromUrl(ENVIRON("HOME"))
      End If
      
      sStandardDir = "Edil"
      path = ConvertToUrl(ConvertFromUrl(path) & getPathSeparator & sStandardDir)
   
      oSfA = createUnoService("com.sun.star.ucb.SimpleFileAccess")
      If Not oSfA.exists(path) Then
         oSfA.createFolder(path)
         Endif
      sUrl = ConvertToUrl(ConvertFromUrl(path) & getPathSeparator & sDb & ".odb")
      If Not oSfA.exists(sUrl) Then
         sOxtDbUrl = GetDatabaseURL
         Dim m(0) As New com.sun.star.beans.PropertyValue
         m(0).Name = "Hidden"
         m(0).Value = True
         oDbDoc = StarDesktop.loadComponentFromUrl(sOxtDbUrl, "_blank" , 0, m())
         Dim mb()
         oDbDoc.StoreAsURL (sUrl, mb())
         oDbDoc.close(True)
      Endif
      oDb = oContext.getByName(convertToUrl(sUrl))
      oContext.registerObject(sDb, oDb)
         
   Endif

End Sub



REM  *****  BASIC  *****
'***Thanks to Paolo Mantovani***

Public Const PKG_ID = "it.icstools.Edil"

'______________________________________________________________________________
Function OpenForm(sFormUrl As String, bReplaceCurrent As Boolean, Optional bDontHideMenuBar As Boolean) As Object

'   sFormUrl = GetFormURL(sFormName)
'   sDbUrl = GetDatabaseURL()
'   silentCheckDb
   oContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
   If Not  oContext.hasByName("edil") Then
      Exit Function
   Endif
   
   If bReplaceCurrent  Then
      oCmpLoader = StarDesktop.ActiveFrame
      sDestFrame = "_self"
   Else
      oCmpLoader = StarDesktop
      sDestFrame = "_blank"
   Endif
   
   Dim mArgs(1) As New com.sun.star.beans.PropertyValue
   mArgs(0).Name = "MacroExecutionMode"
   mArgs(0).Value = com.sun.star.document.MacroExecMode.ALWAYS_EXECUTE_NO_WARN '4
   mArgs(1).Name = "ReadOnly"
   mArgs(1).Value = True

   oDoc = oCmpLoader.loadComponentFromURL(sFormUrl, sDestFrame, 0, mArgs())
   oDoc.CurrentController.setFormDesignMode(True)

   ' Remove UI stuff
   oLMgr = oDoc.CurrentController.Frame.LayoutManager
   oLMgr.setVisible(False)

   If bDontHideMenuBar = True Then
      'Nothing to do
   Else
      oLMgr.hideElement("private:resource/menubar/menubar")

   Endif
   'init forms and subforms
'   For Each oForm In oDoc.DrawPage.Forms()
'      InitializeForm(oForm, sDbUrl)
'   Next

   OpenForm = oDoc
   
End Function

'______________________________________________________________________________
Sub InitializeForm(oForm, sDbUrl)
Dim oElem
Dim sImageUrl As String
Dim mParams()
Dim sCommand

   If oForm.DataSourceName <> sDbUrl Then
      'iCmdType = oForm.CommandType
      'sCommand = oForm.Command
      oForm.DataSourceName = sDbUrl
      'oForm.Command = Command
      
   Endif

   For Each oElem In oForm
      If oElem.supportsService("com.sun.star.form.component.Form") Then
         InitializeForm(oElem, sDbUrl)
      Endif
   Next
   
   oForm.load()
   
End Sub


'______________________________________________________________________________
Function GetFormURL(sFormName As String) As String
   GetFormURL = ConvertToUrl(ConvertFromUrl(GetPackageUrl()) & getPathSeparator & "forms" & getPathSeparator & sFormName & ".odt")
End Function


'______________________________________________________________________________
Function GetDatabaseURL() As String
   GetDatabaseURL = ConvertToUrl(ConvertFromUrl(GetPackageUrl()) & getPathSeparator & "db" & getPathSeparator & sDb & ".odb")
End Function



'______________________________________________________________________________
Function GetPackageUrl() As String
   oCtx = GetDefaultContext()
   oPkgManFactory = oCtx.getByName("/singletons/com.sun.star.deployment.thePackageManagerFactory")
   oPkgMan = oPkgManFactory.getPackageManager("user")
   oPkg = oPkgMan.getDeployedPackage(PKG_ID, "", Null)
   GetPackageUrl = ExpandMacroFieldExpression(oPkg.Url)
End Function


'_________________________________________________________________________________________
Function ExpandMacroFieldExpression(sURL As String) As String
Dim sTemp As String
Dim oSM As Object
Dim oMacroExpander As Object
   
   'get the service manager
   oSM = getProcessServiceManager
   'get the macro expander
   oMacroExpander = oSM.DefaultContext.getValueByName("/singletons/com.sun.star.util.theMacroExpander")
   
   'cut the vnd.sun.star.expand: part
   sTemp = Join(Split(sURL, "vnd.sun.star.expand:"), "")
   
   'Expand the macrofield expression
   sTemp = oMacroExpander.ExpandMacros(sTemp)
   sTemp = Trim(sTemp)
   ExpandMacroFieldExpression = sTemp
       
End Function
Per cortesia, inserisci [Risolto] nel Titolo iniziale se il tuo problema è stato risolto.
---
Sergio Corato
Libo 3.5.7 su Ubuntu 12.04 / OOo 3.2.1 su Windows XP
http://www.icstools.it
Avatar utente
xergio
 
Messaggi: 307
Iscritto il: lunedì 15 marzo 2010, 21:54
Località: Arzignano (Vicenza)

Re: Registrazione database

Messaggioda Akrobaticone » mercoledì 12 gennaio 2011, 8:50

Grazie per le dritte :super:
integro e il codice e, se funziona, pubblico il risultato
LibreOffice 3.3.2
Ubuntu 10.10
Akrobaticone
 
Messaggi: 93
Iscritto il: mercoledì 31 marzo 2010, 8:09

Re: Registrazione database

Messaggioda Akrobaticone » sabato 15 gennaio 2011, 21:44

Dopo prolungate elucubrazioni mentali e il prezioso aiuto di XSergio
ho trovato questo
Codice: Seleziona tutto   Espandi visualeStringi visuale

Sub RegistraDatabase

   
   dim sUrl as string
   dim sName as string
   dim oBaseContext as object
   dim OdataSource as object
   
   GlobalScope.BasicLibraries.loadLIbrary( "Tools" )

   If ThisComponent.hasLocation() Then
      sUrl = ThisComponent.URL
      sName= GetFileNameWithoutExtension( FilenameOutOfPath( ConvertFromURL(sUrl ) ) )

      oBaseContext=CreateUnoService("com.sun.star.sdb.DatabaseContext")
       oDataSource = oBaseContext.getByName(sUrl)
       oBaseContext.registerObject(sName, oDataSource)
      endif

End Sub


A me funziona, ma non so se è del tutto corretto
Aspetto a mettere RISOLTO
LibreOffice 3.3.2
Ubuntu 10.10
Akrobaticone
 
Messaggi: 93
Iscritto il: mercoledì 31 marzo 2010, 8:09

Re: Registrazione database

Messaggioda icedry » lunedì 19 marzo 2012, 18:12

Con il codice sopra riportato però a me sorge un altro problema, la prima volta che lancio il db ok viene registrato, ma quando lo riapro la seconda volta mi da un errore, credo legato al fatto che il db risulti già registrato.

C'è la possibilità di fare in modo che la macro di cui sopra si avvii solo ed esclusivamente al primo avvio?
Oltretutto mi risolverebbe anche il problema legato al fatto che avevo già collegato una macro per aprire un form specifico all'apertura del documento. Se fosse possibile assegnare la registrazione del db ad un altro evento sarebbe perfetto.
OpenOffice 3.3 su Windows 7 Home Premium
icedry
 
Messaggi: 8
Iscritto il: giovedì 23 febbraio 2012, 18:16


Torna a Base

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite