🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Datenbank schließen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Antworten
chico
Beiträge: 17
Registriert: Mo 28. Jul 2014, 15:13

Datenbank schließen

Beitrag von chico » Di 21. Okt 2014, 15:21

Beitrag nach LibreOffice Programmierung verschoben !!

Hallo LibreOffice-Helfer,

ich komme auch nach langem Suchen nicht weiter.
Szenario:
In einem Makro werden 2 Datenbanken aufgerufen. Mit der 1. Datenbank "file:///Z:/wmt/verwaltung.odb" wird LO gestartet und mit

Code: Alles auswählen

oVerbindungZiel = oDatenbank.ActiveConnection() 
zur aktiven Verbindung.
Die 2. Datenbank wird mit

Code: Alles auswählen

oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
oDatenquelle = oDatabaseContext.getByName("file:///Y:/wmt/empfang.odb") 
oVerbindungQuelle = oDatenquelle.GetConnection("","")
verbunden.
Nachdem eine Tabelle von der 1. - zur 2. Datenbank kopiert wurde, soll die 1.Datenbank die 2.Datenbank überschreiben.

Code: Alles auswählen

FileCopy("file:///Z:/wmt/verwaltung.odb","file:///Y:/wmt/empfang.odb")
Dabei kommt die Fehlermeldung:'Pfad nicht gefunden'.
Das liegt nach meinem Verständnis daran, dass die2. Datenbank nicht überschrieben werden kann, weil sie noch geöffnet ist, erkennbar auch an der Existenz des Lockfiles empfang.odb.lck
Nun versuche ich die 2. Datenbank vor dem Kopiervorgang zu schließen und komme nicht weiter.
Mit welcher Funktion wird die 2. Datenbank geschlossen, sodass das Lockfile verschwindet ? Mit oVerbindungQuelle.close() wird zwar kein Fehler angezeigt, aber die Verbindung nicht geschlossen.
Hier nochmal der gesamte Makro-Code, zum besserem Verständnis.

Code: Alles auswählen

'/** openDatenabgleichBesuche
'*************************************************************************.
'* Wird von der Schaltfläche 'Datenabgleich' gestartet
'* In empfang.odb wurde nur die Tabelle 'Besuche' geändert
'* In verwaltung.odb wurden alle übrigen Tabellen geändert
'* Prüft, ob beide Sticks im Rechner stecken
'* Leert die Tabelle 'Besucher' des Z:Aufnahme-Sticks
'* Kopiert die Tabelle 'Besucher' des Y:Empfang-Sticks in die leere Tabelle
'* 'Besucher' des Z:Aufnahme-Sticks
'* Kopiert die Datenbank 'verwaltung.odb' des Z:Aufnahme-Sticks nach 
'* 'empfang.odb' des Y:Empfang-Sticks
'* Als Ergebnis sind die Datenbanken auf beiden Sticks gleich.
'*************************************************************************
'*/ 
Sub openDatenabgleichBesuche  
	DIM oDatabaseContext AS OBJECT
	DIM oDatenbank AS OBJECT
	DIM oDatenquelle AS OBJECT
	DIM oDatenziel AS OBJECT
	DIM oVerbindungQuelle AS OBJECT
	DIM oVerbindungZiel AS OBJECT
	DIM sTitel As STRING
 	if NOT checkPfadKomplett("file:///Y:/wmt/empfang.odb") then 
   		MsgBox("Kann empfang.odb nicht finden ! Bitte Empfangs-Stick 'Y' einstecken !",48,"Hinweis")
   		exit sub
   	end if	
   	if NOT checkPfadKomplett("file:///Z:/wmt/verwaltung.odb") then
   		MsgBox("Kann verwaltung.odb nicht finden ! Bitte Verwaltungs-Stick 'Z' einstecken !",48,"Hinweis") 
   		exit sub  
  	end if 	
	CacheToDB					
	oDatenbank = ThisComponent.Parent.CurrentController  'Ziel-Datenbank verwaltung.odb	
	If NOT (oDatenbank.isConnected()) THEN
		oDatenbank.connect()
	END IF
	oDoc = ThisComponent.Parent 
	sTitel = oDoc.Title
	IF sTitel <> "verwaltung.odb" THEN
		MsgBox("Das Programm muss mit der Datei 'verwaltung.odb' gestartet werden !",16,"Falsche Datenbank gestartet")
		exit sub
	END IF
	oVerbindungZiel = oDatenbank.ActiveConnection()  			'Verbindung zur Zieldatenbank verwaltung.odb aktivieren
	oDatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")  'Sun Service aufrufen
	oDatenquelle = oDatabaseContext.getByName("file:///Y:/wmt/empfang.odb") 'Quelldatenbank empfang.odb aufrufen
	oVerbindungQuelle = oDatenquelle.GetConnection("","")	'Quelldatenbank  verbinden
	oSQL_Anweisung = oVerbindungQuelle.createStatement()  	'SQL-Anweisung für Quell-Datenbank empfang.odb
	stSql = "SELECT * FROM ""Besuche"""	   					'Alles aus Tabelle Besuche der Quelldatenbank auswählen
	oAbfrageergebnis = oSQL_Anweisung.executeQuery(stSql)	'Ergebnis auswerten
	oSQL_AnweisungZiel = oVerbindungZiel.createStatement()	'SQL-Anweisung für Ziel-Datenbank
	stSqlDelete = "DELETE FROM ""Besuche"""    				'Tabelle Besuche der Zieldatenbank leeren
	oSql_AnweisungZiel.executeUpdate(stSqlDelete) 			'SQL-Anweisung Durchführen
	WHILE oAbfrageergebnis.next  							'Alle Datensätze(Zeilen) der Quell-Tabelle empfang.odb nacheinander aufrufen
		inID = oAbfrageergebnis.getInt(1)					'Jedes Datenfeld einer Zwischenvariablen zuweisen
		dBesuche = oAbfrageergebnis.getString(2)
		inKunden_ID = oAbfrageergebnis.getInt(3)
 		bEuro = oAbfrageergebnis.getBoolean(4)
		oSQL_AnweisungZiel = oVerbindungZiel.createStatement() 'SQL-Anweisung für Ziel-Datenbank vorbereiten
		stSqlZiel = "INSERT INTO ""Besuche"" (""ID"",""Besuche"",""Kunden_ID"",""Euro"") VALUES ('"+inID+"','"+dBesuche+"','"+inKunden_ID+"','"+bEuro+"')"
		oSql_AnweisungZiel.executeUpdate(stSqlZiel)  			'Alle Datenfelder der Quelltabelle in die leere Zieltabelle Kopieren
	WEND 	'nächster Datensatz 
	oVerbindungQuelle.close()
	FileCopy("file:///Z:/wmt/verwaltung.odb","file:///Y:/wmt/empfang.odb")
	msgbox("Die Datenbank verwaltung.odb und empfang.odb haben sich gegenseitig aktualisiert."+chr$(13)+"Beide Datenbanken sind nun gleich.",64,"Datenabgleich erfolgreich")
 End Sub  
Vielen Dank im Voraus !

Jens
Zuletzt geändert von chico am Di 21. Okt 2014, 18:11, insgesamt 1-mal geändert.

Benutzeravatar
lorbass
* LO-Experte *
Beiträge: 627
Registriert: Mo 25. Apr 2011, 18:17

Re: Datenbank schließen

Beitrag von lorbass » Di 21. Okt 2014, 17:37

Deine Frage gehört in den Bereich LibreOffice Programmierung.

Gruß
lorbass

chico
Beiträge: 17
Registriert: Mo 28. Jul 2014, 15:13

Re: Datenbank schließen

Beitrag von chico » Di 21. Okt 2014, 18:17

@lorbass
Danke für den Hinweis.
Ich habe den Beitrag nach LibreOffice Programmierung kopiert.
Kann und soll ich den hier löschen ?

Gruß
Jens


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten