SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 09:49

Hallo,

die Syntax bringt mich um ;-)….
Habe leider auch im Internet und hier dazu nix gefunden - vermutlich ist das zu einfach ;-)...


Folgendes:
Ich habe eine Tabelle, die als Schlüsselfelder das „Jahr“ (als komplettes Datum) und den „Wochentag“ hat. Der Wochentag ist ein Optionsfeld (also Montag bis Sonntag).

Nun möchte ich eine Funktion erstellen, in der diese zwei Felder als Parameter übergeben werden und anhand direser Parameter ein Filter auf die Tabelle gesetzt wird (z.B. nur alle Montage des Jahres anzeigen).

Also: Funktionsaufruf mit Parameter wäre:
FilterTable(in_Year (als integer),in_DayOfWeek (als Option) ).

Code der Funktion:
//Datumsbereich 01.01. bis 31.12 festlegen
locDateStart := DMY2DATE(1,1,in_Year);
locDateEnd := DMY2DATE(31,12,in_Year);

recTable.SETFILTER(Datum“,’%1..%2’,locDateStart,locDateEnd);
recTable.SETFILTER(„Wochentag“,Wochentag::in_DayOfWeek),


Die zweite Zeile wird jedoch vom Compiler immer angemeckert (bei der ersten setze ich daher mal voraus, dass sie so korrekt ist ;-) ).
Entweder bekomme ich die Meldung, dass „in_DayOfWeek“ keine zulässige Option ist, oder aber – wenn ich es so versuche: recTable.SETFILTER(„Wochentag“,in_DayOfWeek) – eine Meldung, dass eine Typkonvertierung nicht durchgeführt werden kann (was gibts denn da zu konvertieren?).

Ich habe auch versucht den Wochentag als integer in die Funktion zu übergeben – auch dann erhalte ich den Typkonvertierungsfehler …
Ich bin zwar NAV-Beginner, aber eine solch komplizierte Syntax habe ich noch nie gesehen – mal mit doppelten Anführungsstrichen, mal mit einfachen, mal ohne…
Es kann doch nicht so schwer sein einen Wochentag, der als Option deklariert wurde, auf ein Feld zu setzen und danach zu filtern – wrkstlmpf…. ;-)….

Grüsse
Yorgo

Re: SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 10:00

Hi,

falls du deinen Code nur kopiert hat, hätte ich schon die ersten Punkte:
Code:
recTable.SETFILTER(Datum“,’%1..%2’,locDateStart,locDateEnd);
recTable.SETFILTER(„Wochentag“,Wochentag::in_DayOfWeek),
sollte so aussehen
recTable.SETFILTER(Datum,’%1..%2’,locDateStart,locDateEnd);
recTable.SETRANGE(„Wochentag“,Wochentag::Montag);

Bei einem Optionsfeld wird nach :: der Name des Optionswertes erwartet.
Solange in_DayOfWeek ein Optionsfeld mit identischer ANzahl optionen zu Wochentag ist, sollte auch das hier fehlerfrei komplilierbar sein:
Code:
recTable.SETRANGE(„Wochentag“,in_DayOfWeek);

Re: SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 10:30

Hallo Danjo,

vielen Dank erstmal für die schnelle Antwort.

Leider funktioniert letzteres (recTable.SETRANGE(„Wochentag“,in_DayOfWeek); ) nicht - in dem Moment, wo ich das Feld variabel halten will bekomme ich immer die Meldung, dass die Typkonvertierung nicht hinhaut.

Die Tabelle selbst hat also das Optionsfeld "Wochentag" mit dem OptionString "Montag,Dienstag..... usw."

Der Aufruf der Funktion erfolgt auch mit dem Feld "Wochentag" (aus einem Form heraus als Option), der in-Parameter in die Funktion ist ein lokaler Option-Parameter, der als OptionString exakt die gleichen Werte wie "Wochentag" enthält.

Komisch finde ich übrigens auch, dass ich den Code der Funktion in eine If-Anweisung gepackt habe, die da lautet:

if in_DayOfWeek > 0 then begin //also alle Montage nicht berücksichtigen
.
.
.
end;

DAS kompiliert er interessanter Weise und begreift, dass die Option "Montag" der Wert "0" ist und kommt mit dem Integer-Wert klar. Verwandle ich aber den in-Parameter in_DayOfWeek in einen integer und versuche dann mit SETFILTER zu filtern, kommt wieder die Meldung mit der Typkonvertierung...
In den Schulungsunterlagen habe ich auch gelesen, dass er selbstständig einen Optionswert in einen Integer vewandeln kann - aber nicht bei SETFILTER?
Das verstehe, wer will ;-)...

Re: SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 10:35

PS:
Natürlich könnte ich auch mit Case alle Optionen abfangen und hart mit :: verdrahten, aber das kann doch nicht im Sinne des Erfinders sein, oder? ;-)

Re: SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 11:07

Hi,

ich kann das Problem momentan leider nicht nachvollziehen.
Bei einem schnellen Test hat alles geklappt.
Kannst du die betroffenen Objekte als Text anhängen?
Vielleicht kann man da mehr sehen.

Re: SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 11:37

Hi,
das mit dem Wochentag war nur ein exemplarisches Beispiel für die gewünschte Funktionalität.

Das "echte" Beispiel ist wie folgt:
Es gibt eine Tabelle, die beinhaltet alle deutschen Feiertage für alle deutschen Bundesländer.
Diese Tabelle hat nur 4 Felder:
Datum, Bezeichnung (des Feiertages), Bundesland, Wochentag

Das Feld "Bezeichnung" ist ein Optionsfeld mit den Werten:
(Alle),Allerheiligen,Augsburger Friedensfest,Buß- und Bettag,Christi Himmelfahrt,Fronleichnam,Gründonnerstag,Heilige drei Könige,Karfreitag,Mariä Himmelfahrt,Neujahrstag,Ostermontag,Ostersonntag,Pfingstmontag,Pfingstsonntag,Reformationstag,Tag der Arbeit,Tag der deutschen Einheit,1. Weihnachtstag,2. Weihnachtstag

Das Feld "Bundesland" ist ein Optionsfeld mit den Werten:
(Alle),Nordrhein-Westfalen,Hamburg,Bremen,Niedersachsen,Bayern,Baden-Württemberg,Berlin,Brandenburg,Hessen,Mecklenburg-Vorpommern,Rheinland-Pfalz,Saarland,Sachsen,Thüringen,Schleswig-Holstein,Sachsen-Anhalt

Der erste Wert ist also jeweils "(Alle)".

Die Funktion "FilterTable" soll nun je nach übergebenem Parameter die Datensätze in der Tabelle nach Jahr filtern.
In die Funktion übergeben werden von einem Form aus: Datum, Bezeichnung, Bundesland

***********
FilterTable(in_Jahr : Integer;in_Feiertag : '(Alle),Allerheiligen,Augsburger Friedensfest,Buß- und Bettag,Christi Himmelfahrt,Fronleich.... (Bundesland mit allen Optionen wird ebenfalls übergeben)

- Die Funktion "FilterTable":

recFeiertage.RESET;
locDateStart := DMY2DATE(1,1,in_Jahr);
locDateEnd := DMY2DATE(31,12,in_Jahr);

IF in_Feiertag > 0 THEN BEGIN
IF in_Bundesland > 0 THEN BEGIN
recFeiertage.SETFILTER("Datum",'%1..%2',locDateStart,locDateEnd);
recFeiertage.SETFILTER("Bezeichnung",in_Feiertag);
recFeiertage.SETFILTER("Bundesland",in_Bundesland);
END ELSE BEGIN
recFeiertage.SETFILTER("Bezeichnung",in_Feiertag);
END;
END ELSE BEGIN
IF in_Bundesland > 0 THEN BEGIN
recFeiertage.SETFILTER("Bundesland",in_Bundesland);
END;
END;


Wenn eines der Optionsfelder den Wert "(Alle)" enthält, sollen dafür alle Datensätze angezeigt werden.
Beispiel 1:
Datum: 01.05.2010
Bezeichnung: (Alle)
Bundesland: Bayern

Im Ergebnis sollen alle Datensätze (also alle Feiertage) für 2010 angezeigt werden, die in Bayern gelten.

Beispiel 2:
Datum: 24.03.2010
Bezeichnung: Christi Himmelfahrt
Bundesland: Thüringen

Im Ergebnis soll nur ein Datensatz für 2010 angezeigt werden, nämlich der mit "Christi Himmelfahrt" und "Thüringen.


Wie gesagt, das Problem liegt darin, dass beim kompilieren die Optionsfelder mit der Meldung "Typkonvertierung" angemeckert werden, sobald ich sie variabel halten will.

Ich hoffe das hilft weiter ;-)

Re: SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 11:41

Hast du schon einmal versucht SETRANGE statt SETFILTER für die Optionen zu verwenden?
Alternativ auch einmal diese Variante:
Code:
recFeiertage.SETFILTER("Bezeichnung",'=%1',in_Feiertag);


Und der Code dürfte so auch für spätere Änderungen besser zu lesen sein:
Code:
recFeiertage.RESET;
locDateStart := DMY2DATE(1,1,in_Jahr);
locDateEnd := DMY2DATE(31,12,in_Jahr);
recFeiertage.SETFILTER("Datum",'%1..%2',locDateStart,locDateEnd);

IF in_Feiertag > 0 THEN BEGIN
  recFeiertage.SETFILTER("Bezeichnung",in_Feiertag);
END;
IF in_Bundesland > 0 THEN BEGIN
  recFeiertage.SETFILTER("Bundesland",in_Bundesland);
END;

Re: SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 12:03

Jo, mit SETRANGE habe ich neulich schon ne ganze Zeit herumgetrickst, bin aber über ähnliche Probleme gestolpert...

Das mit dem '=%1' kompiliert er auf jeden Fall schonmal :-) - ohne dem bekomme ich wieder den Typkonvertierungsfehler. (auf '=%1' wäre ich im Leben nicht gekommen...)

Danke auch für die Code-Umstellung - macht Sinn :-).

Jetzt habe ich eigentlich nur noch ein Problem:
Das Form, welches die Funktion aufruft, beinhaltet auch ein Grid, in dem die Datensätze angezeigt werden.
Wie bekomme ich die darin nun so angezeigt, dass er nur die gefilterten Datensätze im Grid anzeigt?
"CurrForm.UPDATE" scheint es nicht hinzubekommen - nach Funktionsaufruf wird das Grid nicht aktualisiert. Ich weiss also jetzt gar nicht, ob der Filter gesetzt ist oder nicht.
Die Funktion selbst steckt in der Tabelle - ist der Filter dann auch für das Form überhaupt aktiv? Oder muss die Funktion am Form hängen? (Was dann aber bedeuten würde, dass die Funktion u.U. x-Mal in der Applikation existiert...)

Wie handelt NAV das generell mit Filtern / Ranges - wenn einmal gesetzt, gelten die dann für die gesamte Applikation / den aktuellen User / das aktuelle Objekt?

Re: SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 12:05

PS:
Sorry, habe gerade erst gesehen, dass dein erstes Beispiel in der letzten Zeile ja SETRANGE und nicht SETFILTER war - das hatte ich übersehen und mich gewundert, dass es bei dir funzt, aber bei mir nicht ... da hätte ich uns wohl einiges ersparen können ;-)...

Yorgo = NAV-Anfänger ;-)

Re: SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 13:51

So,
ich gehe mal davon aus das Grid in deinem Fall eine Tablebox ist.
Du kannst den Code in der Tabelle selbst hinterlegen, solltest dann allerdings noch einen weiteren Parameter mitgeben.
Dieser ist vom Typ Record und wird per Referenz übergeben.
Am einfachsten dürfte es sein deinen recFeiertage als Parameter anzulegen und aus der Globalen/lokalen zu löschen.
Beim Aufruf gibst du dann einfach Rec an.
Ist dein Grid allerdings eine SubForm, so solltest du den Aufruf in die SubForm einbauen, hier auch wieder mit Rec. Diesen Aufruf am besten in eine eigene Funktion packen, welche dann über die MainForm aufgerufen werden kann.

Re: SETFILTER mit Paramter Optionsfeld setzen

19. April 2010 15:45

Ja richtig - bei NAV heisst das ja Tablebox ;-)...

OK, ich teste das mal!

Vielen Dank erstmal - hast mir sehr geholfen!