Arbeiten mit Datenfeldern

In diesem Kapitel werden folgende Themen behandelt:

Einführung in Datenfelder

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.

ConSol CM-Version 6.9 und höher

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:

  1. Benutzerdefinierte Felder werden immer in Benutzerdefinierten Feldgruppen verwaltet und referenziert, d. h. wenn Sie den Wert eines Benutzerdefinierten Feldes abrufen wollen, müssen Sie <Name Benutzerdefinierte Feldgruppe>.<Name Benutzerdefiniertes Feld> verwenden.
  2. Datenobjektgruppenfelder werden immer in Datenobjektgruppen verwaltet und referenziert, d. h. wenn Sie den Wert eines Datenobjektgruppenfeldes abrufen wollen, müssen Sie <Name Datenobjektgruppe>.<Name Datenobjektgruppenfeld> verwenden.
  3. Sie müssen immer den eindeutigen technischen Namen verwenden, um ein Datenobjektgruppenfeld oder eine Datenobjektgruppe zu referenzieren, nie den lokalisierten Wert.

ConSol CM-Version 6.10 und höher

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: 

Datentypen für Datenfelder

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.

Der Datentyp, den Sie beim Erstellen eines Datenfeldes verwenden, kann danach nicht mehr verändert werden!

Details über String-Felder: Verwenden von Annotationen zum Anpassen von Strings

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.

Wie kann ich ...

... statt einer einzelnen Zeile ein Textfeld einfügen?

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.

... die Eingabe des Feldes für Passwörter ausblenden?

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.

... einen Hyperlink anzeigen, den Namen statt dem Link anzeigen?

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"

... einen Dateilink anzeigen?

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:

... ein Label definieren?

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!

... ein Feld für das CM.Track-Login definieren?

Wert für Annotation username: true

Wird für die Authentifizierung beim CM.Track-Server verwendet. Nur für Datenobjektgruppenfelder in einem Kontaktobjekt.

... ein Feld für das CM.Track-Passwort definieren?

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.

... ein Feld für gültige E-Mail-Adressen definieren?

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>.

... eine skriptbasierte Autocomplete-Liste definieren? 

Wert für die Annotation text-typeautocomplete

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.

Benutzerdefinierte Felder für Ticketdaten

Im Admin Tool werden die Benutzerdefinierten Felder für Ticketdaten in der Verwaltung der Benutzerdefinierten Felder definiert: Navigationsgruppe Tickets, Navigationselement Benutzerdefinierte Felder.

Abbildung 122: ConSol CM Admin Tool: Verwaltung der Benutzerdefinierten Felder für Ticketdaten (CM-Version 6.10)

Die wichtigsten Methoden für den Zugriff auf Benutzerdefinierte Felder für Tickets

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:

Abrufen von Werten von Benutzerdefinierten Feldern für Ticketdaten

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.

Einfache Datentypen

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 25: 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 26: Bedingungsskript, in dem ein Boolean-Wert überprüft wird

Oder kürzer:

return ticket.get("am_fields.vip")

Code-Beispiel 27: Bedingungsskript, in dem ein Boolean-Wert überprüft wird, Kurzversion

Listenwerte

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 28: Abrufen eines Enum-Wertes für ein Benutzerdefiniertes Feld

MLAs

Arbeiten mit einem MLA-Wert (das ausgewählte "Blatt" des MLA-Baums)

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 123: Admin Tool: Definition eines Benutzerdefinierten Feldes des Typs MLA

Abbildung 124: Admin Tool: MLA-Definition

Abbildung 125: 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 29: Code (Workflow- oder Admin-Tool-Skript) für die Anzeige der MLA-Daten

Abbildung 126: Log-Ausgabe für das obige Beispiel

Arbeiten mit dem gesamten Pfad des ausgewählten MLA-Wertes

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 30: Abrufen des gesamten Pfads zum ausgewählten MLA-Wert

Abbildung 127: Log-Ausgabe für das obige Beispiel

Listen

Listen mit einfachen Datentypen

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 128: ConSol CM Admin Tool - Benutzerdefiniertes Feld für eine Liste mit Datumsfeldern

Abbildung 129: 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 31: Anzeigen des Inhalts einer Liste mit Datenobjekten

Abbildung 130: 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 32: Abrufen eines bestimmten Werts aus einer Liste mit einfachen Datentypen

Lists of Structs (Tabellen)

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 131: ConSol CM Admin Tool - Benutzerdefinierte Felder für die Liste

Abbildung 132: 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 33: Abrufen von Daten aus einer List of Structs

Abbildung 133: Log-Datei - Skriptausgabe

Setzen von Werten von Benutzerdefinierten Feldern für Ticketdaten

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>)

Setzen von Werten für Benutzerdefinierte Felder mit einfachen Datentypen

ticket.set("fields.reaction_time", new Date());

Code-Beispiel 34: 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 35: 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 36: Setzen des Wertes eines Benutzerdefinierten Feldes auf null

Oder kürzer:

ticket.remove("fields.numberOfEmployees" )

Code-Beispiel 37: Setzen des Wertes eines Benutzerdefinierten Feldes auf null durch Entfernen des Wertes

Setzen von Enum-Werten

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 38: Setzen eines Enum-Wertes

Setzen von Listenwerten

Setzen von Werten in Listen mit einfachen Datentypen

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 39: 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 40: Setzen eines Werts in einer Liste mit Strings

Setzen von Werten in einer List of Structs

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 41: Hinzufügen einer neuen Zeile zu einer List of Structs

Ein- und Ausblenden von Benutzerdefinierten Feldgruppen

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 42: 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 43: Ausblenden von Benutzerdefinierten Feldgruppen

Datenfelder für Kundendaten

Datenobjektgruppenfelder für Kundendaten (CM-Version 6.9 und höher)

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 134: 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 wichtigsten Methoden für den Zugriff auf Datenobjektgruppenfelder für Kundendaten

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:

Abrufen von Werten für Kundendaten in CM-Version 6.9 und höher

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 44: 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 135: 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 45: 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 136: ConSol CM Web Client - Kundendatensatz

Abbildung 137: Log-Datei - Skriptausgabe für FlexCDM

String firstName = company.get("responsibleConsultants[0].firstName");

Code-Beispiel 46: Abrufen eines Wertes aus einer List of Structs mithilfe der Index-Notation

Setzen von Werten für Kundendaten in CM-Version 6.9 und höher

Setzen von Werten für Datenobjektgruppenfelder mit einfachen Datentypen

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 47: Setzen und Hinzufügen von Werten für ein Datenobjektgruppenfeld des Typs integer

Listen
Setzen von Werten in einer List of Structs für Kundendaten

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 48: Erstellen einer neuen List of Structs, Version 2

company.add("responsibleConsultants", new Struct().set("lastName", " Nowitzki ").set("email", "dnowitzki@consol.us"));

Code-Beispiel 49: Hinzufügen einer neuen List of Structs für Kundendaten

company.set("responsibleConsultants[0].firstName", "John");

Code-Beispiel 50: Setzen eines Wertes in einer List of Structs mithilfe der Index-Notation

company.set("responsibleConsultants[last]", null);

Code-Beispiel 51: Entfernen eines struct (= Zeile) aus einer List of Structs (= Tabelle)

Convenience-Methoden für den Zugriff auf Kundendaten in CM-Version 6.9 und höher

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 52: Convenience-Methoden für den Zugriff auf Kundendaten

Datenobjektgruppenfelder für Kundendaten (CM-Version 6.10 und höher)

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 138: 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)

Ressourcendaten

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 139: 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 53: Einfaches Ressourcenaktionsskript, das Informationen über die Ressource in der Log-Datei anzeigt

Abbildung 140: Web Client: Ressourcenseite einer Ressource des Typs HP-Drucker

Abbildung 141: 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.

Ein- und Ausblenden von Ressourcenfeldgruppen

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 Gruppenbereichs 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 54: Auszug aus einem Skript, das auf einer Ressourcenseite Zeilen zu einer Ticketliste hinzufügt und die Ressourcenfeldgruppe, die die Liste enthält, sichtbar macht

Verwenden von Datenfeldern für (unsichtbare) Variablen

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.