Berechne-Funktion kann kann eine FileMaker-Anwendung beschleunigen

Ersetze Berechnungsfelder mit regulären Text- oder Nummernfeldern


1. September 2022In TippsBy Karsten Risseeuw9 Minutes

Die «Berechne» Funktion in FileMaker führt eine Berechnung aus, als wäre es ein Berechnungsfeld. Eine Berechne-Funktion verwendet aber kein Berechnungsfeld, sondern stattdessen reguläre Text- oder Nummernfelder. Diese können indexiert werden, was zu einer besseren Performance führt.

Berechnungsfelder verlangsamen

Warum sollte man statt ein Berechnungsfeld normale Text- oder Nummernfelder verwenden? Ein wichtiger Grund kann in der Indexierung liegen.

Berechnungsfelder werden stets aktualisiert und können deshalb nicht indexiert werden. Felder, die stets aktualisiert werden, verlangsamen jede FileMaker Lösung. Das macht sich insbesondere bei grossen Datenmengen in Listenansichten bemerkbar, sowie bei Scripts, die auf Layouts zugreifen müssen, worin Berechnungsfeldern liegen.

Normale Text- und Nummernfeldern dagegen werden meist automatisch indexiert und können deshalb schnell Resultate liefern – es muss nichts mehr berechnet werden. Es ist sinnvoll, Berechnungen in normalen Text- und Nummernfeldern auszulösen, aber nur im Bedarfsfall. Grösstenteils müssen Angaben nur einmal berechnet werden und vielleicht später noch einmal in einer Korrektur. Mehrheitlich ist eine ständige Neuberechnung nicht erforderlich und belastet das System nur unnötig.

Will man performante Lösungen erstellen, sind Berechnungsfelder häufig ein Flaschenhals. Deswegen kann es sich lohnen nach Alternativen Ausschau zu halten.

Berechne den Text

Texte können zusammengebaut werden. Ein typisches Anwendungsgebiet sind Adressblöcke. Man kann etwa eine Adresstabelle mit folgenden Feldern haben:

<Firma>
<Strasse>
<Postleitzahl> <Ort>.

Dies ist nur ein vereinfachtes Beispiel. Die meisten Adressen sind deutlich komplexer. Damit man diese Angaben nicht ständig neu zusammensetzen muss, kann es sinnvoll sein, ein separates Feld für eine <Komplettanschrift> zu erstellen. Darin kann man die gesamte Adresse abbilden. Bei Briefen, Rechnungen und dergleichen muss man nur auf das vorberechnete Feld der <Komplettanschrift> verweisen. Weil das berechnete Feld ein normales Textfeld ist, kann dieses Feld indexiert werden. Es geht in diesem Beispiel um das Prinzip, nicht um diese spezielle Lösung, welche als Beispiel herbeigezogen wird.

Das Resultat soll in das neutrale Textfeld <Komplettanschrift> geschrieben werden. Es gibt mehrere Optionen, dies zu lösen:

  1. Per Script (Feldwert setzen + Berechnung im Script)
  2. Per Felddefinition (Definition im Feld selbst)
  3. Per Felddefinition (Definition in einem externen Referenzfeld)

Die Berechnung findet also nur 1x statt. Sie sollte aber bei Bedarf wiederholt werden können.

Hier liegen nun die Unterschiede zu einem Berechnungsfeld: Bei einem regulären Text- oder Nummernfeld muss man die Berechnung speziell auslösen, während bei einem Berechnungsfeld ständig aktualisiert wird. Daraus folgt selbstverständlich, dass die Entwicklung mit regulären Feldern etwas aufwändiger ist. Die Belohnung liegt jedoch in einer performanteren Lösung und steuerbaren Resultaten.

Links sind verschiedene Adressfelder. Rechts steht das Feld <Komplettanschrift>, worin die Daten zusammengerechnet wurden. Das Feld rechts ist kein Berechnungsfeld, sondern ein normales Textfeld.

Berechnung per Script

Eine einfache Möglichkeit, ein berechneter Wert in ein reguläres Feld einzufügen, ist mit einem Scriptschritt:

Berechnung im Feld

Eine weitere, ressourcenschonende Methode ist die Verwendung eines Textfeldes, worin man eine Berechnung angibt:

Die Berechnung wird bei Änderung der Datenfelder jeweils neu aktiviert. Danach ist wieder Funkstille bei den Berechnungen. Die Belastung des Systems ist minimal und das Resultat kann indexiert werden.

3. Berechnung mit «Berechne» Funktion

Die automatische Berechnung bei der Texteingabe (Beispiel 2) funktioniert gut. Sie funktioniert jedoch nicht immer. Speziell mit externen Referenzen kann die «automatische» Neuberechnung hapern. Das ist logisch, denn eine Berechnung in einem regulären Textfeld muss immer speziell getriggert werden.

Folgendes Szenario könnte zutreffen: Statt eine Berechnungsformel in einem Feld oder in einem Script zu verstecken, kann ich die Formel offen in einem Textfeld ablegen. Das ist dann die Definition für eine Berechnung, nicht die Berechnung selbst. Dort, wo ich das Resultat der Berechnung sehen will, muss ich die Berechnung herbeiziehen, dann evaluieren und das Resultat in das Resultatfeld schreiben.

Werden nun Textdefinitionen als «Text» übergeben, sind diese nicht automatisch evaluiert. Hier kommt die Berechne-Funktion zum Einsatz.

  • Im Feld, wo ich ein Resultat sehen will (z.B. <Komplettanschrift>), erstelle ich ein Verweis auf eine externe Berechnungsformel, die in einem Textfeld liegt. Diese externe Formel soll mir die Berechnung im Feld auslösen:
    • Felddefinition <Komplettanschrift> hat bei der «Eingabe» eine «Formel», worin ich das externe Feld angebe: [ Externe Definition ]
    • Diese Berechnung wird leider nicht automatisch ausgeführt. Das korrigiert man mit der Berechne-Funktion: Berechne ( [ Externe Definition ] )
  • Steuern kann man die Berechnung mit einem Trigger-Feld. Ein Trigger-Feld sagt, wann die Berechnung ausgeführt werden soll. Eine Änderung im Trigger-Feld bewirkt dies. Das funktioniert wie folgt:
    • Berechne ( [ Externe Definition ] ; [ Trigger-Feld ] )
    • Trigger-Felder aktivieren durch Änderung des Inhaltes die Evaluation.

Hier liegt die Berechnung für zwei verschiedene Adressblöcke in normalen Textfeldern. Es sind komplexe Berechnungen. Beachte: In diesen Feldern liegt nur die Formel. Berechnet wird hier nichts. Das Ziel ist es jedoch, die Berechnung zentral abzulegen und an einem anderen Ort zu evaluieren.

Hier ist das eigentliche Feld für das Resultat der Berechnung. Es ist jedoch kein Berechnungsfeld. Die Berechnung wird «Bei Dateneingabe» ausgeführt, was sich in den Einstellungen des Feldes definieren lässt. Dort wird der Verweis auf die vorher genannte Formel mit «Berechne ( FORMELFELD)» ausgelöst. Wegen der Komplexität reicht das jedoch nicht. Die Berechnung hat häufig nicht automatisch funktioniert. Ein extra Trigger muss dies beheben. Deswegen steht hier «Berechne ( FORMELFELD ; TRIGGERFELD )».

Mehrere Trigger für die Berechne-Funktion

Die Berechne-Funktion unterstützt nur 1 Trigger. Das ist eine Begrenzung. Es funktioniert recht einfach: Ändert sich der Inhalt des Trigger-Feldes, dann wird die Berechnung ausgeführt. Bei komplexen, verschachtelten Berechnungen und bei externen Feldern kann die Berechnung stocken. Ein Trigger kann sie aber gezielt wieder zum Laufen bringen. Das ist die Aufgabe des Triggers.

Nur 1 Trigger steht zur Verfügung. Manchmal stehen aber mehrere Felder in einer Berechnung, worauf die Berechne-Funktion nicht wirkt. Diese Felder kann man in ein neues Feld zusammenrechnen (addieren!), damit daraus ein Wert entsteht. Ändert sich nun in einem der addierten Felder etwas, dann ändert sich auch die Summe im separaten Trigger. Das separate Feld wird also nur angelegt, damit eine sonst nicht entdeckte Änderung trotzdem zu einer Neuberechnung führt. Es ist ein Hilfsfeld.

Als Triggerfeld habe ich ein Nummernfeld angelegt, worin ich die relevanten Schalter für diese Berechnung «zusammengezählt» habe. Das Ergebnis ist nicht wichtig. Es wird jedoch zuverlässig jede Änderung in den Schalter-Feldern berücksichtigen. Die Änderung triggert nun die Berechnung der <Komplettanschrift>.

Einsatzgebiete

Lösungen wie diese helfen dabei, eine Anwendung zu optimieren. Das einzige Ziel dabei ist es, Berechnungsfelder zu vermeiden, weil die ständig Ressourcen benötigen. Reguläre Textfelder dagegen können indexiert werden. Die Techniken in diesem Beitrag zeigen, wie man eine Berechnung bei Bedarf in einem regulären Textfeld triggert.

Beispiel

Im folgenden kurzen Video wird das Ergebnis des letzten Beispiels gezeigt. Die Adresse rechts im Bild wird mit verschiedenen Schaltern formatiert. Das Ergebnis wird in ein reguläres Textfeld gespeichert. Das Beispiel zeigt, wie man mit regulären Feldern Berechnungen ganz ohne Berechnungsfelder bei Bedarf ausführen kann.