Im vorherigen Artikel haben wir gesehen, wie man Zeilenkontexte überschreiben kann und mittels den Funktionen EARLIER() und EARLIEST() auf umgebende Kontexte zugreifen kann. Welchen Einfluss haben Benutzerfilter bei der Verwendung von RELATED() oder RELATEDTABLE() und welche Rolle spielen mehrere Tabellen?

Kommen mehrere Tabellen in einem Datenkontext zum Einsatz, kann man via RELATED() direkt auf Felder einer verknüpften Tabelle zugreifen – wenn die Richtung der Verknüpfung eine “zu 1” Verknüpfung ist. Beispielsweise hat eine Auftragstabelle eine Anzahl tatsächlich versandter Packstücke sowie die vom Dienstleister berechneten Frachtkosten. Auf der Versandartentabelle haben wir Richtwerte, wie viel ein Packstück mit dieser Versandart kosten darf. Datenmodell Auf der Tabelle Auftrag können wir jetzt berechnen, wie viel wir zu viel oder zu wenig gegenüber dem Richtwert bezahlt haben: Fracht Differenz berechnen RELATED() funktioniert nur in Richtung der spezielleren Tabelle also in Richtung “1” bei einer “1:n” Verknüpfung (nur so finden wir sicher einen oder keinen Wert, niemals aber mehrere). In die andere Richtung haben wir RELATEDTABLE() – wenn wir beispielsweise wissen wollen, wie oft wir eine Versandart verwendet haben: RELATEDTABLE angewandt Legen wir eine weitere berechnete Spalte auf Versandarten an, beispielsweise die Anzahl an Monaten, erhalten wir folgendes Ergebnis: RELATEDTABLE über many to many Wir erhalten immer alle Zeilen aus der Monatstabelle zurück – RELATEDTABLE (wie auch in der Gegenrichtung RELATED) funktioniert auch über mehrere Tabellen hinweg, aber nur, wenn die Verknüpfungen immer m:1-Verbindungen sind (bzw. bei RELATED immer 1:m).

Auswirkungen mit Benutzerkontext

Auswirkungen mit Benutzerkontext Bei “1:m”-Verknüpfungen werden Filter werden immer in “m“-Richtung propagiert, niemals in “1”-Richtung. Das bedeutet, auch wenn im obigen Beispiel pro Zeile ein anderer Monat steht, ist die Anzahl verwendeter Versandarten immer 7 – ob sie in dem entsprechenden Monat verwendet wurden oder nicht. Nur im Januar und März werden allerdings versandte Aufträge angezeigt, da im Februar kein Auftrag via “Luft” versandt wurde.

Mehr Kontext?

Über Kontext haben wir in den drei Teilen Einiges geschrieben –man muss damit spielen, Beispiele machen, die Praxis sprechen lassen. Wenn sich Formeln anders verhalten als erwartet, lohnt es sich, das Thema nochmals zu betrachten. Und was, wenn man Filter nicht nur weiter eingrenzen oder überschreiben will? Mit dem ALL()-Filter haben wir zwar die Möglichkeit, Filter auszuschalten – aber eben nur ganz oder gar nicht. Das geht aber trotzdem – und darüber schreiben wir im nächsten Post, wenn wir (endlich) die CALCULATE()-Funktion einführen. Stay tuned… Smiley