Formular von einem anderen Formular aus auffrischen

Ich habe in LibreOffice Base eine Datenbank Tabelle1 erstellt, auf die ich aus 2 Formularen heraus zugreife (Formulare als übergeordnete Dokumente verstanden). Das Formular FormTab zeigt die Daten in einer Tabelle (und enthält dabei das Formular FormTabAnzeige) und das Formular FormEdit zeigt jeweils einen einzelnen Datensatz mit seinen Feldern an (und enthält dabei das Formular FormEditAnzeige). Ich würde nun gern, wenn ich beide Formulare offen habe und einen Datensatz in FormEdit geändert oder hinzugefügt habe per Makro automatisch die Anzeige in FormTab ändern (im Prinzip würde es auch reichen, wenn das geschieht, wenn ich FormEdit schließe). Innerhalb von FormTab mache ich das über das Makro

sub refreshAufgabeAnzeigen 'aktualisiert das Formular Aufgabe Anzeigen
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService(“com.sun.star.frame.DispatchHelper”)
dispatcher.executeDispatch(document, “.uno:Refresh”, “”, 0, Array())
end sub

Aber ich habe bisher trotz intensiver Suche keinen Weg gefunden, das von außerhalb anzuregen. Kann mit da jemand weiterhelfen?

Ich nutze Libreoffice 7.5.2.2 und darin die eingebaute HSQLDB-Datenbank

Ich habe da auch einige Zeit dran herum probiert, schließlich aber darauf verzichtet, da nie ganz klar ist, ob Du beim Aktualisieren wirklich all das aktualisiert, was Du wirklich aktualisieren musst. Außerdem ist das immer ein gefuddele, dass Du wirklich bei dem Datensatz landest, an dem Du zuletzt gearbeitet hast.

Ich mache das vom Prinzip her so, dass ich mit dem Öffnen eines Formulars das andere schließe. Geht über recht einfache Makros aus dem Handbuch. Den Wechsel von einem Formular zum anderen habe ich inzwischen standardmäßig in Listenfeldern untergebracht, so dass darüber das neue Formular gewählt werden kann.

In einer aktuellen Datenbank habe ich das lediglich einmal erstellt, dass ein Artikel für Lieferungen in der Artikeltabelle nachgetragen werden können. Und da soll dann eben nach dem Schließen des Artikelformulars das Lieferformular wieder mit dem grade gewählten Datensatz geöffnet werden. Den speichere ich zwischen in einer Filtertabelle, die bei mir alle möglichen Werte enthält nach denen ich Daten in meinen Formularen suchen würde.

Bring einfach einen großen [UPDATE] button (gerne in Leuchtfarbe) auf das Formular und benutze ihn oft genug. Das geht dann auch nicht auf die Performance weil Du immer nur updatest wenn Du es willst und nicht während Du eigentlich ganz was anderes machst. Vieleicht wäre das Dokument-Ereignis “Fenster aktiviert” ein besser Anlass, alle enthaltenen Formulare upzudaten. Wenn das Fenster nicht aktiv ist interessiert der Inhalt ja nicht.

Wenn das nicht an Platzmangel scheitert, kann man das sehr gut auf ein Formulardokument bringen.

Vielen Dank für die schnellen Reaktionen. Das mit dem Update-Button ist auch die von mir praktizierte Lösung, mit der ich auch gut leben kann. Aber die Automatisierung wäre halt eleganter gewesen. Aber ich bin halt schon daran gescheitert, die Inhalte des ersten Formulars (also die von FormTabAnzeige) überhaupt vom anderen aus zu adressieren und hatte da auf einen Weg gehofft.

Lade doch einfach ein Beispiel ohne besondere Daten hier hoch. Ich würde so einen Weg über eine Filtertabelle gehen: Den Primärschlüssel des Ausgangsformulars in die Filtertabelle rein schreiben und für das neue Formular als Filter wieder auslesen. Braucht aber ein bisschen Makrocode.

Es kann furchtbar neven, wenn eine über die Jahre wachsende Datenbank immer träger wird weil ständig irgendwas im Hintergrund mit zigtausenden Datensätzen herumwerkelt.

@Villeroy : Wieso soll das bei einer Filtertabelle der Fall sein? Ich schreibe einen Wert in den einen Datensatz und starte das andere Formular genau mit diesem Filterwert.

Ja, aber wenn man versucht, pauschal alle offenen Formulardokumente zu aktualisieren bloß weil man im aktuellen Formular einen Datensatz gespeichert oder gelöscht hat, dann geht das ziemlich an die Resourcen wenn man nicht ebenfalls programmiert, welche Formulare oder Listenfelder eben KEIN reload() oder refresh() benötigen. EIn zu simples Makro würde pauschal alle offenen Formulare neu zu laden.

Also ich lade gerne mal die Datei hoch. Es geht mir um die Tabelle Aufgaben (ein paar Werte habe ich einfach mal stehen gelassen). Im Formular Aufgaben Anzeigen wird über den Button Neue Aufgabe das Formular Aufgaben Eingeben gestartet. Was ich mir wünsche ist, dass, wenn ich dieses Formular beende, das Formular Aufgaben Anzeigen aufgefrischt wird, so wie ich das für die Bearbeitung von Werten über den Button Edit realisiert habe (über einen Dialog, was aber nur funktioniert, wenn die Datenbank unter dem Namen arbeit.odb angemeldet ist).
arbeit - Kopie.odb (69.5 KB)

@Panther33 : Der Button in dem benannten Formular “Aufgaben Anzeigen” führt direkt zu der Fehlermeldung, dass die Tabelle “ARow” nicht vorhanden ist. Und die bespielst Du gleich mit mindestens 2 Makros weiter …

Da Du doch schon weißt, wie ein Formular per Button geöffnet werden kann: Warum schließt Du das andere nicht direkt auch damit und gehst von dem geöffneten Formular über einen Button zurück zu “Aufgaben Anzeigen”?

Sorry, die Tabelle hatte ich versehentlich gelöscht; ich lade sie noch mal mit hoch.
arbeit - Kopie.odb (69.5 KB)
Und die Idee mit dem Schließen und Neu-Öffnen ist natürlich eine gute Möglichkeit.

Nur für mein Verständnis. Gibt es keinen einfachen Weg, wie ein Formular innerhalb eines Formulares von außerhalb über die Schnittstelle der registrierten Datenbanken (oder der Formulare des aktuellen Dokumentes) ansprechbar ist?

@Panther33 : Du arbeitest doch mit den internen Formularen, oder habe ich da etwas falsch verstanden? Datenbanken, die ich hier erstelle, lasse ich grundsätzlich erst einmal nicht registrieren. Die *.odb-Datein laufen komplett ohne jegliche Registrierung.

Wenn Du ein bestimmtes Formular, das noch im Hintergrund geöffnet ist, wieder ansprechen willst: Ich würde so etwas über eine Filtertabelle oder über eine Variable, die ich als Globale Variable (außerhalb einer Prozedur) speichere, versuchen.

Danke, das war für mich der entscheidende Hinweis. Ich kann ja die Referenz auf das Formular in einer globalen Variablen speichern und dadurch vom neuen Makro aus erreichen.