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()
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("","")
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")
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
Jens