Hauptmenü

RuleSet funktioniert nicht wie erwartet

Begonnen von Alexander Gensler, 30.09.2025 12:19:52

⏪ vorheriges - nächstes ⏩

Alexander Gensler

Hallo zusammen,

ich habe folgendes RuleSet:

Rule "GetDaten" on Ticket
    ExecuteMacro "GetErreichbarkeit1Jahr" as MacroResult with {"NN": 1}
    Set DynamicFields.PrivateAnschrift "${MacroResult.Data.strasse}"
    Set DynamicFields.PrivatePLZ ${MacroResult.Data.plz}
    Set DynamicFields.PrivaterOrt "${MacroResult.Data.ort}"
   
    If TR.DynamicFields.isEmpty(PrivateAnschrift)
    Tell Warning "Fehlende Stammdaten" "Ihre Stammdaten konnten nicht geladen werden.<br/>Bitte prüfen Sie diese auf Vollständigkeit und Aktualität."
    Disable Submit
        Stop
    EndIf
    If TR.DynamicFields.isEmpty(PrivatePLZ)
    Tell Warning "Fehlende Stammdaten" "Ihre Stammdaten konnten nicht geladen werden.<br/>Bitte prüfen Sie diese auf Vollständigkeit und Aktualität."
    Disable Submit
        Stop
    EndIf
    If TR.DynamicFields.isEmpty(PrivaterOrt)
    Tell Warning "Fehlende Stammdaten" "Ihre Stammdaten konnten nicht geladen werden.<br/>Bitte prüfen Sie diese auf Vollständigkeit und Aktualität."
    Disable Submit
        Stop
    EndIf
End

Das ausgeführte Makro liest von einer SQL-Datenbank einen Datensatz und setzt diese Werte. Ist einer der drei Werte leer, soll eine Warnung ausgegeben werden und der Speichern-Button deaktiviert werden.

Leider wird die Warnmeldung auch ausgegeben, wenn alle drei Werte erfolgreich geladen werden konnten:
Fehler.png

Kann mir jemand sagen, wo hier der Fehler (mutmaßlich) in der If-Bedingung liegt? Ich habe es auch schon probiert, die Anweisung zur Fehlermeldung + Deaktivieren des Speichern-Buttons in eine eigene Rule auszulagern und mit entsprechenden if-Bedingungen zu versehen und diese im Anschluss der ersten Rule auszuführen.

Viele Grüße
Alexander

Torsten Thau

#1
Hi Alexander,

innerhalb der Workflow Rules werden die zuvor geänderten Werte nicht berücksichtigt. Du könntest aber folgendes probieren und direkt nochmal die Macrorückgaben auswerten. Denn die werden ja ohnehin verwendet um die Formularfelder zu setzen.

Rule "GetDaten" on Ticket
    ExecuteMacro "GetErreichbarkeit1Jahr" as MacroResult with {"NN": 1}
    Set DynamicFields.PrivateAnschrift "${MacroResult.Data.strasse}"
    Set DynamicFields.PrivatePLZ ${MacroResult.Data.plz}
    Set DynamicFields.PrivaterOrt "${MacroResult.Data.ort}"
  
    If ("${MacroResult.Data.strasse}" eq "" || "${MacroResult.Data.plz}" eq ""  || "${MacroResult.Data.ort}" eq "")
        Tell Warning "Fehlende Stammdaten" "Ihre Stammdaten konnten nicht geladen werden.<br/>Bitte prüfen Sie diese auf Vollständigkeit und Aktualität."
        Disable Submit
        Stop
    EndIf
End

Denn mit "isEmpty" gibt es noch eine Stolperfalle: es ist eigentlich für Selection-DF gedacht und checkt ob dort Werte ausgewählt sind oder nicht (https://docs.kixdesk.com/pro/de/administration/workflow/rule-sets.html#UUID-f45c61ad-e9a6-4568-6902-22c133dc0d1b_UUID-adeb9d80-c209-a2ba-3885-d810cfe9eed0)

CU, Torsten


UPDATE: fehlende Anführungsstriche um Variablen in Code nachträglich ergänzt entspr. Rückmeldung Alexander

Alexander Gensler

Hallo Torsten,

besten Dank, das hat mit minimalen Änderungen funktioniert.
In der If-Bedingung mussten die Variablen von Straße und Ort jeweils noch in Hochkommata gesetzt werden (analog zu den Set-Zeilen), damit die NVARCHAR-Werte aus der SQL-Datenbank passend als Strings gecastet werden und der Vergleich mit eq möglich ist.

Viele Grüße
Alexander


Torsten Thau

Hallo Alexander,

oh ja - jetzt da du das schreibst fällt es mir auch auf. Danke. 

CU, Torsten

Alexander Gensler

Hallo Torsten,

eine ergänzende Frage:
Ich habe das RuleSet mittlerweile um weitere Rules erweitert, da noch einige anderer Felder auf Änderungen reagieren sollen. Nun wollte ich versuchen, dass die Rule mit dem ExecuteMacro nur einmalig ausgeführt wird und bei anderen Änderungen nicht mehr reagiert zur Verhinderung, dass ich den SQL-Server mit Anfragen spamme.

Mein Ansatz war einfach, die Rule mit folgender If-Bedingung zu versehen:
Rule "GetDaten" on Ticket if ${MacroResult.Data.plz} ne ""
...

Aus meinem Verständnis heraus sollte die Rule dann nicht mehr ausgeführt werden, wenn der geladene PLZ-Datensatz einen Wert beinhaltet (was der Regelfall sein sollte). Leider klappt das nicht.

Ein zweiter Ansatz, den ich ausprobiert habe, war durch das Setzen einer Variable:
Rule "GetDaten" on Ticket if ${Loaded} != 1
   SetVariable Loaded 1
...

Auch das jedoch ohne Erfolg (auch mit verschiedenen anderen Schreib- und Vergleichsoperatoren).

Viele Grüße
Alexander

Torsten Thau

Hallo Alexander,

fehlen da vielleicht nur die Anführungsstriche um die Macro-Variable herum?

Rule "GetDaten" on Ticket if "${MacroResult.Data.plz}" ne ""
...


Davon abgesehen muss das Macro ja ausgeführt werden damit der Platzhalter aufgelöst werden kann. Ich befürchte also, dass das nicht so geht. 


CU, Torsten

Alexander Gensler

Hallo Torsten,

nachdem die PLZ ein Zahlenwert ist, nein. Ich habe es jedoch auch mal mit 
Rule "GetDaten" on Ticket if "${MacroResult.Data.strasse}" eq ""
...

ausprobiert und auch hier wird die Rule mehrmals ausgeführt statt wie gewünscht nur einmal.

Ausgehend von deiner Anregung habe ich ebenso versucht, die Bedingung an ein befülltes Dynamisches Feld zu binden, auch das jedoch ohne Erfolg.
Rule "GetDaten" on Ticket if TR.DynamicFields.PrivateAnschrift eq ""
...

Viele Grüße
Alexander