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.
Es gibt drei Arten von Datenfeldern:
Regeln für die Arbeit mit Datenfeldern
Wenn Sie mit Ticketfeldern, Kundenfeldern oder Ressourcenfeldern arbeiten, müssen Sie zwei Grundregeln berücksichtigen:
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 Ticketfelder, Kundenfelder 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 130: 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 131: 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:
Siehe auch die Erklärung von file-url im Abschnitt Liste der Feldannotationen
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 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.
Wert für Annotation username: true
Wird für die Authentifizierung beim CM/Track-Server verwendet. Nur für Kundenfelder in einem Kontaktobjekt.
Wert für Annotation password: true
Wird (im Datenbankmodus) für die Authentifizierung beim CM/Track-Server verwendet. Nur für Kundenfelder in einem Kontaktobjekt.
Wert für Annotation personal-data: true
Diese Annotation kann Ticket- und Kontaktfeldern zugewiesen werden. Kontaktfelder mit dieser Annotation werden gelöscht, wenn ein Kontakt anonymisiert wird. Ticketfelder mit dieser Annotation werden gelöscht, wenn der Hauptkunde des Tickets anonymisiert wird.
Beachten Sie bei der Definition von Feldern für persönliche Daten, dass das Löschen des Feldes während des Anonymisierungsprozesses wie eine normale Aktualisierung behandelt wird. Das heißt, Business-Event-Trigger, die auf Änderungen an Ticketfeldern reagieren, feuern und das Aktionsskript zur Kontaktaktualisierung wird ausgeführt.
Dies kann zu unerwünschten Nebeneffekten führen.
Im Admin Tool werden die Ticketfelder in der Navigationsgruppe Tickets, Navigationselement Ticketfelder definiert.
Abbildung 132: ConSol CM Admin Tool - Verwaltung der Ticketfelder für Ticketdaten (CM-Version 6.10)
Die folgenden drei Methoden sind für die Programmierung des Zugriffs auf Ticketfelder 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 Ticketfeld in einem Skript abzurufen, müssen Sie es über die technischen Namen der Ticketfeldgruppe und des Ticketfeldes referenzieren. Die zu verwendende Methode kann je nach Datentyp des Ticketfeldes unterschiedlich sein.
Die folgenden Beispiele beziehen sich auf die Ticketfelder 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
log.info 'Display enum from helpdesk CF group ... '
def myfield = ticket.get("helpdesk_standard.priority")
log.info 'Class of helpdesk_standard.priority field is ' + myfield.getClass()
log.info 'Value of helpdesk_standard.priority field is ' + myfield.getName()
log.info 'Retrieve value directly, method 1, using getter method ... '
def my_new_field1 = ticket.get("helpdesk_standard.priority").getName()
log.info 'Result is ' + my_new_field1
log.info 'Retrieve value directly, method 2, using direct access to attribute ... '
def my_new_field2 = ticket.get("helpdesk_standard.priority").name
log.info 'Result is ' + my_new_field2
log.info 'Display value of simple data field ...'
def fb = ticket.get("helpdesk_standard.feedback")
log.info 'Value of feedback boolean field is ' + fb
Code-Beispiel 28: Admin-Tool-Skript zum Anzeigen von Ticketfeldern
Die folgende Ausgabe wird in der Datei server.log angezeigt:
Erklärung:
Wenn Sie den Wert eines Ticketfeldes, 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 29: Bedingungsskript, in dem ein Boolean-Wert überprüft wird
Oder kürzer:
return ticket.get("am_fields.vip")
Code-Beispiel 30: Bedingungsskript, in dem ein Boolean-Wert überprüft wird, Kurzversion
Ein Feld des Typs enum 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")
log.info 'Priority is now ' + prio.getName()
//or shorter:
log.info 'Priority is now ' + prio.name
Code-Beispiel 31: Abrufen eines Enum-Wertes für ein Ticketfeld
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 133: ConSol CM Admin Tool - Definition eines Ticketfeldes des Typs MLA
Abbildung 134: ConSol CM Admin Tool - MLA-Definition
Abbildung 135: ConSol CM 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
log.info 'Displaying MLA value ...'
def my_mla_field = ticket.get("helpdesk_standard.categories")
log.info '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())
log.info 'MLA value categories (localized name) is now ' + my_mla_field_localized
Code-Beispiel 32: Code (Workflow- oder Admin-Tool-Skript) für die Anzeige der MLA-Daten
Abbildung 136: 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:
log.info 'Displaying MLA branch ...'
List<EnumValue> mlaPathElements = mlaService.getAssignedMla(ticket, "helpdesk_standard", "categories")
def mlaPath1=""
mlaPathElements.each() {elem ->
mlaPath1 = elem.name + ' -- ' + mlaPath1
}
log.info 'mlaPath1 is now ' + mlaPath1
//or shorter:
def mlaPath2 = mlaService.getAssignedMla(ticket, "helpdesk_standard", "categories").reverse()*.name.join(" -- ")
log.info 'mlaPath2 is now ' + mlaPath2
Code-Beispiel 33: Abrufen des gesamten Pfads zum ausgewählten MLA-Wert
Abbildung 137: 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 Ticketfeld des Typs date muss den Parameter Gehört zu haben, der auf die Liste zeigt.
Abbildung 138: ConSol CM Admin Tool - Ticketfeld für eine Liste mit Datumsfeldern
Abbildung 139: ConSol CM Web Client - Liste der Datumsfelder in einem Ticket (Bearbeitungsmodus)
Mit folgendem Code können Sie auf die einzelnen Ticketfelder des Typs date der Liste zugreifen:
def convs = ticket.get("conversation_data.conversation_list").each() { conv ->
log.info "NEXT DATE is :" + conv
log.info "CLASS of NEXT DATE is " + conv.getClass()
}
Code-Beispiel 34: Anzeigen des Inhalts einer Liste mit Kundenobjekten
Abbildung 140: 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 35: 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 Ticketfelder (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 141: ConSol CM Admin Tool - Ticketfelder für die Liste
Abbildung 142: ConSol CM Web Client - Ticket mit ausgefüllter Tabelle
def structs = ticket.get("order_data.orders_list").each() { str ->
log.info("CLASS of LINE is " + str.getClass())
log.info("FIELD VALUE HARDWARE is " + str.orders_hardware.getName())
log.info("CLASS of FIELD VALUE HARDWARE is " + str.orders_hardware.getName().getClass())
log.info("FIELD VALUE CONTACT is " + str.orders_contact)
log.info("CLASS of FIELD VALUE CONTACT is " + str.orders_contact.getClass())
log.info("FIELD VALUE NUMBER is " + str.orders_number)
log.info("CLASS of FIELD VALUE NUMBER is " + str.orders_number.getClass())
}
Code-Beispiel 36: Abrufen von Daten aus einer List of Structs
Abbildung 143: Log-Datei - Skriptausgabe
Um Werte für Ticketfelder für Tickets zu setzen, folgende Sie dem gleichen Prinzip wie für den Abruf der Daten: Verwenden Sie den Namen der Ticketfeldgruppe und den technischen Namen des Ticketfeldes 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 37: Setzen eines Ticketfeldwertes für ein Feld des Typs Datum
Wenn Sie mit Feldern des Datentyps number oder date arbeiten, können Sie die Werte der Ticketfelder bequem berechnen, siehe folgendes Beispiel.
//add 24 hours (in millis) to current field value
ticket.add("fields.deadline", 24*60*60*1000)
Code-Beispiel 38: Rechnen mit dem Wert eines Ticketfelds des Typs 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 39: Setzen des Wertes eines Ticketfeldes auf null
Oder kürzer:
ticket.remove("fields.numberOfEmployees" )
Code-Beispiel 40: Setzen des Wertes eines Ticketfeldes 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 Ticketfeld referenziert wird.
ticket.set("Gruppenname.Feldname",<technischer Name des Wertes>)
ticket.set("fields.priority", "URGENT");
Code-Beispiel 41: 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 42: 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 43: 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 44: Hinzufügen einer neuen Zeile zu einer List of Structs
Eine Ticketfeldgruppe kann mit einer Methode von workflowApi eingeblendet (sichtbar gemacht) und ausgeblendet (unsichtbar gemacht) werden. Dies funktioniert für Ticketfeldgruppen, die im Kopfbereich des Tickets angezeigt werden, und für Ticketfeldgruppen, die als Tab (im Bereich für Detaildaten) des Tickets angezeigt werden.
Ein typischer Anwendungsfall ist eine Ticketfeldgruppe, 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 Ticketfeldgruppe, 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 45: Einblenden einer Ticketfeldgruppe
Um einige Ticketfeldgruppen auszublenden, z. B. wenn das Ticket qualifiziert wurde und einige der Ticketfeldgruppen 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 46: Ausblenden von Ticketfeldgruppen
Das Kundendatenmodell (FlexCDM) enthält Kundenfeldgruppen und Kundenfelder. Sie werden im Admin Tool, Navigationsgruppe Kunden, Navigationselement Datenmodelle definiert.
Abbildung 144: ConSol CM Admin Tool - Verwaltung von Kundenfeldern für Kundendaten (CM-Version 6.10)
Die folgenden drei Methoden sind für die Programmierung des Zugriffs auf Kundenfelder in ConSol CM-Skripten wichtig. Alle Methoden gehören zur Klasse Unit.
Zum Abrufen von Daten aus einem Kundenfeld:
Unit.get()
Zum Setzen von Daten in einem bereits vorhandenen Kundenfeld:
Unit.set()
Für Berechnungen mit einem Wert in einem Kundenfeld, z. B. zum Hinzufügen eines bestimmten Zeitraums zu einem Datumsfeld und zum Hinzufügen einer neuen Zeile in Listenfeldern (einfache Listen und Tabellen):
Unit.add()
Eine andere Methode kann verwendet werden, wenn ein Feld geleert werden soll, d. h. wenn der Wert auf null gesetzt werden soll:
Unit.remove() // Sets the value of the field to null.
Da der Name eines Kundenfeldes in mehr als einer Kundenfeldgruppe vorkommen kann, muss der Name der Kundenfeldgruppe beim Zugriff auf die Kundendaten angegeben werden. Zum Beispiel könnten im in der obigen Abbildung gezeigten Kundendatenmodell die Kundenfeldgruppen ResellerCompanyData und DirCustCompanyData ein Kundenfeld 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 47: Abrufen eines Feldwertes für eine Firma
Methoden zum Abrufen von Werten von Kundenfeldern:
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 145: 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.ticket
def mcont = ticket.mainContact
log.info "CustomerGroup of main contact is now " + mcont.customerGroup.name
def custmod = mcont.customerDefinition.name
log.info "Customer definition of main contact is now " + custmod
log.info "UnitDefinition of main contact is now " + mcont.definition.name
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;
default: cityfield = null;
break
}
log.info "CITYFIELD is now " + cityfield
def utype1 = mcont.getDefinition().getType()
def utype2 = mcont.definition.type
log.info "UTYPE1 is now " + utype1
log.info "UTYPE2 is now " + utype2
def company = mcont
if (utype2 == UnitDefinitionType.CONTACT) {
company = mcont.get("company()")
}
def mycity = company.get(cityfield)
log.info " CITY is now " + mycity
Code-Beispiel 48: 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 146: ConSol CM Web Client - Kundendatensatz
Abbildung 147: Log-Datei - Skriptausgabe für FlexCDM
Die Methoden set und add funktionieren so, wie es für Ticketfelder für Tickets beschrieben ist. Zum Beispiel:
//set a string field
unit.set("ResellerCompanyData:service_status","ok")
//set number field
company.set("ResellerCompanyData:numberOfEmployees", 1);
//add 1 to field value, afterwards the value of the field is 2
company.add("numberOfEmployees", 1);
Code-Beispiel 49: Setzen und Hinzufügen von Werten für ein Kundenfeld des Typs Integer und Setzen eines Wertes für ein Kundenfeld des Typs String
company.set("consultantsFields: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 50: Erstellen einer neuen List of Structs, Version 2
company.add("consultantsFields:responsibleConsultants", new Struct().set("lastName", " Nowitzki ").set("email", "dnowitzki@consol.us"));
Code-Beispiel 51: Hinzufügen einer neuen Zeile in einer List of Structs für Firmendaten
company.set("consultantsFields:responsibleConsultants[0].firstName", "John");
Code-Beispiel 52: Setzen eines Wertes in einer List of Structs mithilfe der Index-Notation
company.set("consultantsFields:responsibleConsultants[last]", null);
Code-Beispiel 53: 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 54: Convenience-Methoden für den Zugriff auf Kundendaten
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 148: ConSol CM 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, printing infos about resource fields into server.log
def my_resource_name = resource.get("HP_Printer_Fields_basic.name")
log.info 'Displaying resource information ...'
log.info ' Name is : ' + my_resource_name
def my_resource_inv_number = resource.get("HP_Printer_Fields_basic.inventory_number")
log.info ' Inventory number is : ' + my_resource_inv_number
Code-Beispiel 55: Einfaches Ressourcenaktionsskript, das Informationen über die Ressource in der Log-Datei anzeigt
Abbildung 149: ConSol CM Web Client - Ressourcenseite einer Ressource des Typs HP-Drucker
Abbildung 150: 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.
Eine Ressourcenfeldgruppe kann mit einer workflowApi-Methode eingeblendet (sichtbar) und ausgeblendet (unsichtbar) werden. Dies funktioniert sowohl für Ressourcenfeldgruppen im Kopfbereich der Ressourcenseite als auch für Ressourcenfeldgruppen, die in den Tabs des Bereich für Detaildaten angezeigt werden.
Die Ressource HP Printer enthält im folgenden Beispiel eine Ressourcenfeldgruppe mit einer Ticketliste. Jedes Wartungsticket, das für die Ressource mit einer Ressourcenaktion erzeugt wird (eine detaillierte Erklärung zu Ressourcenaktionen finden Sie im ConSol CM Administratorhandbuch), soll zu dieser Liste hinzugefügt werden. Am Anfang ist die Ressourcenfeldgruppe als unsichtbar konfiguriert (Gruppenannotation group-visibility = false). Erst, wenn die Aktion durchgeführt wurde, soll die Ressourcenfeldgruppe auf der Ressourcenseite sichtbar werden.
Der folgende Code ist ein Auszug aus dem Ressourcenaktionsskript, derselbe oder ähnlicher Code kann aber auch in Workflow-Skripten verwendet werden.
// set ticket number in list in resource, newtic is the newly created maintenance ticket
def newtic_id = newtic.id.toString()
def newtic_name = newtic.name
//resource is the HP printer from which the action script is started
resource.add("HP_Printer_MaintenanceTickets.MaintenanceTicketsList",new Struct().set("MaintenanceTicketID", newtic_id)
.set("MaintenanceTicketName", newtic_name)
)
if (!executionContext) {
return actionScriptResultFactory.getPostAction(PostActionType.FAILURE, "action.fail.wrong.activity")
}
// if ticktes are in the list in the resource, the field group should be visible
def groupName = "HP_Printer_MaintenanceTickets"
def fieldGroupDefinition = fieldDefinitionService.getGroupByName(groupName)
if (fieldGroupDefinition == null) {
throw new IllegalArgumentException("There is no group definition with name '" + groupName + "'.")
}
resource.getGroupsConfiguration().setProperty(fieldGroupDefinition, GroupPropertyType.VISIBLE, "true")
Code-Beispiel 56: Auszug aus einem Skript, das auf einer Ressourcenseite Zeilen zu einer Ticketliste hinzufügt und die Ressourcenfeldgruppe, die die Liste enthält, sichtbar macht
Manchmal ist es erforderlich, mit Variablen zu arbeiten, die nicht für Ticketfelder, Kundenfelder oder Ressourcenfelder verwendet werden und nicht auf der GUI sichtbar sind, die aber als Container für interne Programmiervariablen benötigt werden.
Die Werte dieser Datenfelder stellen globale Variablen dar. Sie implementieren globale Variablen, indem Sie normale Ticketfelder, Kundenfelder Ressourcenfelder 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.