Formular per Makro aktualisieren: Wie genau

Hallo, ich versuche ein Makro zu schreiben, das ein Formular aktualisiert (weil z.B. in einer Tabelle, die mit dem Formular verknüpft ist, etwas geändert wurde) ohne dass dabei der aktuelle Datensatz verlassen wird wie bei dem Aktualisierungs-Button in der Menü-Leiste. Meine bisherigen Versuche:

führen aber nicht zur Aktualisierung, d.h., das Makro landet zwar auf dem ersten Eintrag (durch wait 200 sichtbar) und springt dann korrekt auf den ursprünglichen Datensatz, aber die Änderungen an den verknüpften Tabellen, auf die zugegriffen wird, werden nicht gezeigt. Das Icon der Menü-Leiste dagegen erreicht die Änderung der Anzeige (bleibt aber auf dem 1. Eintrag stehen). Warum passiert hier nicht das gleiche, wie in der eingebauten Funktion. Ich dachte “reload” bedeutet Aktualisierung?

Was genau meinst Du mit “Änderungen an den verknüpften Tabellen”? Willst Du vielleicht gar nicht das Formular aktualisieren sondern nur den Inhalt z.B. von Listenfeldern?

Das von Dir aufgelistete Makro macht genau das, was es soll: Den ursprünglichen Datensatz nach einem Neuladen wieder anzeigen. Nur Listenfelder, die eventuell geändert wurden, sind davon nicht berührt. Da müsstest Du mit oFeld.refresh nacharbeiten. Alles andere nur mit genauerer Beschreibung.

In der Ausgangsform fülle ich über ein Kombinationsfeld einen Namen in ein Feld der Ausgangsform. Das Kombinationsfeld zieht die Namen aus einer anderen Tabelle. Wenn ich feststelle, dass ein Name in dieser Tabelle noch nicht angelegt ist, wechsle ich (ohne die Ausgangsform zu schließen) auf die Form, mit der ich in der Tabelle neue Einträge anlegen kann und füge den fehlenden Namen in die Tabelle ein. Nach schließen dieser Form lande ich wieder bei der Ausgangsform. In dem Kombinationsfeld ist der neue Eintrag aber nicht zu sehen.
Wenn ich auf den “Aktualisieren”-Knopf in der Menüleiste drücke, falle ich auf den ersten Datensatz zurück, aber jetzt ist der neue Name im Kombinationsfeld verfügbar.
Mit dem Makro oben komme ich zwar beim richtigen Datensatz wieder an, der neue Name fehlt aber immer noch im Kombinationsfeld.

Wenn der Inhalt von Listenfeldern oder Kombinationsfeldern außerhalb eines geöffneten Formulars geändert wird - auch über ein Nebenformular, das extra nur dazu eingeblendet wird - dann muss das Listenfeld oder Kombinationsfeld anschließend neu geladen werden. Dafür gibt es in der Navigationsleiste auch extra den Button “Steuerelement aktualisieren”.

Für Makros heißt das: Das Feld muss angesprungen werden und dann ein oFeld.refresh laufen. Mit einem oForm.reload wirst Du nicht zu diesem Ziel kommen. Wundert mich, dass das mit dem “Aktualisieren”-Button läuft. Da müsste dann inzwischen etwas geändert worden sein, so dass nicht nur das Formular neu eingelesen wird sondern auch alle Listenfelder und Kombinationsfelder mit einem Refresh versehen werden.

Das wird wohl so sein, denn bei dem Button klappt das gut.

Ich hatte gehofft, eine einfachere Lösung zu finden (z.B. das eingebaute Makro aufrufen zu können, das nach dem Button “Aktualisieren” ausgeführt wird), nun also die beschwerliche:

Leider nun keine Event-Steuerung mehr (ich muss das gleiche mit 3 weiteren Formen machen, deshalb war das vorher so elegant)

Alternative vielleicht:

SUB Refresh
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

Alles mit dem Makrorecorder aufgezeichnet. Der UnoService ist in der Regel umfassender. Nur ein kleines Beispiel: Du kannst den Inhalt eines Formulars mit uno:Save (oder so ähnlich) abspeichern. Damit arbeitet auch der Button. Wenn Du mit den Methoden, die beim Formular zur Verfügung stehen, arbeitest, musst Du zuerst abklären, ob es sich um ein Update oder um ein Insert handelt.

Ausprobiert: Perfekt!!! Mit dem ursprünglichen oEvent-Makro, ergänzt um deine UnoService-Befehle kann ich mit einem Makro 4 verschiedene Formen inkl. der Listen- und Kombinationsfelder aktualisieren.