Notes Felder

Bei der Migration von Notes nach Exchange können Sie mit Drittprodukten meist bessere Ergebnisse erzielen, als mit den Microsoft eigenen Transporter Suiten. So schlecht sind aber auch die Transporter Suiten nicht, wenn man vielleicht etwas unterstützt. Daraus ist ja das Skripte FixNotesItems entstanden, welches einige Notes Einträge vorab schon fixt. Auf dieser Seite möchte ich ein paar Infos zu Notes und dessen Feldern beschreiben, die ich während der Analysen und Migrationen erarbeitet oder gesammelt habe und wie man diese anpassen kann.

Notes Datenbanken

Zuerst sollten Sie wissen, dass Notes Clients ihre Informationen in NSF-Datenbanken abspeichern, und darauf entweder selbst direkte per Dateizugriff oder über den Notes Server (RPC) zugreift. Wenn der Client direkt die NSF-Datei öffnet, dann nutzt er diese exklusiv. Bei einem Zugriff über den Notes Server können natürlich mehrere Personen, abhängig von den Berechtigungen auch parallel mit der gleichen Datei arbeiten.

Die Datenstruktur einer Notes Datenbank ist eigentlich "flach" und die Ansichten nach Ordnern sind auch eigentlich nur "Ansichten". Das zeigt ein zweites Problem: Ein Element kann in mehreren Ordnern verlinkt sein und löscht man das Element in einem Ordner, dann ist es auch im anderen Ordner entfernt. Notes hat keinen "Single Instance Store" aber ein Element in mehreren Ordnern kann aber schon auf das gleiche Element verweisen.

Notes per API

Der Zugriff auf eine NSF-Datei ist für Windows Administratoren der Zugriff über einen Notes Client. Nach der Installation des Notes Client kann über eine COM-API der Zugriff auf Datenbanken erfolgen. Damit sind sogar müssenÄnderungen möglich. Hier ein Beispiel:

Set objSession = CreateObject("Notes.NotesSession")
objSession.Initialize(strPassword)
set db = objSession.GetDatabase("", "c:\User.nsf")  ' lokale NSF Datei oeffnen
set dc = db.AllDocuments
total = dc.Count für count = 1 to total
	set doc = dc.GetNthDocument(count)
	wscript.echo "Betreff&" & doc.GetFirstItem("Subject").text für each item In doc.Items
		wscript.echo item.name &" = " & item.text
	next
next

Diese Skript öffnet die gegebene Datenbank und gibt alle Elemente mit ihren Details aus. In der Ausgabe finden Sie wirklich sehr viele "Felder", von denen einige besonders interessant sind.

Property: Appointmenttype (string)

Diese Feld ist für Migrationen besonders wichtig, da die Transporter Suite in Outlook nur "Termine" und Ganztägige Termine" anlegen kann und über die Messageclass auch Terminanfragen unterstützt. Notes kennt aber fünf verschiedene Formate.

  • 0 = Normaler Termin
  • 1 = Jahrestag
  • 2 = Ganztägiger Termin
  • 3 = Besprechung
  • 4 = Erinnerungen

Für die Migration habe ich mit FixNotesItems ein VBScript, welches vor der Migration z.B. die nicht transportierbaren Elemente in Ganztägige Termine (2) konvertiert und die Belegt-Zeiten anpasst

Property: "BookFreeTime" und "BusyPriority"(string)

Dieses Feld ist besonders interessant, da Notes hier speichert, ob die fragliche Zeitspanne als "Belegt" gekennzeichnet ist. In meinem Notes Client ist die Belegung des Feldes aber gerade umgekehrt, wie ich es als logisch angesehen hätte.

  • BookFreeTime = 1 und BusyPriority=2: Termin ist "vorgemerkt"
    Man muss den Namen "BookFreeTime" wörtlich nehmen. In Outlook bucht man ja "belegt"-Zeiten. in Notes hingegen sagt man damit, das dieser Bereich "Frei" ist. Die Checkbox "Vorgemerkt" ("Pencil In") kennzeichnet, dass der Termin nicht angezeigt werden soll
  • 0 = ??
    Ich habe nie ein Element mit 0 gesehen. vermute aber, dass es dennoch funktioniert
  • BookFreetime ="" und  und BusyPriority=1: Termin ist belegt
    Wenn das Feld nicht da ist oder "leer" ist, dann wird der Zeitraum in der Terminplanung als "Vorgemerkt" angezeigt

Notes kennt im Gegensatz zu Exchange/Outlook nur die nur die Einstellungen Vorgemerkt oder eben Belegt. Per Default ist jeder Termin erst einmal "blockierend", d.h. die Zeit wird als nicht frei angezeigt. Bei der Migration mit der Transporter Suite wird aber nun ein Termin ohne "Vormerkung" wie erwartet als "Belegt" übertragen. Ein Termin mit "Vormerkung" landet aber in Outlook als "Unter Vorbehalt" und keineswegs als Frei. Alle migrierten Termine sind daher in Outlook entweder "Belegt" oder "Unter Vorbehalt". Das ist natürlich nicht praktikabel, wenn z.B. ganztägige Termine (Geburtstage etc.) als "unter Vorbehalt" dann den kompletten Kalender blocken.

Lösen kann ich das wieder über ein Skript (Siehe Tentative2Free), welches nach der Migration in Exchange dann eben alle Termine mit "Unter Vorbehalt" auf "Frei" zurück stellt.

Property: $CSFlags (string)

Dieses Flag ist ein guter Indikator für die Erkennung von Feiertagen. Wie Outlook können auch in Notes per Menü die verschiedenen Feiertage und Ferien (Holiday) vom Client importiert werden. Feiertage werden bei der Migration mit der Transporter Suite nicht übertragen aber stören die Migration, da "Warnungen" ausgegeben werden. Um dies zu vermeiden, kann man vor der Migration die Feiertage z.B. mit FixNotesItems einfach löschen.

Flags used to control C&S operations. Multiple values are allowed; they are simply concatenated into a single string. There are at most 32 flags allowed on any entry.
Valid values are:
c = Repeat instances have been created
e = Document is a repeat exception
f = Event is managed entry
h= Holiday, placed by ImportHoliday agent
i = Document is a repeating instance
m = Document is a repeating workflow message. This is the most commonly used value and MUST be on any R5.x+ repeating entry
r = Document is a request für information
u = Document is Updated information
w = Event is workflow enabled

Für Ferien sind daher Werte wie "hi" und "hc" zu erwarten und relativ gefahrlos zu entfernen.

Property: repeatUnit (string)

Serientermine sind die Kür einer jeden Migrationslösung, denn Outlook und Notes nutzen unterschiedliche Verfahren, um Serientermine zu speichern. Notes legt für jeden Termin ein eigenes Element an, d.h. ein Termin mit 10 Wiederholungen wird 10 Mal angelegt. In diesem Feld ist das Wiederholungsintervall hinterlegt. Als Dokumentation habe ich nur einen Auszug aus einem anderen Quellcode gefunden

// Quelle http://www.koders.com/java/fid83349651007CE275608298DCD93A3CDA90B75129.aspx
//RepeatUnit values
    public static final String REPEAT_UNIT_DAILY = "D";
    public static final String REPEAT_UNIT_WEEKLY = "W";
    public static final String REPEAT_UNIT_MONTHLY_DAY = "MP";
    public static final String REPEAT_UNIT_MONTHLY_DATES = "MD";
    public static final String REPEAT_UNIT_YEARLY   = "YD";
    public static final String REPEAT_UNIT_YEARLY_2 = "Y";

The 'unit' of time that the entry repeats over.
Valid values are:
C = Custom set of explicit dates
D = Daily or a particular month date when used after "M" (repeat monthly).
M = Monthly. If Monthly then the second character MUST be either "D" (repeat monthdate) or "P" (repeat monthday), making this value really either "MD" or "MP".
P = A particular month day
W = Weekly
Y = Yearly

Irritierend ist hierbei, dass für jährliche Temine sowohl "Y" also auch "YD" denkbar ist. Die Transporter Suite kann keine Termine migrieren, die ein "Y" enthalten. In diversen Quelle ist aber "Y" richtig, Wenn man aber eine Serie manuell bearbeitet (also nicht die 10 Default Tage) belässt, dann steht auch bei Notes ein "YD" drin. Sie entstehen also nur, wenn ein Anwender einen Jahrestermin direkt speichert. Wird der Termin vor dem Speichern nicht wiederholend und dann wieder wiederholend gemacht, dann steht ein YD im Feld (alles andere bleibt gleich) und wird migriert. Auch diese Korrektur wird von FixNotesItems durchgeführt.

Property: $PublicAccess (string)

Gerade die Problematik der "Privaten Mails" ist bei Migrationen wichtig bis heikel. Mitarbeiter können auf einem System Elemente durchaus als "Privat" kennzeichnen und damit dem Blick der Stellvertreter entziehen. Im Exchange/Outlook Datenmodell gibt es das entsprechende Flag (CdoPR_SENSITIVITY), welches die Werte  0=Normal, 1=Personal, 2=Private oder 3=Confidential annehmen kann..

Notes speichert die Information, ob ein Element als "Privat" anzusehen ist, in dem Feld $PublicAccess. Auch hier ist die Logik derart, dass das Feld da und gefüllt sein muss, wenn eine Information nicht privat ist:

  • "1" -> öffentlich verfügbar
    Wenn der Wert auf 1 steht, dann ist das Objekt nicht privat, d.h. die Checkbox ist nicht gesetzt.
  • Nicht vorhanden -> Element ist als privat gekennzeichnet
    Wird die Checkbox "Privat" angekreuzt, dann entfernt Notes das Feld komplett.

Die Transporter Suite kann dieses Feld lesen und auch korrekt nach Exchange übertragen. Allerdings ist diese Feld nicht für Ordner gültig. Notes-Anwender können auch "Private Ordner" anlegen, die von der Transporter Suite nicht gesehen werden.

Properties rund um die Alarme

Die Problematik der Transporter Suite zur Übernahme von Erinnerungen bei Serienterminen hat mich auf die Spur der Felder geführt, welche Notes den Erinnerungszeitpunkt mitteilen. Leider konnte ich hier noch nicht mehr Zeit zur Analysieren der Inhalte aufbringen, zumal es auch jedem Menge Felder für die Terminserien selbst gibt. für die Alarme sind folgende Felder vorhanden:

  • $AlarmUnit = D
    Das "D" steht hier wohl für "Day"
  • $AlarmMemoOptions
    Ich habe zwar noch nicht gesehen, wo ich eine Nachricht eintragen kann, aber hier könnte wohl ein String stehen, der bei der Erinnerung angezeigt wird
  • $Alarm = 1
  • $AlarmDescription
    Das dürfte die Beschreibung des Alarms sein. In der Regel steht hier der gleiche Betreff wie die Bezeichnung des Elements selbst.
  • $AlarmOffset
    Dies könnte der Zeitpunkt in Minuten ausgehend von Mitternacht.

Vielleicht ergibt sich später noch einmal die Zeit, die Notes Termine in einer Art umzubauen, dass die Erinnerungen auch übernommen werden können.

Property: FolderReferences String[]

Über die "Datenbank.AllDocuments" bekommt man eine Collection mit allen Elementen in der Datenbank unabhängig von ihrem realen Ablageort. Nur über das Feld FolderReferences, welches ein Array of String ist. kann man ermitteln, in welchem Ordner das Element angezeigt wird.

Property: ExcludeFromViews (string)

Über dieses Feld können Elemente aus verschiedenen Absichten in Notes ausgeschlossen werden. Bislang habe ich hier drei Inhalte gesehen.

  • leer
    Dokument ist aus keiner Ansicht ausgeschlossen
  • D = Draft/Entwürfe
    Dokument wird nicht in Entwürfe angezeigt
  • S = Sent/Gesendete Objekte
    Objekt ist nicht in der Ansicht "Gesendete Objekte" sichtbar
  • A
    Blendet das Element im "$all"-View aus. Dieses Feld ist besonders interessant, da Exchange beim Export alle Elemente aus dem "$ALL"-View holt und Objekte mit diesem Flag in diesem View dann nicht sichtbar sind.

Irritierend für mich ist dabei, dass ich per VBScript eben die Dokumente im "$ALL"-View holen kann und da trotzdem die Elemente erscheinen, die eigentlich ein "A" als Exclude-Parameter haben.

set dc = db.GetView("($All)")

Ich vermute, dass dies auch einer der Gründe ist, wenn längst als gelöscht angesehene Elemente in Notes nach einer Migration in Outlook/Exchange wieder erscheinen.

Property: Body

Die "Nachricht" einer Mail oder anderen Elements ist im Feld "BODY" hinterlegt. Der Body ist nicht nur ein einfacher String, sondern kann aus Notes-Sicht auch ein "Array" sein. Auf dieses Problem bin ich in Verbindung mit einem Faxserver gestoßen, welcher alle Faxe als Mail mit Anlage aber ohne Body gesendet hat. Notes konnte die zwar noch anzeigen, aber das Icon für "Anlagen" war nicht sichtbar. Bei der Migration nach Exchange mit der Transporter Suite wurden diese Element nicht korrekt übertraqen.

Weitere Links