Die Notwendigkeit des expliziten Speichens mit .Store() beim Arbeiten mit Dialogen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Stephan
********
Beiträge: 10475
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Die Notwendigkeit des expliziten Speichens mit .Store() beim Arbeiten mit Dialogen

Beitrag von Stephan » Di, 17.04.2018 13:41

Hallo,

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

F3K Total
********
Beiträge: 3212
Registriert: Mo, 28.02.2011 17:49

Re: Die Notwendigkeit des expliziten Speichens mit .Store() beim Arbeiten mit Dialogen

Beitrag von F3K Total » Do, 19.04.2018 17:45

Bin leider nicht am Rechner, such mal nach

Code: Alles auswählen

.flush
. Gruß R

Stephan
********
Beiträge: 10475
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Die Notwendigkeit des expliziten Speichens mit .Store() beim Arbeiten mit Dialogen

Beitrag von Stephan » Fr, 20.04.2018 12:03

F3K Total hat geschrieben:
Do, 19.04.2018 17:45
Bin leider nicht am Rechner, such mal nach

Code: Alles auswählen

.flush
. Gruß R
danke, das scheint zu funktionieren.


Gruß
Stephan

F3K Total
********
Beiträge: 3212
Registriert: Mo, 28.02.2011 17:49

Re: Die Notwendigkeit des expliziten Speichens mit .Store() beim Arbeiten mit Dialogen

Beitrag von F3K Total » Fr, 20.04.2018 15:38

Hallo Stephan,
wenn ich richtig informiert bin, wird die .lck Datei erst dann erstellt, wenn

Code: Alles auswählen

ThisDatabasedocument.CurrentController.isconnected = true
Dies wird im Normalfall durch das Öffnen einer Tabelle, Abfrage, eines Formulares oder F4 der Datenquellenansicht automatisch erledigt.
Wenn man nur per Makro zugreift, kann man mit diese Verbindung mit

Code: Alles auswählen

ThisDatabasedocument.CurrentController.connect
herstellen.
Mit

Code: Alles auswählen

.flush
kann man meineserachtens das Senden in die interne DB erzwingen.
HTH Gruß R

Antworten