Vereinfachte expressions für Farbeinstellungen in Listen

  • Die Möglichkeit Zellen in Listen Expression-gesteuert einzufärben ist nützlich und hilfreich. Bei uns hilft dies Listenwerte die kontrolliert werden müssen, benutzerfreundlich zu gestalten (z.B. mit rot/grün-Hintergrundfarbe, etc.)


    Wenn die Zellenwerte an sich eine (komplexe) OCL-Expression sind, muss man jedoch diese 1:1 die die "Farbbedingung" übernehmen, wenn diese die Einfärbung steuern sollen.


    Gibt es es die Möglichkeit, über eine vordefinierte Variable einfacher auf den Wert der Zelle zuzugreifen, statt die OCL-Expression nochmals hier einzufügen?


    Wenn nein, wäre das eine Anregung für die Zukunft, hilft dies doch bei der "Wartung" von Listen, da nicht die gleiche Expression an mehreren Orten angepasst werden muss.
    Beispiel was ich meine (Expression an sich ist nicht von Bedeutung):

    OCL-Espression für die Liste sei:


    (planWertExt+planAuslagenWert+planSpesenWert).round


    Wenn ich nun die Hintergrundfarbe abängig von diesem Werte definiere, könnt das z.B.so aussehen:



    Was ich mir wünsche, wäre z.B. eine Variable "cellValue" mit der man dann die "Einfärbeexpression" so formulieren kann.
    cellValue enthält das Ergenis der Spalten expression.


    • Offizieller Beitrag

    Deine Wiederholungen sind zwar von der Wartbarkeit her nicht ideal, aber wenigstens nicht performance-relevant. Wenn sie es wären, müsste man dringend eine Möglichkeit suchen, um doppelte Berechnungen zu verhindern.


    Die Idee mit der impliziten Variable cellValue finde ich recht gut! Es gibt solche OCL Variablen schon an anderen Orten, z.B. wenn ein Ordner Suchfelder hat oder auch die relativ neu eingeführten varParent und varContainer.


    Ohne eine solche Erweiterung sehe ich 2 Möglichkeiten:

    • versuch mal mit dem ->collect() Operator was zu erreichen, Du findest die Dokumentation in https://www.vertec.com/ch/kb/ocl/. Ich selber bin da nicht so begabt, darum versuche ich jetzt hier nicht, was auszuformulieren ;)
    • mit den Custom Renderer hast Du natürlich alle Möglichkeiten, die es braucht. Richtig Sinn ergibt das natürlich, wenn der gleiche Renderer dann an vielen Stellen eingesetzt weden könnte!
    • Offizieller Beitrag

    Apropos cellValue: vielleicht ist das nicht so einfach wie man denken könnte, denn die Variable würde ja erst zur Verfügung stehen, wenn die Expression der Zelle ausgewertet wäre und sie wäre dann erst noch sehr lokal für diese Zelle - eine andere Zelle hätte ja einen anderen Value. Die bisherigen OCL Variablen sind "lokal" in dem Sinne, dass sie für die ganze Liste gelten.

    • Offizieller Beitrag

    Der von Claudio vorgeschlagene Custom Renderer ist hier sicherlich eine einfache Möglichkeit, zumindest die Code Duplikation zu vermeiden. Im konkreten Fall könnte das ungefähr so aussehen:



    Anmerkung: Ich wandle den Rückgabewert zu float um, da unser rate Converter eine Fliesskommazahl erwartet, aus round aber ein Integer herauskommt.