[Gelöst]Filter Mainform Subform

18. Juli 2006 10:45

Hallo,

so langsam fällt mir nichts mehr dazu ein, vielleicht könnt ihr mir ja helfen:

Ich habe eine Mainform zur Tabelle: Objekt und eine Subform zur Tabelle Aufwand. Die habe ich miteinander verlinkt habe(wie Sales Header, Sales Line).
Zur Erklärung: Es gibt Objekte, an denen gearbeitet wird und hierzu werden Zeiten von unterschiedlichen Benutzern zurückgemeldet.

Nun möchte ich aber die Tabelle in der Subform noch zusätzlich filtern:

Wenn in der Benutzereinrichtung ein Haken: AlleObjekte nicht gesetzt ist, dann sollen nur Datensätze des derzeitigen Benutzers angezeigt werden. Das funktioniert noch. (OnAfterGetRecord der Subform).

Wenn der Haken in der Benutzereinrichtung gesetzt ist, dann soll geprüft werden, von wem das Objekt angelegt wurde. Denn nur derjenige darf die Aufwände aller Benutzer zu seinem Objekt sehen und sonst nur seine.
Und da liegt mein Problem. Wenn ich nun zwischen den Objekten blättere, dann muss ich unter bestimmten Umständen erst in die Zeilen klicken und dann in den Header, damit der Setrange kpl. greift.

Aber nur, und jetzt kommt´s: Wenn der erste Datensatz in der Subform ein Datensatz von einem anderen Benutzer ist und ich nicht Objektinhaber bin. wird dieser trotzdem angezeigt. Existiert ein zweiter Datensatz von einem anderen Benutzer wird dieser korrekterweise auch nicht angezeigt, eben sonst nur meine.
Ist der erste Datensatz ein Datensatz von mir, ist alles andere auch richtig.

Hat jemand hierfür eine Erklärung und vielleicht auch eine Idee, wie ich das abstellen kann?

Danke schon einmal im voraus (auch für´s Lesen des langen Textes :wink: )
Zuletzt geändert von NavHummel am 19. Juli 2006 09:51, insgesamt 1-mal geändert.

18. Juli 2006 11:30

an welcher Stelle läßt du die Filter denn eingreifen?
hast du mal versucht die Filter im OnOpenForm der Subform zu aktivieren?

18. Juli 2006 11:40

Das funktioniert ja auch nur bedingt. Klar, wenn ich die Form öffne und damit die Subform auch öffne, dann wird richtig gefiltert. Das macht er aber auch wenn ich beim Öffnen direkt im betreffenden Objekt bin. und die Programmierung im OnAfterGetRecord lasse.
Das Problem habe ich beim Blättern und da wird die Subform ja nicht neu geöffnet.
Hmmmm oder kann ich das irgendwie provozieren? Wäre ja auch ein Ansatz....
Trotzdem Danke.

18. Juli 2006 11:55

vielleicht läßt sich ein neu öffnen provozieren mit Visible(false) und anschließend visible(true), getestet hab ichs aber nicht.

Du könntest auch noch mal versuchen, den Filter im OnAfterGetCurrRecord unterzubringen.

18. Juli 2006 12:15

Das mit dem Visible bringt hier auch keine Veränderung und das mit dem CurrRecord hatte ich schon, auch ohne Erfolg.

Ist schon komisch. Es funktioniert, so lange der erste Datensatz in der Subform innerhalb des Filters ist. Wenn ich auf diesen datensatz draufklicke, dann verschwindet er auch... :roll:

18. Juli 2006 12:34

das Phänomen kenne ich, ich habe in den Verkaufsforms eine Taste (genaugenommen 3 Tasten) eingebaut, mit der ich dann jeweils die Ressource, den Artikel oder das Sachkonto öffnen kann. Nur beim Öffnen der Form passiert nun folgendes.
Wenn der Typ der letzten Zeile nicht mit dem der ersten übereinstimmt, zeigt Navision die falsche Taste an, bis ich in einen anderen Record klicke und zurück zur ersten Zeile gehe. Ich habe mir dann mit einem Timer Event geholfen, in dem ich erst mal abfrage, ob der Timer schon mal durchgelaufen ist, und wenn nicht, lasse ich noch mal die Form updaten. Der Timer läuft zwar weiter, aber das kostet dann kaum noch Zeit, weil der nur die Abfrage in der ersten zeile ausführt ( if timerexecuted then exit). Vielleicht hilft Dir das weiter, allerdings müsstest du den immer komplett durchlaufen lassen....

Das blöde ist ja bei Navision, dass man genau in den Triggern, die beim Wechsel angesprochen werden, bestimmte Aktionen wie Currform.updatecontrols nicht ausführen kann. im OnAfterGetRecord ist das sogar tödlich, weil er dann rekursiv den Stackspeicher füllt ;-)

18. Juli 2006 15:04

Hallo,

versuch's doch mal mit einer Funktion in der Subform, die nur ein CurrForm.UPDATE() aufruft und ruf diese Funtion im OnAfterGetRecord-Trigger der Hauptform auf.

MfG
Josef Metz

19. Juli 2006 09:50

jm hat geschrieben:Hallo,

versuch's doch mal mit einer Funktion in der Subform, die nur ein CurrForm.UPDATE() aufruft und ruf diese Funtion im OnAfterGetRecord-Trigger der Hauptform auf.

MfG
Josef Metz


Danke, aber das funktioniert leider auch nicht. Das hatte ich versucht.

Aber das mit dem OnTimer funktioniert prima. Ist zwar nicht schön, aber der Zweck heiligt bekanntlich ja die Mittel. :wink:
War das erste Mal, dass ich den Timer in Navision benutzt habe.

Vielen Dank noch einmal allen für die Hilfe!

19. Juli 2006 13:07

Wenn man ohne OnTimer arbeiten will, kann man folgendes machen:

In der Subform eine Funktion erstellen. Als Parameter werden in dieser Funktion die benötigten Filterkriterien eingetragen.
Auf dem Hauptform im OnAfterGetCurrentRecord-Trigger diese Funktion aus dem Subform aufrufen und dabei die Filterkriterien übergeben.
Di Funktion in der SubForm muss dann noch CurrForm.UPDATE ausführen

20. Juli 2006 10:38

@rotsch
Nein, das funktioniert leider nicht. Der seltsame Effekt mit dem ersten Datensatz bleibt, bis man in den Header klickt oder den Datensatz anklickt.

20. Juli 2006 10:51

Dann könntest du vielleicht noch versuchen, die Funktion der Subform bereits im OnOpenForm-Trigger aufzurufen. Die Filterwerte sollten da ja dem ersten Record entsprechen.

Wenn das auch nicht hilft, bleibt wohl wirklich nur noch die Timer-Variante.

21. Juli 2006 13:43

Das funktioniert nur solange, wie ich nicht zwischen den objekten blättere, weil die Subform ja nur einmal geöffnet wird, wenn ich die Mainform öffne. Beim Blättern in der Mainform wird der OnOpen der Subform ja nicht mehr durchlaufen.

Tja, bleibt die etwas unglückliche Variante mit dem Timer. :wink:

Trotzdem danke!

21. Juli 2006 13:51

vielleicht hilft dann ein subform.activate im onaftergetcurrentrecord?

21. Juli 2006 15:37

Vielleicht habe ich mich zu wenig deutlich ausgedrückt. Die Funktion zum setzen der Filter müsste in OnOpenForm UND auf OnAfterGetCurrentRecord ausgeführt werden (oder hast du das auch schon versucht?)

27. Juli 2006 10:03

Hilft alles nicht, also bleibt es beim Timer. Vielen Dank nochmal.

9. Juli 2007 16:33

einfach ein "IF find('-') then;" an das Ende des Triggers schreiben, dann klappts