Versionen im Vergleich

Schlüssel

  • Diese Zeile wurde hinzugefügt.
  • Diese Zeile wurde entfernt.
  • Formatierung wurde geändert.


 

Seit Version 3.2.0 wird eine neues Application Programming Interface entwickelt, mit dem diverse Aspekte in Nuclos flexibel und komfortabel konfiguriert werden können sollen. Auf diesen Seiten finden Sie allgemeine Grundlagen zur Verwendung der API. Die einzelnen Einsatzzwecke werden auf den jeweiligen spezifischen Seiten genauer erläutert.


(Info) Tritt während der Ausführung eines groovy-Scriptes eine Exception auf, bricht das Script ohne weiteren Hinweis ab.

Namensräume und Packages

Ein Namensraum wird pro Nuclet definiert. Ist ein Businessobjekt einem Nuclet zugewiesen, so muss beim Aufruf der entsprechende Namespace angegeben werden (Lokaler Identifizierer des Nuclets) . Ist ein Businessobjekt keinem Nuclet zugeordnet, so wird der Default Namespace 'DEF' verwendet.

...

Codeblock
#{[namespace].[entity]} // liefert das aktuelle BO oder die Datensätze eines Unterformulars als Liste
#{[namespace].[entity].[field]} // liefert den Wert eines Attributs. Wenn "id" als Feld eingesetzt wird, kann auf die intid das Datensatzes zugegriffen werden.
#{[namespace].[entity].[field].value} // gleiche Funktion wie #{[namespace].[entity].[field]}
#{[namespace].[entity].[field].id} // liefert den Id-Wert eines Referenzfelds als java.lang.Long
#{[namespace].[entity].[field].context} // liefert den Context für ein referenziertes Objekt

(Info) [entity] steht dabei für den internen Namen des Businessobjekts wie er im BO-Editor angegen ist (nicht der Anzaigename oder Tabellenname).

Referenzierte Kontexte

Häufig wird ein Zugriff auf Werte eines referenzierten Objekts benötigt. Hierfür kann der Ausdruck #{[namespace].[entity].[field].context} verwendet werden. Dieser Ausdruck liefert ein neues Context-Objekt, mit dem Sie in identischer Weise weiterarbeiten können. Zu beachten ist, dass ein referenzierter Kontext häufig nur eingeschränkte Daten liefert. Bei Auswahlfeldern stehen z.B. nur die Werte des referenzierten Datensatzes zur Verfügung - ein erneuter Aufruf von #{[namespace].[entity]} oder #{[namespace].[entity].[field].context} ist also nicht möglich. Sollten die zur Verfügung stehenden Daten nicht ausreichen, müssen Funktionen verwendet werden.

Auswertung des Scripts

Das Script wird ausgeführt wenn:

  • ein neuer Datensatz des BOs angelegt wird
  • sich ein Feld ändert, dass im Script ausgelesen wird

Beispiel

Hier ein Beispiel für die Berechnung eines Gesamtbetrages. Der Gesamtbetrag wird durch Iteration über ein Unterformular 'auftrag_position' ermittelt.

...

Codeblock
context."#{ROG.SubF_Barbeleg}".each { 
item ->
if (item."#{ROG.SubF_Barbeleg.positionstyp}" == "Normal"){
	if (null != item."#{ROG.SubF_Barbeleg.gesamtpreis}") {
		 gesamtbetrag = gesamtbetrag.add(item."#{ROG.SubF_Barbeleg.gesamtpreis}")
	}
} 
}
return gesamtbetrag.setScale(2, java.math.RoundingMode.HALF_UP).doubleValue() 

...


def innenring = context."#{TVI.Auftragspositionen.auftrag.context}"."#{TVI.Auftrag.kunde.context}"."#{TVI.Kunde.innenringbedruckung}"

...

  • return true = Feld aktiv
  • return false = Feld nicht aktiv

 


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.

...

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
languagegroovy
fieldFromParent = context."#{<NUCLET>.<SUBENTITY>.<REFERENCEFIELD>.context}"."#{<NUCLET>.<PARENTENTITY>.<FIELD>}"

z.B. Statusnumeral des Elternobjektes ermitteln:

Codeblock
languagegroovy
stateNumeral = context."#{NUC.Rechnungsposition.rechnung.context}"."#{NUC.Rechnung.nuclosStateNumber}"


Hinweis

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.