Beispiel Hintergrundfarbe von Zeilendarstellungen
In Suchergebnislisten und Unterformularen können Zeilen farblich hinterlegt werden. Die Definition geschieht über einen Groovy-Code der pro Businessobjekt angegeben wird. Im letzten Schritt vom Businessobjekt befindet sich ein Button 'Hintergrundfarbe der Zeilendarstellung konfigurieren'. Hier wird das Skript hinterlegt.
Die Farben werden im Return-Statement anhand von Hexadezimalen Farbcodes angegeben.
Beispiel
Nachfolgend ein Beispielcode für die Farbeneinstellungen:
Codeblock |
---|
if (context."#{WAR.auftrag.auftragGesamtbetrag}" == null) {
return "#FFA500";
}
else {
if (context."#{WAR.auftrag.auftragBezahlt}" < context."#{WAR.auftrag.auftragGesamtbetrag}") {
return "#DC143C";
}
else {
return "#32CD32";
} }
}
|
Hintergrundfarbe von einzelnen Feldern
Die Funktion wurde implementiert unter Businessobjekt "Attribut/Allg.Eigenschaften" dort kann man das GroovySkript hinterlegen.
In Detailmasken kann das Skript "übergangen" werden, indem im Layout die Hintergrundfarbe explizit gesetzt wird. Für Suchergebnislisten oder Unterformulare wird dennoch das Skript ausgewertet.
Die Farben werden im Return-Statement anhand von Hexadezimalen Farbcodes angegeben.
Aktivieren und Deaktivieren von Feldern bzw. Buttons in Unterformularen
In den Eigenschaften eines Subformelements im Layout können über Clientregeln die Buttons für Neuanlage, Klonen und Löschen sowie einzelne Spalten aktiviert bzw. deaktiviert werden.
Die gerade aktuelle Spalte kann mittels
Codeblock |
---|
context.field == "#{<Namespace>.<Businessobjektsname>.<Feldname>}" |
abgefragt werden.
Neu / Löschen / Klonen aktiv (dynamsich)
Die Aktivierung/Deaktivierung der Buttons wird entsprechend eines boolschen Rückgabewertes durchgeführt.
Bearbeiten aktiv (dynamisch)
Die Aktivierung/Deaktivierung der Spalten wird entsprechend eines boolschen Rückgabewertes durchgeführt.
Info |
---|
Achtung: Der Ausgangskontext für "Neu aktiv (dynamisch)" ist immer das übergeordnete BO der Subform, der Ausgangskontext für "Bearbeiten aktiv (dynamisch)", "Löschen aktiv (dynamisch)" und "Klonen aktiv (dynamisch)" hingegen ist immer das BO der Subform selbst. Will man sich also beispielsweise in einem Subform für Auftragspositionen den Status des Auftrages holen, muss man dies für "Neu" mittels context."#{NAME.Auftrag.nuclosStateNumber}" tun, für "Bearbeiten", "Löschen" und "Klonen hingegen muss man erst einen Kontext nach oben gehen mittels context."#{NAME.Auftragsposition.auftrag.context}"."#{NAME.Auftrag.nuclosStateNumber}". |
Beispiel 1
Bestimmte Felder sollen abhängig des ausgewählten Wertes (componentType) aktiviert oder deaktiviert sein.
Codeblock |
---|
if ("Artikel".equals(context."#{DIB.PackageComponent.componentType}")) {
if (context.field == "#{DIB.PackageComponent.textNumber}")
return false }
}
if ("Text".equals(context."#{DIB.PackageComponent.componentType}")) {
if (context.field == "#{DIB.PackageComponent.article}")
return false
if (context.field == "#{DIB.PackageComponent.price}")
return false
if (context.field == "#{DIB.PackageComponent.amount}")
return false
if (context.field == "#{DIB.PackageComponent.weight}")
return false }
}
return true |
Beispiel 2
Feld invoiceamountinhours soll abhängig des ausgewählten Wertes (chargedashours) aktiviert oder deaktiviert sein.
Vorsicht: Da im Namen des BO ein Leerzeichen enthalten ist, muss es auch im Groovy-Code so angesprochen werden ("External services").
Codeblock |
---|
if (context."#{D3R1.External services.chargedashours}" == false) {
if (context.field == "#{D3R1.External services.invoiceamountinhours}") {
return false
}
}
return true |
Funktionen über Bibliotheksregeln
Sie können in Bibliotheksregeln Funktionen definieren, die in dynamischen Eigenschaften und berechneten Werten verwendet werden können. Eine Bibliotheksregel muss hierfür mit der Annotation org.springframework.stereotype.Component gekennzeichnet werden, damit sie von der Laufzeitumgebung erkannt wird (Hinweis: es wird nur eine Instanz der Klasse erzeugt - beachten Sie dies beim Einsatz von Klassenvariablen). Falls Sie eine Methode dieser Klasse als Funktion verwenden möchten, kennzeichnen Sie diese mit der Annotation org.nuclos.api.annotation.Function und vergeben Sie einen global eindeutigen Namen. Diesen Namen verwenden Sie später, um die Funktion mit Hilfe über context."#FUNCTION{<Funktionsname>}" aufzurufen. Bei der Implementierung von Funktionen ist darauf zu achten, dass Parameter- und Rückgabe-Typen übereinstimmen. Ggf. notwendige Umwandlungen müssen manuell vorgenommen werden. Ausserdem muss beachtet werden, dass der Namensraum des Packages im Nuclet Mangagement und der Packagename der Componente (Bibliotheksregel) gleich sind.
Beispiel
In folgendem Beispiel wird eine automatische Vergabe von Bestellnummern in Abhängigkeit des ausgewählten Kunden implementiert.
Bibliotheksregel mit Funktion
Codeblock |
---|
package org.nuclet.rules;
import org.nuclos.api.annotation.Function;
import org.springframework.stereotype.Component;
@Component
public class TestBean
{
@Function("org.nuclet.rules.MyFunction")
public String getNewOrderNumber(String kundennr) {
return "ON-" + kundennr;
} }
} |
Dynamisch berechneter Wert
context."#FUNCTION{org.nuclet.rules.MyFunction}"(context."#{DEF.Kunde.kundennr}")
Logausgaben
Um Clientregeln zu debuggen, können Logausgaben eingegeben werden:
log.info("Logausgabe")
Die Ausgabe kann in der Scripting-Ausgabe (Fenster / Ausgabe (Scripting)) eingesehen werden.
Aktueller User (Nuclos Version 4.0.15 und höher)
Die Variable username kann in Groovy Skripten verwendet werden.
In dieser Variable vom Typ java.lang.String steht der aktuelle User.
z.B.: def anwender = username
Der aktuelle User wird in die Variable anwender übertragen.
Known Issues- Best Practice
Feld aus Elternbusinessobjekt / Hauptbusinessobjekt auslesen
Codeblock |
---|
|
fieldFromParent = context."#{<NUCLET>.<SUBENTITY>.<REFERENCEFIELD>.context}"."#{<NUCLET>.<PARENTENTITY>.<FIELD>}" |
z.B. Statusnumeral des Elternobjektes ermitteln:
Codeblock |
---|
|
stateNumeral = context."#{NUC.Rechnungsposition.rechnung.context}"."#{NUC.Rechnung.nuclosStateNumber}" |
Das Feld, das aus dem Elternbusinessobjek ausgelesen werden soll, muss im Layout vorhanden sein. Soll es nicht sichtbar sein für den Benutzer, kann es deaktiviert werden.
Messagebox anzeigen
Codeblock |
---|
language | groovy |
---|
firstline | 0 |
---|
linenumbers | true |
---|
|
import groovy.swing.SwingBuilder |
def swing = new SwingBuilder() |
def myMainFrame = new Frame() |
if (context."#{S663.Auftrag.eingangsdatum}" != null) { |
JOptionPane.showMessageDialog( |
myMainFrame, "Hello There" |
Debugging
Exceptions die von Groovy-Regeln zur Laufzeit geworfen werfen, werden von Nuclos nicht an den Benutzer weitergegeben. Zu Debuggingzwecken kann man Exceptions auffangen und mit Hilfe der oben beschriebenen Messagebox anzeigen.
Codeblock |
---|
language | groovy |
---|
firstline | 0 |
---|
linenumbers | true |
---|
|
(...) |
JOptionPane.showMessageDialog( |
}Berechnungsrichtung abhängig von einem Parameter ändern
Szenario: Feld A soll aus Feld B berechnet werden, wenn eine boolena-Variable den Wert wahr hat, andernfalls soll Feld B soll aus Feld A berechnet werden.
Codeblock |
---|
language | groovy |
---|
firstline | 0 |
---|
title | Berechnungsvorschrift Feld A |
---|
linenumbers | true |
---|
|
def berechneAausB = context."#{J94R.businessobject.aausb}" |
if (berechneAausB==false) { |
def currentValue = context."#{J94R.businessobject.felda}" |
def feldB = context."#{J94R.businessobject.feldb}" |
Codeblock |
---|
language | groovy |
---|
firstline | 0 |
---|
title | Berechnungsvorschrift Feld B |
---|
linenumbers | true |
---|
|
def berechneAausB |
= context."#{J94R.businessobject.aausb}" |
def currentvalue = context."#{J94R.businessobject.feldb}" |
if (currentvalue == null) |
throw new Exception("Exit") |
def feldA = context."#{J94R.businessobject.felda}" |