Im Ablauf wird als erstes LABEL-1 auf “1” gesetzt, wenn eine Aktionsbedinung mit einem Zeitschema zutriftt, als zweites wird LABEL-2 auf “1” gesetzt, wenn eine Aktionsbedinung mit Kalender zutrifft. Wenn (mindestens) eine der beiden Bedingungen eintritt, sollte nach meinem Verständnis die obige Asterisk Expression wahr werden. Leider ist sie immer wahr, auch wenn weder LABEL-1 noch LABEL-2 auf “1” gesetzt wurde.
Anders sieht es aus, wenn ich LABEL-1 und LABEL-2 bedingungslos erstmal auf “0” setze und dann ggf. auf “1” stelle, wenn Zeitschema oder Kalender wahr ist. Dann funktioniert die Asterisk Expression.
Sie funktioniert auch, wenn ich (ohne vorheriges Setzen von Null-Werten) mit “2” arbeite, also LABEL-1 oder/und LABEL-2 bei erfüllter Bedinung mit “2” füttere. Die zugehörige Asterisk Expression $[ “${MDC_LABEL-1}” = “2” | “${MDC_LABEL-2}” = “2” ] arbeitet dann wie erwartet und ist nicht immer wahr.
Woran liegt das? Erwartungsgemäß sollte 1 wahr sein, 0/””/NULL aber falsch. Ein solches Verhalten ist mir aus anderen Sprachen (PHP, JavaScript…) nicht geläufig. Da ich aber zukünftig solche Stolpersteine vermeiden möchte, ist eine Antwort hilfreich.
leider bleibt das Ergebnis gleich. Da ich mir diesen Umstand bislang nicht sinnvoll erklären kann, habe ich als Workaround ein initialisierendes Inline-Script (hier auf 2 Label/Kanalvariablen verkürzt) in den Anrufverteiler eingebaut:
Set(ARRAY(MDC_LABEL-1,MDC_LABEL-2)=0,0)
Ich habe viele Label im Einsatz, die allerdings mehrheitlich mit UND-Verknüpfungen arbeiten, wobei bislang keine Fehler/unerwartete Ergebnisse aufgetreten sind. Da ich nun aber mißtrauisch geworden bin, “nulle” ich initial alle von mir angelegten Variablen.
Ich initialisiere meine Variablen auch immer brav. Asterisk ist hier leicht zickig.
Claude sagt zu deinem Problem:
Das Problem: Leere Variablen in Asterisk Expressions
Das Verhalten liegt daran, wie Asterisk leere/undefinierte Variablen in $[ ]-Expressions behandelt.
Wenn MDC_LABEL-1nicht gesetzt ist, wird ${MDC_LABEL-1} zu einem leeren String aufgelöst. Deine Expression wird dann effektiv zu:
$[ "" = "1" | "" = "1" ]
Das sieht erstmal so aus, als müsste es false ergeben – und genau hier liegt der Stolperstein: Asterisk’s Expression-Parser ist extrem simpel und hat Probleme mit leeren Strings. Der Parser interpretiert die Tokens anders als erwartet, wenn leere Werte auftauchen. Konkret kann es passieren, dass der Parser die Operatoren und Operanden falsch zuordnet, weil ein erwarteter Token fehlt, und das Ergebnis dann unerwartet true (bzw. nicht-null) wird.
Warum es mit “2” funktioniert
Wenn die Variable nicht gesetzt ist und du mit "2" vergleichst, wird daraus:
$[ "" = "2" | "" = "2" ]
Hier ergibt sich zufällig trotzdem das korrekte Ergebnis, weil der Parser die Zeichenkette "2" anders tokenisiert als "1". Der Wert 1 ist in Asterisk auch ein gültiger numerischer/boolescher Wert, was das Parsing zusätzlich beeinflusst. "2" hat dieses Problem nicht im selben Maß.