Master–Detail-Layout (1:N Relation)
Ein Dashbaord habe ich mittels einer Seite aufgebaut.
Weiter habe ich auf den Dashboard ein Auswahlfeld mit Name Ablaufdatum, welches die Optionen
- 1 mit Name "Ungefiltert",
- die Option 2 mit Name "Abgelaufen"
- und die Option 3 mit Name "Gut" hat.
Auf dem Dashboard ist ein Widget mit einer Tabellenansicht. In dieser Tabelle möchte ich Daten aus den Tabellen:
- Lebensmittelgruppierung und
- Lebensmitteldetail sehen.
Die Tabelle Lebensmittelgruppierung hat eine 1:N Beziehung zur Tabelle Lebensmitteldetail. Vom selben Lebensmittel x kann ich also mehrere Einheiten mit unterschiedlichen Ablaufdaten haben.
In der Tabelle Lebensmittelgruppierung habe ich den Name des Lebensmittels "Artikel". In der Tabelle Lebensmitteldetail habe ich das Datumsfeld Ablaufdatum, die Anzahl des Lebensmittels x.
Wenn auf dem Dashboard das Auswahlfeld auf Ungefiltert ist, dann soll das Ansichtswidget die Tabelle mit allen Lebensmitteln zeigen, egal ob der heutige Tag die Ablaufdaten der Lebensmittel überschreitet oder nicht.
Wenn das Auswahlsfeld auf Abgelaufen ist, dann soll das Ansichtswidget nur Lebensmittel zeigen, deren Ablaufdatum überschritten ist.
Und wenn das Auswahlfeld auf Gut ist, dann soll das Ansichtswidget nur Lebensmittel zeigen, deren Ablaufdatum noch nicht überschritten ist.
Da ein Lebensmittel über die 1:N Beziehung mehrere Artikel mit unterschiedlichen Ablaufdatum haben kann, soll die oben beschriebene Logik greifen wenn von z. B. 5 Artikeln lediglich einer das Ablaufdatum überschritten hat.
Nach mehreren Stunden des probieren wende ich mich an euch im Forum, kann mir jemand helfen? Danke vorweg.
11 Antworten
-
Hallo Hermann. Versuche Folgendes. Lege den Code in das Formelfeld der Ansicht
let auswahl := Auswahl; switch auswahl do case 1: (select Lebensmitteldetails) case 2: (select Lebensmitteldetails where Ablaufdatum < today()) case 3: (select Lebensmitteldetails where Ablaufdatum >= today()) endFüge dann eine neue Spalte mit einem Funktionsfeld hinzu und schreibe dort den Code hinein:
Lebensmittelgruppierung.Artikeloder ziehe das entsprechende Feld per drag-and-drop herüber. Dann sollte es so funktionieren.
Im Grunde braucht dein Auswahlfeld nur zwei Felder: Abgelaufen und Gut. Wenn nichts angewählt wird, dann wird alles angezeigt. Nach click wird gefiltert. Dann sieht es so aus. Mirko
let auswahl := Auswahl; switch auswahl do case 1: (select Lebensmitteldetails where Ablaufdatum < today()) case 2: (select Lebensmitteldetails where Ablaufdatum >= today()) default: (select Lebensmitteldetails) end -
Wenn man das Script von Mirko noch etwas optimierter im Hinblick auf Datenmenge und Performance ausrichten möchte, würde ich es wie folgt abändern.
let auswahl := Auswahl; let vTbl := select Lebensmitteldetails where Nr; switch auswahl do case 1: (vTbl) case 2: (vTbl[Ablaufdatum < today()]) case 3: (vTbl[Ablaufdatum >= today()]) endWeshalb beim ersten 'select' die Klausel 'where Nr'?
Ein Select mit einer where Klausel wird in Ninox immer schneller bearbeitet als ein reines 'select'.
Das fällt bei Datenbanken mit überschaubarer Anzahl an Datensätzen noch nicht so ins Gewicht.
Im laufe der Zeit kommen aber immer mehr Datensätze dazu und da kann es dann doch schon Unterschiede machen wie lange ein Ergebnis auf einen select auf sich warten lässt, wenn bspw.mehrere 'select' in einem Script genutzt werden müssen.
Ein zweiter Grund ist für die Zuordnung des select zu einer Variablen ist die einmalige Ausführung des 'select' im Script. Das fällt zwar in der 'case'-Prüfung nicht so ins Gewicht, aber wenn man es sich frühzeitig aneignet, vergisst man es auch bei späteren umfangreichen Skripten nicht und muss sich nicht bei performance Problemen in dieser Hinsicht wundern. -
said:
Weitere Optimierungen kommen durch die Reihenfolge der Filterargumente. Diese sollten so aufgebaut werden: Boolean, Numbers, Date/Time/alle Anderen, TextDas habe ich mal anders gelernt. Man solle die Reihenfolge der Filterargumente nach inhaltlichen Kriterien bestimmen, also zuerst das, bei dem erwartbar am wenigsten Datensätze übrig bleiben, weil entsprechend weniger Datensäte auf das folgende Argument geprüft werden müssen. Also unabhängig vom Datentyp.
Content aside
- Status Answered
- gesternZuletzt aktiv
- 11Antworten
- 90Ansichten
-
6
Folge bereits

