ShortCut F3 verbiegen nur im Header

9. Oktober 2006 19:31

Nun habe ich mal wieder ein Problem:
Ich baue gerade an einer Form Mietvertrag.
Da im OnNewRecord-Trigger einer Form ja nicht in die Datenbank geschrieben werden kann, aber gewünscht wird, dass nach drücken von F3 erst mal ein Menü aufgeht, wie denn der neue Vertrag angelegt werden soll, ob als Ergänzung (gleiche Kopfdaten als Vorgabe, gleiche Vertragsnr. aber Vertrags-Subnr um eins erhöht) oder als Zusatzvertrag (gleiche Kopfdaten aber neue Vertragsnr mit Bezug zur aktuellen Vertragsnr im Feld "gehört zu Vertragsnr") oder eben als eigenständiger Vertrag, habe ich den Menüpunkt "neuer Vertrag" im Menübutton Funktion mit dem Shortcut F3 angelegt.
Das funktioniert soweit auch ganz prächtig.

Nun will ich Zeilen im Vertrag eingeben. Solange ich die neue Zeile immer nur unten anhängen muss, ist das alles noch kein Problem. Cursor runter oder in die erste freie Zeile klicken und loslegen.

Nur, wenn ich zwischen vorhandenen Zeilen eine neue anlegen will, also die Zeile, vor der eingefügt werden soll, anklicke oder mir den Cursortasten dorthin gehe und dann F3 drücke, kommt das Menü für einen neuen Vertrag und keine neue Eingabezeile.
Jetzt hab ich mir gedacht, ich prüfe im OnPush-Trigger des F3 Menüpunkts ab, ob die Mainform auch die aktive ist, bzw dass die Subform nicht aktiv ist. So kann ich zwar das Menü für den neuen Vertrag umgehen, aber eine neue Zeile wird nicht eingefügt.
Ich muss also eine möglichkeit finden, wie ich programmgesteuert vor der markierten zeile eine neue einfügen kann, als ob die F3 Funktion nicht umgeleitet wäre.
Ich kann zwar mit der Rechten Maustaste auf den Zeilenkopf klicken und dann den Befehl New aus dem Kontextmenü wählen, aber dazu muss man ja wieder zur Maus greifen, was den Eingabefluss erheblich stört.

Hat jemand eine Idee, wie ich das Problem lösen kann?

9. Oktober 2006 20:25

Hallo Michael,

nur so eine Idee:
- Groß+F3 -> Neuer Vertrag
- F3 -> Neue Zeile
- Groß+F4 -> Vertrag löschen
- F4 -> Zeile löschen

Alles über eigene Menüpunkte ausprogrammieren.

MfG
Josef Metz

9. Oktober 2006 20:36

die Frage ist ja nur, wie erzeuge ich eine neue Zeile zwischen bestehenden, wo die Daten eingegeben werden können. Der Datensatz soll ja erst gespeichert werden, wenn die Primärschlüsselfelder gefüllt sind, weil leere Felder nachträglich oft nicht mehr umbenannt werden können, z.B. wenn tablerelations darauf zugreifen.....
alles andere (speziell F4) ist kein Problem, da hab ich ja nichts umgebogen.
Was mich ärgert, ist das die Systemfunktion F3 sehr wohl unterscheidet, ob die Sub- oder die Mainform aktiv ist, ein Menubutton auf der Mainform mit F3 im Menüpunkt reisst aber alles an sich, egal wo der Cursor steht....

9. Oktober 2006 22:50

Hast du mal versucht, das Property DelayedInsert des SubForms auf TRUE zu setzen? Dann wird der Datensatz erst in die DB geschrieben, wenn alle Felder, die zum Primärschlüssel gehören, einen Werte aufweisen.

10. Oktober 2006 00:48

rotsch hat geschrieben:Hast du mal versucht, das Property DelayedInsert des SubForms auf TRUE zu setzen? Dann wird der Datensatz erst in die DB geschrieben, wenn alle Felder, die zum Primärschlüssel gehören, einen Werte aufweisen.

Auch wenn der Tip gut ist, die Erklärung ist nicht richtig. DelayedInsert bedeutet, dass der Insert erst ausgeführt wird , wenn der Datensatz verlassen wird. Der normale Insert dagegen wird ausgeführt, sobald das Control mit dem letzten Primärschlüsselfeld nach der Eingabe des Feldwertes verlassen wird.

10. Oktober 2006 08:27

um delayed insert nutzen zu können, muss man ja erst mal einen jungfräulichen Datensatz mitten zwischen 2 bestehenden anlegen.
mein Problem ist genau dieses anlegen, was die Systemfunktion macht.
Da ich F3 ja umgebogen habe, muss ich genau diese Funktion nachbilden!
Also ich bin auf einem existierenden Datensatz, drücke F3 und dann soll an dieser Stelle eine leere Zeile mit dem Sternchen davor erscheinen und der Cursor im ersten sichtbaren Feld zur Eingabe erscheinen. alles weitere wie z.B. delayed insert usw. kommt ja erst zum tragen, nachdem ein Feld ausgefüllt wurde.

Nochmal ganz deutlich:
Ich will, dass Navision sich bei aktiver Subform beim Drücken der F3-Taste so verhält, als hätte ich F3 nicht verbogen.

10. Oktober 2006 08:35

Ich denke mal, in diesem Fall musst du die Geschichte ausporgammieren. Ich würde folgendes versuchen:

Beim Auslösen auf F3 die aktuelle Zeilennr. und die nachfolgende Zeilennr. merken. Der neue Datensatz muss ja dann als Zeilnnr. den Wert in der Mitte zwischen aktuellem und nächstem Satz erhalten (also wenn aktuell = 10000 und nächster 20000, dann bekommt der neue den Wert 15000). Dann über den Befehl INIT einen neuen Datensatz anlegen und die Primärschlüsselfelder füllen.

10. Oktober 2006 08:53

Warum versteht mich denn keiner?
Die neue Zeile soll nicht programmgesteuert ausgefüllt werden.
Rotsch, ausserdem wird die neue Zeile VOR der aktuellen eingefügt, nicht nachher, ich muss mir also die aktuelle und die vorherige Zeile merken...
Aber das ist nicht das Problem.....

Der Benutzer sitzt vor der Form und stellt fest: "Oh ich hab ja noch einen Artikel zwischen der 3. und 4. Position vergessen".
Nun geht der Benutzer, weil er ja das normale Verhalten von Navision gewohnt ist, hin, setzt den Cursor auf die 4. Zeile und drückt F3.

Normalerweise stellt Navision ihm dann ja eine leere neue Zeile zur Eingabe an genau dieser Stelle zur Verfügung.

Durch mein umbiegen von F3 passiert aber genau das nicht, sondern das Menü zur Anlage eines neuen Vertrags.

Ich kann jetzt zwar abfragen, ob die Subform aktiv ist, und in diesem Fall das Neuanlagemenü unterdrücken, aber dann passiert eben gar nichts.
Ich muss also das Standardverhalten von Navision irgendwie nachbilden.
Und genau das "irgendwie" ist mein Problem. Was genau muss ich tun, um dem Benutzer an der gewünschten Stelle eine neue leere Zeile zur verfügung zu stellen?

10. Oktober 2006 10:26

Ich würde zwar F3 nie so verbiegen ( entspricht auch nicht Style Guide und läßt sich nicht zertifizieren) sondern, wie von Josef schon gesagt, dann lieber die unbelegten Shortcuts verwenden. Wenn es aber die Menupunkte funktioniert, müßte es gehen, über einen Automation Server den Windows Scriptiing Host mit SENDKEYS zu füttern, um den Menüpunkt anzusteuern.

10. Oktober 2006 11:14

Das sich das nicht zertifizieren läßt ist klar, aber es wurde so gewünscht, und der Kunde ist König.
Hmmm, das mit dem Scripting Host klingt kompliziert.
Ich muss dem also erst mal den Movemouseevent senden, dass die Maus auf dem Zeilenkopf positioniert wird, denn nur da hat das Kontextmenü der Rechten maustaste......
ach quatsch, ich muss ja nur ALT-B und N senden.....
muss ich mir mal ansehen

11. Oktober 2006 15:27

@Kowa:

So, jetzt hab ich alles was mit Scripting zu tun hat durch,
ich finde in keinem Automationserver irgendwas, was an Sendkey erinnert.
Kannst Du mir da irgendwie weiterhelfen?

11. Oktober 2006 18:32

MSDN - Windows Script Host
MSDN - Windows Script Host - SendKeys-Method

Ein Beispiel für die Verwendung von SendKeys ist in diesem Download zu finden: WSHManagement

11. Oktober 2006 19:42

Perfekt, das funktioniert, die neue Zeile wird an der Stelle eingefügt

ich sende einfach
wshShell.sendkeys('%bn');

dummerweise verschwindet sie sofort wieder und der Cursor springt in die erste Zeile. Wenn ich ALT-B und N manuell eintippe bleibt die neue Zeile stehen

Ich helfe mir im Moment damit dass ich
wshShell.sendkeys('%bn{right}');
sende, allerdings ist die Zeile damit schon gespeichert....

Delayed insert hilft hier nicht, da die Zeile dann trotz {RIGHT} verschwindet. Anscheinend kommt nach ausführen des Sendkey noch etwas hinterher, dass einen Abbruch der neuen Zeile veranlasst.

22. Mai 2007 18:16

Hallo Michael,

kannst du mir sagen, wie man Zugriff auf den F3-Shortcut bekommt?
Ich möchte im VK-Auftrag das Einfügen von Zeilen zwischen andere Zeilen mit F3 unterbinden, weiß allerdings nicht wie das funktionieren soll.
Es soll immer nur nach der letzten VK-Zeile eine neue Zeile eingefügt werden können. Ist das machbar?

22. Mai 2007 18:36

Um die F-Tasten Shortcuts für eigene Zwecke zu nutzen musst du nur einen Menubutton in die Form einbauen und einem MenuItem den entsprechenden Shortcut zuweisen, das geht auch mit F3. Den Rest musst du dann entsprechend programmieren. Du musst aber dann auch dafür sorgen, dass ein neuer VK angelegt wird, wenn der Cursor im Kopf steht und der Benutzer auf F3 klickt.

22. Mai 2007 18:43

Du kannst auch auf der SubForm im Trigger OnNewRecord den Parameter BelowxRec auswerten.