Berechnungen in Views mit Views Calc
Mit dem Views-Modul hat wahrscheinlich jeder schon einmal gearbeitet, der Webseiten mit Drupal erstellt. Neben oft benötigten Funktionen wie Filter oder Sortieren gibt es aber auch Dinge, die man eher selten benötigt. Verständlich, dass solche Funktion nicht zum Lieferumfang des Views-Moduls gehören, sondern durch Extra-Module bereitgestellt werden. Zu diesen Funktionen zählen z.B. das Summieren von Feldern oder die Berechnung eines Durchschnittswertes. Diese und weitere Funktionen stellt Views Calc zur Verfügung. Die Installation und die Nutzung der Basisfunktionen sind sehr einfach.
Allerdings gilt es ein paar Stolperfallen zu vermeiden.
Die Installation von Views Calc funktioniert wie bei jedem Drupal-Modul: Herunterladen, entpacken (bis Drupal 6), per FTP in den Module-Ordner laden (bzw. ab Drupal 7 direkt über die Drupal-Seite installieren) und aktivieren.
Anschließend legt man entweder einen neuen Inhaltstyp an oder versieht einen vorhandenen mit CCK-Feldern, die die Werte aufnehmen, mit denen Views Calc später rechnen soll. In unserem Beispiel ist das ein Dezimalfeld "Stunden" mit zwei Nachkommastellen. Bevor man mit der Konstruktion des Views anfängt, sollte man noch ein paar Testdaten eintragen, damit man die korrekte Funktionsweise überprüfen kann.
Um einen View mit Rechenoperationen zu erstellen, geht man folgendermaßen vor (Hinweis: das folgende Beispiel ist auf einer Drupal 6-Webseite entstanden):
- Neuen View erstellen: "Verwalten >> Strukturierung >> Views (heißt manchmal auch "Ansichten"!) >> Hinzufügen".
- Pflichtfelder ausfüllen, ggf. Beschreibung und Tag eintragen und den View-Typ (hier "Beitrag") wählen und mit "weiter" bestätigen.
- Zunächst erstellt man den View als normale Tabelle, d.h. man wählt unter "Basiseinstellungen >> Darstellung" zunächst "Tabelle" und richtet die gewünschten Felder, Sortierkriterien, Zugriffsbeschränkungen, Filter etc. ein.
- Dann ändert man die Darstellung von "Tabelle" auf "Views Calc Table". Damit stehen die Basisfunktionen von Views Calc zur Verfügung. Nach einem Klick auf das kleine Rädchen neben "Darstellung: Views Calc Table" (roter Kreis) kann man für jedes Feld die gewünschte Kalkulation einschalten. Der folgende Screenshot zeigt die aktivierten Funktionen "Summe" (engl. "Sum") und "Anzahl" (engl. "Count") für das Feld "Stunden" (rotes Rechteck). Weitere verfügbare Funktionen sind hier "Durchschnitt" (bzw. arithmetisches Mittel, engl. "Average"), Minimum und Maximum (aller Werte der jeweiligen Spalte).
- Nach einem Klick auf "Aktualisieren", kann man weitere Displays anlegen. Oft wird man ein Seiten-Display mit Pfad und Menüpunkt anlegen wollen oder, wie in diesem Beispiel, ein Anhang-Display, das die noch nicht bestätigten Zeiten direkt unter der Tabelle mit den bestätigten Zeiten ausgibt. Und an dieser Stelle lauert ein Stolperstein: Wenn man die Darstellung "Views Calc Table" aus dem Defaults-Display übernimmt und nicht übersteuert, kann es passieren, dass Views Calc falsch rechnet. In einem Fall äußerte sich das so, dass die Berechnungen für den Admin-User stets korrekt waren, sobald sich aber ein anderes Mitglied eingeloggt hatte und seine Tabelle mit den Arbeitszeiten aufrief, wurden diese allesamt doppelt summiert. Erst nach dem Übersteuern der Views Calc Table in jeder Display-Variante verschwand dieser Fehler!
- Zum Schluss speichert man den View ab und kontrolliert anhand der Testdaten die korrekte Funktion. Das Ergebnis sieht dann bspw. so aus:
Was kann Views Calc noch?
Neben den oben erwähnten Funktionen SUM, AVG, MIN, MAX und COUNT, kann man mit Hilfe von PHP eigene Kalkulationsfelder programmieren hierfür stehen weitere Funktionen wie CONCAT, ROUND oder NOW() zur Verfügung und man hat Zugriff auf alle Felder, die Drupal kennt.
Was muss man beachten?
Die SQL-Queries, die Views Calc erzeugt, sind sehr komplex. Daher kann es an verschiedenen Stellen zu Problemen bei der korrekten Berechnung kommen. So z.B. bei der Verwendung von Relationships oder dem Einsatz von Pagern, um die Ergebnisse der Tabellen auf mehrere Seiten zu verteilen. Hier muss man besonders sorgfältig testen.