myContactCenterHandbuch

Code in Flows

Wie Sie in Flows mit C# rechnen und entscheiden — der Baustein Skriptcode, Funktionen und der Ausdruck einer Prüfung —, was der Code sieht, wie ihn der Flow-Designer prüft und was bei Fehlern im Betrieb geschieht.

In einem Flow steht C#-Code an drei Stellen:

Stelle Was Sie schreiben Ergebnis
Baustein Skriptcode Anweisungen, die mit return einen Text zurückgeben Der Text bestimmt, an welchem Ausgang der Ablauf weitergeht.
Funktionen eigene Methoden mit Parametern und Rückgabewert aufrufbar aus Skriptcode, Ausdrücken und anderen Funktionen
Ausdruck einer Prüfung eine Bedingung, etwa Position > 10 Der Ablauf geht bei Ja oder Nein weiter.

Aus allem Code eines Flows setzt der Flow-Designer eine gemeinsame Klasse zusammen. Der Routing Service übersetzt sie, sobald er den Flow bekommt, und führt für jede Konversation ein eigenes Exemplar aus. Variablen gelten deshalb immer nur für eine Konversation.

Der Baustein Skriptcode

Den Baustein Skriptcode finden Sie im Werkzeugkasten des Flow-Designers unter Erweiterte Knoten, in jeder Art von Flow. Seine Eigenschaften:

Eigenschaft Bedeutung
Anzeigename der Name im Flow
Ausgänge die Ausgänge; mit „+“ fügen Sie einen hinzu, mit „–“ entfernen Sie einen. Jeder Ausgang hat einen Anzeigetext und kann Sichtbar sein.
Skript der Code; „…“ öffnet den Code-Editor

Der Code ist der Rumpf einer Methode, die einen Text zurückgibt. Der Ablauf geht an dem verbundenen Ausgang weiter, dessen Anzeigetext genau diesem Text entspricht — Groß- und Kleinschreibung und Leerzeichen zählen mit.

Funktionen

Funktionen legen Sie in den Eigenschaften des Flows an — ohne gewählten Baustein — unter Globale Elemente › Funktionen:

Eigenschaft Bedeutung
Name ein gültiger C#-Name: ohne Leer- und Sonderzeichen, nicht mit einer Ziffer am Anfang
Rückgabetyp int, float, double, bool, string, DateTime, TimeSpan oder void
Parameter je Parameter Name und Typ: dieselben Typen und long
Code der Rumpf der Methode; „…“ öffnet den Code-Editor

Sie rufen eine Funktion wie eine Methode auf, etwa IstServicenummer(DestinationNumber). Funktionen ohne Parameter, die einen Wert zurückgeben, stehen außerdem in Texten des Flows als Platzhalter zur Verfügung: %Name% — siehe Platzhalter.

Der Ausdruck einer Prüfung

Der Baustein Prüfung hat die Eigenschaft Ausdruck: eine einzeilige C#-Bedingung, die true oder false ergibt. Bei true geht der Ablauf am Ausgang Ja weiter, sonst an Nein. Im Ausdruck stehen dieselben Namen zur Verfügung wie im Skriptcode.

Was der Code sieht

  • Variablen des Flows — unter Globale Elemente › Variablen — als Felder, die Sie lesen und schreiben: Anzahl = Anzahl + 1;. Unterfelder sprechen Sie mit Punkt an, etwa Kunde.Name.
  • Systemvariablen und -funktionen wie Position, IsOpen() oder AvailableAgents("Vertrieb", "Deutsch", "InboundCall") — dieselben wie in Texten, siehe Platzhalter, im Code aber auch mit mehreren Argumenten. Im Code haben sie einen Typ: IsOpen() etwa ergibt bool, Position eine Zahl.
  • Skill und Language können Sie auch setzen, mit dem Namen des Wissensgebiets bzw. der Sprache: Skill = "Vertrieb";. Einen Namen, den es nicht gibt, behandelt der Flow als Fehler.
  • trace schreibt ins Protokoll: trace.Info(…), trace.Warning(…), trace.Error(…). Die Zeilen erscheinen im Bereich Flow des Routing Service, siehe Tracing Einstellungen.

Die Auswahl Flow-Variablen unter dem Code-Editor listet alle diese Namen mit Rückgabetyp, Parameter und Beschreibung und fügt den gewählten an der Schreibmarke ein.

Eingebunden sind unter anderem die Namensräume System, System.Collections.Generic, System.Linq, System.Threading.Tasks, System.Data, System.Data.Odbc, System.Data.SqlClient und MimeKit. Eigene using-Zeilen sind nicht möglich; alles andere schreiben Sie mit vollem Namen, etwa System.Text.RegularExpressions.Regex. Der Code läuft nicht asynchron — await gibt es nicht.

Prüfen und Speichern

Der Flow-Designer übersetzt den ganzen Flow bei jeder Änderung. Fehler stehen in der Fehlerliste unter dem Diagramm und im Code-Editor. Ein Doppelklick auf einen Fehler im Code öffnet den Editor an der richtigen Stelle.

Code Meldung
UC0001 Der Usercode im Knoten enthält Kompilierfehler. — im Skriptcode oder Ausdruck eines Bausteins
UC0002 Usercode in einer Funktion enthält Kompilierfehler.
UC0003 Usercode enthält Compilerfehler. oder Script gibt einen nicht existierenden Output-Anzeige-String zurück. — ein return "…" passt zu keinem Ausgang

Hinter der Meldung folgt die Zeile und der Fehler des Übersetzers. Solange einer dieser Fehler besteht, lässt sich der Flow nicht speichern: Das Fenster Kritischer Fehler meldet Flow kann aufgrund kritischer Fehler nicht gespeichert werden und Bitte beheben Sie diese Fehler, um das Speichern zu ermöglichen.

Den ganzen Code, den der Flow-Designer erzeugt, zeigt Code generieren im Menüband — hilfreich, um eine gemeldete Zeile zu finden.

Im Betrieb

  • Fehler: Wirft Code eine Ausnahme, reagiert der Flow mit seinem Fehlerverhalten — bei Anrufen etwa Standard: den Anruf beenden. Fangen Sie Fehler, die Sie nachverfolgen wollen, selbst ab und schreiben Sie sie mit trace.Error(…) ins Protokoll.
  • Dauer: Der Code läuft im Ablauf der Konversation. Solange er rechnet, wartet sie; eine Endlosschleife hält sie fest.
  • Uhrzeit: DateTime.Now ist die Ortszeit des Rechners, auf dem der Routing Service läuft.

Beispiele

Offen oder geschlossen: Ein Skriptcode mit den Ausgängen „Offen“ und „Geschlossen“:

if (IsOpen() && AvailableAgents() > 0)
{
    return "Offen";
}

return "Geschlossen";

Kundennummer aus der Signalisierung übernehmen: Die Telefonanlage übergibt die Kundennummer im SIP-Kopffeld X-Kundennummer; der Flow hat eine Variable Kundennummer vom Typ string und die Ausgänge „Bekannt“ und „Unbekannt“. GetXHeader erwartet den Namen des Kopffelds ohne „X-“; Trim() entfernt Leerzeichen am Rand des Werts:

string number = GetXHeader("Kundennummer").Trim();
if (string.IsNullOrEmpty(number)) return "Unbekannt";

Kundennummer = number;
trace.Info("Kundennummer aus X-Header: ", number);
return "Bekannt";

Funktion in einer Prüfung: Eine Funktion IstServicenummer mit dem Rückgabetyp bool, einem Parameter nummer vom Typ string und dem Code return nummer.StartsWith("0800");. Der Ausdruck der Prüfung lautet IstServicenummer(DestinationNumber).

Funktion für Texte: Eine Funktion Tageszeitgruss mit dem Rückgabetyp string, ohne Parameter, mit dem Code return DateTime.Now.Hour < 12 ? "Guten Morgen" : "Guten Tag";. In einer Ansage aus Text schreiben Sie dann %Tageszeitgruss%.

    ↑ ↓ auswählen · Eingabe öffnen · Esc schließen