Der ValueStore kann Zusatzdaten an jedes DMS-Objekt hängen. Diese sind aber nicht über Filter suchbar, sondern können durch die ValueStore-Api über ihren Namen abgerufen, geändert oder gelöscht werden.
Als Objekt kann im Grunde alles in DMS verwendet werden. Also Dokumente, Akten, Ordner, Benutzer, Gruppen, Vorgänge, Suchprofile, etc. Bekannt sein muss die ID, entweder in der Guid-Darstellung der internen Int64-Id, oder die LegacyGuid.
Um Werte für ein Objekt setzen oder löschen zu können, benötigt der Anwender mindestens Schreibzugriff auf das Objekt.
Wichtig: Es wird dringend empfohlen, dass die Namen für die Werte dem folgenden Schema entsprechen: “..”. Dadurch werden Konflikte vermieden.
CRUD
Setzen von Werten
object wert = "ein Beispiel";
Guid objectId = ...; // Id des Objekts an welches der Wert gesetzt werden soll
await dms.ValueStore.SetValue(objectId, "name-des-wertes", wert);Der Wert wird mittels NewtonSoft.Json in einen Json-String gewandelt,
bevor er an den DMS-Server übertragen wird. Dieser kann in dem
ValueStore eigentlich nur Strings abspeichern. Wird als Wert
null übergeben, wird intern die Methode
dms.ValueStore.DeleteValue(objectId, “name-des-wertes”)
aufgerufen und damit der Wert gelöscht.
Besitzt das Objekt bereits einen Wert mit dem angegebenen Namen, wird dieser überschrieben. Der letzte Zurgriff gewinnt hierbei.
Lesen eines Wertes
var wert = await dms.ValueStore.GetValue<string>(objectId, "name-des-wertes");Die generische Typangabe ist notwendig, da der intern als Json-String gespeicherte Wert wieder in den eigentlichen Typ gewandelt werden muss.
Löschen eines Wertes
await dms.ValueStore.DeleteValue(objectId, "name-des-wertes");Sollte ein Wert mit dem angegebenen Namen existieren, wird dieser gelöscht.
Alle Namen für ein Objekt abfragen
string[] namenDerWerte = await dms.ValueStore.GetKeys(objectId);Ab DMS 7.6.302
Eine Überladung dieser Methode nimmt eine Liste von Objekt-Ids an und liefert ein Dictionary als Ergebnis. Der Key des Ergebnisses ist die Objekt-Id zu welcher Namen gefunden wurden. Der Value enthält ein String-Array mit den Namen.
var objectIds = new [] { guid1, guid2 };
Dictionary<Guid, string[]> namenDerObjekte = await dms.ValueStore.GetKeys(objectIds);Hier werden keine Exceptions bei Problemen geworfen. Hat man auf ein Dokument keinen Zugriff, oder es existiert nicht, wird es lediglich nicht in das Ergebnis aufgenommen. Das Ergebnis enthält somit nur Einträge für Objekte, welche für den Anwender lesbar sind und auch Werte für den ValueStore enthalten.
Fehlerbehandlung
Jeder der obigen Aufrufe (mit Ausnahme von GetKeys(ids)) kann Fehler verursachen. Es wird in diesem Fall eine ValueStoreException geworfen.
class ValueStoreException : Exception {
public Guid ObjectId { get; }
public string Key { get; }
public ValueStoreResponses Result { get; }
}Die Exception enthält also das Objekt (die Id), sowie ggf. den Namen des Wertes (Key). Im Falle von GetKeys gibt es keinen eindeutigen Key.
Außerdem wird der Fehlergrund angegeben:
enum ValueStoreResponses {
Success,
KeyNotFound,
ObjectNotFound,
InsufficentAccessRights
}Ab DMS 8.6.1
Diese Methode nimmt eine Liste von Objekt-Ids und einen Namen an und liefert ein Dictionary als Ergebnis. Ein Dictionary-Eintrag enthält die Objekt-Id zu welcher der Name “keyName” gefunden wurden und dessen Wert.
var objectIds = new [] { guid1, guid2 };
Dictionary<Guid, string> resultDictionary = await dms.ValueStore.GetValues(objectIds, keyName);Eine andere Methode nimmt ein Dictionary an und liefert ein Dictionary als Ergebnis zurück.
Der Dictionary-Key der Eingabe ist die Objekt-Id, der Wert des Dictionary-Eintrags ist eine Objektliste vom Typ ‘KeyValue’ (KeyValue[]). Bei der Anfrage wird nur der Key in der KeyValue-Liste mit dem abzufragenden Namen befüllt; Value ist hier null. Im Ergebnis Dictionary sind dann die Values zu jedem KeyName mit dem passenden Wert gefüllt.
var objKeyValues = new Dictionary<Guid, KeyValue[]>();
foreach (var objectId in objectIds)
{
objKeyValues[objectId] = new[] { new KeyValue { Key = keyName } }; // Zu einer objectId können mehrere keyName abgefragt werden.
}
Dictionary<Guid, KeyValue[]> result = await GetKeyValuePairList(objKeyValues);
public class KeyValue
{
public string Key { get; set; }
public string Value { get; set; }
}Verknüpfung mit