Seite 1 von 3

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

Verfasst: Do 19. Mai 2016, 19:18
von Shel
Hallo zusammen,
ich habe mich gerade neu in diesem Forum angemeldet und bin daher für Hinweise dankbar, wie ich Beiträge und Fragen besser oder anders stellen könnte oder was sonst noch zu beachten wäre (hier bitte ich um etwas Nachsicht der erfahrenen Nutzer dieses Forums).

In Libreoffice benutze ich momentan vorrangig (und sehr gerne) die Datenbankanwendung, die ich beruflich zur Verwaltung von Dokumentationen einsetze und kontinuierlich um Funktionen erweitere. Vor dem Einsatz werden die Versionen von mir auf verschiedenen Betriebsystemen und in LO 4.4 sowie 5.0 getestet. Das ist vielleicht nicht notwendig, aber auf diese Weise und durch Herumprobieren versuche ich mehr über die Funktionalität zu lernen, da meine Kenntnisse bezgl. SQL und Basic noch recht begrenzt sind. Die Handbücher und Hilfedateien ziehe ich regelmäßig zurate.

Aktuell wünsche ich mir Unterstützung bei einer Funktion, die ich zuerst für eher einfach gehalten habe. Lösungsvorschläge, die ich dazu bislang gefunden habe, führten leider nicht zum gewünschten Ergebnis:

- Ein Formular("MainForm") enthält ein Unterformular ("SubForm") in Tabellendarstellung.
- Die zahlreichen Einträge im Unterformular sind nach Datum sortiert, bei Aufruf des Formulars soll der " grüne Zeiger" ganz unten auf dem neuen, leeren Datensatz stehen und eine sofortige Eingabe ermöglichen
- Alle anderen Datensätze sollen jedoch weiterhin angezeigt werden und können z.B. mit dem Mausrad durchsucht werden.

= Mit einer Schaltfläche und der Aktion "Neuer Datensatz" kann das im Formular zwar schnell erzeugt werden. Aber wie lässt sich das automatisch auslösen, ohne eine Schaltfläche zu benutzen?
Ich habe angenommen, dass die "Standart"Aktion in den Eigenschaften der Schaltfläche auch über einen simplem Befehl auslösbar wäre, habe dazu aber nichts gefunden. Makros mit verschiedenen gefundenen Lösungswegen (movetoInsertrow(), insertrow, .setfocus oder .last) habe ich allesamt nicht ans Laufen bekommen. Wie gesagt, ich vermute immer noch, dass es einen ganz einfachen Weg gibt... Kann mir jemand Tipps geben?

Vielen Dank im Voraus.

Re: Automatisch auf den neuen Datensatz springen

Verfasst: Fr 20. Mai 2016, 16:20
von gogo
kopier' mal eines Deiner Makros hier in einen Codeblock - dann geht's vermutlich am schnellsten.

Prinzipiell: Wenn Du ein Main- und ein SubForm hast gibt's mit der Bestimmung des neuen Sub-Satzes ein logisches Problem, denn man muss ja vor dem Anlegen desselben wissen zu welchem übergeordneten Satz er gehört.

Re: Automatisch auf den neuen Datensatz springen

Verfasst: Fr 20. Mai 2016, 19:45
von RobertG
Hallo *,

ich habe das eben einmal mit der Beispieldatenbank "Sport" aus dem Handbuch umgesetzt:
Makro mit MoveToInstertRow an das Tabellenkontrollfeld des Unterformulars gebunden. Dort auf die Eigenschaft "Bei Fokuserhalt".

Eine Bug bei dem automatischen Kontrollelementefokus führt dazu, dass der Fokus nicht automatisch zum ersten Feld des Hauptformulars springt. Beim Öffnen des Formulars steht stattdessen der Cursor direkt in dem Tabellenkontrollfeld und dort jetzt zur Eingabe bereit. Da sich aber beim Datenwechsel zum nächsten Datensatz der Cursor dort gar nicht erst raus bewegt, springt das Makro nicht an. Sobald der Weg aus dem Hauptformular ins Unterformular gegangen wird, ist dies aber wieder der Fall.

Gruß

Robert

Re: Automatisch auf den neuen Datensatz springen

Verfasst: Fr 20. Mai 2016, 21:44
von Shel
Hallo gogo,

vielen Dank für die Antwort!
gogo hat geschrieben:kopier' mal eines Deiner Makros hier in einen Codeblock - dann geht's vermutlich am schnellsten.
Ich habe meine erfolglosen Versuche dummerweise nicht aufbewahrt. Einer der Versuche, den ich mir ohnehin aus verschiedenen Quellen zusammengesucht hatte, sah aber ähnlich aus wie das Beispiel von Robert. Leider zeigt auch das keine Wirkung und ich bin ratlos.
gogo hat geschrieben:Prinzipiell: Wenn Du ein Main- und ein SubForm hast gibt's mit der Bestimmung des neuen Sub-Satzes ein logisches Problem, denn man muss ja vor dem Anlegen desselben wissen zu welchem übergeordneten Satz er gehört.
Das kann ich nachvollziehen. Allerdings habe ich bei Aufruf des Formulars den übergeordneten Satz per Filter auf einen Eintrag begrenzt und das Subformular ist ja mit dem Mainformular verbunden (z.B. so: WHERE Tabelle1.ID = Tabelle2.ID). Würde das Problem da immer noch bestehen?
Mit einer Schaltfläche geht es problemlos. Als ich spaßeshalber versucht habe die Schaltfläche per Makro zu aktivieren, wurde der Fokus seltsamerweise auf den 1. Datensatz gesetzt. Geht so etwas nicht?

Re: Automatisch auf den neuen Datensatz springen

Verfasst: Fr 20. Mai 2016, 21:59
von Shel
Hallo Robert,

herzlichen Dank für die Antwort und das Beispiel!
RobertG hat geschrieben:Hallo *,

ich habe das eben einmal mit der Beispieldatenbank "Sport" aus dem Handbuch umgesetzt:
Makro mit MoveToInstertRow an das Tabellenkontrollfeld des Unterformulars gebunden. Dort auf die Eigenschaft "Bei Fokuserhalt".
Das sieht für mich nach der einfachen Lösung aus, die ich vermutet habe.
RobertG hat geschrieben:Eine Bug bei dem automatischen Kontrollelementefokus führt dazu, dass der Fokus nicht automatisch zum ersten Feld des Hauptformulars springt. Beim Öffnen des Formulars steht stattdessen der Cursor direkt in dem Tabellenkontrollfeld und dort jetzt zur Eingabe bereit. Da sich aber beim Datenwechsel zum nächsten Datensatz der Cursor dort gar nicht erst raus bewegt, springt das Makro nicht an. Sobald der Weg aus dem Hauptformular ins Unterformular gegangen wird, ist dies aber wieder der Fall.
Nach einigen Versuchen konnte ich das nachvollziehen. Die gewünschte Funktion wird offenbar ausgeführt, sobald irgendwo ins Unterformular geklickt wird. Als ich das Makro mit der Eigenschaft "Maus innerhalb" verbunden habe, habe ich das Ziel fast erreicht. Die neue Zeile ist ausgewählt - jetzt muss nur noch der Cursor im ersten Feld (in dem Fall ein Datumsfeld) blinken, und ich könnte sofort schreiben. Bislang müsste der Nutzer noch einmal klicken. Lässt sich das noch umgehen?

Re: Automatisch auf den neuen Datensatz springen

Verfasst: Sa 21. Mai 2016, 01:56
von gogo
Das Setzen des Fokus muss man in LO/AOO über den Controller machen, dafür gibt es die Methode .getControl([Kontrollelement-Objekt]).setFocus
Folgendes Makro wird funktionieren:

Code: Alles auswählen

Sub LastOnOpen(oEvent AS OBJECT)
	' ermittelt das Unterformular und geht dort zum neuen Datensatz
	oSubform = oEvent.Source.DrawPage.Forms.getByName("MainForm").getbyname("SubForm")
	oSubform.MoveToInsertRow
	' 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. Daher muss der Dokumentencontroller den Fokus versetzen:
	' Das ist das TabellenSteuerelement
	oGrid    = oSubform.getByName("SubForm_Grid")
	' hier wird der Focus in das Grid des SubForms gesetzt:
	oEvent.Source.CurrentController.getControl(oGrid).setFocus
end Sub
Das Makro an die Eigenschaft "Dokument öffnen" des Formulars (Extras/Anpassen/Ereignisse) binden! dann wird beim Öffnen des Base-Formulars der Fokus gesetzt.

Re: Automatisch auf den neuen Datensatz springen

Verfasst: Sa 21. Mai 2016, 08:35
von Shel
gogo hat geschrieben:Das Setzen des Fokus muss man in LO/AOO über den Controller machen, dafür gibt es die Methode .getControl([Kontrollelement-Objekt]).setFocus
Hallo gogo,
vielen Dank für den Hinweis. Das Problem ist gelöst. Der funktionierende Code ist folgender:

Code: Alles auswählen

Sub Last(oEvent AS OBJECT)
oForm = oEvent.Source.Model.Parent
oForm.MoveToInsertRow
Grid = ThisComponent.drawpage.forms.MainForm.SubForm.SubForm_Grid
oControlView    = ThisComponent.CurrentController.GetControl(Grid)       
oControlView.SetFocus
oControlView.setCurrentColumnPosition(0) 
End Sub
Danke noch mal an alle!
PS: Wie kann ich diese Anfrage als "Gelöst" kennzeichnen?

Re: Automatisch auf den neuen Datensatz springen

Verfasst: Sa 21. Mai 2016, 09:00
von RobertG
Hallo Shel,

als "Gelöst" kannst Du das kennzeichnen, indem Du Deinen Startbeitrag bearbeitest - dort einfach in den Betreff ändern.

Übrigens:
Grid in Deiner Lösung dürfte gleich sein oEvent.Source.Model.

Gruß

Robert

Re: Automatisch auf den neuen Datensatz springen

Verfasst: Sa 21. Mai 2016, 11:49
von Shel
Hallo RobertG,

herzlichen Dank für die Hilfe!
Das Beispiel hat mich viel weiter gebracht.
RobertG hat geschrieben: Übrigens:
Grid in Deiner Lösung dürfte gleich sein oEvent.Source.Model.
Das hatte ich auch probiert, hat aber eine Fehlermeldung hervorgebracht, "Methode nicht gefunden".

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

Verfasst: Sa 21. Mai 2016, 13:24
von gogo
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.

Um rauszufinden wo man gerade ist haben sich Tools wie XRay oder MRI bewährt