0

Ansicht mit Mehrfachauswahlfeld

Arbeite gerade an einer Ansicht, in der ich mir alle Rechnungen anzeigen lasse und je nach Auswahlfeld nur die eines Jahres. Jetzt wollte ich noch per Mehrfachauswahlfeld die Monate mit ins Spiel bringen. Per einfachem Auswahlfeld klappt es z.B. nur den April oder Mai anzeigen zu lassen. Ich würde aber gerne April und Mai und Juni beispielsweise anzeigen lassen. Mit numbers(Monat) erhalte ich ein Array mit den richtigen Nummern aber ich bekomme das nicht in die select-Anweisung gepackt. Code aktuell, der natürlich nur funktioniert, wenn ich nur 1 Feld auswähle:

let myMonat := numbers(Monat);

select Rechnungen where year(Datum) = text(Auswahl) and month(Datum) = myMonat

11 Antworten

null
    • Leonid_Semik
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Hallo Dirk,

    Wenn Auswahl die Jahre auswählt und die IDs bei Monat den Monaten entsprechen, dann würde ich es so probieren:

    ---

    let myM := numbers(Monat);
    let myY := number(text(Auswahl));
    (select Rechnungen)[year(Datum) = myY and (
    let myFlag := false;
    for i in myM do
    if i = month(Datum) then myFlag := true end
    end;
    myFlag = true
    )]

    ---

     

    Leo

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

    Hallo, das geht wahrscheinlich wieder eleganter, aber ich hätte jetzt keine andere Idee, als die Monatsabfragen je nach gewählter Anzahl per "or" aneinander zu reihen. Hier am Beispiel von bis zu drei Auswahlmonaten. Und die Jahresabfrage sollte auf beiden Seiten dasselbe Format haben:

    let myJahr := number(text(Auswahl));
    let myMonat := numbers(Monat);
    switch cnt(myMonat) do
       case 1:
           (select Rechnungen where year(Datum) = myJahr and month(Datum) = item(myMonat, 0))
       case 2:
           (select Rechnungen where year(Datum) = myJahr and (month(Datum) = item(myMonat, 0) or month(Datum) = item(myMonat, 1)))
       case 3:
           (select Rechnungen where year(Datum) = myJahr and (month(Datum) = item(myMonat, 0) or month(Datum) = item(myMonat, 1) or month(Datum) = item(myMonat, 2)))
       default:
           (select Rechnungen)
    end

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

    Ach, siehste ... Okay, ich ziehe meinen Vorschlag zurück. ;)

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

    Seltsam eigentlich, der Zeitstempel von Leos Posting ist 24 Minuten früher, es wurde mir aber nicht angezeigt. Ist mir schon mehrfach passiert. Da könnte man sich ja Arbeit sparen, wenn man wüsste, dass schon jemand ne Lösung gepostet hat.

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

    Habe Leos Lösung aus Interesse gerade mal ausprobiert. Wie erwartet funktioniert sie einwandfrei. Schleife innerhalb der select-Bedingung - puh. Darauf wäre ich nie gekommen. Hut ab!

    • Dirk_Patzer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Brauchst nichts zurückziehen, Copytexter. Beide Lösungen funktionieren. Danke ihr zwei! Ich weiß manchmal nicht was das großartigste an Ninox ist. Die Software selbst oder der Support und die Unterstützung durch die Anwender. Vielen Dank!

    So klappt es dann (habe nach "Bezahlt am" auswählen lassen) beispielsweise:Bildschirmfoto 2019-07-29 um 23.20.27

    • BugTrapper
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Leos Lösung sieht zwar schön aus aber würde ich selbst nie so machen. 1. schwer verständlich und 2. wirds nichts an der Schnelligkeit machen und 3. werden hier Tricks ausgenutzt, die in anderen Prigrammiersprachen nicht gehen.

    Man verlernt das korrekte Programmieren, nur meine Meinung.

     

    ich plädiere für die lange Lösung, einfacher und verständlicher.

    • Dirk_Patzer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Naja, weniger Code ist immer eleganter, finde ich. Und damit meistens auch übersichtlicher und besser zu verstehen. Aber der 1. Preis für den besten/effektivsten/schönsten/verständlichsten Code möchte ich auch gar nicht vergeben. Mein Problem wurde mit beiden Ansätzen gelöst. Danke Leo und Copytexter nochmals!

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

    @BugTrapper: Na ja, wie ich immer wieder gerne sage: Viele Wege führen nach Rom. Es liegt halt in der Natur programmiertechnisch eleganter Lösungen, etwas komplizierter auszusehen. Aber Leos Code ist ohne Zweifel sehr effizient, weil er alle denkbaren Auswahl-Konstellationen berücksichtigt. Um dasselbe zu erreichen, müsste die switch-Lösung um weitere neun case-Abfragen mit immer länger werdenden Filterbedingungen erweitert werden. Ich bin mir nicht sicher, ob du dann immer noch sagen würdest, dass du die (wohl etwa 10 mal) längere Version bevorzugst. ;)

    Ich selbst wäre wie gesagt gar nicht auf die Idee gekommen, es auf diese Weise zu versuchen. Und ich breche mir keinen Zacken aus der Krone, das zuzugegeben. Im Gegenteil, ich finde es super, dass Leo solche Dinge ausprobiert, sein Wissen teilt und immer wieder zeigt, was mit der ursprünglich eher einfachen Ninox-Scriptsprache inzwischen alles möglich ist. Nur so hat man die Chance, sich selbst weiterzuentwickeln. Und wer will, kann ja weiterhin den etwas längeren, dafür leichteren Weg nach Rom nehmen. Das ist ja das Schöne an Ninox: Man muss kein Programmiergenie sein, um Lösungen für seine Aufgabenstellung zu entwickeln. Aber es ist doch gut zu wissen, dass es Alternativen gibt und bei Bedarf noch mehr möglich ist.

    • BugTrapper
    • vor 5 Jahren
    • Gemeldet - anzeigen

    Ich brauche keinen Leo :-)

    • Dirk_Patzer
    • vor 5 Jahren
    • Gemeldet - anzeigen

    @BugTrapper: Das ist ja gut zu wissen! Ich freue mich über jede Hilfe, ganz gleich von wem sie kommt. Die freundlichen gegenseitigen Hilfestellungen sind prima hier. 

Content aside

  • vor 5 JahrenZuletzt aktiv
  • 11Antworten
  • 2351Ansichten