[Risolto] Registrazione automatica database

Discussioni sull'applicazione per i fogli di calcolo
Rispondi
Avatar utente
LUGIUDANI
Messaggi: 400
Iscritto il: martedì 27 marzo 2012, 12:29

[Risolto] Registrazione automatica database

Messaggio da LUGIUDANI »

Salve a tutti!
Sono di nuovo qui a proporre un nuovo quesito e spero mi sappiate aiutare!
La domanda è: "come faccio a far funzionare la macro seguente?"

Codice: Seleziona tutto

Sub registraDatabase
dim oBaseContext,oDataSource as object
dim sName as string
oDoc = ThisComponent
If (oDoc.hasLocation()) then
	sDocURL = oDoc.getURL()
End if
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
sName = "DatiperBilancio"
oDataSource = oBaseContext.getByName(sName)
oBaseContext.registerObject("DatiperBilancio",oDoc)
Msgbox sName + " è stato registrato!",48,"Registrazione Database"
End Sub
Ora vi spiego quanto ho fatto prima di arrivare a chiedervi aiuto.
Ho creato un file di calc che lavora con delle finestre di dialogo per l'inserimento di dati e un file di base che utilizzo come archivio dati.
Per lavorare con le finestre di dialogo, alla loro apertura, le caselle di riepilogo inserite vanno a prelevare i dati dal database e per fare questo ho inserito una macro che vada ad aprire il database e poi di conseguenza ricercare nelle tabelle i valori da inserire nella finestra di dialogo.
Il problema è che se volessi passare i file ad un'altro computer, la finestra di dialogo all'apertura mi dà errore se il database non è registrato, quindi volevo ovviare questo problema inserendo la macro sopra citata per registrare in automatico il database appena si va ad aprire il file di calc per l'inserimento dei dati.

Al momento la macro l'ho inserita nel file di calc alla procedura che va ad aprire il database:

Codice: Seleziona tutto

public Sub DBOpen(sDBName)                       ' APERTURA DB LAVORO
   '---------------------------------------------'-----------------------------'
   '  Questa routine crea il servizio di accesso alla banca dati 'sDBName' 
   '  passata come parametro dal programma chiamante e attiva la connessione
   '  assegnandola alla variabile globale oDBConn
   '---------------------------------------------'-----------------------------'
   dim oDoc,oDBIHnd,oDBServ, oContext as object
   dim sDocURL as string
   oDoc = ThisComponent
   If (oDoc.hasLocation()) then
   	sDocURL = oDoc.getURL()
   end if
   oContext= CreateUnoService("com.sun.star.sdb.DatabaseContext")
   oDBServ = oContext.getByName(sDBName)
   oContext.registerObject("DatiperBilancio",oDBServ)
   Msgbox sDBName & "è stato registrato!", 48, "Registrazione Database"
      If Not oContext.hasByName(sDBName) Then
      Msgbox "Errore. il database [" & sDBname &  "] non è registrato"
      Exit Sub
   End If	
   If Not oDBServ.IsPasswordRequired Then        ' IF    NO RICHIESTA PWD ACCESSO
      oDBConn = oDBServ.GetConnection("","")     ' ACCEDO SENZA PASSWORD
   Else                                          ' ELSE  PWD RICHIESTA
      oDBIHnd = createUnoService("com.sun.star.sdb.InteractionHandler")
      oDBConn = oDBServ.ConnectWithCompletion(oDBIHnd) ' ACCEDO CON PASSWORD
   End If                                        ' ENDIF ACCESSO CON PWD
End Sub                                          ' FINE


ma mi dà questo errore
Immagine errore.jpg
Fatemi sapere dove sbaglio.
Ultima modifica di LUGIUDANI il sabato 26 luglio 2014, 17:02, modificato 1 volta in totale.
Openoffice.org 3.2
patel
Volontario attivo
Volontario attivo
Messaggi: 4030
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Registrazione automatica database

Messaggio da patel »

Non ho mai lavorato con i database, però non capisco perché non basta trasferire tutti i file sul nuovo computer e correggere i percorsi
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Registrazione automatica database

Messaggio da Gaetanopr »

Per registrare il database devi indicarne il percorso, quindi da un pc ad un altro può variare, quindi non ne vedo l'utilità
cambia con questa

Codice: Seleziona tutto

Sub registraDatabase
dim oBaseContext,oDataSource as object
dim sName as string
oDoc = ThisComponent
If (oDoc.hasLocation()) then
   sDocURL = oDoc.getURL()
End if
sName = "DatiperBilancio"
indirizzo = convertToURL("C:\Documents and Settings\Administrator\Desktop\DatiperBilancio.odb")
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource = oBaseContext.getByName(indirizzo)
oBaseContext.registerObject(sName,oDataSource)
Msgbox sName + " è stato registrato!",48,"Registrazione Database"
End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Registrazione automatica database

Messaggio da Gaetanopr »

Ricontrollando la macro la prima parte non ha senso, tu devi effettuare un controllo tra i db registrati e se non presente registrare quello di tuo interesse cambia in questo modo:

Codice: Seleziona tutto

Sub registraDatabase
dim oBaseContext,oDataSource as object
dim sName as string
sName = "Nuovo database"
indirizzo = convertToURL("C:\Documents and Settings\Administrator\Desktop\DatiperBilancio.odb")
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
if not oBaseContext.hasByName(sName) then
   oDataSource = oBaseContext.getByName(indirizzo)
   oBaseContext.registerObject(sName,oDataSource)
   Msgbox sName + " è stato registrato!",48,"Registrazione Database"
else 
   MsgBox "database già registrato"
End if      
End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Gaetanopr
Volontario
Volontario
Messaggi: 3316
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Registrazione automatica database

Messaggio da Gaetanopr »

Oppuire e il file calc e il db hanno lo stesso nome e percorso puoi fare in questo modo

Codice: Seleziona tutto

Sub registraDatabase
dim oBaseContext,oDataSource as object
dim sName as string
sName = "Nuovo database"
oDoc = ThisComponent
ind = Left(oDoc.getURL(), Len(oDoc.getURL())-3)
indirizzo = convertToURL(ind & "odb")
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
if not oBaseContext.hasByName(sName) then
   oDataSource = oBaseContext.getByName(indirizzo)
   oBaseContext.registerObject(sName,oDataSource)
   Msgbox sName + " è stato registrato!",48,"Registrazione Database"
else 
   MsgBox "database già registrato"
End if      
End Sub
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
Avatar utente
LUGIUDANI
Messaggi: 400
Iscritto il: martedì 27 marzo 2012, 12:29

Registrazione automatica database

Messaggio da LUGIUDANI »

Grazie Gaetanopr hai risolto egregiamente il mio quesito. :super:
Openoffice.org 3.2
Rispondi