Home Forum Nuclos Entwicklung Makros und Regeln Wie funktioniert groovy?

Ansicht von 7 Beiträgen - 1 bis 7 (von insgesamt 7)
  • Autor
    Beiträge
  • #6356
    Markus Glitzner
    Teilnehmer

    Hallo!

    Ich hab schon öfters probiert in Entitäsattributen einen Berechnungsausdruck mit groovy zu verwenden, allerdings will es einfach nicht funktionieren.

    Ich probier hin und her, weis aber nicht was wann wo passieren sollte, daher weis ich auch nicht wo ich ansetzen soll.

    Daher ein paar Verständnissfragen:
    Ab wann greift der Groovy Code?
    – Sobald ich auf compilieren klicke
    – wenn ich das Codefenster schließe
    – wenn ich das Attribut fertig stelle
    – wenn der EntitätWizard fertig gestellt wird
    – muss dann die Eingabemaske neu geöffnet werden

    Warum funktoniert ein einfaches return 0.0 nicht, was mach ich da blos falsch?

    Wenn es funktioniert, wann wird der Code ausgeführt?
    Wenn das betreffende Feld den Focus verliert?
    Wenn irgend ein Feld den Focus verliert?

    Im Layout möchte ich groovy verwenden um Felder abhängig von einer Combobox zu aktivieren bzw. zu deaktivieren. Blöd dabei ist nur, dass der Datensatz erst gespeichert werden muss, bevor der Code greift. Ist das normal bzw. kann ich

    so sieht mein Code im Layout aus:
    if (context."#{DEF.auftrag.lief_adresse.id}" == 40100000)
    return false
    else
    return true

    #6357
    Frank Pavlic
    Teilnehmer

    Hallo Hugo,
    ja Groovy ist sehr sensibel in nuclos :unsure: . Nehmen wir deinen Beispielcode, dann geht das nicht, weil „auftrag“ und nicht „Auftrag“ verwendet wird. Ich gehe davon aus,
    dass deine Entität-Definitionen vom Namen groß geschrieben sind. Also müsste folgendes funktionieren:
    if (context."#{DEF.Auftrag.lief_adresse.id}" == 40100000)
    return false
    else
    return true

    Aktiv/Inaktiv – Regeln im Layout funktionieren ganz gut. Berechnungsausdrücke, also Groovy im Entitätenwizard hinterlegt, funktionieren dagegen miserabel. Als Beispiel habe ich im Attribut A Groovy-Code hinterlegt. Dort frage ich ein Attribut B auf Wert > 0.0 ab und abhängig davon setze ich den Wert in A aus B entsprechend. Ganz simpel. Das funktioniert nur genau bei ersten Tastenanschlag im Feld B, dann ist Schicht im Schacht. Gebe ich in B 200 ein, dann übernimmt A genau die 2 , mehr nicht. Da ich aber noch mit 3.9.4 arbeite, ist dafür noch kein JIRA aufgegangen. Und bisher komme ich ohne Groovy als Berechnungsausdruck aus.

    return 0.0 ging bei mir auch nicht, allerdings ging folgendes:
    def rc = new java.math.BigDecimal(0.0)
    return rc.doubleValue()

    Generell:
    Groovy-Code läuft im Client, d.h. ob Datensatz bereits gespeichert oder nicht, der Code _muss_ ausgeführt werden. D. h. aber auch, dass Du Feldinhalte auch auf null prüfen musst, sonst gibt es NullPointerExceptions.

    Um deinen Code von oben noch ein wenig zu modifizieren:

    def lid = context."#{DEF.Auftrag.lief_adresse.id}"
    if (lid != null && lid == 40100000)
    return false
    return true

    Gruß
    Frank

    #6358
    Markus Glitzner
    Teilnehmer

    Hallo Frank!

    Ich dachte, dass ich für einfache Berechnungen nicht immer eine Regel erstellen müsste und es ja mal ganz fein wäre, wenn die Werte schon vorm Speichern berechnet werden, aber wenn das nicht zuverlässig funktioniert, bleib ich lieber bei Regeln.

    Ganz schlau werd ich aus dem Groovy Code trozdem nicht, schreibe ich den Code wie von dir vorgeschlagen #{DEF.Auftrag… funktioniert aktiv/inaktiv wunderbar 🙂 , schreibe ich aber #{DEF.auftrag … greift der Code erst, wenn der Datensatz neu geladen wird. Die Logik dahinter erschließt sich mir nicht. Nachdem das Wiki Beispiel auch klein geschrieben wurde, dachte ich das gehört so und es hat ja zum Teil funktioniert.

    Warum ist es eigentlich nicht möglich die Berechnung via Groovy direkt ins Formular zu geben so wie aktiv/inaktiv.

    Gruß
    Hugo

    #6359
    Frank Pavlic
    Teilnehmer

    Hallo Hugo,
    hat mich auch ein wenig Zeit gekostet, um auf Gross-/Kleinschreibung von Entitäten in Groovy zu kommen ! Ich denke aber, dass es in irgendeiner Form ein Bug ist. Entweder auf Gross-/Kleinschreibung achten oder eben unabhängig davon !

    Und meiner Meinung nach ist die komische Ausführung der Berechnungs-Skripten auch ein Bug, allerdings muss ich das erst mit einer aktuellen Version verfizieren. Es funktioniert ja zum Teil und ein wenig Groovy wird auch bei Berechnungen ausgeführt, aber eben nur ein wenig :pinch:

    Die direkte Eingabe im Formular fände ich auch besser, zumal alles dann an einer Stelle zu finden ist. Ich denke, das ist historisch (oder doch histerisch ? 😉 ) so gewachsen. Am Anfang war die Berechnung 😉 . Müsste man per JIRA vorschlagen, Freiwillige vor :whistle:

    Welche Version setzt du ein ?

    Gruß
    Frank

    #6360
    Frank Pavlic
    Teilnehmer

    Hab noch ein wenig rumgespielt. Im Schnitt bei jedem zweiten Tastenanschlag wird das Skript ausgeführt. Folgendes Skript habe ich beim Feld „Meldebestand“ angelegt:


    def sb = context."#{DEF.Artikel.sicherheitsbestand}"
    if (sb == null)
    sb = new java.math.BigDecimal(0.0)
    return sb.doubleValue()

    Sicherheitsbestand und Meldebestand sind zwei Double-Felder (Numerisch 9,2). Bei jeder zweiten Ziffer, dich ich im Sicherheitsbestand eingebe, wird Meldebestand aktualisiert. Keine Ahnung warum, dafür müsste ich den Client mal mit DEBUG-Meldungen ausführen. Mist, das ist lange her, muss ich erst mal nachschauen, wo ich die log4j-Datei ablegen muss.

    Vielleicht willst Du das bei Dir mal einbauen und schauen, was passiert.

    Gruß
    Frank

    #6361
    Ramin Goettlich
    Teilnehmer

    Hallo,

    ein Hinweis: Das Problem, dass Groovy-Berechnungregeln nur jedes zweite Mal ausgeführt werden, sollte seit Nuclos 3.10 mit NUCLOS-1280 behoben sein.

    Wir arbeiten übrigens daran, Groovy-Regeln durch clientseitige Java-Regeln zu ersetzen, damit man sich nur noch in einer Sprachwelt bewegen muss. Auch für clientseitige Regeln wird also die Nuclos API die wesentliche Schnittstelle werden.

    Grüsse,
    nuclosian

    #6362
    Frank Pavlic
    Teilnehmer

    Danke für die Aufklärung und Information.

    Gruß
    Frank

Ansicht von 7 Beiträgen - 1 bis 7 (von insgesamt 7)