❤️ Helfen Sie noch heute, unser LibreOffice Forum zu erhalten! ❤️
Unterstützen Sie das LibreOffice-Forum und helfen Sie uns, unser Ziel für 2025 zu erreichen!

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱


❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

[Nicht ganz GELÖST]Automatisch auf den neuen Datensatz springen

Base ermöglicht es Ihnen, Ihre Daten in einer Datenbank direkt mit LibreOffice zu bearbeiten.
Shel
Beiträge: 17
Registriert: Do 19. Mai 2016, 17:51

Re: [GELÖST]Automatisch auf den neuen Datensatz springen

Beitrag von Shel » So 22. Mai 2016, 13:50

Hallo gogo,
gogo hat geschrieben:Kommt drauf an an welchem Ereignis welches Objekts das Makro hängt.
Alles klar. Das wird es sein.
gogo hat geschrieben:Prinzipiell ist es besser das Makro an das Dokument zu binden, da dann das Ereignis auch wirklich nur beim Öffnen des Formularfensters stattfindet.
Ich habe das Marko nun an das Unterformular gehangen, und es funktioniert wie gewünscht. Allerherzlichsten Dank für die Hilfe!!!

Shel
Beiträge: 17
Registriert: Do 19. Mai 2016, 17:51

Re: [GELÖST]Automatisch auf den neuen Datensatz springen

Beitrag von Shel » Mo 23. Mai 2016, 18:06

Hallo gogo,
gogo hat geschrieben:Kommt drauf an an welchem Ereignis welches Objekts das Makro hängt.
Wenn es am Dokument hängt, musst Du in der "Drawpage" zuerst das Mainform und dann das Subform suchen.
Wenn es am Subform hängt, bekommst Du das Grid dort direkt.

Prinzipiell ist es besser das Makro an das Dokument zu binden, da dann das Ereignis auch wirklich nur beim Öffnen des Formularfensters stattfindet.
Tatsächlich. Das Makro habe ich testweise an die Mausbewegung gehängt, doch da wird es immer wieder angesprochen und lässt keine Änderungen zu. Hänge ich es aber an das Dokument, kommt wieder der Fehler ".Model" nicht gefunden. Ersetze ich diese Zeile mit dem ThisComponent.drawpage... (erst das Haupt, dann Unterformular, dann Grid), kommt der Fehler "MoveToInsertow nicht gefunden". Das verstehe ich nicht.

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: [Nicht ganz GELÖST]Automatisch auf den neuen Datensatz springen

Beitrag von gogo » Mo 23. Mai 2016, 21:05

Dazu musst Du wissen was ein Softwareobjekt ist. z.B. ist ein Writer-Dokument ein Softwareobjekt, aber auch ein Textrahmen im Writer-Dokument ist ein Softwareobjekt. Ein Ereignis (z.B. "BeimÖffnen") ist ebenfalls ein Softwareobjekt. Grob gesprochen ist ein Sofwareobjekt eigentlich ein Softwareprogramm(teil).

Softwareobjekte wiederum haben Eigenschaften und Methoden. Eigenschaften und Methoden erreicht man in Starbasic über einen Punkt zwischen dem Objekt und seiner Eigenschaft/Methode. Wenn das Wirter-Dokument also ThisDocument ist, dann kann man es mit der Methode .print ausdrucken. Im Makro genügt im Wesentlichen:

Code: Alles auswählen

ThisComponent.print
Die Eigenschaft .DrawPage erreicht man über

Code: Alles auswählen

MeineDrawpage = ThisComponent.DrawPage
Eine Methode macht etwas, eine Eigenschaft ist etwas. Wenn Du wissen willst wie der Titel des derzeitigen Dokumentes ist, dann schreibst Du ins Makro:

Code: Alles auswählen

msgbox ThisComponent.Title
und erhältst:
Unbenannt.png
Unbenannt.png (6.95 KiB) 3532 mal betrachtet
Einige Eigenschaften eines Objektes können wiederum andere Objekte sein. Dadurch entsteht eine hierarchische Struktur. z.B. hat ein Writer-Dokument unter anderem folgende Eigenschaften:

Code: Alles auswählen

...
CurrentController
CurrentSelection
...
DialogLibraries
...
DocumentProperties
…
DrawPage
EmbeddedObjects
Endnotes
...
Events
...
GraphicObjects
...
Parent
...
TextTables
...
Die Eigenschaft .Parent ist besonders wichtig, sie führt Dich zum übergeordneten Objekt.
Wie man sich in diesen Objektstrukturen herumhangelt findet man am besten selbst raus ;) Dabei kann man sich u.U. auch im Kreis bewegen:

Ein Formular das sich in einem Writer-Dokument befindet kannst Du so finden:

Code: Alles auswählen

Formularobjekt = ThisComponent.DrawPage.Forms.getByName("MeinFormularname")
Da das Formular der Drawpage und in weiterer Folge dem Writer-Dokument untergeordnet ist, kann man das Writer-Dokument durch 2maligen Aufruf der Eigenschaft .Parent erreichen

Code: Alles auswählen

MeinWriterDokument = Formularobjekt.Parent.Parent
Im Wesentlichen schafft man den Einstieg in die Objekthierarchie über das Event-Objekt oder über Standardobjekte wie z.B. ThisComponent die "immer und überall" zur Verfügung stehen.

Wenn man das Makro "Last(oEvent AS OBJECT)" an ein Ereignis (=Event) bindet, dann steht im Makro oEvent als Objekt zur Verfügung.
Das Ereignis "Mausbewegung" hat offensichtlich die Eigenschaften .Source.Model.Parent. ThisComponent.drawpage hat aber keine ".Source" Eigenschaft - daher der Fehler.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Shel
Beiträge: 17
Registriert: Do 19. Mai 2016, 17:51

Re: [Nicht ganz GELÖST]Automatisch auf den neuen Datensatz springen

Beitrag von Shel » Di 24. Mai 2016, 19:31

Hallo gogo
vielen herzlichen Dank für die umfangreiche Erklärung! Ich werde mich mit der Objekthierarchie mal eingehender beschäftigen.
So, wie ich das verstehe:
gogo hat geschrieben: Wenn man das Makro "Last(oEvent AS OBJECT)" an ein Ereignis (=Event) bindet, dann steht im Makro oEvent als Objekt zur Verfügung.
Das Ereignis "Mausbewegung" hat offensichtlich die Eigenschaften .Source.Model.Parent. ThisComponent.drawpage hat aber keine ".Source" Eigenschaft - daher der Fehler.
,

sollte ich doch aber mit "ThisCompontent.drawpage.mainForm.SubForm.Grid" zu der Tabelle im Unterformular finden, wenn das Makro am Dokument hängt. Aber ich habe noch nicht gefunden, wie ich an "MoveToInsertRow" komme.

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: [Nicht ganz GELÖST]Automatisch auf den neuen Datensatz springen

Beitrag von gogo » Di 24. Mai 2016, 22:37

"MoveToInsertRow" ist eine Methode die es nur bei Formularobjekten gibt. Ein Grid stellt nur Daten dar, es ist dem Formularobjekt untergeordnet und besitzt daher diese Methode nicht.

Du kannst mit:

Code: Alles auswählen

ThisCompontent.drawpage.Forms.getbyname("mainForm").MoveToInsertRow
im übergeordenten Formular zum neuen DS springen. Mit:

Code: Alles auswählen

ThisCompontent.drawpage.Forms.getbyname("mainForm").getbyname("SubForm").MoveToInsertRow
kommst Du im AKTUELLEN Datensatz des MainForm zum neuen Datensatz des Subforms.

MoveToInsertRow bezieht sich NICHT auf den Fokus, sondern setzt den internen Zeiger innerhalb der Datentabelle auf einen bestimmten Datensatz. In einem Grid kann man den Zeiger am grünen Pfeil am "Datensatzmarkierer" (graues Viereck links der Tabelle) erkennen.

Der FOKUS (also das blinkende Ding ;) ) verhält sich UNABHÄNGIG vom Zeiger innerhalb der Datentabelle! Daher musst Du ihn mit ...CurrentController.getControl(oGrid).setFocus setzen! Allerdings: Beim Klicken in das Formular/Grid... werden Fokus und "Zeiger" simultan versetzt! Beides sind aber prinzipiell eigenständige Dinge! Daher habe ich folgenden Kommentar in das Makro oben geschrieben:

Code: Alles auswählen

	' nun kann man sehen, dass im Tabellen-Grid der Datensatzzeiger am neuen Datensatz steht, der Focus (also der Cursor)
	' steht aber noch immer in Feld #1 des MainForm. 
Wenn Du unter diesen Kommentar ein "msgbox" schriebst, dann wird der Code hier pausiert, und Du kannst im Formular sehen was ich meine
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Shel
Beiträge: 17
Registriert: Do 19. Mai 2016, 17:51

Re: [Nicht ganz GELÖST]Automatisch auf den neuen Datensatz springen

Beitrag von Shel » Do 26. Mai 2016, 08:01

Hallo gogo,
herzlichen Dank!
gogo hat geschrieben:"MoveToInsertRow" ist eine Methode die es nur bei Formularobjekten gibt. Ein Grid stellt nur Daten dar, es ist dem Formularobjekt untergeordnet und besitzt daher diese Methode nicht.
Finde ich irgendwo eine Übersicht mit Erläuterungen über Methoden ect., die bei welchen Objekten angewendet werden können, aus der ich mich systematisch informieren kann?
gogo hat geschrieben: Du kannst mit:

Code: Alles auswählen

ThisCompontent.drawpage.Forms.getbyname("mainForm").MoveToInsertRow
im übergeordenten Formular zum neuen DS springen. Mit:

Code: Alles auswählen

ThisCompontent.drawpage.Forms.getbyname("mainForm").getbyname("SubForm").MoveToInsertRow
kommst Du im AKTUELLEN Datensatz des MainForm zum neuen Datensatz des Subforms.
Da mache ich offensichtlich noch irgendetwas falsch, weil ich einen Fehler erhalte, der mir leider nichts sagt:

BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.sdbc.SQLException
Message: Fehler in der Funktionsfolge...

Woran kann das liegen?

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: [Nicht ganz GELÖST]Automatisch auf den neuen Datensatz springen

Beitrag von gogo » Do 26. Mai 2016, 23:27

Schau' Dir mal dieses Thema an: http://www.libreoffice-forum.de/viewtop ... 12&t=15840

... und poste dann das Makro, und sag' uns an welchem Event es hängt und in welcher Zeile genau der Fehler auftritt

... oder lade ein Beispiel hoch
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Shel
Beiträge: 17
Registriert: Do 19. Mai 2016, 17:51

Re: [Nicht ganz GELÖST]Automatisch auf den neuen Datensatz springen

Beitrag von Shel » Fr 27. Mai 2016, 08:15

Hallo gogo,

danke für den Tipp.
gogo hat geschrieben:Schau' Dir mal dieses Thema an: http://www.libreoffice-forum.de/viewtop ... 12&t=15840

... und poste dann das Makro, und sag' uns an welchem Event es hängt und in welcher Zeile genau der Fehler auftritt

... oder lade ein Beispiel hoch
Ich verwende nun das gleiche Makro wie in dem Beispiel. Es hängt an dem Ereignis "Dokument laden beendet":

Code: Alles auswählen

ub Last
dim oDoc AS OBJECT
dim oDrawpage AS OBJECT
dim oForm AS Object
dim oSubForm AS Object

oDoc = thisComponent
oDrawpage = oDoc.drawpage
oForm = oDrawpage.forms.getByName("MainForm")
oSubForm = oForm.getByName("SubForm")
'ThisComponent.drawpage.Forms.getbyname("MainForm").getbyname("SubForm").MoveToInsertRow
	if oSubForm.isnew then
		oSubForm.insertRow()
		oSubForm.updateRow()
	else
	oSubForm.updateRow()
end if
Grid = ThisComponent.drawpage.forms.MainForm.SubForm.SubForm_Grid
oControlView    = ThisComponent.CurrentController.GetControl(Grid)       
oControlView.SetFocus
oControlView.setCurrentColumnPosition(0) 
End Sub
Doch nun tritt ein neuer Fehler in der Zeile: "oSubForm = oForm.getByName("SubForm")" auf:

BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.container.NoSuchElementException
Message: .

Vielen Dank nochmal für die geduldige Hilfe.

gogo
* LO-Experte *
Beiträge: 1081
Registriert: Sa 5. Feb 2011, 19:07

Re: [Nicht ganz GELÖST]Automatisch auf den neuen Datensatz springen

Beitrag von gogo » Fr 27. Mai 2016, 17:58

ich stelle die gewagte Hypothese auf, dass Dein "MainForm" kein Formular mit dem Namen "SubForm" beinhaltet.
Manchmal muss man auf gR0ßUndkLeInSchrEIbUnG aufpassen.

... hast Du xray oder mri installiert?

Code: Alles auswählen

xray oForm
bzw.

Code: Alles auswählen

mri oForm
zeigen Dir die Methoden und Properties von oForm.
g
2008 LucidL./MaverickM./WinXP LibreOffice 3.3.2 > 02/13 LinuxMint13/Xubuntu > 09/13 Debian Wheezy+LO3.5.4.2 > 01/15 Debian Jessie KDE+LO4.3.3.2/Mint17 openbox auf USB+LO4.2.8.2 > 03/16 ArchLin & LO5.1+ff > 02/18 Kubuntu

Shel
Beiträge: 17
Registriert: Do 19. Mai 2016, 17:51

Re: [Nicht ganz GELÖST]Automatisch auf den neuen Datensatz springen

Beitrag von Shel » Sa 28. Mai 2016, 09:14

Hallo gogo,
gogo hat geschrieben:ich stelle die gewagte Hypothese auf, dass Dein "MainForm" kein Formular mit dem Namen "SubForm" beinhaltet.
Manchmal muss man auf gR0ßUndkLeInSchrEIbUnG aufpassen.
Das wäre naheliegend, aber das habe ich schon überprüft. Der Formularnavigator listet tatsächlich ein "SubForm" auf.
Sollte vielleicht besser jedes Formular und Unterformular individuell benannt werden, wenn es in der DB mehrere Formulare gibt?
gogo hat geschrieben:... hast Du xray oder mri installiert?

Code: Alles auswählen

xray oForm
bzw.

Code: Alles auswählen

mri oForm
zeigen Dir die Methoden und Properties von oForm.
Das habe ich noch nicht und muss ich mir einmal ansehen...


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten