[gelöst] Dateninkonsistenz (Verbindung über Dialog)
Moderator: Moderatoren
[gelöst] Dateninkonsistenz (Verbindung über Dialog)
Hallo Forum,
das nächste Problem hat sich bei mir ergeben. Wenn ich in mein Formular Daten eingebe, werden diese zwar zunächst in die DB geschrieben und können auch durch Abfragen gefunden werden, aber die Speicherung ist nicht dauerhaft: Verlasse ich nun Base, sind die Daten beim Nächsten Start wieder weg (bzw. im Falle von durchgeführten Löschaktionen wieder da)!
Es wird noch seltsamer: Ich wollte nochmal selber in der Tabelle nach den Daten sehen, öffnete sie per Doppelklick, sah, dass die Daten wie erwartet da waren, schloss Tabelle und Base und siehe da: Beim nächsten Base-Start waren die Daten tatsächlich immer noch da! Das ließ sich übrigens mit Löschvorgängen analog reproduzieren.
Jetzt frage ich mich natürlich, was da los ist... Das Formular hat schließlich vorher funktioniert und ich habe an den DB-Zugriffs-Makros seitdem (ziemlich sicher) nichts geändert. (DB ist natürlich angemeldet)
Der Fehler tritt übrigens mit allen Formularen der DB auf. Sowohl mit denen, bei denen ich kräftig programmiert habe, als auch, bei einfachen per Assistent erstellten Standardformularen.
Hat jemand so schon ne Idee, oder würde sich meine DB-Datei mal ansehen? Hier Struktur und Makros zu posten würde den Rahmen etwas sprengen
EDIT: Mir ist gerade nochmal aufgefallen, dass manchmal wenn ich mein DB-Dokument schließe der Sound einer Fehlermeldung kommt, aber es gibt keine Fehlermeldung!? Konnte ich auch nicht mit bestimmten Aktionen meinerseits in Verbindung bringen.
OpenOffice.org 3.3.0 ,OOO330m20 (Build:9567) auf Windows XP SP3
das nächste Problem hat sich bei mir ergeben. Wenn ich in mein Formular Daten eingebe, werden diese zwar zunächst in die DB geschrieben und können auch durch Abfragen gefunden werden, aber die Speicherung ist nicht dauerhaft: Verlasse ich nun Base, sind die Daten beim Nächsten Start wieder weg (bzw. im Falle von durchgeführten Löschaktionen wieder da)!
Es wird noch seltsamer: Ich wollte nochmal selber in der Tabelle nach den Daten sehen, öffnete sie per Doppelklick, sah, dass die Daten wie erwartet da waren, schloss Tabelle und Base und siehe da: Beim nächsten Base-Start waren die Daten tatsächlich immer noch da! Das ließ sich übrigens mit Löschvorgängen analog reproduzieren.
Jetzt frage ich mich natürlich, was da los ist... Das Formular hat schließlich vorher funktioniert und ich habe an den DB-Zugriffs-Makros seitdem (ziemlich sicher) nichts geändert. (DB ist natürlich angemeldet)
Der Fehler tritt übrigens mit allen Formularen der DB auf. Sowohl mit denen, bei denen ich kräftig programmiert habe, als auch, bei einfachen per Assistent erstellten Standardformularen.
Hat jemand so schon ne Idee, oder würde sich meine DB-Datei mal ansehen? Hier Struktur und Makros zu posten würde den Rahmen etwas sprengen
EDIT: Mir ist gerade nochmal aufgefallen, dass manchmal wenn ich mein DB-Dokument schließe der Sound einer Fehlermeldung kommt, aber es gibt keine Fehlermeldung!? Konnte ich auch nicht mit bestimmten Aktionen meinerseits in Verbindung bringen.
OpenOffice.org 3.3.0 ,OOO330m20 (Build:9567) auf Windows XP SP3
Zuletzt geändert von Jott am So, 06.03.2011 09:33, insgesamt 2-mal geändert.
Re: In Formular eingegebene Daten bleiben nicht dauerhaft in
Ich konnte das Problem jetzt eingrenzen:
Ich hatte ein Navigationsformular, das sich mit der DB öffnete und von dem aus ich alle anderen Formulare angesteuert habe. Dies habe ich (hauptsächlich aus optischen Gesichtspunkten heraus) durch einen Dialog ersetzt. Dieser funktioniert auch. Jetzt habe ich den Verdacht, dass die im Dialog erstellte DB-Verbindung irgendwie mit den DB-Verbindungen meiner Formulare in Konflikt tritt. Meine Idee ist es jetzt, den Dialog beim Öffnen eines Formulares zu schließen und die DB-Verbindung zu kappen.
Dieser Code für den Dialog:
Dieser Code fürs Formular-öffnen:
Jetzt zickt das Formular aber rum: Bei oForm.moveToInsertRow() kommt eine SQL-Exception ("Falsche Funktionsfolge"):
Die DB-Verbindung besteht aber und die ListBox wird auch gefüllt. Sieht jemand was? Was mich wundert: Es funktioniert anscheinend nicht (wenn man den Navigationsdialog nicht schließt) aus den Formular-Makros auf die im Dialog erstellte DB-Verbindung zuzugreifen, obwohl die entsprechenden Variablen "Public" sind. Irgendwie verstehe ich das Phänomen Dialog noch nicht so ganz...
EDIT: Ja, habe mal auf "Formularsteuerung" zurückgerüstet, jetzt ist allles wieder konsistent. Würde mich aber sehr freuen, wenn mir jemand das mit den Dialogen mal erklären könnte. Macht nämlich einfach einen professionelleren Eindruck
Ich hatte ein Navigationsformular, das sich mit der DB öffnete und von dem aus ich alle anderen Formulare angesteuert habe. Dies habe ich (hauptsächlich aus optischen Gesichtspunkten heraus) durch einen Dialog ersetzt. Dieser funktioniert auch. Jetzt habe ich den Verdacht, dass die im Dialog erstellte DB-Verbindung irgendwie mit den DB-Verbindungen meiner Formulare in Konflikt tritt. Meine Idee ist es jetzt, den Dialog beim Öffnen eines Formulares zu schließen und die DB-Verbindung zu kappen.
Dieser Code für den Dialog:
Code: Alles auswählen
Sub DialogNavi_aufrufen
call DBInit
call DialogNaviInit
oDiaNavi.execute
Verbindung.commit()
Verbindung.close()
End Sub
Sub DBInit
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
Datenquelle = DatabaseContext.getByName("Gefahrstoffe_testversion2")
Dokument = Datenquelle.DatabaseDocument
Verbindung = Datenquelle.GetConnection("","")
SQL_Anweisung = Verbindung.createStatement()
End Sub
Sub DialogNaviInit
DialogLibraries.LoadLibrary("Standard")
oDiaNavi = createUnoDialog(DialogLibraries.Standard.Dialog_Navigation)
End Sub
Code: Alles auswählen
Sub OpenForm_Raeu( oev as variant )
sFormName = "Räume verwalten"
OpenForm( getFormsTC, getConnectionTC, sFormName )
End Sub
function OpenForm( formContainer as variant, oConnection as variant, sFormName as string) as variant
Dim aProp(1) As New com.sun.star.beans.PropertyValue
aProp(0).Name = "ActiveConnection"
aProp(0).Value = oConnection
aProp(1).Name = "OpenMode"
aProp(1).Value = "open"
oDiaNavi.endExecute()
OpenForm = formContainer.loadComponentFromURL(sFormName,"_blank",0,aProp())
end function
function getFormsTC() as variant
getFormsTC = Dokument.getFormDocuments
end function
function getConnectionTC() as variant
getConnectionTC = Verbindung
end function
Code: Alles auswählen
Sub FormRVStart
call ListBox_fuellenRV
oForm.moveToInsertRow()
End Sub
Sub FormRVInit
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
Datenquelle = DatabaseContext.getByName("Gefahrstoffe_testversion2")
Verbindung = Datenquelle.GetConnection("","")
SQL_Anweisung = Verbindung.createStatement()
oForm = ThisComponent.drawpage.forms.getByName("MainForm")
oListBox = oForm.getByName("Lst")
oTextFieldNummer = oForm.getByName("TxtNummer")
oTextFieldName = oForm.getByName("TxtName")
End Sub
Sub ListBox_fuellenRV
dim i as Integer, length as Integer
dim aListe(1) as String
call FormRVInit
SQL_Anweisung.ResultSetType = com.sun.star.sdbc.ResultSetType.SCROLL_SENSITIVE
Sql = "SELECT (""Nummer"" || ' --- ' || ""Name"") AS ""Raum"" FROM ""Ort"" ORDER BY ""Nummer"""
ResultSet = SQL_Anweisung.executeQuery(Sql)
if ResultSet.next() then
ResultSet.last() 'lädt alle Datensätze
length = ResultSet.getRow()
redim aListe(1 to length)
ResultSet.beforeFirst()
for i=1 to length
ResultSet.next()
aListe(i) = ResultSet.getString(1)
next i
else
aListe(0) = "nichts gefunden"
end if
oListBox.StringItemList = aListe
End Sub
Die DB-Verbindung besteht aber und die ListBox wird auch gefüllt. Sieht jemand was? Was mich wundert: Es funktioniert anscheinend nicht (wenn man den Navigationsdialog nicht schließt) aus den Formular-Makros auf die im Dialog erstellte DB-Verbindung zuzugreifen, obwohl die entsprechenden Variablen "Public" sind. Irgendwie verstehe ich das Phänomen Dialog noch nicht so ganz...
EDIT: Ja, habe mal auf "Formularsteuerung" zurückgerüstet, jetzt ist allles wieder konsistent. Würde mich aber sehr freuen, wenn mir jemand das mit den Dialogen mal erklären könnte. Macht nämlich einfach einen professionelleren Eindruck
Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia
Hallo Jott,
mir passiert genau das gleiche.
Das ist ein Supergau.
Ich öffne in meiner DB alle Formulare über Makros und verwende Dialoge.
Inzwischen habe ich durch herumprobieren folgendes herausgefunden:
1.) Die Ansicht, die beim Öffnen von Base erscheint, ist die Ansicht auf die Formulare.
Wechselt man einmal in die Tabellen-Ansicht, funktioniert alles wie gewohnt.
2.) Öffnet man ein Formular nicht über die Makros, sondern durch Doppelklick in der Ansicht Formulare, funktioniert auch alles wie gewohnt.
Ich schließe daraus, dass die Datenbankverbindung erst in dem Augenblick aufgebaut wird, in dem man eine der beiden o.a. Aktionen durchführt.
Das bekannte
scheint nicht mehr auszureichen, um Base zu veranlassen, eine Verbindung in die DB zu erzeugen.
Jetzt suche ich also jemanden, der sagen kann, wie man entweder dafür sorgt, das die Tabellenansicht beim Start von Base aufgerufen wird, oder weiß, wie man per Basic-Makro die Datenbankverbindung sicher aufbaut.
hast Du eine Idee?
... inzwischen habe ich mit xray weiter herausgefunden:
... das die "activeConnection" solange leer bleibt, bis man eine der beiden o.a. Aktionen durchführt.
Die Frage ist, wie kommt man per Makro dazu dass die "activeConnection" erzeugt wird?
Was ich bei der Sache überhaupt nicht verstehe, ist, dass das Lesen von Daten aus der DB funktioniert, das Schreiben in die DB aber eben nicht.
mir passiert genau das gleiche.
Das ist ein Supergau.
Ich öffne in meiner DB alle Formulare über Makros und verwende Dialoge.
Inzwischen habe ich durch herumprobieren folgendes herausgefunden:
1.) Die Ansicht, die beim Öffnen von Base erscheint, ist die Ansicht auf die Formulare.
Wechselt man einmal in die Tabellen-Ansicht, funktioniert alles wie gewohnt.
2.) Öffnet man ein Formular nicht über die Makros, sondern durch Doppelklick in der Ansicht Formulare, funktioniert auch alles wie gewohnt.
Ich schließe daraus, dass die Datenbankverbindung erst in dem Augenblick aufgebaut wird, in dem man eine der beiden o.a. Aktionen durchführt.
Das bekannte
Code: Alles auswählen
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext")
Datenquelle = DatabaseContext.getByName(StarDesktop.CurrentComponent.getLocation())
Verbindung = Datenquelle.GetConnection("","")' ("Benutzername","Passwort")
SQL_Anweisung = Verbindung.createStatement()
Jetzt suche ich also jemanden, der sagen kann, wie man entweder dafür sorgt, das die Tabellenansicht beim Start von Base aufgerufen wird, oder weiß, wie man per Basic-Makro die Datenbankverbindung sicher aufbaut.
hast Du eine Idee?
... inzwischen habe ich mit xray weiter herausgefunden:
Code: Alles auswählen
xray thisComponent.currentController.activeConnection
Die Frage ist, wie kommt man per Makro dazu dass die "activeConnection" erzeugt wird?
Was ich bei der Sache überhaupt nicht verstehe, ist, dass das Lesen von Daten aus der DB funktioniert, das Schreiben in die DB aber eben nicht.
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia
Ich verstehe es richtig, dass du als "Navigationsfenster" einen Dialog genutzt hast?
Wie gesagt: Ich verstehe den Grund unseres Problemes nicht, aber ersetzt du einfach den Dialog durch ein entsprechendes Formular, sollte es mit der Datenkonsistenz klappen (tut es bei mir zumindest). Ist leider nur optisch nicht so schön...
Wie gesagt: Ich verstehe den Grund unseres Problemes nicht, aber ersetzt du einfach den Dialog durch ein entsprechendes Formular, sollte es mit der Datenkonsistenz klappen (tut es bei mir zumindest). Ist leider nur optisch nicht so schön...
Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia
Hallo Jott,
nicht ganz, ich steuere meine Datenbank über eigene Menüs.
Aus diesen Menüs heraus öffne ich mal ein Formular und mal einen Dialog.
Ich öffne also meine Datenbank, und öffne dann direkt, ohne in die Ansicht "Tabellen" zu wechseln oder ein Fomular per Doppelklick in der Ansicht "Formulare" zu öffnen, ein Formular oder einen Dialog über ein Menü, an dem ein Makro hängt.
Auf diese Weise kommt das Problem meiner Einschätzung nach zustande:
Um Daten in die Datenbank speichern zu können, muß es zwischen Datenbank-Dokument und der eingebetteten HSQLDB, sprich dem Ort, an dem die Daten gespeichert werden, eine "activeConnection" geben.
Mit xray von der Benutzeroberfäche der Datenbank aus, kann man diese "activeConnection" beobachten, und zwar mit dem Befehl
Solange man in Base nicht in die Ansicht "Tabellen" gewechselt ist, bzw. kein Formular in der Ansicht "Formulare" per Doppelklick geöffnet hat, ist die "activeConnection" nicht vorhanden, zeigt im xray keinen Inhalt.
Ich dachte bisher, mit einem Makro und dem o.a. Befehl wird diese Verbindung erzeugt.
Komischerweise kommt sie auch halbwegs zustande, denn die per Makro geöffneten Dokumente zeigen ja Daten an, sprich, es werden Daten aus der Datenbank (embeddet-HSQLDB) gelesen.
Wenn nun aber Daten geändert werden, wie gesagt, der Dialog oder das Formular wurde per Makro geöffnet, und die Datenbank dann wieder geschlossen wird, sind die eingegebenen Daten weg, also nicht abgespeichert, nicht in die Datenbank geschrieben.
Wenn man stattdessen, vor dem Öffnen eines Formulares oder eines Dialoges per Makro, einmal in die Tabellenansicht wechselt oder ein Formular per Doppelklick öffnet, ist die "activeConnection" im xray nicht mehr leer.
Sprich die Verbindung in die HSQLDB ist "geschaltet" und zwar fürs Lesen und fürs Schreiben.
Ab jetzt werden alle geänderten, hinzugefügten Daten sauber abgespeichert.
Also, aus meiner Sicht handelt es sich hier um einen Bug in Base.
Die Frage ist, wie können wir sicherstellen, dass die "activeConnection" zustande kommt, ohne vorher ein Formular per Doppelklick zu öffnen oder in die Ansicht "Tabellen" wechseln zu müssen?
Hat jemand eine Idee?
nicht ganz, ich steuere meine Datenbank über eigene Menüs.
Aus diesen Menüs heraus öffne ich mal ein Formular und mal einen Dialog.
Ich öffne also meine Datenbank, und öffne dann direkt, ohne in die Ansicht "Tabellen" zu wechseln oder ein Fomular per Doppelklick in der Ansicht "Formulare" zu öffnen, ein Formular oder einen Dialog über ein Menü, an dem ein Makro hängt.
Auf diese Weise kommt das Problem meiner Einschätzung nach zustande:
Um Daten in die Datenbank speichern zu können, muß es zwischen Datenbank-Dokument und der eingebetteten HSQLDB, sprich dem Ort, an dem die Daten gespeichert werden, eine "activeConnection" geben.
Mit xray von der Benutzeroberfäche der Datenbank aus, kann man diese "activeConnection" beobachten, und zwar mit dem Befehl
Code: Alles auswählen
xray thisComponent.currentController
Ich dachte bisher, mit einem Makro und dem o.a. Befehl
Code: Alles auswählen
DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext") ...
Komischerweise kommt sie auch halbwegs zustande, denn die per Makro geöffneten Dokumente zeigen ja Daten an, sprich, es werden Daten aus der Datenbank (embeddet-HSQLDB) gelesen.
Wenn nun aber Daten geändert werden, wie gesagt, der Dialog oder das Formular wurde per Makro geöffnet, und die Datenbank dann wieder geschlossen wird, sind die eingegebenen Daten weg, also nicht abgespeichert, nicht in die Datenbank geschrieben.
Wenn man stattdessen, vor dem Öffnen eines Formulares oder eines Dialoges per Makro, einmal in die Tabellenansicht wechselt oder ein Formular per Doppelklick öffnet, ist die "activeConnection" im xray nicht mehr leer.
Sprich die Verbindung in die HSQLDB ist "geschaltet" und zwar fürs Lesen und fürs Schreiben.
Ab jetzt werden alle geänderten, hinzugefügten Daten sauber abgespeichert.
Also, aus meiner Sicht handelt es sich hier um einen Bug in Base.
Die Frage ist, wie können wir sicherstellen, dass die "activeConnection" zustande kommt, ohne vorher ein Formular per Doppelklick zu öffnen oder in die Ansicht "Tabellen" wechseln zu müssen?
Hat jemand eine Idee?
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia
Ah, OK.
Meine Lösung, ein Formular per Makro beim Dokumentstart zu starten und dann bei jedem Makroaufruf wieder den in deinem ersten Posting aufgeführten Code auszuführen funktioniert rätselhafterweise ja schonmal Ist aber natürlich für dich leider keine Lösung.
Meine Lösung, ein Formular per Makro beim Dokumentstart zu starten und dann bei jedem Makroaufruf wieder den in deinem ersten Posting aufgeführten Code auszuführen funktioniert rätselhafterweise ja schonmal Ist aber natürlich für dich leider keine Lösung.
Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia
Hallo Jott,
habe Deine Lösung gerade ausprobiert, funktioniert bei mir leider nicht.
Auch wenn ich ein Formular per Makro bei beim Dokumentstart öffne, gibt es keine "activeConnection" und weiterhin verschwundene Daten.
Na, ich forsche mal weiter.
habe Deine Lösung gerade ausprobiert, funktioniert bei mir leider nicht.
Auch wenn ich ein Formular per Makro bei beim Dokumentstart öffne, gibt es keine "activeConnection" und weiterhin verschwundene Daten.
Na, ich forsche mal weiter.
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia
Mir ist gerade noch eine Idee dazu gekommen.
Wie hast du denn das erste Formular geöffnet? Ich folgendermaßen (nix außer diesem Code ausgeführt):
"Navigation" ist dabei der Name des Formulars, FALSE heißt 'non-edit-mode'.
Wenn du's anders gemacht hast, könnte das der Grund dafür sein, dass es bei dir nicht geht...
Wie hast du denn das erste Formular geöffnet? Ich folgendermaßen (nix außer diesem Code ausgeführt):
Code: Alles auswählen
Sub FormAutostart
dim oCon as object
oCon = ThisDatabaseDocument.CurrentController
If NOT ( oCon.isConnected() ) Then oCon.connect()
oCon.loadComponent(com.sun.star.sdb.application.DatabaseObject.FORM,"Navigation",FALSE)
End Sub
Wenn du's anders gemacht hast, könnte das der Grund dafür sein, dass es bei dir nicht geht...
Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia
Hallo Jott, hallo Halis,
ich glaube Jott hat uns soeben die Lösung präsentiert:
Wenn ich diesen Code beim Öffnen der DB ausführen lasse, ist die "ActiveConnetion" da und meine Formulare und Dialoge funzen, wie es sein soll.
Superklasse, genau das habe ich gesucht.
Vielen Dank Jott.
Übrigens glaube ich, dass Du Deinen Dialog wieder verwenden kannst, wenn du diesen Code vorher ausführst.
Aus meiner Sicht, ist das Problem damit gelöst, kennzeichnest Du es als "solved?"
ich glaube Jott hat uns soeben die Lösung präsentiert:
Code: Alles auswählen
dim oCon as object
oCon = ThisDatabaseDocument.CurrentController
If NOT ( oCon.isConnected() ) Then oCon.connect()
Superklasse, genau das habe ich gesucht.
Vielen Dank Jott.
Übrigens glaube ich, dass Du Deinen Dialog wieder verwenden kannst, wenn du diesen Code vorher ausführst.
Aus meiner Sicht, ist das Problem damit gelöst, kennzeichnest Du es als "solved?"
- miniKasse MMove 1.0.6 Base Videotutorial
- Windows 10: AOO, LO Linux Mint: AOO, LO
Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia
Darauf, dass es an diesem Befehl liegt, hätte ich mal gleich kommen sollen.
Ist markiert.
Ist markiert.