In diesem Kapitel werden folgende Themen behandelt:
Der Zugriff auf die Datenfelder ist ein wesentlicher Bestandteil der ConSol CM-Programmierung. Er kann in allen Skripten des Systems notwendig sein, sowohl in Workflow-Skripten als auch in Admin-Tool-Skripten und zwar unabhängig vom Skripttyp. An dieser Stelle konzentrieren wir uns auf die Workflow-Programmierung, der Zugriff auf die Datenfelder funktioniert aber in allen Skripten grundsätzlich gleich.
Ab ConSol CM-Version 6.9.0 gibt es zwei Arten von Datenfeldern:
Die Arbeit mit Datenfeldern des neuen Kundendatenmodells (FlexCDM) in Version 6.9 und höher ist im ConSol CM Administratorhandbuch - Kundendatenmodell 6.9: FlexCDM und ConSol CM Administratorhandbuch (Version 6.9), Abschnitt Das CM-Kundendatenmodell: FlexCDM detailliert beschrieben.
Regeln für die Arbeit mit Datenfeldern in CM 6.9 und höher:
Wenn Sie mit Benutzerdefinierten Feldern und Datenobjektgruppenfeldern arbeiten, sollten Sie drei Grundregeln berücksichtigen:
In ConSol CM-Version 6.10 wurde das Modul CM.Resource Pool eingeführt. Eine detaillierte Beschreibung aller Objekte im neuen Modul finden Sie im ConSol CM Administratorhandbuch, Abschnitt CM.Resource Pool. Zu den bereits aus Version 6.9 bekannten Datenfeldern kommt eine neue Art von Datenfeldern: die Ressourcenfelder. In CM-Versionen 6.10 und höher arbeiten wir mit folgenden Datenfeldern:
Ein Datenfeld hat immer einen bestimmten Datentyp. Bei Variablen für die Programmierung hängt es vom Datentyp ab, wie Sie den Wert des Feldes verarbeiten müssen, ein Feld des Datentyps string kann z. B. nicht für die Berechnung von Zahlen verwendet werden und Felder des Datentyps enum benötigen eine spezielle Zugriffsmethode.
Die folgenden Datentypen sind für Benutzerdefinierte Felder, Datenobjektgruppenfelder und Ressourcenfelder verfügbar.
Wenn Sie in CM-Workflows oder im Admin Tool mit Skripten arbeiten, sollten Sie wissen, dass das Verhalten von Boolean-Feldern, die als Checkboxen dargestellt werden, d. h. mit der Annotation boolean-type = checkbox (Standardwert) versehen sind, anders ist als in früheren CM-Versionen!
Felder, die in der Datenbank bereits mit Werten gefüllt sind, werden während des Updates von einer Version vor 6.9.4.0 auf Version 6.9.4.0 und höher nicht verändert.
Boolean-Felder, die als Radio-Button (Annotation boolean-type = radio) oder Drop-down-Liste (Annotation boolean-type = select) dargestellt sind, hatten schon immer das Verhalten, das für Version 6.9.4.0 oder höher beschrieben ist, d. h. sie haben den Wert NULL, wenn sie noch nicht angefasst wurden.
Abbildung 118: Schema: List of Structs
Technisch gesehen ist eine Liste ein Array, der in jedem Feld eine Map (= Paare von Schlüssel:Wert) enthält.
Abbildung 119: List of structs, technisches Prinzip
Beschränkung bei der Verwendung einer Oracle-Datenbank: Es können höchstens 4000 Bytes in UTF-Codierung gespeichert werden. Ab Oracle12c.
Beim Datentyp long string (Text) hängt die Grenze von dem für ConSol CM verwendeten Datenbanksystem ab: MS SQL Server: 2 GByte; MySQL: 4 GByte; Oracle: 16 - 64 GByte (je nach Page-Größe des Tablespace).
Bei Feldern des Datentyps string (Text) können Sie die Felddefinition mithilfe von Annotationen präzisieren. Ein Feld des Datentyps string kann zum Beispiel so definiert werden, dass es eine URL enthält und automatisch als Hyperlink angezeigt wird. Lesen Sie dazu den folgenden Abschnitt.
Der Datentyp, den Sie beim Erstellen eines Datenfeldes verwenden, kann danach nicht mehr verändert werden!
String-Felder werden häufig für Kunden-, Ticket- und Ressourcendaten verwendet und in Strings kann unterschiedlicher Inhalt gespeichert werden, zum Beispiel ein Textfeld mit einem Kommentar, ein einfaches Eingabefeld mit nur 20 Zeichen, eine URL oder ein Passwort. Das Anpassen von String-Feldern erfolgt mithilfe von speziellen Annotationen, die auf der Seite Annotationen des Anhangs aufgeführt sind. Da die Arbeit mit diesen Annotationen zu den alltäglichen Aufgaben eines CM-Administrators gehört, sind die wichtigsten und am häufigsten verwendeten Annotationen zusätzlich an dieser Stelle erklärt.
Wert für Annotation text-type: textarea
Die Größe des Textfeldes kann angepasst werden. Es wird je nach Webbrowser als Standardtextfeld angezeigt. Verwenden Sie die Annotation field-size, wenn das Textfeld eine bestimmte Größe haben soll.
Wert für Annotation text-type: password
Es werden nur Punkte angezeigt. Diese Annotation legt nicht fest, dass das Feld ein Passwort enthält! Es definiert nur den Anzeigemodus! Verwenden Sie die Annotation password, um ein String-Feld zu definieren, das das CM.Track-Passwort enthält.
Wert für Annotation text-type: url
Die Eingabe wird im Ansichtsmodus als Hyperlink angezeigt. Der String muss einem bestimmten URL-Muster entsprechen:
Der erste Teil des Strings ist der Link (URL) und der zweite Teil ist der Name, der angezeigt werden soll.
Beispiel: "http://consol.de ConSol"
Wert für Annotation text-type: file-url
Die Eingabe wird als Link auf eine Datei im Dateisystem angezeigt. Der Webbrowser muss solche Links zulassen/unterstützen!
Beispiel: Aktivieren von file://-URLs in einem Firefox-Browser
Fügen Sie die folgenden Zeilen entweder zur Konfigurationsdatei prefs.js oder zu user.js im Benutzerprofil hinzu. Auf einem Windows-System befindet sich diese normalerweise in einem Ordner wie C:\Benutzer\<BENUTZERNAME>\AppData\Roaming\Mozilla\Firefox\Profiles\uvubg4fj.default
Alternativ kann ein Add-on des Firefox-Browsers wie Local Filesystem Links installiert werden, um einfacher auf die referenzierten Dateien und Ordner zugreifen zu können.
Dieser Link wird auch als Tooltip angezeigt.
Die URL ist korrekt formatiert, wenn folgende Bedingungen erfüllt sind:
Beispiel-URLs:
Wert für Annotation text-type: label
Dies ist ein schreibgeschütztes Feld, das grau angezeigt wird. Verwenden Sie die Annotation label-group, um das Label und die dazugehörigen Eingabefelder zu verknüpfen. Berücksichtigen Sie die Annotationen für Label (show-label-in-edit, show-label-in-view), bevor Sie spezielle Label-Felder implementieren!
Wert für Annotation username: true
Wird für die Authentifizierung beim CM.Track-Server verwendet. Nur für Datenobjektgruppenfelder in einem Kontaktobjekt.
Wert für Annotation password: true
Wird (im Datenbankmodus) für die Authentifizierung beim CM.Track-Server verwendet. Nur für Datenobjektgruppenfelder in einem Kontaktobjekt.
Wert für Annotation email: true
Das Feld darf nur gültige E-Mail-Adressen enthalten. Die Eingabe wird gemäß des Standardformats für E-Mail-Adressen validiert <name>@<domain>.
Wert für die Annotation text-type = autocomplete
Optional: Wert für die Annotation autocomplete-script = <Name des entsprechenden Skripts>
Eine skriptbasierte Autocomplete-Liste wird verwendet, um ein Drop-down-Menü bereitzustellen, das anhand der Eingabe, die der Bearbeiter bereits vorgenommen hat, dynamisch gefüllt wird. Wenn der Benutzer zum Beispiel "Mei" eingibt, werden die möglichen Werte "Meier", "Meister" und "Meinert" als Liste angezeigt und der Bearbeiter kann den für das Feld erforderliche Wert auswählen. Sie kennen dieses Verhalten von anderen Autocomplete-Feldern, z. B. der Suche nach Bearbeitern für ein Ticket oder die Suche nach Kunden bei der Ticketerstellung. In diesen Fällen erzeugt CM die Liste allerdings automatisch und das Verhalten kann nicht beeinflusst oder angepasst werden. Im Gegensatz dazu können skriptbasierte Autocomplete-Listen vom CM-Administrator implementiert werden. Die Werte basieren auf einem Ergebnissatz, der dynamisch erstellt wird. Der Ergebnissatu kann Strings, Bearbeiter, Kunden (Units) und Ressourcen enthalten.
Eine detaillierte Beschreibung von skriptbasierten Autocomplete-Listen finden Sie im Abschnitt Skriptbasierte Autocomplete-Listen des Administratorhandbuchs.
Im Admin Tool werden die Benutzerdefinierten Felder für Ticketdaten in der Verwaltung der Benutzerdefinierten Felder definiert: Navigationsgruppe Tickets, Navigationselement Benutzerdefinierte Felder.
Abbildung 120: ConSol CM Admin Tool: Verwaltung der Benutzerdefinierten Felder für Ticketdaten (CM-Version 6.10)
Die folgenden drei Methoden sind für die Programmierung des Zugriffs auf Benutzerdefinierte Felder in CM-Skripten wichtig. Alle Methoden gehören zur Klasse Ticket:
Eine weitere Methode kann verwendet werden, wenn ein Feld geleert werden soll, d. h. wenn der Wert auf null gesetzt werden soll:
Um Daten aus einem Benutzerdefinierten Feld in einem Skript abzurufen, müssen Sie es über die technischen Namen der Benutzerdefinierten Feldgruppe und des Benutzerdefinierten Feldes referenzieren. Die zu verwendende Methode kann je nach Datentyp des Benutzerdefinierten Feldes unterschiedlich sein.
Die folgenden Beispiele beziehen sich auf die Benutzerdefinierten Felder aus der obigen Abbildung. Die zu verwendende Methode (der bequemste Weg) ist:
ticket.get("<Gruppenname>.<Feldname>")
Denken Sie daran, dass die Getter-Methode für ein Feld abhängig vom Typ des Datenfelds entweder einen Wert oder ein Objekt zurückgeben kann! Dies ist in folgendem Beispiel erklärt.
Mit dem folgenden Admin-Tool-Skript, das z. B. aus dem Workflow aufgerufen wird, werden Ticketdaten angezeigt:
// display info from custom types of various data types:
import com.consol.cmas.common.model.ticket.Ticket
Ticket ticket = workflowApi.ticket
println 'Display enum from helpdesk CF group ... '
def myfield = ticket.get("helpdesk_standard.priority")
println 'Class of helpdesk_standard.priority field is ' + myfield.getClass()
println 'Value of helpdesk_standard.priority field is ' + myfield.getName()
println 'Retrieve value directly, method 1, using getter method ... '
def my_new_field1 = ticket.get("helpdesk_standard.priority").getName()
println 'Result is ' + my_new_field1
println 'Retrieve value directly, method 2, using direct access to attribute ... '
def my_new_field2 = ticket.get("helpdesk_standard.priority").name
println 'Result is ' + my_new_field2
println 'Display value of simple data field ...'
def fb = ticket.get("helpdesk_standard.feedback")
println 'Value of feedback boolean field is ' + fb
Code-Beispiel 24: Admin-Tool-Skript zum Anzeigen von Benutzerdefinierten Feldern
Die folgende Ausgabe wird in der Datei server.log angezeigt:
Erklärung:
Wenn Sie den Wert eines Benutzerdefinierten Feldes, das ein Objekt enthält, (z. B. einen EnumValue) abrufen möchten, müssen Sie Methoden wie getName() verwenden, um den tatsächlichen Wert abzurufen, da ticket.get ... nur das Objekt liefert. Die Notation .name ist eine vereinfachte Version (Groovy) der Getter-Methode.
Wenn Sie den Wert eines einfachen Datenfeldes abrufen möchten, können Sie dies "direkt" tun: ticket.get ... liefert den Wert.
Ein Bedingungsskript einer Workflow-Aktivität könnte wie folgender Code aussehen:
boolean vip_info = ticket.get("am_fields.vip")
if(vip_info == true){
return true
}
else {
return false
}
Code-Beispiel 25: Bedingungsskript, in dem ein Boolean-Wert überprüft wird
Oder kürzer:
return ticket.get("am_fields.vip")
Code-Beispiel 26: Bedingungsskript, in dem ein Boolean-Wert überprüft wird, Kurzversion
Ein Feld des Typs enum (sortierte Liste) ist ein Feld, in dem der Wert einer von mehreren Listenwerten ist. Zum Beispiel kann eine Liste mit Prioritäten die Grundlage für ein Enum-Feld bilden. Sie können zum Abrufen des Wertes eines Enum-Feldes die gleiche Syntax verwenden, wie für einfache Datentypen. Die Methode get liefert den Listenwert des Enums und die Methode getName() liefert den Namen des Wertes als String-Attribut.
def prio = ticket.get("helpdesk_standard.priority")
println "Priority is now " + prio.getName()
//or shorter:
println "Priority is now " + prio.name
Code-Beispiel 27: Abrufen eines Enum-Wertes für ein Benutzerdefiniertes Feld
Die Java-Klasse für MLAs (Multi Level Attributes) ist MultiEnumField. Sie wird wie ein normales Enum-Feld behandelt, d. h. Sie können Java-/Groovy-Code wie im nachfolgenden Beispiel verwenden, um den aktuellen Wert eines MLA-Feldes abzurufen.
Abbildung 121: Admin Tool: Definition eines Benutzerdefinierten Feldes des Typs MLA
Abbildung 122: Admin Tool: MLA-Definition
Abbildung 123: Web Client: Setzen eines Wertes (technisch: Name) eines MLAs
// Get
def myEnumValueName = ticket.get("GROUP_NAME.MLA_FIELD_NAME").name
// Set
EnumValue enumValue = enumService.getValueByName("ENUM_NAME","ENUM_VALUE_NAME")
ticket.set("GROUP_NAME.MLA_FIELD_NAME", enumValue)
Beispiel mit technischem Namen des Feldes und lokalisiertem Namen:
import com.consol.cmas.common.model.customfield.enums.EnumValue
println 'Displaying MLA value ...'
def my_mla_field = ticket.get("helpdesk_standard.categories")
println 'MLA value categories (technical name) is now ' + my_mla_field.name
def my_mla_field_localized = localizationService.getLocalizedProperty(EnumValue.class, "name", my_mla_field.id, engineerService.getCurrentLocale())
println 'MLA value categories (localized name) is now ' + my_mla_field_localized
Code-Beispiel 28: Code (Workflow- oder Admin-Tool-Skript) für die Anzeige der MLA-Daten
Abbildung 124: Log-Ausgabe für das obige Beispiel
Wenn Sie den gesamten Pfad des ausgewählten MLA-Wertes abrufen möchten, können Sie folgendermaßen vorgehen:
println 'Displaying MLA branch ...'
List<EnumValue> mlaPathElements = mlaService.getAssignedMla(ticket, "helpdesk_standard", "categories")
def mlaPath1=""
mlaPathElements.each() {elem ->
mlaPath1 = elem.name + ' -- ' + mlaPath1
}
println 'mlaPath1 is now ' + mlaPath1
//or shorter:
def mlaPath2 = mlaService.getAssignedMla(ticket, "helpdesk_standard", "categories").reverse()*.name.join(" -- ")
println 'mlaPath2 is now ' + mlaPath2
Code-Beispiel 29: Abrufen des gesamten Pfads zum ausgewählten MLA-Wert
Abbildung 125: Log-Ausgabe für das obige Beispiel
Eine Liste mit einfachen Datentypen besteht aus einer Liste (= Array), bei der in jeder Zeile ein Wert eines einfachen Datentyps steht, in unserem Beispiel ein Datum. Das Benutzerdefinierte Feld des Typs date muss den Parameter Gehört zu haben, der auf die Liste zeigt.
Abbildung 126: ConSol CM Admin Tool - Benutzerdefiniertes Feld für eine Liste mit Datumsfeldern
Abbildung 127: ConSol CM Web Client - Liste der Datumsfelder in einem Ticket (Bearbeitungsmodus)
Mit folgendem Code können Sie auf die einzelnen Benutzerdefinierten Felder des Typs date der Liste zugreifen:
def convs = ticket.get("conversation_data.conversation_list").each() { conv ->
println "NEXT DATE is :" + conv
println "CLASS of NEXT DATE is " + conv.getClass()
}
Code-Beispiel 30: Anzeigen des Inhalts einer Liste mit Datenobjekten
Abbildung 128: Log-Ausgabe des obigen Skripts
Um auf eine bestimmte Zeile zuzugreifen, können Sie folgende Syntax verwenden:
def mydate = ticket.get("conversation_data.conversation_list[1]")
Code-Beispiel 31: Abrufen eines bestimmten Werts aus einer Liste mit einfachen Datentypen
Die Datenstruktur list of structs bildet die technische Grundlage für eine Tabelle mit mehreren Spalten im Web Client. Die Liste ist das übergeordnete Objekt, das Zeilen enthält. Jede Zeile ist eine Instanz eines struct. Jede Zeile (struct) enthält so viele Benutzerdefinierte Felder (Tabellenspalten) wie erforderlich. Siehe Abbildung in der Einleitung dieses Abschnitts.
Um die Daten aus einer List of Structs abzurufen, arbeiten Sie mit einer Iteration über die Zeilen (= structs). Im folgenden Beispiel (aus einem Bestellsystem, nicht in der obigen Abbildung gezeigt), arbeiten wir mit einer Tabelle, in der ...
Abbildung 129: ConSol CM Admin Tool - Benutzerdefinierte Felder für die Liste
Abbildung 130: ConSol CM Web Client - Ticket mit ausgefüllter Tabelle
def structs = ticket.get("order_data.orders_list").each() { str ->
println("CLASS of LINE is " + str.getClass())
println("FIELD VALUE HARDWARE is " + str.orders_hardware.getName())
println("CLASS of FIELD VALUE HARDWARE is " + str.orders_hardware.getName().getClass())
println("FIELD VALUE CONTACT is " + str.orders_contact)
println("CLASS of FIELD VALUE CONTACT is " + str.orders_contact.getClass())
println("FIELD VALUE NUMBER is " + str.orders_number)
println("CLASS of FIELD VALUE NUMBER is " + str.orders_number.getClass())
}
Code-Beispiel 32: Abrufen von Daten aus einer List of Structs
Abbildung 131: Log-Datei - Skriptausgabe
Um Werte für Benutzerdefinierte Felder für Tickets zu setzen, folgende Sie dem gleichen Prinzip wie für den Abruf der Daten: Verwenden Sie den Namen der Benutzerdefinierten Feldgruppe und den technischen Namen des Benutzerdefinierten Feldes als Referenz. Außerdem ist natürlich der neue Wert erforderlich. Dieser muss selbstverständlich den richtigen Datentyp haben.
ticket.set("<Gruppenname>.<Feldname>", <Wert>)
ticket.set("fields.reaction_time", new Date());
Code-Beispiel 33: Setzen eines Wertes für ein Benutzerdefiniertes Feld mit einem Datum
Wenn Sie mit Feldern des Datentyps number oder date arbeiten, können Sie die Werte der Benutzerdefinierten Felder bequem berechnen, siehe folgendes Beispiel.
//add 24 hours (in millis) to current field value
ticket.add("fields.deadline", 24*60*60*1000)
Code-Beispiel 34: Berechnen des Wertes eines Benutzerdefinierten Feldes mit einem Datum
Das Setzen eines Wertes auf null (d. h. Leeren des Feldes) ist dasselbe wie das Entfernen des Wertes:
ticket.set("fields.numberOfEmployees", null)
Code-Beispiel 35: Setzen des Wertes eines Benutzerdefinierten Feldes auf null
Oder kürzer:
ticket.remove("fields.numberOfEmployees" )
Code-Beispiel 36: Setzen des Wertes eines Benutzerdefinierten Feldes auf null durch Entfernen des Wertes
Verwenden Sie folgende Syntax, um einen enum-Wert zu setzen. Der neue Wert muss natürlich in der Sortierten Liste (enum) vorhanden sein, die vom Benutzerdefinierten Feld referenziert wird.
ticket.set("Gruppenname.Feldname",<technischer Name des Wertes>)
ticket.set("fields.priority", "URGENT");
Code-Beispiel 37: Setzen eines Enum-Wertes
Wenn Sie eine Zeile hinzufügen möchten, können Sie einfach die Methode add verwenden:
ticket.add("fields.tags", "my new String")
Code-Beispiel 38: Hinzufügen einer neuen Zeile zu einer Liste mit Strings
Wenn Sie sich auf einen bestimmten Wert beziehen möchten, um einen neuen Wert dafür zu setzen, müssen Sie die Syntax für ein Array verwenden:
ticket.set("fields.tags[last]", "ConSol CM6")
Code-Beispiel 39: Setzen eines Werts in einer Liste mit Strings
Wenn Sie mit structs arbeiten, müssen Sie immer mit dem Schlüssel des Wertes arbeiten, den Sie hinzufügen oder setzen möchten. Wenn Sie eine neue Zeile hinzufügen möchten, müssen Sie ein neues Struct als neue Zeile erstellen. Mit der Methode set können Sie nacheinander jedes neue Feld befüllen.
ticket.add("order_data.orders_list", new Struct()
.set("tA_Id", id).set("orders_hardware",mynewhardware_model)
.set("orders_contact", thenewcontactname)
.set("orders_number",thenewnumber)
Code-Beispiel 40: Hinzufügen einer neuen Zeile zu einer List of Structs
Eine Benutzerdefinierte Feldgruppe kann mit einer Methode von workflowApi eingeblendet (sichtbar gemacht) und ausgeblendet (unsichtbar gemacht) werden. Dies funktioniert für Benutzerdefinierte Feldgruppen, die im Kopfbereich des Tickets angezeigt werden, und für Benutzerdefinierte Feldgruppen, die im Gruppenbereich des Tickets angezeigt werden.
Ein typischer Anwendungsfall ist eine Benutzerdefinierte Feldgruppe, die zuerst unsichtbar ist (Gruppenannotation group-visibility = false) und zu dem Zeitpunkt eingeblendet wird, an dem der Bearbeiter im Prozess mit den Daten arbeiten muss. Eine Benutzerdefinierte Feldgruppe, die die Gründe für die Ablehnung einer Anfrage enthält, wird zum Beispiel erst angezeigt (eingeblendet), wenn der Bearbeiter auf die Workflow-Aktivität Ticket verwerfen ... geklickt hat. Dies verhindert, dass das Ticket mit Informationen überladen wird.
workflowApi.setGroupProperty("CF_Group_Dismissal",GroupPropertyType.VISIBLE,"true")
Code-Beispiel 41: Einblenden einer Benutzerdefinierten Feldgruppe
Um einige Benutzerdefinierte Feldgruppen auszublenden, z. B. wenn das Ticket qualifiziert wurde und einige der Benutzerdefinierten Feldgruppen für den Prozess nicht mehr benötigt werden, können Sie Code wie den im folgenden Beispiel gezeigten verwenden:
workflowApi.setGroupProperty("CF_Group_HardwareInfo",GroupPropertyType.VISIBLE,"false")
workflowApi.setGroupProperty("CF_Group_SoftwareInfo",GroupPropertyType.VISIBLE,"false")
Code-Beispiel 42: Ausblenden von Benutzerdefinierten Feldgruppen
In CM-Version 6.9 und höher gehören Datenobjektgruppen für Kunden zum neuen Kundendatenmodell (FlexCDM). In Version 6.9 werden sie im Admin Tool, Abschnitt Benutzer-Attribute, Tab Kundendatenmodell definiert. In Version 6.10 werden sie im Admin Tool, Navigationsgruppe Kunden, Navigationselement Datenmodelle definiert (siehe auch Datenobjektgruppenfelder für Kundendaten (CM-Version 6.10 und höher).
Abbildung 132: ConSol CM Admin Tool - Verwaltung von Datenobjektgruppenfeldern für Kundendaten (CM-Version 6.9)
Die Felder, die in Kundendatenmodellen früherer Versionen Benutzerdefinierte Felder hießen, heißen jetzt Datenobjektgruppenfelder. Das Prinzip, über das Sie Werte für diese Datenfelder abrufen und setzen, ist allerdings grundsätzlich das gleiche wie in CM-Version 6.8 und älter.
Die folgenden drei Methoden sind für die Programmierung des Zugriffs auf Datenobjektgruppenfelder in CM-Skripten wichtig. Alle Methoden gehören zur Klasse Unit:
Eine andere Methode kann verwendet werden, wenn ein Feld geleert werden soll, d. h. wenn der Wert auf null gesetzt werden soll:
Da der Name eines Datenobjektgruppenfeldes in mehr als einer Datenobjektgruppe vorkommen kann, muss der Name der Datenobjektgruppe beim Zugriff auf die Kundendaten angegeben werden. Zum Beispiel könnten im in der obigen Abbildung gezeigten Kundendatenmodell die Datenobjektgruppen ResellerCompanyData und DirCustCompanyData ein Datenobjektgruppenfeld mit dem Namen city haben. Deshalb ist es wichtig, den Gruppennamen und den Feldnamen anzugeben.
Verwenden Sie dazu folgende Syntax:
unit.get("group1:name")
Zum Beispiel:
def mycity = company.get("ResellerCompanyData:city")
Code-Beispiel 43: Abrufen eines Feldwertes für eine Firma
Es gibt mehrere Objekte und Methoden, mit denen Sie auf unterschiedlichen Ebenen von FlexCDM mit Daten arbeiten können. Im folgenden Beispiel werden mehrere häufige Objekte und Methoden angewendet. Dies ist ein Admin-Tool-Skript, auf das aus einer Workflow-Aktivität zugegriffen wird. Der einzige Zweck ist die Anzeige einiger Daten des Hauptkunden des Tickets. Die folgende Abbildung zeigt die im Skript verwendeten Java-Objekte und die referenzierten ConSol CM-Objekte im Admin Tool.
Abbildung 133: ConSol CM-Kundenobjekte im Skript und Admin Tool
Denken Sie daran, dass Sie für Getter-Methoden wie unit.getDefinition().getType() auch die kurze Notation wie unit.definition.type verwenden können.
import com.consol.cmas.common.model.ticket.Ticket
import com.consol.cmas.common.model.customfield.meta.UnitDefinitionType
def ticket = workflowApi.getTicket()
def mcont = ticket.getMainContact()
println "CustomerGroup of main contact is now " + mcont.getCustomerGroup().getName()
println "Customer definition of main contact is now " + mcont.getCustomerDefinition().getName()
println "UnitDefinition of main contact is now " + mcont.getDefinition().getName()
def custmod = mcont.getCustomerDefinition().getName()
// println "CUSTMOD is now " + custmod
def cityfield
switch (custmod) {
case "BasicModel" : cityfield = "company:city";
break;
case "DirectCustomerModel" : cityfield = "DirCustCompanyData:dir_cust_company_city";
break;
case "ResellerModel": cityfield = "ResellerCompanyData:city";
break;
}
println "CITYFIELD is now " + cityfield
def utype1 = mcont.getDefinition().getType()
def utype2 = mcont.definition.type
println "UTYPE1 is now " + utype1
println "UTYPE2 is now " + utype2
def company = mcont
if (utype2 == UnitDefinitionType.CONTACT) {
company = mcont.get("company()")
}
def mycity = company.get(cityfield)
println " CITY is now " + mycity
Code-Beispiel 44: Admin-Tool-Skript (aus dem Workflow aufgerufen) zum Anzeigen von Kundendaten
Die Ausgabe der Log-Datei für den folgenden Datensatz ist unten abgebildet. Es wird das Modell Reseller aus der obigen Abbildung verwendet.
Abbildung 134: ConSol CM Web Client - Kundendatensatz
Abbildung 135: Log-Datei - Skriptausgabe für FlexCDM
String firstName = company.get("responsibleConsultants[0].firstName");
Code-Beispiel 45: Abrufen eines Wertes aus einer List of Structs mithilfe der Index-Notation
Die Methoden set und add funktionieren so, wie es für Benutzerdefinierte Felder für Tickets beschrieben ist. Zum Beispiel:
//set number field
company.set("numberOfEmployees", 1);
//add 1 to field value, afterwards the value of the field is 2
company.add("numberOfEmployees", 1);
Code-Beispiel 46: Setzen und Hinzufügen von Werten für ein Datenobjektgruppenfeld des Typs integer
company.set("responsibleConsultants", [
new Struct().set("lastName", "Miller").set("email", "miller@consol.com"),
new Struct().set("lastName", "Smith").set("email", "smith@consol.com"),
new Struct().set("lastName", "Burger").set("email", "burger@consol.com")
]);
Code-Beispiel 47: Erstellen einer neuen List of Structs, Version 2
company.add("responsibleConsultants", new Struct().set("lastName", " Nowitzki ").set("email", "dnowitzki@consol.us"));
Code-Beispiel 48: Hinzufügen einer neuen List of Structs für Kundendaten
company.set("responsibleConsultants[0].firstName", "John");
Code-Beispiel 49: Setzen eines Wertes in einer List of Structs mithilfe der Index-Notation
company.set("responsibleConsultants[last]", null);
Code-Beispiel 50: Entfernen eines struct (= Zeile) aus einer List of Structs (= Tabelle)
Unit mainContact = ticket.getMainContact();
// "company" extension returns company for contact
Unit company = mainContact.get("company()");
// it is also possible to set company using "company" extension
mainContact.set("company()", company);
// "contacts" extension returns list of contacts for company
List contacts = company.get("contacts()");
// "tickets" extension returns list of tickets for contact or company
List tickets = company.get("tickets()");
tickets = mainContact.get("tickets()");
// extensions can be chained
Integer count = contact.get("company().contacts()[0].tickets()[count]");
// parentheses can be omitted, but it is not recommended (possible collision with name of group or field)
count = contact.get("company.contacts[0].tickets[count]"); // here "company" is not extension but name of field
Code-Beispiel 51: Convenience-Methoden für den Zugriff auf Kundendaten
In CM-Version 6.10 und höher gehören Datenobjektgruppen für Kundendaten, wie in Version 6.9, zum Kundendatenmodell (FlexCDM). Sie werden im Admin Tool, Navigationsgruppe Kunden, Navigationselement Datenmodelle definiert.
Abbildung 136: ConSol CM Admin Tool - Verwaltung von Datenobjektgruppenfeldern für Kundendaten (CM-Version 6.10)
Alles, was Sie in Version 6.9 über Datenobjektgruppenfelder gelernt haben, gilt auch für CM-Version 6.10. Einige Methoden wurden allerdings als veraltet (deprecated) gekennzeichnet.
In CM-Version 6.9 ist es noch möglich, Unit-Methods zu verwenden, die den Namen der Datenobjektgruppe nicht als Parameter haben, z. B.
Unit.getField(String pFieldName)
Dies funktioniert nur dann reibungslos, wenn ein Datenobjektgruppenfeld in allen Kundengruppen, auf die das Skript angewendet wird, den gleichen Namen hat, oder wenn im restlichen Code sichergestellt wird, dass es zur Laufzeit nicht in mehrdeutigen Situationen verwendet wird. In Version 6.10 sind die Unit-Methoden ohne den Namen der Datenobjektgruppe veraltet (deprecated) und werden in Version 6.11 und höher nicht mehr unterstützt. Die folgende Tabelle enthält alle diese Methoden:
CM-Versionen bis 6.9, deprecated in 6.10, nicht in 6.11 | CM-Versionen 6.10 und höher |
---|---|
getField(String pFieldName) | getField(String pGroupName, String pFieldName) |
getFieldValue(String pFieldName) | getFieldValue(String pGroupName, String pFieldName) |
setFieldValue(String pFieldName, Object pFieldValue) | setFieldValue(String pGroupName, String pFieldName, Object pValue) |
removeField(String pFieldName) | removeField(String pGroupName, String pFieldName) |
Ab Version 6.10.0 kann ConSol CM das optionale Modul CM.Resource Pool haben. Mit diesem Modul können Sie die CM-Datenbank erweitern und Ressourcenobjekte speichern. Dies können unterschiedliche Objekte wie IT-Assets, Verträge, Produkte oder andere in der entsprechenden Firma benötigte Objekte sein. Ähnlich wie das Kundendatenmodell wird auch das Ressourcendatenmodell mit dem Admin Tool definiert. Das Modell wird in der Navigationsgruppe Ressourcen, Navigationselement Datenmodelle definiert. Um in Workflow-Skripten mit Ressourcendaten arbeiten zu können, sollten Sie erst ein fundiertes Wissen des Funktionsprinzips des Ressourcenpools und der Einrichtung des Datenmodells erwerben. Lesen Sie dazu zuerst den Abschnitt über CM.Resource Pool im ConSol CM Administratorhandbuch.
Ähnlich wie bei Ticket- und Kundendaten werden auch die Ressourcendaten in Ressourcenfeldgruppen, die Ressourcenfelder enthalten, gespeichert.
Abbildung 137: Admin Tool: Definition des Ressourcendatenmodells
Um Daten aus Ressourcenfeldern abzurufen, können Sie Methoden wie die in den folgenden Beispielen gezeigten, verwenden.
// Display info about HP Printer, priting infos about resource fields into server.log
def my_resource_name = resource.get("HP_Printer_Fields_basic.name")
println 'Displaying resource information ...'
println ' Name is : ' + my_resource_name
def my_resource_inv_number = resource.get("HP_Printer_Fields_basic.inventory_number")
println ' Inventory number is : ' + my_resource_inv_number
Code-Beispiel 52: Einfaches Ressourcenaktionsskript, das Informationen über die Ressource in der Log-Datei anzeigt
Abbildung 138: Web Client: Ressourcenseite einer Ressource des Typs HP-Drucker
Abbildung 139: Log-Ausgabe des Skripts für den Drucker aus dem GUI-Beispiel
In echten Prozessen sind die Anforderungen normalerweise komplexer. Es ist häufig erforderlich, alle Ressourcen eines bestimmten Typs abzurufen, die über eine bestimmte Art von Relation mit einem Ticket oder einer Ressource verknüpft sind. Dieses Thema wird detailliert im Abschnitt Arbeiten mit Ressourcenrelationen.
Weitere Programmierbeispiele aus dem ConSol CM Action Framework finden Sie im ConSol CM Administratorhandbuch, Abschnitt Skripte für das Action Framework.
Manchmal ist es erforderlich, mit Variablen zu arbeiten, die nicht für Benutzerdefinierte Felder, Datenobjektgruppenfelder oder Ressourcenfelder verwendet werden und nicht auf der GUI sichtbar sind, die aber als Container für interne Programmiervariablen benötigt werden.
Diejenigen, die wissen, wie ConSol CM5-Workflows programmiert werden, kennen diese Container als globale Variablen. In ConSol CM6 können Sie das gleiche Ziel erreichen, indem Sie normale Benutzerdefinierte Felder (für Ticketdaten), Datenobjektgruppenfelder (für Kundendaten) oder Ressourcenfelder (für Ressourcendaten) mit dem erforderlichen Datentyp erstellen und diese auf unsichtbar setzen. Dies erfolgt über die Verwendung der Annotation visibility = none. Sie können die Variable auch während der Entwicklung des Prozesses sichtbar lassen, um den Wert des Feldes zu kontrollieren. Wenn das System an die QA und die Benutzer übergeben wird, können Sie sie dann auf unsichtbar setzen.