[gelöst] Dateninkonsistenz (Verbindung über Dialog)

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

[gelöst] Dateninkonsistenz (Verbindung über Dialog)

Beitrag von Jott »

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 :D

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.
Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

Re: In Formular eingegebene Daten bleiben nicht dauerhaft in

Beitrag von Jott »

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:

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
Dieser Code fürs Formular-öffnen:

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
Jetzt zickt das Formular aber rum: Bei oForm.moveToInsertRow() kommt eine SQL-Exception ("Falsche Funktionsfolge"):

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 8)
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia

Beitrag von F3K Total »

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

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()
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:

Code: Alles auswählen

xray thisComponent.currentController.activeConnection
... 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.
Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia

Beitrag von Jott »

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...
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia

Beitrag von F3K Total »

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

Code: Alles auswählen

xray thisComponent.currentController
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

Code: Alles auswählen

DatabaseContext = createUnoService("com.sun.star.sdb.DatabaseContext") ...
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?
Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia

Beitrag von Jott »

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.
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia

Beitrag von F3K Total »

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.
Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia

Beitrag von Jott »

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):

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
"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...
F3K Total
********
Beiträge: 3706
Registriert: Mo, 28.02.2011 17:49

Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia

Beitrag von F3K Total »

Hallo Jott, hallo Halis,
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()
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?"
Jott
*
Beiträge: 18
Registriert: Mo, 21.02.2011 11:49

Re: Daten bleiben nicht dauerhaft in DB (Verbindung über Dia

Beitrag von Jott »

Darauf, dass es an diesem Befehl liegt, hätte ich mal gleich kommen sollen.

Ist markiert. :lol:
Antworten