Ausgangsbedingungen:
-angemeldete Datenquelle unter Extras-Optionen (DB ist interne HSQLDB in *.odb)
-ich ändere Datensätze nur per Basic-Dialog und Makros/SQL (... .executeUpdate(sql_string))
-nebenher werden einige Makros mit Dispatcher-Code genutzt
-Backup-Datei immer erstellen in Extras-Optionen aktiviert
Ich stelle jetzt plötzlich fest das das automatische Speichern der *.odb offensichtlich nur geschieht wenn ich vorher (während des Arbeitens mit der DB über längere Zeit) einen Dispatchbefehl ausgeführt habe der dazu führt das LO eine .odb.lck Datei anlegt. [1]
Da aufgrund des konkreten Frontends der Datenbank und des Workflows in wohl 99% der Fälle letztere .odb.lck Datei anlegt wird, war ich bisher des Glaubens in müsse in aktuellen LO-Versionen die eigentlich *.odb garnicht explizit speichern. Jetzt aber stoße ich darauf das in dem 1% der Fälle Aktualisierungen per Makro/SQL/(... .executeUpdate(sql_string)) nicht automatisch gespeichert werden sondern ich ein .Store() des Dokuments durchführen muss, also:
Code: Alles auswählen
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
oDataSource = oBaseContext.getByName(DB_name)
oDataSource.DatabaseDocument.Store()
Kann mir da bitte jemand etwas zu sagen?
Ist es richtig das ich, unter den gegeben Rahmenbedingungen, eigentlich immer explit per .Store speichern müsste und bisher nur 'zufällig' alles funktionierte?
Falls ja, was ist 'best practice', nach jeder kleinen Datensatzänderung immer das Dokument mitspeichern?
Gruß
Stephan
[1]
z.B. benutze ich diesen Code um eine Übersichtstabelle anzuzeigen und wenn der Code einmalig per Datenbank-Sitzung gelaufen ist, ist die .odb.lck Datei vorhandeen und bleibt bis zum Ende erhalten:
Code: Alles auswählen
Sub datentabelle_zeigen(welche As String, sortierung As String)
'sortierung: auf-aufsteigend, ab-absteigend
'welche: f-Firmen, p-Personen
Dim URL as New com.sun.star.util.URL
Dim Args(5) as New com.sun.star.beans.PropertyValue
Dim Dispatch As Object
oBaseContext = CreateUnoService("com.sun.star.sdb.DatabaseContext")
If Not(oBaseContext.hasByName(DB_name)) Then
mld = "Benötigte Datenbank-Registrierung (""" & DB_name & """) nicht gefunden."
mld = mld & CHR(13) & CHR(13)
mld = mld & "Bitte überprüfen Sie die Datenbankverknüpfung unter:" & CHR(13)
mld = mld & "Extras - Optionen... - LibreOffice Base - Datenbanken." & CHR(13) & " "
Msgbox mld ,16,"Initialisierung fehlgeschlagen"
Exit Sub
End If
oDataSource = oBaseContext.getByName(DB_name) 'DB_name, siehe Modul "_info"
oCon = oDataSource.getConnection(sUser, sPassword)
If welche = "f" And sortierung = "auf" Then
sql_string="Select * FROM ""Firma"" ORDER BY ""Firmenname"" ASC"
ElseIf welche = "f" And sortierung = "ab" Then
sql_string="Select * FROM ""Firma"" ORDER BY ""Firmenname"" DESC"
ElseIf welche = "p" And sortierung = "auf" Then
sql_string="Select * FROM ""Person"" ORDER BY ""Nachname"" ASC"
ElseIf welche = "p" And sortierung = "ab" Then
sql_string="Select * FROM ""Person"" ORDER BY ""Nachname"" DESC"
Else
Msgbox "Fehler"
Exit Sub
End If
URL.Complete = ".component:DB/DataSourceBrowser"
Dispatch = StarDesktop.queryDispatch(URL,"_Blank",8)
Args(0).Name = "ActiveConnection"
Args(0).Value = oCon
Args(1).Name = "CommandType"
Args(1).Value = 2
Args(2).Name = "Command"
Args(2).Value = sql_string
Args(3).Name = "ShowMenu"
Args(3).Value = True
Args(4).Name = "ShowTreeView"
Args(4).Value = False
Args(5).Name = "ShowTreeViewButton"
Args(5).Value = False
Dispatch.dispatch(URL, Args)
'...
End Sub