Sie zeigen eine alte Version dieser Seite an. Zeigen Sie die aktuelle Version an.

Unterschiede anzeigen Seitenhistorie anzeigen

« Vorherige Version anzeigen Version 4 Nächste Version anzeigen »

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.

Namensräume und Packages

Ein Namensraum wird pro Nuclet definiert. Ist eine Entität einem Nuclet zugewiesen, so muss beim Aufruf der entsprechende Namespace angegeben werden. Ist eine Entität keinem Nuclet zugeordnet, so wird der Default Namespace 'DEF' verwendet.

Packages werden für die Initialisierung spezieller Bibliotheksregeln benötigt. Alles Inhalte (also Bibliotheksregeln) eines Nuclet-Packages können Spring-managed sein und so innerhalb von Nuclos spezielle Funktionalitäten nutzen und bereitstellen (z.B. aufrufbare Funktionen).

Dynamische Eigenschaften und Berechnete Werte

Dynamische Eigenschaften (z.B. Hintergrundfarbe von Zeilendarstellungen) und berechnete Werte (z.B. Berechnungsausdruck bei Attributen) können in Groovy-Code definiert werden.

Berechnete Werte

Clientregeln für berechnete Werte werden immer auf dem Zielfeld definiert. Im Entitätenwizard findet sich in der Attributdefinition ein Button 'Berechnungsausdruck'. Hier wird der Groovy-Code hinterlegt.

ApplicationProgrammingInterface 1.jpg

Sie können im Code über die Variable "context" und passende Ausdrücke (im Code: context."Ausdruck" auf die Kontextinformationen und Daten des Objekts zugreifen.

Folgende Ausdrücke werden im Moment unterstützt:

#{[namespace].[entity]} // liefert die Datensätze eines Unterformulars als Liste
#{[namespace].[entity].[field]} // liefert den Wert eines Attributs
#{[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

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.

Beispiel

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

def bBetragBrutto = new java.math.BigDecimal(0.000)
def porto = context."#{WAR.auftrag.auftragPorto}"
def bKundeMitUstBerechnung = context."#{WAR.auftrag.auftragUst}"
 
context."#{WAR.auftrag_position}".each {
    item -> bBetragBrutto = bBetragBrutto.add(java.math.BigDecimal.valueOf(item."#{WAR.auftrag_position.gesamtpreisrechnung}"))
}
if (porto) {
	bPorto = new java.math.BigDecimal(porto)
	bBetragBrutto = bBetragBrutto.add(bPorto)
    if (bKundeMitUstBerechnung)
        bBetragBrutto = bBetragBrutto.add(bPorto.multiply(new java.math.BigDecimal(0.1900)))
 
}
return bBetragBrutto.setScale(4, java.math.RoundingMode.HALF_UP).doubleValue()

Hintergrundfarbe von Zeilendarstellungen

In Suchergebnislisten und Unterformularen können Zeilen farblich hinterlegt werden. Die Definition geschieht über einen Groovy-Code der pro Entität angegeben wird. Im letzten Schritt des Entitätenwizards befindet sich ein Button 'Hintergrundfarbe der Zeilendarstellung konfigurieren'. Hier wird das Skript hinterlegt.

ApplicationProgrammingInterface 2.jpg

Die Farben werden im Return-Statement anhand von Hexadezimalen Farbcodes angegeben.

Beispiel

Nachfolgend ein Beispielcode für die Farbeneinstellungen:

if (context."#{WAR.auftrag.auftragGesamtbetrag}" == null) {
    return "#FFA500";
}
else {
    if (context."#{WAR.auftrag.auftragBezahlt}" < context."#{WAR.auftrag.auftragGesamtbetrag}") {
                    return "#DC143C";
                }
    else {
        return "#32CD32";
    }
}


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.

ApplicationProgrammingInterface 3.jpg

Die gerade aktuelle Spalte kann mittels

context.field == "#{<Namespace>.<Entitätsname>.<Feldname>}"

abgefragt werden.

 Neu / Löschen / Klonen aktiv (dynamsich)

Die Aktivierung/Deaktivierung der Buttons wird entsprechend eines boolschen Rückgabewertes durchgeführt.

  • return true = Button aktiv
  • return false = Button nicht aktiv

Bearbeiten aktiv (dynamisch)

Die Aktivierung/Deaktivierung der Spalten wird entsprechend eines boolschen Rückgabewertes durchgeführt.

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

 

Beispiel

Bestimmte Felder sollen abhängig des ausgewählten Wertes (componentType) aktiviert oder deaktiviert sein.

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

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

package org.nuclet.rule;
 
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.Bestellung.kunde.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.

 

  • Keine Stichwörter