Registrazione database

Discussioni sulle caratteristiche di database
Rispondi
Akrobaticone
Messaggi: 93
Iscritto il: mercoledì 31 marzo 2010, 9:09

Registrazione database

Messaggio da Akrobaticone »

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
r.vanoni
Messaggi: 35
Iscritto il: lunedì 29 novembre 2010, 15:40

Re: Registrazione database

Messaggio da r.vanoni »

Cosa significa va registrato? Io non l'ho mai fatto e ha sempre funzionato. Forse intendi questo?
http://user.services.openoffice.org/it/ ... f=13&t=827
indica Risolto se ok
Windows 10 - Apache OpenOffice 4.1.8
Akrobaticone
Messaggi: 93
Iscritto il: mercoledì 31 marzo 2010, 9:09

Re: Registrazione database

Messaggio da Akrobaticone »

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, 9:09

Re: Registrazione database

Messaggio da Akrobaticone »

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
Avatar utente
marcofoc
Messaggi: 235
Iscritto il: martedì 12 ottobre 2010, 16:48
Località: Arzignano (VI)
Contatta:

Re: Registrazione database

Messaggio da marcofoc »

Ma il tuo problema qual'è?
Inserito una volta (registrato), l'hai disponibile per sempre..
Non esistono buoni maestri senza buoni allievi...
Akrobaticone
Messaggi: 93
Iscritto il: mercoledì 31 marzo 2010, 9:09

Re: Registrazione database

Messaggio da Akrobaticone »

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
Avatar utente
marcofoc
Messaggi: 235
Iscritto il: martedì 12 ottobre 2010, 16:48
Località: Arzignano (VI)
Contatta:

Re: Registrazione database

Messaggio da marcofoc »

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
xergio
Messaggi: 315
Iscritto il: lunedì 15 marzo 2010, 21:54
Località: Arzignano (Vicenza)
Contatta:

Re: Registrazione database

Messaggio da xergio »

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

'***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 6.x su Ubuntu 18.04 / OOo 4.x su Windows XP/10 (VirtualBox)
https://efatto.it
Akrobaticone
Messaggi: 93
Iscritto il: mercoledì 31 marzo 2010, 9:09

Re: Registrazione database

Messaggio da Akrobaticone »

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, 9:09

Re: Registrazione database

Messaggio da Akrobaticone »

Dopo prolungate elucubrazioni mentali e il prezioso aiuto di XSergio
ho trovato questo

Codice: Seleziona tutto


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
icedry
Messaggi: 8
Iscritto il: giovedì 23 febbraio 2012, 18:16

Re: Registrazione database

Messaggio da icedry »

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
Rispondi