[Gelöst] SetFilter in OnOpenForm funktioniert nicht

23. Mai 2011 12:15

Hallo.

Ich benutze den Classic-Client unter NAV 2009 und habe folgendes Problem:
Ich habe ein Formular, das auf eine Tabelle mit drei Felder "Feld 1", "Feld 2" und "Feld 3" zugreift.
Bei der Anzeige des Formulars möchte ich die Datensätze so filtern, dass nur die Datensätze angezeigt werden, bei denen der Wert von Feld 1 ungleich dem Wert von Feld 2 ist. Wie ich in einem anderem Beitrag gelesen habe, geht dies nur in dem Trigger OnOpenForm.
Folgenden Befehl verwende ich dort (sonst stehen im dem Trigger keine weiteren Befehle):
SETFILTER("Feld 1",'<> %1',rec."Feld 2");
Beim Kompilieren gibt es keinen Fehler, jedoch werden bei der Ausführung des Formulars auch Datensätze angezeigt, bei denen Feld 1 = Feld 2 ist.

Kann mir jemand bei diesem Problem helfen?

Vielen Dank im voraus.
Zuletzt geändert von Ralf2 am 23. Mai 2011 16:59, insgesamt 1-mal geändert.

Re: SetFilter in OnOpenForm funktioniert nicht

23. Mai 2011 12:35

Kann es sein, daß zu diesem Zeitpunkt der Datensatz noch gar nicht gefunden ist und du daher ungleich leer filterst?
Aber deine eigentliche Fragestellung ist eine andere. Du möchtest ja jeden Datensatz herausfiltern, bei dem Feld1 gleich Feld2 ist. Das geht so einfach nicht.

Re: SetFilter in OnOpenForm funktioniert nicht

23. Mai 2011 12:42

Wie ist denn eine solche (komplexe) Filterung zu realisieren?

Re: SetFilter in OnOpenForm funktioniert nicht

23. Mai 2011 13:11

Spontan fällt mir nur eins ein:

Code:
OnAfterGetCurrRecord:
If Feld1 = Feld2 THEN
  NEXT;


Ist allerdings nicht getestet, und klappt nicht bei List-Forms.

Edit:

Ich hatte mal etwas ähnliches für eine Listen-Form.
Hier blieb als einzig praktikabler weg die Sourcetable der Form temporär zu verwenden.
Beim öffnen der Form ist die Tabelle dann leer und wird durch eine Funktion im OnOpenForm befüllt.
Hier ginge dann so etwas wie das hier:
Code:
Table.RESET;
IF Table.FINDSET(FALSE,FALSE) THEN BEGIN
  REPEAT
    IF Table.Feld1 <> Table.Feld2 THEN BEGIN
      Rec := Table;
      INSERT(FALSE);
    END;
  UNTIL Table.NEXT = 0;
END;


Edit 2:
Satzmarken klingen definitv besser.
Zuletzt geändert von Danjo am 23. Mai 2011 13:21, insgesamt 2-mal geändert.

Re: SetFilter in OnOpenForm funktioniert nicht

23. Mai 2011 13:17

Ich würde ggf. im OnOpenForm-Trigger alle Datensätze einmal durchlaufen, dabei alle markieren, die angezeigt werden sollen und später nur die markierten anzeigen.

Re: SetFilter in OnOpenForm funktioniert nicht

23. Mai 2011 13:17

Feldvergleichende Filter werden leider von NAV nicht unterstützt.

Einziger Workaround:
Im OnOpenForm alle Datensätze in einer Schleife vorab durchlaufen, und die anzuzeigenden Datensätze mit einer Satzmarke versehen.
Anschließend setzt du MARKEDONLY und zeigst dir nur noch die satzmarkierten Datensätze an.

Code:
IF FIND('-') THEN
  REPEAT
    MARK := Field1 <> Field2;
  UNTIL NEXT = 0;
MARKEDONLY := TRUE;


[Edit:] Alex war schneller ;-)

Re: SetFilter in OnOpenForm funktioniert nicht

23. Mai 2011 13:46

Genau diese beiden Varianten (Markierung und temporäre Tabelle) sind mir spontan auch eingefallen. Beides hat aber Vor- und Nachteile. Die Markierung kann bspw. vom User wieder aufgehoben werden, dafür können bei einer temporären Tabelle unter Umständen die weiterführenden Funktionen auf der Form nicht mehr verwendet werden. Es kommt auf die konkrete Situation an, was damit umgesetzt werden soll. In welchem Arbeitsablauf soll das genutzt werden und wie entscheidend ist dabei die Frage der Datensicherheit?

Re: SetFilter in OnOpenForm funktioniert nicht

23. Mai 2011 13:59

In meinem Anwendungsfall ist es wichtig, dass weiterführende Funktionen korrekt genutzt werden können, daher habe ich mich für die Lösung mit der Markierung entschieden. Dies funktioniert einwandfrei. Vielen Dank für eure Antworten.