Daten verschwinden teilweise

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Buddy0815
Beiträge: 4
Registriert: Sa, 12.03.2011 14:04

Daten verschwinden teilweise

Beitrag von Buddy0815 »

Hallo,

ich habe für meinen Schützenverein unter OpenOffice Base unter Verwendung von Makros, ein Programm zur Auswertung unserer Schießergebnisse geschrieben.
Ich habe nun das Problem, dass ab und zu die kompletten Daten des letzten Schießtages nicht mehr in der Datenbank stehen.

Das Ganze ist rein Makro gesteuert, d.h. ich generiere über Makros entsprechende Formulare über welche die Daten eingegeben werden und speichere diese dann mittels Makro in der Base Datenbank ab.
Nach dem Starten des Rechners wird über Autostart ein OpenOffice Textdokument geöffnet mit dem ich über verschiedene Buttons die entsprechenden Makros starte.

Wenn die Auswertung abgeschlossen ist, wird das Textdokument über "X" geschlossen und der Rechner heruntergefahren.

Aufbau Datenbankverbindung:

Code: Alles auswählen

	
        DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	DataSource = DatabaseContext.getByName("Datenbank")
	
	If Not DataSource.IsPasswordRequired Then
		Connection = DataSource.GetConnection("","")
	Else
		InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
		Connection = DataSource.ConnectWithCompletion(InteractionHandler)
	End If
	
	Statement = Connection.createStatement()
	Statement.setPropertyValue("ResultSetType",1004) 
Schließe Datenbankverbindung:

Code: Alles auswählen

	REM ***** Schliesse Verbindungen *****
	Statement.close()
	Connection.close()
Hat jemand eine Idee woran das liegen kann bzw. was ich dagegen tun kann?

Ich verwende übrigends Openoffice 3.2.0 (Build:9483) unter Windows XP.

Danke schon mal für eure Hilfe.

Buddy0815
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Daten verschwinden teilweise

Beitrag von komma4 »

Willkommen im Forum
Buddy0815 hat geschrieben:Hat jemand eine Idee woran das liegen kann
Das wird Dir so keiner beantworten können... da nicht ersichtlich ist WIE die Daten WANN gespeichert werden.
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Buddy0815
Beiträge: 4
Registriert: Sa, 12.03.2011 14:04

Re: Daten verschwinden teilweise

Beitrag von Buddy0815 »

Hallo,

die Daten werden folgendermaßen in die Datenbank geschrieben:

Code: Alles auswählen

Query = "INSERT INTO ..."
Statement.executeUpdate(Query)
Die Makros laufen ja auch ohne Fehler durch.

in 2 von 8 Fällen sind die Daten jedoch beim nächsten Starten des Rechners weg.

Hier mal der komplette Code eines Makros:

Code: Alles auswählen

REM  *****  Neuen Schiesstag anlegen  *****

Dim DatabaseContext As Object
Dim DataSource As Object
Dim Connection As Object
Dim InteractionHandler as Object
Dim Statement As Object
Dim ResultSet As Object
Dim Query As String

Dim oDialog1 As Object
Dim oPBListener1
Dim oPBListener2
Dim Class() As String
Dim Saison As Integer
Dim Schiesstag As Integer
Dim Fleisch As Boolean
Dim Fontsize As Integer
Dim Font As String 

Sub Neuer_Schiesstag

	Dim Datum_string As String
	Dim Class_Fleisch As Integer
	
	DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
	DataSource = DatabaseContext.getByName("Datenbank")
	
	If Not DataSource.IsPasswordRequired Then
		Connection = DataSource.GetConnection("","")
	Else
		InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
		Connection = DataSource.ConnectWithCompletion(InteractionHandler)
	End If
	
	Statement = Connection.createStatement()
	Statement.setPropertyValue("ResultSetType",1004) 
	
	REM ***** Schrift initialisieren
	Font = "Arial"
	Fontsize = 10
	
	REM ***** Aktuelle Saison auslesen *****
	Query = "SELECT * FROM ""Saison"" WHERE ""Aktiv"" = 'True'"
	ResultSet = Statement.executeQuery(Query)
	
	If Not IsNull(ResultSet) Then
		If Not ResultSet.Next Then
			REM ***** Keine aktive Saison gefunden
			MsgBox "Keine aktive Saison gefunden!", MB_ICONSTOP, "Fehler"
	
		Else
	
			REM ***** Aktuelle Saison speichern
			Saison = ResultSet.getInt(1)
			
			If ResultSet.getString(2) = "" Then
	
				Rem ***** Erster Schiesstag in Saison
				Schiesstag = 1
				Fleisch = True
				
			End If
			
			REM ***** Überprüfe ob für heutiges Datum bereits ein Schiesstag begonnen wurde *****
			Query = "SELECT ""Schiesstag"" FROM ""Schiesstage"" WHERE ""Schiesstage"".""Datum"" = CURRENT_DATE"
			ResultSet = Statement.executeQuery(Query)
	
			ResultSet.last()
			If ResultSet.getRow() > 0 Then

				MsgBox "Für das heutige Datum wurde bereits ein Schiesstag begonnen!", MB_ICONSTOP, "Fehler"

			Else
			
				REM ***** Suche nach letzten Schiesstag in aktueller Saison
				Query = "SELECT MAX(""Schiesstag"") FROM ""Schiesstage"" WHERE ""Saison"" = "& Saison &""
				ResultSet = Statement.executeQuery(Query)
		
				If Not IsNull(ResultSet) Then
					While ResultSet.next
					
	'					MsgBox ResultSet.getString(1)
					
						REM ***** Erhöhe gefundenen Schiesstag in aktueller Saison
						Schiesstag = ResultSet.getInt(1) + 1
	
						REM ***** Wurde am letzten Schiesstag Fleisch geschossen?
						Query = "SELECT ""Fleisch"" FROM ""Schiesstage"" WHERE ""Schiesstag"" = "& ResultSet.getInt(1) &" AND ""Saison"" = "& Saison &""
						ResultSet = Statement.executeQuery(Query)
	
						If Not IsNull(ResultSet) Then
							If ResultSet.next Then
	
								REM *** Setze Fleisch für aktuellen Schiesstag
								Fleisch = ResultSet.getInt(1)
								Fleisch = Not Fleisch
	
							End If
						End If				
					Wend
				End If
		
				Query = "SELECT * FROM ""Fleischpreise_Anzahl"""
				ResultSet = Statement.executeQuery(Query)
					
				ResultSet.last()
				Dim iCounter As Integer
				iCounter = ResultSet.getrow()
								
				ReDim Class(iCounter - 1,1)
				Class_Fleisch = 0
				For i = 1 to iCounter
		
					REM ***** Speichere Klassen in Array
					ResultSet.absolute(i)
					Class(i - 1,0) = ResultSet.getString(1)
					Class(i - 1,1) = ResultSet.getInt(2)
		
					REM ***** Zähle Anzahl Klassen mit Fleisch
					If Fleisch And ResultSet.getInt(2) > 0 Then
		
						Class_Fleisch = Class_Fleisch + 1
		
					End If
		
				Next i
					
				REM ***** Es gibt keine Klassen mehr die Fleisch schiessen
				If Fleisch AND Class_Fleisch = 0 Then
					Fleisch = False
				End If
		
				REM ***** Dialog aufrufen
				Call Dialog_Neuer_Schiesstag

			End If
		End If
	End If

	REM ***** Schliesse Verbindungen *****
	Statement.close()
	Connection.close()

End Sub

REM ***** Dialog für neuen Schiesstag
Sub Dialog_Neuer_Schiesstag

	Dim oDialogModel As Object
	Dim oWindow As Object
	Dim oMod As Object
	Dim oEvent1
	Dim oEvent2
	Dim i As Integer
	
	REM ***** Initialisierung der Eigenschaften des Dialogs
	oDialogModel = CreateUnoService("com.sun.star.awt.UnoControlDialogModel")
	With oDialogModel
		.setPropertyValue("PositionX", 50)
		.setPropertyValue("PositionY", 50 )
		.setPropertyValue("FontName", Font)
		.setPropertyValue("FontHeight", Fontsize)
		.setPropertyValue("Width", 150)
		.setPropertyValue("Height", (Fontsize + 23) * (UBOUND(Class())+ 1))
		.setPropertyValue("Title", "Neuen Schiesstag beginnen")
'		.setPropertyValue("HelpText", "Wird Fleisch geschossen?")
	End With
	
	oDialog1 = CreateUnoService("com.sun.star.awt.UnoControlDialog")
	
	REM ***** Textlabel erzeugen
	oMod = oDialogModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
	With oMod
		.setPropertyValue("Label", "Schiesstag: " & Schiesstag)
		.setPropertyValue("Name", "LabelSD")
		.setPropertyValue("PositionX", 10)
		.setPropertyValue("PositionY", Fontsize)
		.setPropertyValue("FontName", Font)
		.setPropertyValue("FontHeight", Fontsize)
		.setPropertyValue("Height", Fontsize + 2)
		.setPropertyValue("Width", 80)
		.setPropertyValue("HelpText", "Aktueller Schiesstag")
	End With
	
	oDialogModel.insertByName("LabelSD", oMod)
	
	REM ***** Textlabel erzeugen
	oMod = oDialogModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
	With oMod
		.setPropertyValue("Label", Format(Date, "DD.MM.YYYY"))
		.setPropertyValue("Name", "LabelDate")
		.setPropertyValue("PositionX", 90)
		.setPropertyValue("PositionY", Fontsize)
		.setPropertyValue("Align", 2)
		.setPropertyValue("FontName", Font)
		.setPropertyValue("FontHeight", Fontsize)
		.setPropertyValue("Height", Fontsize + 2)
		.setPropertyValue("Width", 50)
		.setPropertyValue("HelpText", "Datum")
	End With
	
	oDialogModel.insertByName("LabelDate", oMod)
	
	REM ***** Linie erzeugen
	oMod = oDialogModel.createInstance("com.sun.star.awt.UnoControlFixedLineModel")
	With oMod
		.setPropertyValue("Name", "FixedLabel")
		.setPropertyValue("PositionX", 10)
		.setPropertyValue("PositionY", Fontsize * 2)
		.setPropertyValue("Height", 5)
		.setPropertyValue("Width", 130)
	End With
	
	oDialogModel.insertByName("FixedLabel", oMod)
	
	For i = 1 to UBOUND(Class()) + 1
			
		REM ***** Textlabel erzeugen
		oMod = oDialogModel.createInstance("com.sun.star.awt.UnoControlFixedTextModel")
		With oMod
			.setPropertyValue("Label", "Klasse " & Class(i-1,0) & ":")
			.setPropertyValue("Name", "Label" & i + 1)
			.setPropertyValue("PositionX", 30)
			.setPropertyValue("PositionY", (Fontsize * 2) + (i * (Fontsize + 5)))
			.setPropertyValue("Align", 2)
			.setPropertyValue("FontName", Font)
			.setPropertyValue("FontHeight", Fontsize)
			.setPropertyValue("Height", Fontsize + 2)
			.setPropertyValue("Width", 40)
		End With
	
		oDialogModel.insertByName("Label" & i, oMod)
		
		REM ***** Checkboxen erzeugen
		oMod = oDialogModel.createInstance("com.sun.star.awt.UnoControlCheckBoxModel")
		With oMod
			.setPropertyValue("Label", " ~Fleisch ("& Class(i-1,1) &")")
			.setPropertyValue("Name", Class(i-1,0))
			.setPropertyValue("PositionX", 75)
			.setPropertyValue("PositionY", (Fontsize * 2) + (i * (Fontsize + 5)))
			.setPropertyValue("Align", 0)
			.setPropertyValue("VerticalAlign", 0)
			.setPropertyValue("FontName", Font)
			.setPropertyValue("FontHeight", Fontsize)
			.setPropertyValue("Height", Fontsize + 2)
			.setPropertyValue("Width", 55)
	
			'REM ***** Initialisiere Checkboxen
			If Fleisch AND Class(i-1,1) > 0 Then
				.setPropertyValue("State", 1)
			Else
				.setPropertyValue("State", 0)
			End If
			
			If Class(i-1,1) = 0 Then
				.setPropertyValue("Enabled", False)
			End If
		End With
				
		oDialogModel.insertByName(Class(i-1,0), oMod)

	Next i
	
	REM ***** Pushbutton erzeugen
	oMod = oDialogModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
	With oMod
		.setPropertyValue("Label", "Weiter")
		.setPropertyValue("Name", "PB1")
		.setPropertyValue("PositionX", 35)
		.setPropertyValue("PositionY", oDialogModel.Height - 30)
		.setPropertyValue("FontName", Font)
		.setPropertyValue("FontHeight", Fontsize)
		.setPropertyValue("Height", Fontsize + 7)
		.setPropertyValue("Width", 2 * Fontsize + 20)
	End With
	
	oDialogModel.insertByName("PB1", oMod)
	
	REM ***** Pushbutton erzeugen
	oMod = oDialogModel.createInstance("com.sun.star.awt.UnoControlButtonModel")
	With oMod
		.setPropertyValue("Label", "Abbruch")
		.setPropertyValue("Name", "PB2")
		.setPropertyValue("PositionX", 80)
		.setPropertyValue("PositionY", oDialogModel.Height - 30)
		.setPropertyValue("FontName", Font)
		.setPropertyValue("FontHeight", Fontsize)
		.setPropertyValue("Height", Fontsize + 7)
		.setPropertyValue("Width", 2 * Fontsize + 20)
	End With
	
	oDialogModel.insertByName("PB2", oMod)
	
	oDialog1.setModel(oDialogModel)
	
	REM ***** Listener für den Weiter Button
	oPBListener1 = createUnoListener("PB1_", "com.sun.star.awt.XActionListener")
	oControl = oDialog1.getControl("PB1")
	oControl.addActionListener(oPBListener1)
	
	REM ***** Listener für den Abbruch Button
	oPBListener2 = createUnoListener("PB2_", "com.sun.star.awt.XActionListener")
	oControl = oDialog1.getControl("PB2")
	oControl.addActionListener(oPBListener2)
	
	REM ***** Mittels des Modells den Dialog anzeigen
	oWindow = CreateUnoService("com.sun.star.awt.Toolkit")
	oDialog1.createPeer(oWindow, null)
	oDialog1.execute()

End Sub

REM ***** Die Aktion des Listeners für den Weiter-Button
Sub PB1_actionPerformed(oEvent1)

	Dim i As Integer
	Dim count_cbState As Integer
	Dim cbState As Boolean
	Dim Datum_String As String
	
	Datum_String = Format(Date, "YYYY-MM-DD")
	count_cbState = 0
	
	If Schiesstag = 1 Then
	
		REM ***** Trage 1. Schiesstag in Tabelle "Saison" ein
		Query = "UPDATE ""Saison"" SET ""Beginn"" = {D '"& Datum_string &"'} WHERE ""Saison"" = "& Saison &" AND ""Aktiv"" = 'True'"
		Statement.executeUpdate(Query)
	
	End If
	
	REM ***** Werte aus Dialogfeld auslesen
	For i = 0 to UBOUND(Class())
	
		REM ***** CeckBox-Status im Dialog ansprechen
		CB = oDialog1.getControl(Class(i,0))
	
		REM ***** CeckBox-Status im Dialog auslesen
		cbState= CB.state
	
		REM ***** Daten in Tabelle "Fleischpreise_Schiesstag" schreiben
		Query = "INSERT INTO ""Fleischpreise_Schiesstag"" (""Schiesstag"", ""Klasse"", ""Fleisch"") VALUES ("& Schiesstag &", '"& Class(i,0) &"', '"& cbState &"')"
		Statement.executeUpdate(Query)
	
		Dim days As Integer
		days = Class(i,1)
	
		REM ***** Zähle Anzahl Klassen mit Fleisch
		If cbState Then
			count_cbState = count_cbState + 1	
		End If
	
		REM ***** Reduzieren Anzahl Fleischpreise
		If cbState Then
			If days > 0 Then
		
				REM ***** Anzahl Tage um 1 reduzieren
				days = days - 1
	
				Query = "UPDATE ""Fleischpreise_Anzahl"" SET ""Tage"" = "& days &" WHERE ""Klasse"" = '"& Class(i,0) &"'"
				Statement.executeUpdate(Query)
			End If
		End If
	Next i
	
	REM ***** Überprüfe ob wirklich Fleisch geschossen wird
	If count_cbState > 0 Then
		Fleisch = True
	Else
		Fleisch = False	
	End If
	
	REM ***** Aktuellen Schiesstag in Tabelle "Schiesstage" schreiben.
	Query = "INSERT INTO ""Schiesstage"" (""Saison"", ""Datum"", ""Schiesstag"", ""Fleisch"") VALUES ("& Saison &", {D '"& Datum_String &"'}, "& Schiesstag &", '"& Fleisch &"')"
	Statement.executeUpdate(Query)
	
	
	REM *****Entfernen der Listener 
	oDialog1.getControl("PB1").removeActionListener(oPBListener1)
	oDialog1.getControl("PB2").removeActionListener(oPBListener2)
	
	oDialog1.EndExecute()
	
End Sub

REM ***** Die Aktion des Listeners für den Abbruch-Button
Sub PB2_actionPerformed(oEvent2)

	REM *****Entfernen der Listener 
	oDialog1.getControl("PB1").removeActionListener(oPBListener1)
	oDialog1.getControl("PB2").removeActionListener(oPBListener2)
	
	REM *****Schliessen des Dialogs
	oDialog1.EndExecute()

End Sub
Die anderen Makros sind nach dem gleichen Schema aufgebaut.

Gruß
Buddy0815
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Daten verschwinden teilweise

Beitrag von F3K Total »

Hi,
ohne das ich deine Makros allesamt studiert habe, folgender Hinweis:
Ich hatte mal ein ähnliches Problem, aber mit Formularen zu Eingabe, nicht mit Dialogen.
Es fehlte mir dabei tatsächlich die Verbindung in die Datenbank, weil ich folgenden entscheidenden Befehl nicht kannte:

Code: Alles auswählen

oCon = ThisDatabaseDocument.CurrentController
If NOT ( oCon.isConnected() ) Then oCon.connect()

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
.
.
.
Auch bei mir waren die Daten manchmal da, und manchmal weg, der Grund:
Die Verbindung in die Datenbank wird z.B. dann automatisch hergestellt, wenn man ein Formular per Doppelklick öffnet, was ich aber per Makro erledigt hatte, oder wenn man in die Tabellen-Ansicht wechselt.

HTH
Gruß R

Edit: der Befehl

Code: Alles auswählen

ThisDatabaseDocument.CurrentController.connect()
muß pro Sitzung nur einmal ausgeführt werden.
Buddy0815
Beiträge: 4
Registriert: Sa, 12.03.2011 14:04

Re: Daten verschwinden teilweise

Beitrag von Buddy0815 »

Hallo F3K Total,

die Verbindung zur Datenbank baue ich doch hier auf:

Code: Alles auswählen

   DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
   DataSource = DatabaseContext.getByName("Datenbank")
   
   If Not DataSource.IsPasswordRequired Then
      Connection = DataSource.GetConnection("","")
   Else
      InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
      Connection = DataSource.ConnectWithCompletion(InteractionHandler)
   End If
Da das Makro außerhalb der DB läuft kann ich nicht über "ThisDatabaseDocument" arbeiten.

Kann die Ursache vielleicht die darin liegen, dass ich diese Datenbankverbindung mehrmals in verschiedenen Makros neu aufbaue?

Ich habe noch ca. 20 solcher Codeteile und dort baue ich jedes Mal die Datenbankverbindung wieder neu auf.

Gruß
Buddy0815
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Daten verschwinden teilweise

Beitrag von DPunch »

Aloha

Mal eine Frage am Rande dazu:
Weisst Du zu 100%, dass die Daten tatsächlich jemals in die Datenbank geschrieben wurden?
Buddy0815 hat geschrieben:Kann die Ursache vielleicht die darin liegen, dass ich diese Datenbankverbindung mehrmals in verschiedenen Makros neu aufbaue?
Unwahrscheinlich - zumal die Verbindung bei Standardeinstellungen (Connection Pooling) dabei in der Regel gar nicht erst neu aufgebaut wird.
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Daten verschwinden teilweise

Beitrag von F3K Total »

Hi,
ich habe mal mit folgendem Makro die Datenbank im Hintergrund geladen und die Verbindung getestet:

Code: Alles auswählen

    Sub Test_Verbindung

    Dim args(0) As New com.sun.star.beans.PropertyValue

     DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
     DataSource = DatabaseContext.getByName("Datenbank")
       
      If Not DataSource.IsPasswordRequired Then
          Connection = DataSource.GetConnection("","")
      Else
          InteractionHandler = createUnoService("com.sun.star.sdb.InteractionHandler")
          Connection = DataSource.ConnectWithCompletion(InteractionHandler)
      End If
       
        oUrl = Connection.parent.databasedocument.url
        args(0).Name = "Hidden"
        args(0).Value = True
        oDoc = StarDesktop.loadComponentFromURL(oUrl,"_blank", 0, args)
        oCon = oDoc.CurrentController
        msgbox "Vor dem .connect(): Verbindung = "+oCon.isconnected
        If NOT ( oCon.isConnected() ) Then oCon.connect()
        msgbox "Nach dem .connect(): Verbindung = "+oCon.isconnected
        oDoc.close(-1)
        msgbox "Hintergrunddokument geschlossen"
        end sub
Vielleicht solltest Du sie auch im Hintergrund laden?
Gruß R
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Daten verschwinden teilweise

Beitrag von DPunch »

Aloha
F3K Total hat geschrieben:Vielleicht solltest Du sie auch im Hintergrund laden?
Die entscheidende Frage: was soll das bringen?
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Daten verschwinden teilweise

Beitrag von F3K Total »

Hallo DPunch
ich hatte, wie gesagt, ein ähnliches Problem, und nachdem ich das .connect ausgeführt hatte, gings.
Siehe auch hier:
http://comments.gmane.org/gmane.comp.op ... .user/7880
und dort insbesondere den Satz von Frank:
From this
point onwards, all sub components, including the forms you open
programmatically, use the very same connection, so your data problem
should vanish.
Kann ja sein, dass ich hier völlig schief liege, einen Versuch wäre es doch wert?

Gruß Rik
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Daten verschwinden teilweise

Beitrag von DPunch »

Aloha
F3K Total hat geschrieben:ich hatte wie gesagt, ein ähnliches Problem
Ich sehe da ehrlich gesagt keinen Zusammenhang zwischen den beiden Themen.
In Deinem Fall geht es darum, dass sich Base zuerst mit der Datenbank verbinden muss, damit enthaltene Formulare diese Verbindung nutzen können.
Zum einen stellt Buddy0815 seinem Codeschnipsel nach die Verbindung aber per Hand her, ohne die Base-GUI als Front-End, zum anderen benötigt er keine Verbindung zwischen Formularen und Datenbank, weil er die Daten direkt per INSERT-Befehlen schreibt.
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Daten verschwinden teilweise

Beitrag von F3K Total »

Hallo DPunch,
ich kann es nicht erklären, aber wenn ich direkt von der OOo Benutzeroberfläche, ohne Laden eines Dokumentes eine Verbindung zu einer unter Extras/Optionen angemeldeten .odb-Datenbank, mit dem Befehl
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext") usw...
herstelle, und dann per "execute.update" mit dem SQL-Befehl "Insert ..." Daten hineinschreibe sind sie nach dem Schließen von OOo weg.
Wenn ich allerdings die .odb-Datei (mit embeddet HSQL-DB) im Hintergrund lade, und das .connect ausführe, werden die eingegebenen Daten dauerhaft gespeichert.
Ich habe den Satz von Frank
From this
point onwards, all sub components, including the forms you open
programmatically, use the very same connection, so your data problem
should vanish.
auch nicht so verstanden, das es sich bei den sub Components immer um Formulare handeln muß. Vielmehr so, dass die Verbindung in die embeddet HSQL-DB erst mit dem .connect erfolgt.

Kannst Du einen Weg aufzeigen, wie man es bei o.a. Scenario (angemeldete .odb Datenbank) schafft, Daten ohne das Öffnen des Datenbankdokumentes oder eines anderen Dokumentes, dauerhaft zu speichern?

Gruß R
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Daten verschwinden teilweise

Beitrag von DPunch »

Aloha
F3K Total hat geschrieben:Ich habe den Satz von Frank (...) auch nicht so verstanden, das es sich bei den sub Components immer um Formulare handeln muß. Vielmehr so, dass die Verbindung in die embeddet HSQL-DB erst mit dem .connect erfolgt.
Was "Frank" sagt, ist doch selbsterklärend - Base muss sich zunächst mit der Datenbank verbinden, danach steht allen sub components (Formulare, TableDataView, Abfragen etc) die dort aufgebaute Verbindung zur Verfügung. Hat aber immer noch nichts mit dem hier geschilderten Problem zu tun, denn die Verbindung besteht ja.
F3K Total hat geschrieben:(...)im Hintergrund lade, und das .connect ausführe(...)
Wie Du sehen wirst, hat das allerdings herzlich wenig mit dem .connect zu tun - die Verbindung besteht ja sowieso, s.o.

Was tatsächlich passiert, und auch reproduzierbar, ist, dass die Daten von Base zwischengespeichert werden, aber nur durch explizite Aufforderung auch permanent geschrieben werden, was wohl die Base-Implementierung einer gewissen Transaktionssicherheit darstellen soll.
Eine dieser Aufforderungen besteht aus dem Schliessen der Base-Datei.

Weitere Möglichkeiten sind z.B.

Code: Alles auswählen

DataSource.flush
oder

Code: Alles auswählen

oStatement = Connection.createStatement
sSQL = "CHECKPOINT DEFRAG"
oStatement.executeUpdate(sSQL)
oder eben das (egal ob versteckt oder nicht) Öffnen und wieder Schliessen der Base-Datei, wie Du es in Deinem Vorschlag ja auch tust.

Insofern muss ich Dir natürlich Recht geben, Dein Vorschlag funktioniert tatsächlich - wenn auch aus anderen Gründen, als Du angenommen hast ;)
F3K Total
********
Beiträge: 3720
Registriert: Mo, 28.02.2011 17:49

Re: Daten verschwinden teilweise

Beitrag von F3K Total »

Hallo DPunch,
bei mir klappt CHECKPOINT DEFRAG leider nicht, aber .flush ist super.
Nun, vielleicht hilft der Befehl ja nun auch dem Initiator des Threads.
Danke
Gruß Rik
Buddy0815
Beiträge: 4
Registriert: Sa, 12.03.2011 14:04

Re: Daten verschwinden teilweise

Beitrag von Buddy0815 »

Hallo F3K Total und DPunsh,

danke für euer Bemühen mir bei der Lösung zu helfen.

Was ich vergessen hatte zu erwähnen, ist, dass nach Schließen der Verbindung zur Datenbank immer noch eine Sperre auf die Datenbank (lck-Datei) besteht.
Diese wird erst mit Abmelden des Benutzers entfernt.

Ich werd am WE mal deinen Vorschlag mit "DataSource.flush" testen.

Was nur komisch ist, dass ich das Verhalten bei mir zu Hause nie reproduzieren kann. :(

Ich gebe euch Bescheid ob es was gebracht hat, oder nicht.

Danke und viele Grüße
Buddy0815
Antworten