Zum Hauptinhalt springen

Wie lasse ich etwas berechnen?

Wenn Sie beispielsweise zwei Zahleneingaben "Länge" und "Breite" haben und demm Nutzern die darauf resultierende Fläche anzeigen wollen (und die Fläche z.B. auch in Regeln verwenden wollen), dann legen Sie zunächst die beiden Zahleneingaben an und gehen dann wie folgt vor:

Berechnete Zahl anlegen​

  • Legen Sie eine Zahleneingabe an
  • Klicken Sie auf
    Loading...
    .
  • Setzen Sie den Haken bei Berechnet und klicken Sie auf
    Loading...
    .
  • Es öffnet sich ein Formel-Editor. Darin geben Sie nun die Formel "Länge * Breite" ein. Die Variablen werdenb Ihnen vorgeschlagen.
  • Klicken Sie auf
    Loading...
    .
  • Und noch einmal auf
    Loading...
    (oder
    Loading...
    , falls noch nicht geschehen).
  • Es erscheint eine berechnete Variable, erkennbar an dem "=" im Eingabefeld.
info

Mit der Eingabe von z.B. "Länge" fügen sie also den Wert ein, den das Merkmal "Länge" aktuell hat. Falls das Merkmal einen key gesetzt hat (nur möglich, wenn Entwickler-Modus an), wird dieser statt des Merkmalnamens in der Formel verwendet.

Muss der berechnete Wert angezeigt werden?​

Natürlich nicht. Aktivieren Sie einfach den Haken Versteckt in den

Loading...
.

Welche Berechnungen kann ich ausführen?​

Grundsätzlich kann nur mit Zahlen gerechnet werden.

Als Eingabe stehen alle Merkmale zur Verfügung, einfach indem Sie den Namen des Merkmals angeben: "Länge * Breite"

Sie können auch Wert-Eigenschaften nutzen – die Produktdaten, die Sie an den Werten einer Auswahl abgelegt haben (in Formeln auch Attribute genannt). Wenn ausser der Zahleneingabe "Länge" z.B. eine Auswahl "Form" existiert, bei deren Werten Sie eine Wert-Eigenschaft "Breite" erfasst haben, dann können Sie schreiben: "Länge * Form.Breite" (die Wert-Eigenschaft muss dafür den Typ Zahl haben).

Ihnen stehen die Grundrechenarten zur Verfügung, sowie eine Reihe mathematischer Funktionen, wie etwa

  • sin, cos, tan
  • pow: Potenz: pow(2,4)=2^4
  • sqrt: Wurzel
  • round: Runden
  • ceil: Nächstgrößere Ganzzahl
  • floor: Nächstkleinere Ganzzahl

Wenn Sie Produktkomponenten verwenden, gibt es dafür noch einige spezielle Funktionen:

  • sum
  • sumPrevious
  • average
  • product
  • map
  • filter
  • reduce
  • instanceIndex

Konkrete Anwendungsfälle​

Einfache mathematische Berechnungen​

Flächenberechnung

Länge * Breite;

Volumenberechnung mit Attributen

Länge * Breite * Form.Höhe;

Hier ist Form.Höhe ein Attribut des Auswahlwerts "Form"

Bedingte Berechnungen

Material == 23 ? Fläche * 150 : Fläche * 100;

Berechnungen mit Produktkomponenten​

Produktkomponenten eröffnen völlig neue Möglichkeiten für intelligente Berechnungen. Hier sind die wichtigsten Anwendungsfälle:

Anzahl von Bauteilen berechnen​

Math.ceil(Länge / 2.5); // Anzahl Balken bei 2,5m Abstand

Gesamtwerte aller Komponenten​

sum(map(Ausstattung.instances, (c) => c.Gewicht));

Summiert das Gewicht aller Ausstattungskomponenten

Positionsberechnungen für 3D-Darstellung​

Einfache Position basierend auf Index

Teilelemente.Ausstattung.instanceIndex * 0.5;

Jede Ausstattung wird um 50cm versetzt

Kumulative Positionsberechnung mit sumPrevious

Eine der häufigsten Anfragen ist die korrekte Positionierung von Komponenten basierend auf den vorherigen Elementen, z.B. deren Höhe. Die sumPrevious-Funktion macht kumulative Berechnungen sehr einfach:

Variante 1 - Einzelner Wert:

sumPrevious(Teilelemente.Ausstattung, "Hoehe") / 100;

Summiert automatisch die Höhe aller vorherigen Ausstattungselemente und rechnet in Meter um.

Variante 2 - Mit Berechnung:

sumPrevious(Teilelemente.Ausstattung, (e) => e.Hoehe / 100);

Summiert die Höhe aller vorherigen Elemente und rechnet sie direkt in Meter um.

Wichtig

Die String-Variante ("Hoehe") funktioniert nur für einzelne Merkmale – keine Berechnungen im String!

❌ Falsch:

sumPrevious(Elemente, "Innenbreite + Plattenstärke"); // Geht nicht!

✅ Richtig:

sumPrevious(Elemente, (e) => e.Innenbreite + Plattenstärke);
Praxis-Tipp

Erstellen Sie ein verstecktes berechnetes Feld "positionY" in der Ausstattung mit dieser Expression. Dann können Sie in anderen Berechnungen einfach Teilelemente.Ausstattung.positionY verwenden, anstatt die Formel zu wiederholen.

Hierarchien und Kontext verstehen​

Die Komponenten-Hierarchie​

Bei der Arbeit mit Produktkomponenten ist das Verständnis der Hierarchie entscheidend:

Hauptprodukt
├── Teilelemente (Komponentenliste)
│ ├── Ausstattung (Unterkomponentenliste)
│ │ ├── instanceIndex (Position in der Liste)
│ │ ├── Höhe (Attribut)
│ │ └── Breite (Attribut)
│ └── andere Merkmale
└── andere Merkmale

Zugriff auf verschiedene Ebenen​

Zugriff auf übergeordnete Ebene:

Teilelemente.Ausstattung.instanceIndex; // Index der Ausstattung

Zugriff auf alle Instanzen:

map(Teilelemente.Ausstattung.instances, (c) => c.Gewicht);

Zugriff auf spezifische Instanz:

Teilelemente.Ausstattung[0].Gewicht; // Erste Ausstattung

Häufige Fehler und Lösungen​

Fehler: "InstanceIndex funktioniert nicht"​

Stellen Sie sicher, dass Sie sich in der richtigen Hierarchie-Ebene befinden. Der instanceIndex bezieht sich immer auf die aktuelle Komponente.

Fehler: "Division durch Null"​

❌ Gefährlich:

Gesamtpreis / Gesamtanzahl;

✅ Sicher:

Gesamtanzahl > 0 ? Gesamtpreis / Gesamtanzahl : 0;

Verfügbare Funktionen im Detail​

Mathematische Funktionen​

  • sin, cos, tan - Trigonometrische Funktionen
  • sqrt - Quadratwurzel
  • pow(basis, exponent) - Potenz
  • abs - Absolutwert
  • min, max - Minimum/Maximum
  • clamp(wert, min, max) - Wert in Bereich begrenzen
  • round, ceil, floor - Rundungsfunktionen

Array-Funktionen (für Komponenten)​

  • map(array, funktion) - Transformation jedes Elements
  • filter(array, bedingung) - Filtern nach Bedingung
  • reduce(array, funktion, startwert) - Reduzierung auf einen Wert
  • find(array, bedingung) - Erstes Element finden
  • first(array), last(array) - Erstes/letztes Element
  • sum(array) - Summe aller Zahlen
  • sumPrevious(komponente, "attribut") oder sumPrevious(komponente, e => berechnung) - Summiert Werte aller vorherigen Elemente einer Gruppe (vereinfacht kumulative Berechnungen)
  • count(array) - Anzahl Elemente
  • average(array) - Durchschnitt
  • product(array) - Produkt aller Zahlen

Logische Operatoren​

  • && - UND
  • || - ODER
  • ! - NICHT
  • ==, != - Gleich/Ungleich
  • <, >, <=, >= - Vergleiche
  • bedingung ? wertWennWahr : wertWennFalsch - Ternärer Operator

Praxisbeispiele für verschiedene Branchen​

Terrassendächer​

// Anzahl Pfosten basierend auf Breite
Breite <= 400 ? 2 : Math.ceil(Breite / 250);

// Anzahl Seitenelemente vorne
Pfostenanzahl -
// Position der Seitenelemente
(Gesamtbreite / (Pfostenanzahl - 1)) * instanceIndex;

Geländer​

// Anzahl Füllungen
Math.floor(Gesamtlänge / Maximalbreite);

// Position der Pfosten
(Gesamtlänge / Pfostenanzahl) * instanceIndex;

Möbel/Schränke​

// Anzahl Regalböden
Math.floor((Höhe - 40) / Fachtiefe);

// Höhe der Regalböden
instanceIndex * Fachtiefe + 20;

Best Practices​

1. Strukturiert vorgehen​

  • Beginnen Sie mit einfachen Expressions
  • Testen Sie jeden Schritt einzeln
  • Erweitern Sie schrittweise

2. Wiederverwendbarkeit​

  • Nutzen Sie versteckte berechnete Felder für komplexe Zwischenergebnisse
  • Definieren Sie häufig gebrauchte Berechnungen nur einmal
  • Zahlen, die in vielen Formeln vorkommen, legen Sie als Parameter ab, statt sie in die Formeln zu schreiben

3. Performance optimieren​

  • Vermeiden Sie redundante Berechnungen
  • Nutzen Sie Zwischenergebnisse in versteckten Feldern

4. Debugging​

Wenn eine Expression nicht funktioniert:

  1. Prüfen Sie die Syntax (Klammern, Operatoren)
  2. Stellen Sie sicher, dass alle Variablen existieren
  3. Testen Sie Teilausdrücke einzeln
  4. Prüfen Sie die Hierarchie-Ebene bei Komponenten

Erweiterte Anwendungen​

Dynamische Preisgestaltung​

Berechnen Sie die benötigte Menge eines Verbrauchsartikels, z.B. die Fläche:

// Fläche in qm
((Breite / 100) * Tiefe) / 100;

Legen Sie den Verbrauchsartikel mit dem Preis für die Einheit an, hier qm. Geben Sie beim Zusteuern des Artikels zur Stückliste als dessen Menge die berechnete Fläche an.

Validierung und Constraints​

// Technische Grenzen
clamp(BenutzerEingabe, MinWert, MaxWert);

// Abhängige Werte
Typ == 100 ? BerechnetWert : ManuellerWert;

3D-Positionierung​

// Intelligente Verteilung
(Gesamtbreite / count(Komponenten)) * instanceIndex - Gesamtbreite / 2;

// Spiralförmige Anordnung
Math.cos(instanceIndex * 0.5) * Radius;
Wichtiger Hinweis

Die Expression Engine ist sehr mächtig, aber bei komplexen hierarchischen Berechnungen sollten Sie schrittweise vorgehen und jede Teilberechnung einzeln testen. Bei Fragen zur Implementierung wenden Sie sich an Ihren Umsetzungspartner.

Fazit​

Die Expression Engine ermöglicht es, von einfachen Berechnungen bis hin zu komplexen hierarchischen Kalkulationen alles umzusetzen. Besonders die Arbeit mit instanceIndex und Array-Funktionen bei Produktkomponenten eröffnet völlig neue Möglichkeiten für intelligente Produktkonfiguration.

Mit den hier gezeigten Techniken können Sie dynamische Preiskalkulationen, intelligente 3D-Positionierung und komplexe Mengenberechnungen realisieren - und damit Ihren Kunden eine intuitive und mächtige Konfigurationsoberfläche bieten.