
Gelöst: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
Gelöst: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
Moin in die Runde,
es gibt ja einige Methoden, einem Nutzer der Datenbank den Zugriff auf die Makroprogrammierung, Datenbank- und Formularbearbeitung und überhaupt auf das Datenbankfenster zu sperren. Ich mache bereits folgendes:
- Bei Öffnen der Datenbank wird sofort das Formular, in dem der Anwender seine Arbeit machen soll, geöffnet,
- Die Menuzeile, Symbole usw. werden ausgeblendet,
- Das Datenbankfenster wird ausgeblendet,
- Die Datenbank wird über einen fetten "Ende"-Button sauber geschlossen.
Alles hierfür nötige habe ich mit leichten Abwandlungen in Forum und/oder Handbuch gefunden.
Doch es bleibt die Möglichkeit, über das Schließkreuz des Formulars in das Datenbankfenster zu gelangen. Nun würde ich gerne über das "Vor Entladen"-Ereignis des Formulars das Schließen verhindern - der fette "Ende"-Button würde dann ein Flag setzen, das das Schließen im Ereignismakro doch freigibt.
Ich habe aber keinen Weg gefunden, im Makro des "Vor Entladen" das Entladen zu stoppen. Ein Ausstieg aus der Sub verhindert nicht das Schließen des Formulars und das Wiedererscheinen des Datenbankfensters.
Soweit ich Beiträge zum Thema "Schließkreuz" in Foren gefunden habe, machen sie mir wenig Hoffnung. Aber vielleicht hat doch noch jemand eine Idee? Es müsste die "Vor Entladen"-Sub das Entladen zulassen, wenn das Flag vom "Ende"-Button hergesetzt ist oder wenn über eine kleine Passwortabfrage das Schließen und Wiedererscheinen des Datenbankfensters freigegeben wird (damit es überhaupt noch möglich ist, auf die Programmier- und Bearbeitungsebene zu gelangen).
Bin gespannt...
Aubergino
es gibt ja einige Methoden, einem Nutzer der Datenbank den Zugriff auf die Makroprogrammierung, Datenbank- und Formularbearbeitung und überhaupt auf das Datenbankfenster zu sperren. Ich mache bereits folgendes:
- Bei Öffnen der Datenbank wird sofort das Formular, in dem der Anwender seine Arbeit machen soll, geöffnet,
- Die Menuzeile, Symbole usw. werden ausgeblendet,
- Das Datenbankfenster wird ausgeblendet,
- Die Datenbank wird über einen fetten "Ende"-Button sauber geschlossen.
Alles hierfür nötige habe ich mit leichten Abwandlungen in Forum und/oder Handbuch gefunden.
Doch es bleibt die Möglichkeit, über das Schließkreuz des Formulars in das Datenbankfenster zu gelangen. Nun würde ich gerne über das "Vor Entladen"-Ereignis des Formulars das Schließen verhindern - der fette "Ende"-Button würde dann ein Flag setzen, das das Schließen im Ereignismakro doch freigibt.
Ich habe aber keinen Weg gefunden, im Makro des "Vor Entladen" das Entladen zu stoppen. Ein Ausstieg aus der Sub verhindert nicht das Schließen des Formulars und das Wiedererscheinen des Datenbankfensters.
Soweit ich Beiträge zum Thema "Schließkreuz" in Foren gefunden habe, machen sie mir wenig Hoffnung. Aber vielleicht hat doch noch jemand eine Idee? Es müsste die "Vor Entladen"-Sub das Entladen zulassen, wenn das Flag vom "Ende"-Button hergesetzt ist oder wenn über eine kleine Passwortabfrage das Schließen und Wiedererscheinen des Datenbankfensters freigegeben wird (damit es überhaupt noch möglich ist, auf die Programmier- und Bearbeitungsebene zu gelangen).
Bin gespannt...
Aubergino
Zuletzt geändert von Aubergino am So 8. Mär 2026, 13:50, insgesamt 1-mal geändert.
Re: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
Du brauchst im Prinzip ein Makro, das nach dem Schließen des Formulars direkt Base auch schließt. Ist Base das letzte Fenster von LibreOffice, das offen ist, dann soll auch LibreOffice beendet werden. Korrekt?
Das steht bei mir in der XRechnungs-Datenbank:
Und dann habe ich eine separate Bibliothek "XRechnung" in "Meine Makros und Dialoge" erstellt. Das geht im Fall der XRechnung über einen Button in der Beschreibung.
Wenn ich das innerhalb der Base-Datei mache, dann stürzt mir das Ganze je nach System ab oder bleibt hängen, weil das Makro keine Rückmeldung vom System mehr bekommt. Deswegen diese separate Bibliothek.
Du kannst das auch unter "Standard" in "Meine Makros und Dialoge" einbauen. Nur habe ich das schon öfter gehabt, dass dort beim hin- und her zwischen verschiedenen Versionen plötzlich nichts mehr drin war. Deswegen die separate Bibliothek.
Gruß
Robert
Das steht bei mir in der XRechnungs-Datenbank:
Code: Alles auswählen
REM +++ Ist kein Formular mehr offen, so soll auch die Base-Datei geschlossen werden
REM +++ Die Prozedur wird über Extras → Anpassen → Ereignisse → Unterdokument wurde geschlossen in das Datenbankdokument eingebunden.
SUB DatabaseClose
DIM oDoc AS OBJECT
oDoc = ThisDatabaseDocument
REM Nur bei einem leeren Array (alle Subdokumente geschlossen) wird für UBound der Wert -1 ausgegeben
IF LBound(oDoc.CurrentController.SubComponents()) > UBound(oDoc.CurrentController.SubComponents()) THEN
GlobalScope.BasicLibraries.loadLibrary("XRechnung")
DataWrite
AsyncClose(oDoc)
END IF
END SUBCode: Alles auswählen
Sub AsyncClose(Byval oDoc As Object)
CreateUnoService("com.sun.star.awt.AsyncCallback").addCallback(CreateUnoListener("AsyncClose_","com.sun.star.awt.XCallback"),oDoc)
End Sub
Sub AsyncClose_notify(arg)
arg.Close True
oFrames = StarDesktop.Frames
n = oFrames.Count
IF n = 0 THEN StarDesktop.Terminate()
End SubDu kannst das auch unter "Standard" in "Meine Makros und Dialoge" einbauen. Nur habe ich das schon öfter gehabt, dass dort beim hin- und her zwischen verschiedenen Versionen plötzlich nichts mehr drin war. Deswegen die separate Bibliothek.
Gruß
Robert
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
Re: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
Danke, Robert, für den Ansatz:
Statt das Schließkreuz-Schließen des Formulars zu verhindern, erzwingst Du gleich das Schließen der ganzen Datenbank. Da ich nur das eine Formular offen habe (mit zwei Unterformularen), müsste ich ja nicht mal die Abfrage einbauen, ob es das letzte ist...? Und ich würde, falls das Formularschließen nicht über den "Ende"-Button mit entsprechend gesetztem Flag erfolgt ist, noch eine Rückfrage einbauen, mit der das finale Schließen der Datenbank gegen Passworteingabe nicht ausgelöst wird. Das klingt sehr vielversprechend, ich werde das in den nächsten Tagen ausprobieren.
Tschüs,
Aubergino
Statt das Schließkreuz-Schließen des Formulars zu verhindern, erzwingst Du gleich das Schließen der ganzen Datenbank. Da ich nur das eine Formular offen habe (mit zwei Unterformularen), müsste ich ja nicht mal die Abfrage einbauen, ob es das letzte ist...? Und ich würde, falls das Formularschließen nicht über den "Ende"-Button mit entsprechend gesetztem Flag erfolgt ist, noch eine Rückfrage einbauen, mit der das finale Schließen der Datenbank gegen Passworteingabe nicht ausgelöst wird. Das klingt sehr vielversprechend, ich werde das in den nächsten Tagen ausprobieren.
Tschüs,
Aubergino
Re: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
Moin Robert und alle,
ich habe nun verschiedene Wege versucht, ein stabiles Datenbankschließen nach Schließen des Anwenderforumlares zu erreichen. (Zwischendurch hatte ich noch das LO-Update auf 26.xxx abgerufen - ganz schlechte Idee mit verheerenden Folgen - bin wieder zurück auf 25.xxx). Insbesondere habe ich natürlich auch die von DIr, Robert, als X-Rechnungs-Auszug hier gezeigte Methode ausprobiert (mir auch XRechnung mal heruntergeladen und hineingeschaut).
Doch leider... egal, wie ich herangehe: Ganz am Ende des Schließprozesses, wenn schon alle Fenster geschlossen sind, kommt eine Absturzmeldung: "Libre Office 25.2 Dokumentenwiederherstellung". Unter "Die folgenden Dokumente werden wiederhergestellt" ist NICHTS eingetragen. Bei "OK" öffnet sich das grundlegende Libre Office Fenster und die Bitte einen Fehlerbericht zu senden mit dem Vorschlag, im abgesicherten Modus zu starten. Nachfolgend meine Codeschnipsel.
Wie von Dir vorgeschlagen, sind die "async..." Schnipsel als eigene Bibliothek unter Meine Makros und Dialoge - Bestand - Schließen hinterlegt.
Hast Du noch eine Idee, wie ich das Datenbankfenster sauber schließen könnte? Siehst Du einen maßgeblichen Fehler oder hast Du noch einen anderen Ansatz auf Lager? Das ganze läuft bei mir unter Windows 11, Du arbeitest ja in Linux, evtl. macht das hier einen Unterschied?
DbClose, im Datenbankfenster unter Extras - Anpassen - Ereignisse - Unterdokument wurde geschlossen:
Async..., Aufruf aus DBClose:
FormClose, aufgerufen unter Formular Extras - Anpassen - Ereignisse - Ansicht geschlossen, war auch schon unter (Formular) wird geschlossen, und schließt so oder so sauber das Formular:
ich habe nun verschiedene Wege versucht, ein stabiles Datenbankschließen nach Schließen des Anwenderforumlares zu erreichen. (Zwischendurch hatte ich noch das LO-Update auf 26.xxx abgerufen - ganz schlechte Idee mit verheerenden Folgen - bin wieder zurück auf 25.xxx). Insbesondere habe ich natürlich auch die von DIr, Robert, als X-Rechnungs-Auszug hier gezeigte Methode ausprobiert (mir auch XRechnung mal heruntergeladen und hineingeschaut).
Doch leider... egal, wie ich herangehe: Ganz am Ende des Schließprozesses, wenn schon alle Fenster geschlossen sind, kommt eine Absturzmeldung: "Libre Office 25.2 Dokumentenwiederherstellung". Unter "Die folgenden Dokumente werden wiederhergestellt" ist NICHTS eingetragen. Bei "OK" öffnet sich das grundlegende Libre Office Fenster und die Bitte einen Fehlerbericht zu senden mit dem Vorschlag, im abgesicherten Modus zu starten. Nachfolgend meine Codeschnipsel.
Wie von Dir vorgeschlagen, sind die "async..." Schnipsel als eigene Bibliothek unter Meine Makros und Dialoge - Bestand - Schließen hinterlegt.
Hast Du noch eine Idee, wie ich das Datenbankfenster sauber schließen könnte? Siehst Du einen maßgeblichen Fehler oder hast Du noch einen anderen Ansatz auf Lager? Das ganze läuft bei mir unter Windows 11, Du arbeitest ja in Linux, evtl. macht das hier einen Unterschied?
DbClose, im Datenbankfenster unter Extras - Anpassen - Ereignisse - Unterdokument wurde geschlossen:
Code: Alles auswählen
Sub DBClose
DIM oDoc AS OBJECT
IF NOT Adminmode THEN
Wartemeldung("Speichern und Schließen")
oDoc = ThisDatabaseDocument
REM Nur bei einem leeren Array (alle Subdokumente geschlossen) wird für UBound der Wert -1 ausgegeben
IF LBound(oDoc.CurrentController.SubComponents()) > UBound(oDoc.CurrentController.SubComponents()) THEN
GlobalScope.BasicLibraries.loadLibrary("Bestand")
Zwischenspeichern
wait(1000)
AsyncClose(oDoc)
END IF
Wartemeldung_aus
END IF
End Sub
Code: Alles auswählen
REM ***** BASIC *****
Option Explicit
Sub AsyncClose(Byval oDoc As Object)
CreateUnoService("com.sun.star.awt.AsyncCallback").addCallback(CreateUnoListener("AsyncClose_","com.sun.star.awt.XCallback"),oDoc)
End Sub
Sub AsyncClose_notify(arg)
arg.Close True
oFrames = StarDesktop.Frames
n = oFrames.Count
IF n = 0 THEN StarDesktop.Terminate()
End SubCode: Alles auswählen
Sub FormClose
Dim oFrames As Object
DIM oFrame AS OBJECT
DIM oLayoutMng AS OBJECT
DIM aElemente()
DIM oWin AS OBJECT
DIM El AS integer
Dim Fr AS Integer
Dim oController
Dim strSql AS String
Dim oStatement AS Object
Dim oForm AS Object
Dim oDoc AS Object
oDoc = ThisDatabaseDocument
oController = ThisDatabaseDocument.CurrentController
If not (oController.isConnected()) Then oController.connect() ' Connect to the database, if necessary
oForm = thisComponent.drawpage.forms.getByName("frmObjekte")
' on Error Goto Errormeldung
'Geänderte Daten noch speichern
if oForm.ismodified then
if oForm.isnew then 'nicht mit "Neuspeichern", weil dort noch ein hier unnötiges Reload ausgeführt wird
' oForm = oEvent.Source.Model.Parent
oForm.insertrow
oStatement = oController.ActiveConnection.CreateStatement()
strSql="UPDATE ""tblObjekte"" SET ""Erfassungsdatum"" = CURRENT_DATE WHERE ""IdNr"" = " + getSqlMax("tblObjekte", "IdNr")
oStatement.executeUpdate(strSql)
else
oForm.updaterow
end if
oForm.ismodified = False
end if
'Neue Bilder zuordnen
If getSqlCount("tblObjekte", "LEFT(""URL"",18)= '../Bildarchiv/Vorb'")>0 then bildadressen
'Menuleiste wieder einschalten
oFrames = StarDesktop.Frames
For Fr = 0 To oFrames.Count - 1
oFrame = oFrames.getByIndex(Fr)
If oFrame.Name = "Bestand.odb" Or InStr(oFrame.Title, "– LibreOffice Base") > 0 Then
oLayoutMng = oFrame.LayoutManager
aElemente = oLayoutMng.getElements()
FOR El = LBound(aElemente) TO UBound(aElemente)
oLayoutMng.showElement(aElemente(El).ResourceURL)
NEXT El
If Adminmode Then oFrame.ContainerWindow.setVisible(True)
end if
ThisComponent.CurrentController.Sidebar.Visible = True
ThisComponent.CurrentController.ViewSettings.ShowRulers = True
ThisComponent.CurrentController.ViewSettings.ShowParaBreaks = True
NEXT Fr
'Formular schließen
' ThisDatabaseDocument.FormDocuments.getByName("frmObjekte").close
'Datenbank speichern
' oDoc.Store()
'Datenbank schließen, wenn nicht im Adminmodus
' if not Adminmode then oDoc.Close(False)
exit Sub
Errormeldung:
msgbox "Fehler in Sub >FormClose<"
End Sub
Re: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
Wenn Du Deinen Makros ein
OPTION EXPLICIT
voraus stellst, dann müssen auch alle Variablen deklariert sein. Zumindest bei oFrames ist das nicht der Fall.
Ansonsten: Teste einmal das, was ich mit der XRechnungsdatenbank weitergebe. Ich weiß nicht, ob das dort jemand tatsächlich nutzt. Ich hatte das Problem auch hier schon einmal angesprochen:
https://ask.libreoffice.org/t/automatis ... ops/107149
OPTION EXPLICIT
voraus stellst, dann müssen auch alle Variablen deklariert sein. Zumindest bei oFrames ist das nicht der Fall.
Ansonsten: Teste einmal das, was ich mit der XRechnungsdatenbank weitergebe. Ich weiß nicht, ob das dort jemand tatsächlich nutzt. Ich hatte das Problem auch hier schon einmal angesprochen:
https://ask.libreoffice.org/t/automatis ... ops/107149
https://de.libreoffice.org/get-help/documentation/
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=base_handbuch
https://www.familiegrosskopf.de/robert/index.php?&Inhalt=xml_formulare
Re: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
Danke für den Hinweis!...ertappt... mache ich sonst immer, ich schwör... Die Korrektur hat aber leider auch nichts am Verhalten geändert.
Aber warum gab denn eigentlich nicht die sonst übliche Fehlermeldung wegen nicht deklarierter Variablen(ah, macht er doch nicht immer...)? Nun dachte ich, vielleicht werden diese finalen Routinen gar nicht aufgerufen und habe in die beiden Async-Subs mal eine msgbox eingebaut. Die Folge (für mich völlig komisch, für Dich vielleicht ein Hinweis): Nun hängt sich LO schon auf, bevor das Formular geschlossen ist, also mitten in der Sub FormClose, die Wartemeldung bleibt stehen. Msgboxen wieder herausgenommen aus dem Code: Formular und anschließend das Programmfenster schließen sich wieder mit der bekannten posthumen Fehlermeldung.
Warum kann ein "msgbox("Text") in einer abschließenden Sub denn in einer vorher aufgerufenen Sub zum Systemhänger führen??
Deinem Link folgend habe ich mal im Taskmanager nachgeschaut, und tatsächlich - da bleibt wohl auch jedes Mal ein Prozess stehen. Leider obwohl ich ja jetzt das probiere, was bei Dir dort im letzten Beitrag als funktionierend beschrieben ist.
Ist das schwierig...
Aber warum gab denn eigentlich nicht die sonst übliche Fehlermeldung wegen nicht deklarierter Variablen(ah, macht er doch nicht immer...)? Nun dachte ich, vielleicht werden diese finalen Routinen gar nicht aufgerufen und habe in die beiden Async-Subs mal eine msgbox eingebaut. Die Folge (für mich völlig komisch, für Dich vielleicht ein Hinweis): Nun hängt sich LO schon auf, bevor das Formular geschlossen ist, also mitten in der Sub FormClose, die Wartemeldung bleibt stehen. Msgboxen wieder herausgenommen aus dem Code: Formular und anschließend das Programmfenster schließen sich wieder mit der bekannten posthumen Fehlermeldung.
Warum kann ein "msgbox("Text") in einer abschließenden Sub denn in einer vorher aufgerufenen Sub zum Systemhänger führen??
Deinem Link folgend habe ich mal im Taskmanager nachgeschaut, und tatsächlich - da bleibt wohl auch jedes Mal ein Prozess stehen. Leider obwohl ich ja jetzt das probiere, was bei Dir dort im letzten Beitrag als funktionierend beschrieben ist.
Ist das schwierig...
Re: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
weiter gehts...
Ich habe ja in meinem Anwenderfenster auch einen "Ende"-Button. Der schließt Formular und Datenbankfenster OHNE Fehlermeldungen. Auch ein erneutes Öffnen der Datenbank läuft sauber. Das Ereignis des Buttons ruft (nach Speichern usw.) nur auf:
Allerdings bleiben auch hier Prozesse stehen. Und zwar drei:
- soffice.bin, belegt mit jedem Öffnen und Schließen der DB per "Ende"-Button ca. 40MB Arbeitsspeicher mehr,
- soffice.exe, belegt ca. 0,8MB Arbeitsspeicher und
- sbase.exe, belegt ca. 0,6MB Arbeitsspeicher.
Auch wenn die jedes mal zunehmende Arbeitsspeicherbelegung nach sehr vielen Programmstarts und -Enden irgendwann am vollen Arbeitsspeicher scheitern wird, könnte ich damit leben, wenn es gelänge, das Schließen per Schließkreuz zu verhindern oder aber dem gleichen Schließvorgang wie beim "Enden"-Button zuzuführen.
Aber anscheinend ruft das Schließen per Schließkreuz zwingend einen eigenen internen Schließprozess aus. Könnte es denn sein, dass die Fehlermeldung daher rührt, dass bei den Versuchen, über "Unterdokument wird geschlossen" einen Schließprozess per Makro aufzurufen, dennoch danach auch noch der interne Schließprozess aufgerufen wird, der dann daran scheitern (Fehlermeldung), dass schon alles geschlossen ist?
In MS Acess gibt es das Ereignis "Beim Entladen", dessen Ausführung ich, wenn ein globales "AllowQuit" auf False gesetzt ist, abbrechen kann per
Gibt es denn in LO wirklich keinen Weg, das "beim Entladen" abzubrechen? Wenn doch, könnte ich ja meinen ursprünglichen Ansatz nutzen, das Schließen des Anwenderformulars per Schließkreuz zu sperren und nur per "Ende"-Button zu ermöglichen...
...tappt Aubergino im Dunklen
Ich habe ja in meinem Anwenderfenster auch einen "Ende"-Button. Der schließt Formular und Datenbankfenster OHNE Fehlermeldungen. Auch ein erneutes Öffnen der Datenbank läuft sauber. Das Ereignis des Buttons ruft (nach Speichern usw.) nur auf:
Code: Alles auswählen
ThisDatabaseDocument.FormDocuments.getByName("frmObjekte").close
oDoc.Store()
if not Adminmode then oDoc.Close(True)
- soffice.bin, belegt mit jedem Öffnen und Schließen der DB per "Ende"-Button ca. 40MB Arbeitsspeicher mehr,
- soffice.exe, belegt ca. 0,8MB Arbeitsspeicher und
- sbase.exe, belegt ca. 0,6MB Arbeitsspeicher.
Auch wenn die jedes mal zunehmende Arbeitsspeicherbelegung nach sehr vielen Programmstarts und -Enden irgendwann am vollen Arbeitsspeicher scheitern wird, könnte ich damit leben, wenn es gelänge, das Schließen per Schließkreuz zu verhindern oder aber dem gleichen Schließvorgang wie beim "Enden"-Button zuzuführen.
Aber anscheinend ruft das Schließen per Schließkreuz zwingend einen eigenen internen Schließprozess aus. Könnte es denn sein, dass die Fehlermeldung daher rührt, dass bei den Versuchen, über "Unterdokument wird geschlossen" einen Schließprozess per Makro aufzurufen, dennoch danach auch noch der interne Schließprozess aufgerufen wird, der dann daran scheitern (Fehlermeldung), dass schon alles geschlossen ist?
In MS Acess gibt es das Ereignis "Beim Entladen", dessen Ausführung ich, wenn ein globales "AllowQuit" auf False gesetzt ist, abbrechen kann per
Code: Alles auswählen
Public Sub Form_Unload(Cancel As Integer)
Cancel = Not AllowQuit
End Sub
...tappt Aubergino im Dunklen
Re: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
Nun habe ich es mal mit einer minimalen Datenbank probiert und (wahlweise mal) mit einer Schließ-Sub aus dem ask.libreoffice.org Forum von Ratslinger.
Mit dieser Datenbank klappt das Schließen ohne Fehlermeldung: Egal ob über einen "Schließen"-Button oder das Schließkreuz, es wird das Formular und auch das Datenbankfenster geschlossen. Und auch ein erneutes Programmstarten mit automatischer Öffnung des Formulars funktioniert. Es bleiben aber auch hier drei LO-Prozesse im Taskmanager stehen, aber damit könnte ich leben, sie stören ja nicht.
Aber auch diese Schließen-Sub führt in meiner "großen" Datenbank beim Schließen über das Schließkreuz zu der Absturzmeldung: "Libre Office 25.2 Dokumentenwiederherstellung". Unter "Die folgenden Dokumente werden wiederhergestellt" ist NICHTS eingetragen.
Mir fällt noch auf, dass beim Schließen über den Button die DBClose-Sub zweimal durchlaufen wird, beim Schließen mit dem Schließkreuz nur einmal. (Sichtbar durch Einbau einer msgbox-Meldung in die Sub). Man könnte spekulieren, dass das zweimalige Durchlaufen eine Fehlermeldung erzeugt, aber bei meiner "großen" DB erfolgt die Fehlermeldung ja genau beim Schließkreuz-Schließen (also dem einmaligen Durchlauf), aber nie beim Schließen über den Button!?
Hat hier vielleicht jemand der Sachkundigeren als ich eine Eingebung, warum es bei der kleinen Datenbank klappt, bei der großen aber nicht?
Mag jemand mit einer Windows (11) Umgebung mal testen, ob bei dieser kleinen Datenbank das vollständige Schließen auch bei ihr/ihm (etliche mal hintereinander) ohne Fehlermeldung klappt?
Die kleine hier im Anhang.
Danke, wenn Ihr noch mal mit einsteigt..
Aubergino
Mit dieser Datenbank klappt das Schließen ohne Fehlermeldung: Egal ob über einen "Schließen"-Button oder das Schließkreuz, es wird das Formular und auch das Datenbankfenster geschlossen. Und auch ein erneutes Programmstarten mit automatischer Öffnung des Formulars funktioniert. Es bleiben aber auch hier drei LO-Prozesse im Taskmanager stehen, aber damit könnte ich leben, sie stören ja nicht.
Aber auch diese Schließen-Sub führt in meiner "großen" Datenbank beim Schließen über das Schließkreuz zu der Absturzmeldung: "Libre Office 25.2 Dokumentenwiederherstellung". Unter "Die folgenden Dokumente werden wiederhergestellt" ist NICHTS eingetragen.
Mir fällt noch auf, dass beim Schließen über den Button die DBClose-Sub zweimal durchlaufen wird, beim Schließen mit dem Schließkreuz nur einmal. (Sichtbar durch Einbau einer msgbox-Meldung in die Sub). Man könnte spekulieren, dass das zweimalige Durchlaufen eine Fehlermeldung erzeugt, aber bei meiner "großen" DB erfolgt die Fehlermeldung ja genau beim Schließkreuz-Schließen (also dem einmaligen Durchlauf), aber nie beim Schließen über den Button!?
Hat hier vielleicht jemand der Sachkundigeren als ich eine Eingebung, warum es bei der kleinen Datenbank klappt, bei der großen aber nicht?
Mag jemand mit einer Windows (11) Umgebung mal testen, ob bei dieser kleinen Datenbank das vollständige Schließen auch bei ihr/ihm (etliche mal hintereinander) ohne Fehlermeldung klappt?
Die kleine hier im Anhang.
Danke, wenn Ihr noch mal mit einsteigt..
Aubergino
- Dateianhänge
-
- schliessen.odb
- Die kleine Test-DB
- (13.95 KiB) 1116-mal heruntergeladen
-
Pit Zyclade
- * LO-Experte *
- Beiträge: 3196
- Registriert: Mo 12. Nov 2012, 16:59
Re: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
Ich habe deine Datei runtergeladen.
Wenn ich sie öffne, werde ich ja gefragt, ob mit oder ohne Makro.
Wähle ich "ohne", kann ich sie öffnen. Ist ja fast gar nichts drin...
Wähle ich "mit", dann kommt die Datei zwar, aber leer. Was für ein Quatsch ist denn das? Warum wird das Schließen-Makro (oder wie heißt es?) gleich beim Start gestartet?
WOZU brauchst du ein SCHLIESSENMAKRO?
Wenn ich sie öffne, werde ich ja gefragt, ob mit oder ohne Makro.
Wähle ich "ohne", kann ich sie öffnen. Ist ja fast gar nichts drin...
Wähle ich "mit", dann kommt die Datei zwar, aber leer. Was für ein Quatsch ist denn das? Warum wird das Schließen-Makro (oder wie heißt es?) gleich beim Start gestartet?
WOZU brauchst du ein SCHLIESSENMAKRO?
LO 25.8.6.2 (X86_64) / Windows 11 64bit
Problem gelöst? Dann bitte im Betreff der ersten Nachricht [gelöst] voranstellen.
Problem gelöst? Dann bitte im Betreff der ersten Nachricht [gelöst] voranstellen.
Re: dem Anwender Zugriff auf Programmierebene/Bearbeitung/Datenbankfenster sperren
Danke Pit, für Deinen Versuch. "Quatsch" gehört, meine ich, nicht in so ein Forum. Aber zur Sache:
Dass Du die Makros hierfür freigeben musst, ist ja klar, es geht ja darum, mit Makros ein Ziel zu erreichen.
Die DB heißt "Schliessen.odb", weil es darum geht, LO-Verhalten beim Schließen zu testen.
Beim Start wird eine Sub "OnOpenDocument" gestartet, welches automatisch das (einzige) Formular öffnet.
Und dann beim Formular Öffnen noch eine Sub "FormOeffnen".
Eine Sub "Schliessen" gibt es nicht, nur eine "Formschliessen", die soll aber erst bei einem "Schließen"-Ereignis ablaufen.
Was Du also nach dem Start sehen solltest, wäre ein simples Formular, das an eine simple Tabelle gekoppelt ist. In einem Feld soll es deren Einträge zeigen, mit zwei Buttons soll man durch die paar Datensätze blättern können.
Entscheidend sind nun die zwei größeren Buttons zum Schließen, der eine soll nur das Formular schließen (damit das DB-Fenster zwecks Bearbeitung/Programmierung zugänglich wird. Der andere Button - und das ist das Ziel der Bemühungen und eben nur per Makro zu erreichen - soll das Formular UND die Datenbank, somit das Datenbankfenster schließen.
Sollte das bei Dir ganz anders ablaufen, wäre eine genauere Beschreibung hilfreich - was heißt "die Datenbank kommt" - öffnet sich das Formular? Oder nur das Datenbankfenster? Warum denkst Du, dass ein "Schliessen"-Makro beim Start gestartet wird - normalerweise bekommt man ja nicht zu sehen, wie aufgerufene Makros heißen?
MfG
Aubergino
Dass Du die Makros hierfür freigeben musst, ist ja klar, es geht ja darum, mit Makros ein Ziel zu erreichen.
Die DB heißt "Schliessen.odb", weil es darum geht, LO-Verhalten beim Schließen zu testen.
Beim Start wird eine Sub "OnOpenDocument" gestartet, welches automatisch das (einzige) Formular öffnet.
Und dann beim Formular Öffnen noch eine Sub "FormOeffnen".
Eine Sub "Schliessen" gibt es nicht, nur eine "Formschliessen", die soll aber erst bei einem "Schließen"-Ereignis ablaufen.
Was Du also nach dem Start sehen solltest, wäre ein simples Formular, das an eine simple Tabelle gekoppelt ist. In einem Feld soll es deren Einträge zeigen, mit zwei Buttons soll man durch die paar Datensätze blättern können.
Entscheidend sind nun die zwei größeren Buttons zum Schließen, der eine soll nur das Formular schließen (damit das DB-Fenster zwecks Bearbeitung/Programmierung zugänglich wird. Der andere Button - und das ist das Ziel der Bemühungen und eben nur per Makro zu erreichen - soll das Formular UND die Datenbank, somit das Datenbankfenster schließen.
Sollte das bei Dir ganz anders ablaufen, wäre eine genauere Beschreibung hilfreich - was heißt "die Datenbank kommt" - öffnet sich das Formular? Oder nur das Datenbankfenster? Warum denkst Du, dass ein "Schliessen"-Makro beim Start gestartet wird - normalerweise bekommt man ja nicht zu sehen, wie aufgerufene Makros heißen?
MfG
Aubergino
