Date: prev next · Thread: first prev next last
2017 Archives by date, by thread · List index


Hallo Gerhard,

Schnipsel sind insbesondere in Base nicht ganz einfach zu liefern, weil da doch die Daten- und Dokumentstruktur mit reinspielt. Ich habe den folgenden Code an einem Beispiel, das ich sowieso hatte, ausprobiert. Das enthielt zwei nahezu identische Formular-Dokumente. Ich nenne so, um Missverständnisse zumindest zu erschweren, das, was man als "Formular" im Base-Dokument aufruft - in Übereinstimmung mit der Nomenklatur in UNO: FormDocuments - und was, je nach dem, was man dann definiert, sich auf viele Tabellen beziehen kann, im Gegensatz zum Formular innerhalb eines Formular-Dokuments, das genau auf eine Tabelle (Ansicht, Abfrage) bezogen ist. In diesem Sinn willst du ein zweites Formular-Dokument aktualisieren, wenn ein erstes verwaltet wird (was natürlich, wie in deinem Fall, nur sinnvoll ist, wenn es Überschneidungen in den angezeigten Tabellen gibt). Meine zwei Formular-Dokumente haben mehrere Formulare, die in einer Hierarchie zueinander stehen, aber das ist für den Effekt unerheblich, ich habe nur die Änderung des obersten Formulars (das ein Tabellen-Kontrollelement für die zugehörige Tabelle enthält) behandelt, die durch den Code die erneuerte Anzeige des obersten Formulars des anderen Formulardokuments auslöste (was im Beispiel wiederum ein formal identisches Tabellenkontrollelement ist). Das Makro habe ich mit dem Ereignis "Nach der Datensatzaktion" des obersten Formulars verknüpft.

Sub RefreshSecondForm (evt as object)

dim oDoc as object, oDBDoc as object, oSecondFormDoc as object, mainForm as object

oDoc = ThisComponent
oDBDoc = oDoc.Parent
oSecondFormDoc = oDBDoc.FormDocuments.getByName("???1").open
                    'activates form doc, if already open
mainForm = oSecondFormDoc.DrawPage.Forms.getByIndex(0) 'or getByName("???2")
mainForm.reload

end sub

Der Parent des Formular-Dokuments, in dem die Änderung passiert, ist das Base-Dokument, das weitere Formular-Dokumente enthält, aus denen wir dasjenige wählen, das wir aktualisieren wollen. Das Dok. wird "geöffnet", was bei einem bereits geöffneten nur die Auswahl des Objekts bedeutet. Dann können wir wie gewohnt das Fomular wählen - im Code über den Index, weil es nur ein oberstes gibt. reload erneuert die Anzeige. Da gibt es sicher noch ein paar Dinge zu überlegen, die aber von der konkreten Struktur deiner beiden Formular-Dokumente abhängen, die ich ja nicht kenne. Beispielsweise könnte bei einem aufwändigeren Formular-Dokument die Änderung auch nur in einem Unterformular passieren, dann müsste da beim gleichen Ereignis im Unterformular ein ähnlicher Code aufgerufen werden, der aber dann wohl ein anderes Formular im sekundären Formular-Dokument reloaden müsste. Der Befehl reload beginnt mit der Anzeige wieder beim ersten Satz, egal wie im sekundären Formular-Dokument gerollt war und wo der Cursor stand. Man könnte, denke ich, das Formular auch wieder so positionieren wie vor dem Reload, wenn man sich die Position merkt, aber das habe ich nicht ausprobiert. Es könnte auch einen Unterschied bedeuten, wenn das Formular im sekundären Formular-Dokument nur einen einzelnen Satz anzeigt, da könnte das Repositionieren noch wichtiger sein. Das wirst du sicher selber lösen können, du scheinst ja doch einiges auf diesem Gebiet zu wissen.
Übrigens: dein

   oDATEN = thisComponent.Drawpage.Forms.DATEN

kann ja wohl kein echter Befehl sein, sondern nur exemplarisch gemeint. DATEN gibt es unter ...Forms nicht, und wenn, müsste es ja wohl eine einzelne Form sein, zu der es Daten gibt.

Wenn du das Beispiel-Dokument haben willst, melde dich, ich schicke es dir dann direkt, in der Liste kann man keine Anhänge verwenden.

Gruß

Gerhard

Am 21.06.2017 um 13:44 schrieb Gerhard Dittrich:
Vielen Dank, Gerhard für Deine Hinweise!

Hast Du vielleicht ein Code-Schnipsel parat, so dass ich versuchen kann, den "Weg" anhand des Code-Schnipsels zu rekonstruieren?

Grüße
Gerhard



Am 21.06.2017 um 11:21 schrieb Gerhard Weydt:
Hallo Gerhard,

was ich vergessen habe: anschließend das Formulardokument mit getByName("xxx").open aktivieren, dann hast du den Zugriff.

Am 21.06.2017 um 10:36 schrieb Gerhard Weydt:
Hallo Gerhard,

über ThisComponent.Parent.FormDocuments kannst du auf die anderen Formulardokumente zugreifen. Ich benutze immer Xray, um so etwas zu finden, und probiere einfach vielversprechende Eigenschaften und Methoden aus.

Gruß

Gerhard

Am 21.06.2017 um 09:02 schrieb Gerhard Dittrich:
Guten Morgen,

ich arbeite mit Base.

Zwei Formulare sind geöffnet. Diese beiden Formulare greifen auf den selben Datenbestand zu, nur anders dargestellt.

Ändere ich in dem einen (ERSTEN) Formular Daten, und klicke in der Menü-Leiste ich auf das andere (ZWEITE) bereits in der Anwendung geöffnete Formular, rückt es als aktives in den Vordergrund). Die Daten werden jedoch nicht aktualisiert dargestellt. (Ich müsste also zusätzlich einen AKTUALISIEREN-BUTTON im ZWEITEN Formular klicken). Einfach wäre es, wenn ich im Rahmen der Datenmanipulation im ERSTEN Formular (diese läuft über ein Dialogfenster) zugleich per Makro anweisen könnte, dass das nicht aktive Formular ebenfalls aktualisiert wird.

Dazu müsste ich aber das NICHT-AKTIVE ZWEITE Formular ansteuern können.

Ich kenne aber nur den Befehl "thisComponent". Dieser führt natürlich nur auf das aktive ERSTE Formular.

Bei mir zum Beispiel:    oDATEN = thisComponent.Drawpage.Forms.DATEN

Natürlich könnte ich das ZWEITE Formular per Makro schließen lassen und dann wieder öffnen. Dann würde das ZWEITE Formular automatisch aktualisiert. Diesen Weg möchte ich aber nicht beschreiten.


Grüße
Gerhard Dittrich









--
Liste abmelden mit E-Mail an: users+unsubscribe@de.libreoffice.org
Probleme? http://de.libreoffice.org/hilfe-kontakt/mailing-listen/abmeldung-liste/
Tipps zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.