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, etwaKunde.Name. - Systemvariablen und -funktionen wie
Position,IsOpen()oderAvailableAgents("Vertrieb", "Deutsch", "InboundCall")— dieselben wie in Texten, siehe Platzhalter, im Code aber auch mit mehreren Argumenten. Im Code haben sie einen Typ:IsOpen()etwa ergibtbool,Positioneine Zahl. SkillundLanguagekö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.traceschreibt 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.Nowist 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%.