Dashboard mit Filterfeldern
Liebe Ninox Experten,
ich baue gerade ein Dashboard, in der ich in einer Ansicht die gewünschten Daten anzeige und Datenbankfelder als Filterfeldern benutze. Leider schaffe ich es noch nicht,, wenn ein Filterfeld leer ist, dass dann alle Daten angezeigt werden.
Ist Situation: Tabelle "Dashboard" mit Feld DatumVon und DatumBis und einem Ansichtsfeld mit der Funktion:
let myID := this;
select Zeiten where Datum >= myID.Von and Datum <= myID.Bis
Wenn ich im Feld DatumVon und DatumBis ein Datum eintrage, dann wird mir die Ansicht korrekt dargestellt. Lasse ich eines der Datumfelder frei, so wird mir in der Ansicht nichts angezeigt. hat jemand eine Idee, wie ich das löse, ohne in jede Bedingung (es sind insgesamt 12 Filterfelder) noch mit einer If Abfrage zu versehen?
Danke und VG
Arne
15 Antworten
-
Hallo Arne,
folgenden Code würde ich dir in deinem Ansichtsfeld im Dashboard empfehlen:
let myVon := Von;
let myBis := Bis;
(select Zeiten)[Datum >= myVon and Datum <= myBis]LG
Benjamin
-
Hallo Benjamin, aber auch so habe ich leider das Problem, lasse ich ein Datum weg, dann ist die Ergebnismenge leer! Wie aber bekomme ich es hin, dass beim Fehlen eines Filterwertes dieser quasi "egal" ist und alle mit diesem Wert genommen werden?
-
Hi Arne, versuch mal:
let myVon := Von;
let myBis := Bis;
if myVon and myBis then
select Einkauf where Bestelldatum >= myVon and Bestelldatum <= myBis
else
select Einkauf
end
-
let myVon := Von;
let myBis := Bis;
if myVon and myBis then
select Zeiten where Datum >= myVon and Datum <= myBis
else
select Zeiten
end
-
mit der If Anweisung funktioniert es. Jedoch wenn ich nur einen Wert befülle und nicht beide, dann wieder nicht. Und: ich habe insgesamt 12 Filterfelder. Es kann sein, dass 11 ausgefüllt sind und nur eines nicht. Es kann auch sein, dass nur eines ausgefüllt ist. Mit der If Abfrage bin ich bei meinen Versuchen da nicht weiter gekommen. Oder habe ich noch einen Denkfehler?
-
Du erwähnst zwar Filterfelder, aber in Deinem Code oben stehen keine, bis auf Datumgrenzen. Wenn es noch mehr gibt, könnten die dann ja alle in die erste if-Abfrage hinein nach dem Beispiel. Dann zeigt es die Filterung nach der Datumeingrenzung nur, wenn alle Filterfelder Einträge haben und Datumgrenzen gesetzt sind. Oder ich verstehe es immer noch nicht ;-)
let myVon := Von;
let myBis := Bis;
if myVon and myBis and Filterfeld1 and Filterfeld2 ... and Filterfeld 12 then
select Zeiten where Datum >= myVon and Datum <= myBis
else
select Zeiten
end
-
Vielleicht so?
if Von and Bis and Feld3 and Feld4 then
let me := this;
select Zeiten where Datum >= me.Von and Datum <= me.Bis and Feld3 = me.Feld3 and Feld4 = me.Feld4
else
select zeiten
end
Das würde natürlich auch mit noch mehr Feldern funktionieren. Ich bin mir allerdings nicht ganz sicher, ob ich die Zielstellung richtig verstanden habe.
-
vielleicht habe ich es etwas falsch ausgedrückt. Zielstellung ist: eine Ansicht anhand von Feldern in der Maske zu filtern. Dabei soll, wenn eines der Filterfelder leer ist, dieser Filter ignoriert werden. Konkretes Beispiel aus meiner Datenbank (ich nehme mal ein paar mehr Felder mit dazu):
DatumVon, DatumBis, Kunde (Verweis aus Kundentabelle), Tätigkeit (Verweis auf Tätigkeitentabelle), Mitarbeiter (Verweis auf die Mitarbeitertabelle). Dazu gibt es in der Tabelle dann noch die Ansicht, die folgenden Code enthält:
let myID := this;
select Zeiten where Kunde = myID.Kunden and Datum >= myID.Von and Datum <= myID.Bis and Tätigkeit = myID.Tätigkeit and Mitarbeiter = myID.MitarbeiterDie Tabelle Zeiten enthält auch alle diese Felder!
Wenn ich keinen der Filter setze, also alle Felder leer sind, dann soll er mir alle Datensätze in der Ansicht ausgeben! Je mehr Filter ich setze, desto eingeschränkter soll die Ansicht werden. Setze ich also zum Beispiel bei Mitarbeiter den Mitarbeiter "Meier", dann werden in der Ansicht nur Zeiten des Mitarbeiter Meier angezeigt. Aber noch ohne Datumseinschränkung und ohne Tätigkeitseinschränkung. Setze ich dann als Startdatum "01.01.2021", dann werden mir vom Mitarbeiter Meier nur die zeiten ab dem 1.1.21 angezeigt. Etc.
Wa sich nicht hinbekomme ist eines der Filterargumente quasi "weg zu lassen", wenn das Filterfeld leer ist. Da habe ich noch einen Knoten im Kopf. Mit den Vorgecshlagenen emöglichkeiten, müssten ja immer ALLE Filter mit Filterwerten gefüllt sein.
-
Das heißt, in jedem der 12 Felder kann ein Wert stehen, muss aber nicht? Und es soll immer nach allen Feldern gefiltert werden, in denen ein Wert steht, egal welche und wieviele?
Das wären ja unzählige Kombinationsmöglichkeiten!
Ich sage das nur ungern und auch nicht sehr oft, aber: Da muss ich passen. Vielleicht ließe sich mit eval() und/oder Arrays was basteln, aber selbst das würde noch ziemlich kompliziert.
Wobei die Aufgabe an sich durchaus reizvoll ist. Wenn man eine flexible Lösung fände, die sich verschiedenen Konstellationen anpassen ließe, könnte man sie wiederverwenden. Aber wie gesagt: Ich weiß nicht, ob es überhaupt möglich ist. Und ich habe auch gerade nicht die Zeit, um mich da reinzuknien.
Vielleicht hat Leo (oder jemand anderes) ja eine Idee.
-
Hallo Zusammen,
hier ist ein Code, was ich für solche Dashboardgeschichten Nutze:----
let me := this;
let myChoice := (select Muster)[not Entsorgt];
myChoice := if Volltextsuche then
myChoice[contains(lower(Search), lower(me.Volltextsuche))]
else
myChoice
end;
myChoice := if Auftraggeber then
myChoice[Auftraggeber = me.Auftraggeber]
else
myChoice
end;
myChoice := if Bearbeiter then
myChoice[Bearbeiter = me.Bearbeiter]
else
myChoice
end;
myChoice := if Kunde then
myChoice[Kunde = me.Kunde]
else
myChoice
end;
myChoice := if Hersteller then
myChoice[Hersteller = me.Hersteller]
else
myChoice
end;
myChoice := if 'Eingangsdatum von:' then
if 'Eingangsdatum bis:' then
myChoice[Eingangsdatum >= me.'Eingangsdatum von:' and Eingangsdatum <= me.'Eingangsdatum bis:']
else
myChoice[Eingangsdatum >= me.'Eingangsdatum von:']
end
else
if 'Eingangsdatum bis:' then
myChoice[Eingangsdatum <= me.'Eingangsdatum bis:']
else
myChoice
end
end;
myChoice
---Die Idee ist es, mit myChoice zuers die Hauptbedingung einzugrenzen (select Tabelle) und dann mit vielen kleinenren if anweisungen myChoice zu begrenzen und am Ende myChoice als Bedingung für die Ansicht zu nehmen.
-
Aah, Datensätze in ein Array und die Filter dann auf das Array anwenden. Darauf wäre ich so nicht gekommen. Super. Danke, Leo!
-
Danke Leo, der Ansatz ist gut. Den versuche ich auch nochmal. Ich habe es in der Zwischenzeit für mich so gelöst:
let myID := this;
select Zeiten where
if myID.Kunden then Kunde = myID.Kunden else Kunde != 0 end and
if myID.Von then Datum >= myID.Von else Datum > "01.01.1899" end and
if myID.Bis then Datum <= myID.Bis else Datum < "31.12.2999" end and
if myID.Tätigkeit then Tätigkeit = myID.Tätigkeit else Tätigkeit != null end
klar, damit muss in den Feldern Tätigkeit, etc. etwas stehen, aber das ist hier der Fall. Somit passt die Lösung in dem Fall für mich ganz gut und ist vergleichsweise wenig Aufwand.
Danke Euch!
-
und ist im Grunde genommen ja sogar deine Lösung, Leo. Nur nicht ganz so hübsch : )
-
und ich sehe gerade, irgendwas klappt mit dem Datumsvergleich noch nicht, wenn das leer ist. Gehe noch mal auf die Suche und poste, wenn ich die korrekte Lösung habe.
-
habs. So also meine Lösung:
let myID := this;
select Zeiten where
if myID.Kunden then Kunde = myID.Kunden else Kunde != 0 end and
if myID.Von then Datum >= myID.Von else Datum > date(2000,01,01) end and
if myID.Bis then Datum <= myID.Bis else Datum < date(2099,12,31) end and
if myID.Tätigkeit then Tätigkeit = myID.Tätigkeit else Tätigkeit != null end
Content aside
- vor 3 JahrenZuletzt aktiv
- 15Antworten
- 468Ansichten