gesamte Base-Datenbank über Formular schließen?

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

gesamte Base-Datenbank über Formular schließen?

Beitrag von geimist »

Hallo miteinander,

dank der Hilfe von eBayer konnte ich über das Startformular einer Basedatenbank diese auch beenden (über das Schließenkreuz sowie über eine Schaltfläche).
Leider funktioniert dies in letzter Zeit nicht mehr zuverlässig (ob es mit OOo 3.2 zusammenhängt, kann ich nicht definitiv sagen), jedenfalls stürzt OOo dabei sehr oft ab.
Evtl. muss ich noch eine andere Möglichkeit finden.

Am einleuchtensten wäre für mich:

Code: Alles auswählen

ThisComponent.parent.close(true)
Das schließt zwar auch die .odb-Datei, aber das Startformular bleibt im 'eingefrorenen' Zustand stehen :?

Als Anlage noch die Lösung von eBayer
Dateianhänge
Schliessen.zip
Die Lösung von eBayer
(11.32 KiB) 216-mal heruntergeladen
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von eBayer »

Hallo Stephan,
ich habe auch grad meine Erfahrungen mit 3.2 gemacht.
Wenn ich mich nicht irre zoomst Du Deine Formulare entsprechend der Bildschirmauflösung per Makro.....?
Das läuft unter 3.2 nicht mehr so. Das gemeine daran ist, Base meldet zur Laufzeit keinen Fehler...... Erst beim Herunterfahren der Anwendung meldet oo einen Fehler.
Ein weiteres Problem könnte damit zusammenhängen, daß Du die Connection zur Datenbank bereits im Menuformular schließt.
Ich bin dazu übergegangen, daß ich die Connection erst im Startmodul schließe, also nachdem die eigentliche Anwendung bereits beendet ist.
Dann solltest Du prüfen, welche Ereignisse beim Beenden Deines Menüformulars abgearbeitet werden.
Da hat sich offensichtlich unter 3.2 auch was geändert. Es werfen nun alle Ereignisse abgearbeitet, egal, wie Du das Formular beendest.
Ich weiß, das ist jetzt alles etwas allgemein, aber wenn Du etwas klarer siehst, kann ich Dir evtl. den entscheidenden Tipp geben - meine Anwendung läuft inzwischen auch unter 3.2.
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von eBayer »

Hallo Stephan,
ich habe mir Dein Schliessen mal angeschaut.
Sehe ich das richtig, daß es ein Auszug aus Deinem Startmodul ist?

Ob DAS unter oo 3.2 noch so läuft, ist mir nicht ganz klar.
Nach meiner Meinung kannst Du auf die ersten 3 Zeilen verzichten und dann im folgenden "Parent" rausschmeißen.
Gruß und viel Erfolg bei "Jugend forscht".
eBayer

* oDoc = ThisComponent.CurrentController.Frame
* oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
* oDispatch.executeDispatch(oDoc, ".uno:CloseDoc", "", 0, Array()) ' jetzt das aktive Formular schließen

oDoc = ThisComponent.Parent.CurrentController.Frame
oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
oDispatch.executeDispatch(oDoc, ".uno:CloseDoc", "", 0, Array())
oDispatch.executeDispatch(oDoc, ".uno:CloseWin", "", 0, Array())
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von geimist »

Hallo eBayer,

(ich war das nicht mit dem zoomen... :) )

also so richtig will es noch nicht laufen.
Hier noch einmal meine komplette Routine zum schließen (1x über Schließenkreuz / 1x über eigenen Button)

Code: Alles auswählen

Function isClosed() As Boolean
	isClosed = bGlobalClosed
End Function

Function setClosed(bClosed)
	bGlobalClosed = bClosed
End Function

Sub DATENBANK_Per_X_SCHLIESSEN 'an das Startformular (Dokument schliessen) gebunden

	Dim oDoc As Object
	Dim oDispatch As Object
	
	if isClosed() = true then
		exit Sub
	end if
				
	ThisComponent.Parent.store
	
'**********************************************************************************************************	

	oDoc = ThisComponent.CurrentController.Frame
	oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
	oDispatch.executeDispatch(oDoc, ".uno:CloseDoc", "", 0, Array()) ' jetzt das aktive Formular schließen

	oDoc = ThisComponent.Parent.CurrentController.Frame
	oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
	oDispatch.executeDispatch(oDoc, ".uno:CloseDoc", "", 0, Array())
	oDispatch.executeDispatch(oDoc, ".uno:CloseWin", "", 0, Array())
	
End Sub

'**********************************************************************************************************

Sub DATENBANK_SCHLIESSEN 'über eigenen Button

	Dim oDoc As Object
	Dim oDispatch As Object
		
	ThisComponent.Parent.store() 

	setClosed(True)		' damit wird das erneute Schliessen bei Programmende verhindert

	oDoc = ThisComponent.Parent.CurrentController.Frame
	oDispatch = createUnoService("com.sun.star.frame.DispatchHelper")
	oDispatch.executeDispatch(oDoc, ".uno:CloseDoc", "", 0, Array())
	oDispatch.executeDispatch(oDoc, ".uno:CloseWin", "", 0, Array())

End Sub
Bei der Methode über den Button kommt es jetzt zu dieser Meldung:
Bild
in der letzten Zeile oDispatch.executeDispatch(oDoc, ".uno:CloseWin", "", 0, Array()) , aber nur wenn noch andere Fenster von OOo geöffnet sind. Nehme ich die Zeile heraus, so bleibt das OOo Startfenster (neues Writerdokument / Calcdokument ...) geöffnet und OOo beendet nicht endgültig (sofern keine anderen Fenster geöffnet sind).

Was mache ich da noch falsch???
Zuletzt geändert von geimist am Do, 18.02.2010 14:31, insgesamt 1-mal geändert.
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von geimist »

Ich habe noch eins vegessen:
Über das Schließenkreuz beendet (im Startformular und somit beim Abarbeiten des obigen Makros), friert OOo immer ein :(
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von eBayer »

Hallo Stephan,
um zu verstehen, aus welchem Zusammenhang sich die Fehlersituation ergibt, müsste man Deine Anwendung mal genauer anschauen.
Ich kann Dir nur anbieten, Dir eine kleine Testanwendung, die mit externem Startmodul auch unter 3.2 arbeitet, zu schicken.
Alles was wichtig ist, habe ic in einer ReadMe-Datei beschrieben. Selbst wenn ich alle Formulare geöffnet lasse und die Anwendung beende, läuft das sauber.
Ich kann Dir allerdings nicht ersparen, daß Du Dich ein wenig in die Anwendung einlesen mußt.
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von geimist »

Vielen Dank für dein Angebot welches ich natürlich gerne nutzen würde. Ich werde auch ganz brav versuchen, die für mich relevanten Informationen herauszulesen. :)

Wie möchtest du mir das zukommen lassen? Möchtest du es als Anlage hoch laden, oder ist dir das nicht recht?
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von geimist »

Zwecks Fehleranalyse: Das Fehlverhalten kann ich auch mit der Beispielanwendung (Anhang 1. Beitrag) nachvollziehen, nur dass beim Beenden über den Button bei weiteren geöffneten Fenstern keine Fehlermeldung auftritt, sondern die Anwendung einfriert.
Wenn es dich interessiert, kannst du da ja nachschauen (meine DB bzw. Extension kann ich dir leider nicht zukommen lassen)
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von eBayer »

Hallo Stephan,
Dein Beispiel mit "Schliessen" habe ich mir angeschaut. Das läuft bei mir weder über das X noch über den Button richtig.
Beiliegend meine Testanwendung. Der einfachste Weg, die Makros des Startmoduls anzuschauen ist ein für Makros nicht freigegebenes Verzeichnis.
Viel Erfolg und Gruß
eBayer
Dateianhänge
SampleDB.zip
(121.14 KiB) 187-mal heruntergeladen
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von geimist »

Hallo eBayer,

vielen Dank für dein Beispiel.
(Nettes Bild 8) )

Bei deinem Beispiel tritt die Fehlermeldung genauso auf wie bei meiner Lösung, sofern noch andere Dokumente geöffnet sind!?
Ich habe es gerade nocheinmal mit der portablen Version 3.1.1 versucht, und siehe da: Es kommt keine Fehlermeldung und das Makro arbeitet erwartungsgemäß.

Kannst du mal probieren, ob deine Anwendung ordnungsgemäß beendet werden kann, sofern noch andere Dokumente geöffnet sind? (Du arbeitest doch schon mit 3.2 wenn ich mich richtig erinnere?)

Danke
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von eBayer »

Hallo Stephan,
es geht nichts über eine detaillierte Fehlerbeschreibung :)
Ich hatte es bisher immer mit mehreren geöffneten Formularen versucht......
Daß Du ein parallell zur Anwendung gleichzeitig geöffnetes Dokument meinst, war mir micht klar.
Der Fehler tritt bei mir auch auf (unter 3.2)
Unter 3.1.1 bleiben die geöffneten externen Dokumente offen und die Anwendung wird ordnungsgemäß geschlossen.
Ich habe 3.2 zum Kompatibilitätstest auf meinem Notebook. Es sind schon einige Dinge hochgekommen.... insbesondere auch mit SRB.
Deshalb...... man muß nicht immer der Erste sein.
Ich werde mal ein wenig forschen.......
Gruß eBayer
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von geimist »

Entschuldige bitte - meine Ausdrucksweise war in der Tat nicht sehr deutlich.
Kannst du das Einfrieren beim Schließen über das Kreuz aus einem Formular heraus (mit entsprechend angebundener Routine) rekonstruieren?

Die Fehlermeldung habe ich erst einmal provisorisch über einen Errorhandler abgefangen :?
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
eBayer
******
Beiträge: 556
Registriert: Do, 04.12.2008 14:33
Wohnort: Augsburg

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von eBayer »

Hallo Stephan,
ich denke, ich habe die Lösung.......
Schau Dir den folgenden Code mal an.
Die Überlegung ist: wie erkenne ich, daß nach Beendigung meiner Anwendung noch ein Writer oder Calc-Dokument offen ist!
Mit dem unten stehenden Code klappt es, allerdings bleibt die Anwendung durch OO gesperrt.... Du könntest sie also nicht umbenennen oder löschen.
Nach dem schließen des letzten externen Dokuments wird die Anwendung dann von OO freigegeben.

Gruß eBayer

Function CountAllForms ' alle offenen Fenster zählen, nachdem die Anwendung selbst beendet ist - also nach "uno:closeDoc"
GlobalScope.BasicLibraries.LoadLibrary("Tools")
Dim oDocs As Object, oDoc As Object, oComponents As Object, oDispatch As Object, i As Integer
i = 0
oComponents = StarDesktop.getComponents()
oDocs = oComponents.createEnumeration()
DO WHILE oDocs.hasMoreElements()
ON ERROR resume next
oDoc = oDocs.nextElement()
i = i + 1
' msgbox oDoc.title
LOOP
CountAllForms = i
End Function


----------------------------------------- im Startmodul nach "oDispatch.executeDispatch(oDoc, ".uno:CloseDoc", "", 0, Array())" einfügen.
if CountAllForms() = 0 then ' kein externes Fenster offen
oDispatch.executeDispatch(oDoc, ".uno:CloseWin", "", 0, Array())
end if
Intel(R) Core(TM)2 Quad CPU Q8200 @ 2.33GHz mit 4 GB Memory (3,2 GB aktiv)
Vista Home Premium 32 Bit
openOffice 3.1.1 mit Sun Report Builder 1.1.0 und MySql 5.1
Hauptinteresse ooBase seit 12.2008
geimist
****
Beiträge: 191
Registriert: Fr, 15.02.2008 16:10

Re: gesamte Base-Datenbank über Formular schließen?

Beitrag von geimist »

Vielen Dank für deine Mühe. Auf diese Weise geht es jetzt. :D
Gruß
Stephan

LibreOffice 5.3 - MAC OS/X 10.11
Antworten