Seite 1 von 1
Feldwert per Tastaturkürzel aus vorigem Datensatz übernehmen
Verfasst: Di 5. Apr 2011, 11:51
von devdol
Ganz ähnlich wie in Excel gleich 3 vordefinierte Tastenkürzel ein schnelles Ausfüllen unterstützen ( "Strg + Umschalten + ," übernimmt den "Wert aus der darüberstehende Zelle", "Strg + r" den "Inhalt der links benachbarten Zelle" [wohl als "repeat" zu merken] und "Strg + u" den "Inhalt der darüberliegenden Zelle" [wohl für "upper"] ) sind Anwender von MS Access gewohnt, mit der Tastenkombination "STRG + #" einfach Feldwerte aus dem vorigen Datensatz in den aktuellen kopieren zu können, ohne sie erneut abzutippen.
Nach einer einfachen Lösung, in Base per Tastaturkürzel einen identischen Wert aus dem vorigen Datensatz zu übernehmen, suche ich schon lange in den diversen Foren - bislang vergebens. Auch das Durchkämmen von "Extras/Anpassen/Tastatur" scheint nahezulegen, daß dieser Komfort nicht vorgesehen ist.
Nachdem der Pessimist aber der einzige Mist ist, auf dem garantiert nichts wächst, frage ich trotzdem mal in die Runde:
Hat jemand schon eine Lösung dafür gefunden?
[Kontext: LibreOffice 3.3.2 auf Linux]
P.S: Immerhin fiel mir nebenher bei der Suche eine Technik für das bequeme Kopieren (Verdoppeln) ganzer Datensätze per Drag&Drop auf: Mit der Maus den zu kopierenden Datensatz (Zeile) markieren und mit gedrückter linker Maustaste nach unten in den freien Bereich ziehen, bis ein "+"-Cursor erscheint, dort loslassen: Der gezogene Datensatz wird dupliziert (und ein entsprechendes AutoWert-Feld darin automatisch passend ausgefüllt).
Dies funktioniert sowohl in der Tabellenansicht, als auch in einem Abfrage-Ergebnis, nicht dagegen in einem Tabellen-Kontrollfeld (Unterformular) auf einem Datenformular.
Re: Feldwert per Tastaturkürzel aus vorigem Datensatz überne
Verfasst: Di 5. Apr 2011, 13:11
von gogo
Das Problem lautet:
Was ist der "letzte" Datensatz?
In einer Single-User-Umgebung ist das schon schwierig, in einer Multi-User-Umgebung ... unmöglich. Die Drag&Drop-Lösung ist wohl noch das "sauberste" Verfahren, wenngleich es auch zu bösen Überraschungen führen kann. Diese kann man aber verhindern, wenn man den Datensatzmarkierer nicht anzeigen lässt. Die beschriebene Drag&Drop-Lösung funktioniert nur, wenn man den/die Datensätze vom Datensatzmarkierer weg zieht.
Re: Feldwert per Tastaturkürzel aus vorigem Datensatz überne
Verfasst: Di 5. Apr 2011, 14:16
von devdol
An die Defintion "Was ist der 'letzte' Datensatz" hatte ich sogar gedacht - ich wollte nicht nur noch mehr schreiben ,-)
Granz pragmatisch lautet die Antwort natürlich: den aus Sicht des aktuellen Benutzers und Formulars (bzw. Datensatzmarkierers) vorigen.
Daß es in Multiuser-Multiserver-Multiform-Szenarien Probleme geben könnte, ist schon klar - aber auch unwahrscheinlich, wenn der einzige Anwender vor seiner eingebetteten HSQLDB hockt :-]
Mehr noch: Diese "Ditto-Tasten-Funktionalität" birgt schon deshalb nicht mehr Risiken für Überraschungen, weil hier nur 1 Feldinhalt kopiert wird und dieser im Zentrum der Aufmerksamkeit des Benutzers steht. Erschiene hier etwas Unpassendes, kann man es immer noch manuell überschreiben. In der Regel dürfte also (z.B. bei der sequentiellen Eingabe von Listen, bei denen manche Felder immer wieder denselben Wert haben) eine solche Komfort-Funktion viel mehr (Tipp-)Fehler (durch Immerwiederneueingabe) vermeiden als selbst verursachen.
Re: Feldwert per Tastaturkürzel aus vorigem Datensatz überne
Verfasst: Mi 6. Apr 2011, 19:02
von mhonline
die Antwort von GoGo hab ich nicht verstanden
LO/OO haben ja nicht mal einen internen Satzzeiger sondern nutzen über die Hilfskonstruktion PrimaryKey ausdrücklich einen Zeiger, der nun gerade mit der letzten Erfassung erstellt worden ist, und was das mit Single- und Multi zu tun haben könnte, erschließt sich mir noch weniger, da der Lock-Mechanismus grundsätzlich sich so verhält, als wäre LO/OO in eine Multi-User-Situation, das aber gänzlich irrelevant ist, weil für den Satz "neu" je eh nur Daten "vor" einen Committ erfaßt werden, die ja auch noch änderbar sein müssen. Und mal abgesehen davon, daß Drag+Drop nicht funktioniert (von wo nach wo überhaupt?!), finde ich, daß das eine merkwürdige Antwort ist, wo gibt es denn sowas überhaupt zur Datenerfassung?
Also DevDol, gute Frage, ich schliesse mich der Frage an, kann man ein Macro erzeugen, das in einem Formular den letzen Satzzeiger temporär hält und per Hotkey Daten in einzelne oder alle Felder in den neuen Datensatz einträgt? Wär schon schön.
Martin
Re: Feldwert per Tastaturkürzel aus vorigem Datensatz überne
Verfasst: Do 7. Apr 2011, 10:31
von devdol
Ja, es wird wohl nur per Makro funktionieren. Meine erste Idee war, das Ereignis "Form_OnKeyPressed(oEv)" (sinngemäß, da es in LibO's IDE leider keine "standardisierten" Namen für die Ereignisprozeduren gibt [ ... wäre auch schön ,-)] ) auszuwerten und oEv nach dem aktiven Steuerelement zu befragen. Leider hat aber ein Formular gar kein KeyPress-Event. Es geht ersatzweise vielleicht über das Zuweisen eines Keyhandlers über Extras/Anpassen/Tastatur, beschränkt auf Base und gespeichert nur in der jeweiligen ODB-Datei.
Ferner müßte man beim Datensatzwechsel das Formular in einer globalen Variable die Liste der vor dem Wechsel aktuellen Feldwerte speichern lassen. Das sollte noch eher gehen. (Oder ersatzweise nur den PrimaryKey und die Daten nur bei Bedarf wieder abrufen - letzteres dürfte wohl umständlicher und langsamer sein, dafür bekäme man garantiert den frischesten Inhalt aus der DB...)
Mal sehen wann ich dafür etwas Zeit finde.
P.S. noch gegen die möglicherweise gestiftete Verwirrung in Sachen "Drag & Drop", folgendes war eingangs als Randnotiz gemeint:
Wenn man einen Datensatz mehrfach neu einzugeben hat, der aus vielen Feldern besteht, von denen die meisten aber identische Werte wie im letzten schon vorhandenen Datensatz aufweisen, dann kann man direkt in der Tabelle den Datensatzmarkierer des zu duplizierenden Datensatzes selektieren und per Drag & Drop auf die Zeile "Neuen Datensatz" anlegen "werfen".
Der "gedraggte" Datensatz wird dann tatsächlich dupliziert, und LibO/HSQLDB sind dabei sogar so freundlich, AutoWert-Felder korrekt weiterzuschreiben.
Falls weitere Indexbedingungen verletzt werden, kommt korrekt eine generische Warnung, daß Fehler aufgetreten sind - um die man sich dann noch selber kümmern kann (die betroffenen Felder sollten ja aller Wahrscheinlichkeit nach auch die sein, die tatsächlich abweichende Werte enthalten).
Zumindest hätte ich das Vorhandensein einer solchen Funktionalität zum Duplizieren von Datensätzen keinesfalls erwartet, daher schien es mir einen Hinweis wert. Denn die aus Access geläufige Methode, in die Zwischenablage kopierte Datensätze "ans Ende anfügen" zu können, die Umsteiger vielleicht suchen werden, gibt es hier wiederum nicht. Und was man übers Menü versuchen könnte, nämlich zu kopierende Datensatzzeile kopieren, "Bearbeiten/Kopieren", die "Neuer-Datensatz-Zeile" markieren und "Bearbeiten/Einfügen", funktioniert ebenfalls nicht (wenngleich es eigentlich genau der Drag-and-Drop-Aktion entspricht)!
Nach dem Duplizieren muß man lediglich die Felder mit abweichenden Inhalten korrigieren (falls Schlüsselverletzungen vorliegen, muß es sofort an Ort und Stelle geschehen, ansonsten ggf. anschließend wieder im Formular). Dieses Vorgehen ist zwar unschön, weil man das Formular verlassen muß, aber zumindest arbeitssparender (und weniger fehlerträchtig) als im wesentlichen gleiche Daten immer und immer wieder neu ins Formular einzutippen. Und bei letzterem wäre ja der für diesen Thread namensgebende, aber offenbar nicht implementierte Shortcut, die berühmte "nimm-dasselbe-nochmal-Taste", eine große Hilfe, weil man das Formular nicht zu verlassen bräuchte.
WwwbTw - Womit wir wieder beim Thema wären ,-)
Re: Feldwert per Tastaturkürzel aus vorigem Datensatz überne
Verfasst: Do 7. Apr 2011, 18:47
von mhonline
Dank DevDol
Ich bin zwar kein Programmierer, aber ich denke mal, daß die Lösung ZWEI und das Kopiere-bei-Bedarf die richtige weil universellere Lösung wäre, auch wenn eine während der Laufzeit aus den bekannten Variablen (Datei,Label-Quelle, Label-Ziel und Primkey-Wert) "gebastelte" SQL-Abfrage wahrscheinlich ewig in der Ausführung dauern wird. Aber warum es keine HotKeys in LO/OO gibt, verstehe ich wirklich nicht. Ist die Idee damit tot?
In meiner Lieblings-DOS-Datenbank wird mit <Strg-Enter> der aktuell selektierte Datensatz im ein neues Formular kopiert, ohne irgendwelche Verzögerung, damit können alle Berechnungen in Formularen sofort stattfinden. Das kann doch in LO/OO nicht total unmöglich sein?!
Martin
Re: Feldwert per Tastenkürzel aus vorigem Datensatz kopieren
Verfasst: Fr 8. Apr 2011, 12:08
von devdol
Das paßt ja gut - ich bin (leider) auch kein Programmierer, sondern lediglich ambitionierter Anwender, der mit seinem PC etwas mehr machen möchte als ihn als Schreibmaschinentastatur zu verwenden. Das "Dev" im Alias ist mehr in Anklang an das /dev/-Verzeichnis entstanden ,-)
Ideen hätte ich ja, nur findet sich für einen Nicht-Guru der Weg zum Ziel extrem schwer. Im Moment scheitert es an der Möglichkeit, im Makro herauszufinden, welches Steuerelement auf dem Formular den Fokus hat (dummerweise muß man immer erst wissen, wie etwas heißt, bevor man überhaupt erfolgreich danach suchen kann!). Doch nur zum umgekehrte Weg ("In a Base form, how to get focus on a specific control?") findet sich Information. Ein Event-Objekt kann man leider offenbar auch nicht verwenden, wenn man das Makro über Extras/Anpassen/Tastatur an einen Shortcut bindet.
In VBA gab's einfach Screen.ActiveControl und gut... Doch auch in LibO muß es die Anwendung ja sehr wohl wissen - wie zum Hohn blinkt ja der Cursor darin!
P.S. nach 5 Stunden Forenrecherche und Suchen mit Xray endlich eine Eigenschaft .hasFocus gefunden:
Code: Alles auswählen
Dim foc(oForm.count-1)
for i=0 to (oForm.count-1)
aControl = oForm.getByIndex(i)
foc(i)=oDocView.getControl(oForm.getByName(n)).Peer.hasFocus
next i
Und was enthält foc() danach? Ein Array nur aus false-Werten.
Vorläufiges Fazit als Zitat: "StarBasic _is_ user friendly. It's just very selective about who its friends are."

Vielleicht liest einer dieser Glücklichen hier vorbei und hilft das Rätsel zu lösen?.