0

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

null
    • Benjamin_Kunzmann_pr
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Arne.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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?

    • mirko3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • mirko3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    let myVon := Von;
    let myBis := Bis;
    if myVon and myBis then
    select Zeiten where Datum >= myVon and Datum <= myBis
    else
    select Zeiten
    end

    • Arne.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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?

    • mirko3
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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

    • Ninox-Professional
    • planoxpro
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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.

    • Arne.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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.Mitarbeiter

     

    Die 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.

    • Ninox-Professional
    • planoxpro
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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.

    • Leonid_Semik
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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. 

    • Ninox-Professional
    • planoxpro
    • vor 3 Jahren
    • Gemeldet - anzeigen

    Aah, Datensätze in ein Array und die Filter dann auf das Array anwenden. Darauf wäre ich so nicht gekommen. Super. Danke, Leo! 👏

    • Arne.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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!

    • Arne.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    und ist im Grunde genommen ja sogar deine Lösung, Leo. Nur nicht ganz so hübsch : )

    • Arne.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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.

    • Arne.1
    • vor 3 Jahren
    • Gemeldet - anzeigen

    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