Archiv der Kategorie: SharePoint

SharePoint Testserver: Inhaltsdatenbank aktualisieren

Da man in der Regel immer einen Testserver betreibt, habe ich eine kurze Anleitung geschrieben wie man die Inhaltsdatenbank aus dem Live System in das Testsystem kopiert.

Der Ablauf ist wie folgt:

1. Löschen der bisherigen Inhaltsdatenbank auf dem Testserver über Zentraladministration –> Anwendungsverwaltung –> Inhaltsdatenbanken verwalten. Wählt rechts oben die passende Webanwendung aus. Dann klickt ihr auf die Datenbank. Hier gibt es ganz unten die Option “Inhaltsdatenbank entfernen”. Aktiviert den Haken und klickt auf Ok. Merkt euch den Namen der Datenbank, da ihr diesen in Punkt 4 noch benötigt.

2. Kopiert euch die aktuelle Datenbank vom Live Server. Am einfachsten geht das mit dem SQL Management Studio. Falls ihr euch damit nicht auskennt, dann googelt kurz. Dazu gibt es genügend Einträge. Kopiert die Sicherung auf den Testserver.

3. Beendet auf dem Testsystem im IIS-Manager den Anwendungspool, der mit der Webanwendung verbunden ist.

4. Startet den SQL Dienst auf dem Testserver neu

5. Löscht die immer noch im SQL Server vorhandene Datenbank (den Namen habt ihr euch aus 1 gemerkt) mit dem Management Studio. Aktiviert die Option “Bestehende Verbindungen schließen” im Dialog (optional).

6. Stellt die gesicherte Datenbank wieder her.

7. Startet den Anwendungspool wieder.

8. Geht in der Zentraladministration wieder unter Inhaltsdatenbanken verwalten und wechselt auf die richtige Webanwendung. Klickt auf “Inhaltsdatenbank hinzufügen” und gebt den Datenbankserver und den Datenbanknamen an.

 

Wichtig:

  • Das funktioniert natürlich nur, wenn die entsprechenden SQL Anmeldungen, die auf dem Live-System vorhanden sind, auch auf dem Testsystem sind.
  • Die zwei Server müssen auf dem gleichen Patch-Stand sein.
  • Passt bei absoluten Links auf, da ihr sonst wieder im Live-System landet. Immer relative Links nutzen. Am besten stellt ihr das Farbschema auf dem Dev um, dann merkt ihr sofort, wenn ihr plötzlich die Plattform wechselt.

SharePoint Calculated Fields – Wissenswertes über Formulas

Wer wie ich in einem eigenen Feature berechnete Spalten definieren muss, wird sicherlich auf ähnliche Probleme stoßen. Im Gegensatz zu Formeln, die man über die Oberfläche eingeben kann, befindet man sich bei Spaltendefinitionen innerhalb von XML, sodass Sonderzeichen immer ein leidiges Thema sind. Hier zwei Beispiele:

   1: <Field ID="{FC13F3E2-ED5A-41B6-99A7-FEA6A2605D9E}"

   2:    Name="Heco_ITAM_MachineGroup"

   3:    StaticName="Heco_ITAM_MachineGroup"

   4:    DisplayName="Machine Group"

   5:    Type="Calculated"

   6:    ShowInNewForm="TRUE"

   7:    ShowInEditForm="TRUE"

   8:    Group=" heco ITAM"

   9:    ReadOnly="TRUE"

  10:    Indexed="TRUE"

  11:    Hidden="FALSE"

  12:    Description="Dient zum Gruppieren von zusammengebundener Soft- und Hardware"

  13:    ResultType="Text"

  14:    SourceID="http://schemas.microsoft.com/sharepoint/v3" >

  15:   <FieldRefs>

  16:     <FieldRef Name="Heco_ITAM_AssetNo"/>

  17:     <FieldRef Name="Heco_ITAM_MachineRefId"/>

  18:   </FieldRefs>

  19:   <Formula>=IF(Heco_ITAM_MachineRefId=&quot;&quot;,Heco_ITAM_AssetNo,
Heco_ITAM_MachineRefId)</Formula>

  20: </Field>


  
  1: <Field ID="{9379E5FF-0DDA-4772-91AB-61CAFB9F88E9}"

   2:    Name="Heco_ITAM_OperatingSystem"

   3:    StaticName="Heco_ITAM_OperatingSystem"

   4:    DisplayName="Operating System"

   5:    Type="Calculated"

   6:    ShowInNewForm="TRUE"

   7:    ShowInEditForm="TRUE"

   8:    Group=" heco ITAM"

   9:    ReadOnly="TRUE"

  10:    Indexed="TRUE"

  11:    Description="Dient zum Gruppieren von zusammengebundener Soft- und Hardware"

  12:    ResultType="Text"

  13:    SourceID="http://schemas.microsoft.com/sharepoint/v3" >

  14:   <FieldRefs>

  15:     <FieldRef Name="Heco_ITAM_WindowsVersion"/>

  16:     <FieldRef Name="Heco_ITAM_Architecture"/>

  17:     <FieldRef Name="Heco_ITAM_ServicePack"/>

  18:   </FieldRefs>

  19:   <Formula>=Heco_ITAM_WindowsVersion &amp;&quot; &quot; &amp;
Heco_ITAM_ServicePack &amp;&quot; &quot;&amp; Heco_ITAM_Architecture</Formula>

  20: </Field>

Auf Folgendes sollte man achten:

  • Die FieldRefs benötigen lediglich den Spaltennamen, auf den verweisen wird. Die GUID muss nicht (und darf nicht?) hinterlegt werden
  • Bei den Formeln werden keine Klammern verwendet
  • Um Hochkommata und kaufmännische & abzubilden, müssen die entsprechenden HTML Entities verwendet werden, d.h. &quot; und &amp;. Diese benötigt man z.B. zum Zusammenfügen der Zeichenketten oder zum Prüfen von leeren Eingaben. Eine Tabelle findet ihr hier.
  • Statt Semikolons müssen Kommas verwendet werden, um Funktionsparameter bzw. um Funktionen zu trennen

Projekt: Urlaubspflege mit SharePoint und Export in GDI

 

Seit langem können bei uns die Mitarbeiter ihren Urlaub in SharePoint verwalten. Verwalten bedeutet, dass sie Urlaub eintragen, löschen und übersichtlich anschauen können. Außerdem sehen die Kollegen auf der Startseite übersichtlich, wann wer nicht da ist. Die Eingabemaske sieht wie folgt aus:

image

Und meine eigene Urlaubsübersicht sieht so aus (37,0 sind die Anzahl Tage, die mir dieses Jahr zur Verfügung stehen):

image

Und die rechte Leiste unserer Startseite sieht beispielsweise so aus (Ausschnitt):

image

 

Kurz zum technischen Hintergrund:

Wir verwenden dafür einen eigenen Inhaltstyp Urlaub. Daneben gibt es in unserem Kalender noch die Inhaltstypen ‘Krank’, ‘Außer Haus’ und ‘Im Haus’. Zum Erzeugen der Ausgabe (Spalte Titel), wie man sie auf der Startseite sieht, verwenden wir inzwischen einen Eventhandler, der diese zusammenbaut. Früher war dies ein berechnetes Feld. Wer also nicht programmieren will, muss dies nicht notwendigerweise.

 

Den Geschäftsprozess optimieren und Kosten senken:

Bisher war es so, dass die Buchhaltung am Ende des Monats die Daten in unser Lohnsystem manuell übernommen haben. Das benötigte ca. 1 Manntag. Wenn ihr euch jetzt fragt, ob das dann überhaupt Sinn macht bzw. sich lohnt, dann ist die Antwort ja, da

  • Die Daten müssten so oder so im System erfasst werden
  • Es entfallen die Anfragen der Mitarbeiter nach ihren verbleibenden Urlaubstagen
  • Die Informationen auf der Startseite sind wichtig. Darüber hinaus gibt es noch einen Urlaubskalender, sodass sich z.B. in- und außerhalb der Abteilungen besser abgestimmt werden kann. Kurz: Der Informationsgewinn ist wichtig!

Um den Geschäftsprozess nun vollständig zu automatisieren, benötigten wir noch die Möglichkeit die Daten in unser Lohnsystem von GDI zu exportieren.

Dazu habe ich die Liste der Mitarbeiter, welche gefüllt ist mit Einträgen vom Inhaltstyp ‘heco Mitarbeiter’ um zwei Einträge erweitert:

  • Export zu GDI (interner Feldname: ExportToGDI)
  • Urlaub in Tagen (interner Feldname: HolidayInDays)

Beide Spalten sind vom Typ Ja/Nein. Das sieht dann so aus:

image 

Die Spaltennamen sind selbsterklärend. Nun habe ich mit freundlicher Unterstützung von Olaf Didszun eine Kommandozeilenanwendung geschrieben, die anhand der gesetzten Eigenschaften in der Mitarbeiterliste die Daten aus dem Kalender ausliest und als CSV Datei exportiert (vgl. meinen Artikel dazu hier).

In dem ganzen Prozess gab es zwei besondere Herausforderungen:

  • Monatsübergreifende Einträge
  • Logik für Änderungen nach dem Export

Bei Punkt 1 wäre eine Option gewesen über Gültigkeitsprüfungen (ab SharePoint 2010 für Listen und Spalten out of the box möglich) solche Einträge zu unterbinden. Wir haben uns dagegen entschieden und haben die Logik so programmiert, dass das Programm solche Einträge erkennt und entsprechend monatsgenau abrechnet.

Zu Punkt 2: Das Problem ist, dass es möglich wäre, dass Mitarbeiter im Nachhinein Änderungen vornehmen, die im Vormonat liegen. Das stellt insofern ein Problem dar, als dass wir immer nur am letzten des Monats den Export vornehmen. Das Programm hat und sollte keine Logik dafür enthalten. Deswegen sind wir so Vorgegangen, dass wir eine SharePoint Gruppe angelegt haben, die sich “CalendarAdmins” nennt. Hier sind die Mitarbeiter der Buchhaltung enthalten. Nachdem ein Urlaubseintrag exportiert wurde, wird die Berechtigungsvererbung für das Element gestoppt und es werden alle Berechtigungsgruppen außer die ‘Besucher’ (die haben nur Lesezugriff) und die ‚CalendarAdmins’ entfernt. So ist gewährleistet, dass keine Änderungen nach einem Export mehr durchgeführt werden können, ohne über die die entsprechenden Stellen zu gehen. Der Code hierfür sieht so aus:

   1: urlaubItem.BreakRoleInheritance(true);

   2: SPGroup groupToRemove = urlaubItem.Web.AssociatedOwnerGroup;

   3: urlaubItem.RoleAssignments.Remove(groupToRemove);

   4: groupToRemove = urlaubItem.Web.AssociatedMemberGroup;

   5: urlaubItem.RoleAssignments.Remove(groupToRemove);

   6: urlaubItem.Update();

Typische SharePoint Probleme

Im Rahmen meines Besuchs des Shared Solutions Day haben sich einmal mehr die typischen Schwierigkeiten, die ich auch in früheren Gesprächen auf UserGroups und Konferenzen identifizieren konnte, bestätigt.

Hier die meiner Meinung nach verbreitetsten Probleme:

  • Die Anwender nehmen das neue System nicht an
  • Daraus resultiert auch die Problematik, dass die Systemlandschaft trotz teilweise erheblichen Aufwands und erheblicher Kosten brach liegt… Bis das System eingestampft wird
  • Ein anderer Grund ist sogar in der IT selbst zu finden: Es bleibt bei wenigen Spielereien wie leichtes Anpassen einer Liste und das Erstellen einer Dokumentenbibliothek. Danach wird das System links liegen gelassen.
  • Kein Feature wie es in SharePoint mitgeliefert wird, kann eigentlich genau so out of the box verwendet werden
  • Da jedes Unternehmen typische Geschäftsprozesse wie ‘Besprechung  vereinbaren’ immer in irgendeiner Form um eigene, unternehmensspezifische Modalitäten erweitert hat, lassen sich die vermeintlich einfachen Implementierung dann doch nicht so einfach umsetzen wie geplant. Das sogenannte Eichhörnchen… Demzufolge hat man die Wahl einen größeren Aufwand (meist Programmierung) zu betreiben oder sich mit Einschränkungen abzufinden. Beides ist in der Regel nicht akzeptabel und hinterlässt einen bitteren Beigeschmack, der den anfänglichen Optimismus stark reduziert.
  • Die eigentlich wichtigen Features, um Geschäftsprozesse dann wirklich vollständig (und nicht nur isolierte Teilprozesse) und gewinnbringend umsetzen zu können, stecken in der kostenpflichten Version. Über diesen Tellerrand wollen und können aber gerade kleine und mittelständische Unternehmen nicht hinausschauen, v.a. nicht, wenn man sich gerade erst mit SharePoint auseinandersetzt.

Im folgenden will ich ein paar Lösungsansätze vorschlagen:

Der eigentliche Knackpunkt, bevor man überhaupt zu SharePoint greift, ist, dass man sich klar macht, dass man wie bei jedem anderen System alleine durch die Anschaffung und Einarbeitung Zeit- und Kostenaufwand hat. Lediglich weil die SharePoint Foundation bzw. die Windows SharePoint Services kostenfrei erhältlich sind und weil es gerade in aller Munde ist, heißt dies gewiss nicht, dass nicht wie bei jeder anderen Produkteinführung auch eine entsprechende Planung vorausgehen muss.

Drei wichtige Schritte gehören in jedem Fall zu dieser Planung:

Schritt 1: Holen Sie sich von Anfang an die Fachabteilungen ins Boot. Greifen Sie sich hier v.a. die Abteilungsleiter und IT-affine Mitarbeiter heraus. In der Regel sind diese Personen entscheidend allgemeinen Annahme des neuen Systems.

Schritt 2: Identifizieren Sie gemeinsam einen ausgewählten Satz an einfachen Geschäftsprozessen. In der Regel gibt es fast immer solche, deren Ablauf nicht wirklich störend aber dafür hinderlich sind. Meistens finden sie solche Prozesse, indem sie prüfen, was schon lange auf einer ToDo-Liste steht und immer wieder wegen niedriger Priorität verschoben wird (sogenannte nice-to-have Feature). Idealerweise sollte es auch ein Prozess sein, der viele Mitarbeiter betrifft. Ein Beispiel könnte das Ausdrucken und das manuelle Ausfüllen von Anträgen (z.B. Urlaub) sein, was jeder Verkäufer 1-2 Mal pro Monat machen muss.

Schritt 3: Holen Sie sich einen Mann vom Fach dazu, der längere praktische Erfahrung in diesem Bereich hat. Es reicht keinesfalls aus auf Vorträge zu gehen oder sich durch Online Material zu arbeiten. Vergessen Sie ähnliche Beispiele von Konferenzen und UserGroups, da wie schon erwähnt der Teufel im Detail steckt. In der Regel reicht es völlig aus, wenn man sich einen Tag mit dem SharePoint Consultant zusammensetzt. Stellen Sie klar, dass sie für die Lösungen nur auf die mitgelieferten Hilfsmittel in SharePoint zurückgreifen möchten (Anmerkung: Hin und wieder können vor allem auch kostenfreie Lösungen im Netz ganz hilfreich sein!). Programmieren sollte in diesem frühen Stadium kein Thema sein. Wichtig: Es geht in diesem Gespräch noch nicht um einen detaillierten Plan zur Umsetzung. Lediglich die Machbarkeit und den benötigen Zeitraum gilt es zu evaluieren. Bedenken Sie: Die Kosten für diesen einen Tag sind in jedem Fall geringer als SharePoint aus dem Gedanken heraus aufzusetzen, dass man ja einfach mal das Ganze testen und ein wenig herumspielen will.

Wenn sich nach diesen drei Schritten herausstellt, dass Ihre Anliegen durchaus machbar sind, dann können Sie loslegen. Andernfalls werden Sie mit hoher Wahrscheinlichkeit keinen großen Erfolg bei der SharePoint Integration haben. Halten Sie sich bei der Realisierung an folgende zwei wichtige Regeln:

  • Führen sie immer eine Änderung nach der anderen durch und fangen sie mit den kleinsten davon an
  • Setzen Sie Lösungen für die alltäglichen Geschäftsprozesse um, die das Gros der Mitarbeiter betrifft

Wohlgemerkt halte ich diese zwei Regeln nur für sinnvoll bis eine allgemeine Akzeptanz erreicht bzw. SharePoint eingeführt wurde! Um Ihnen ein paar Beispiele zu nennen, was wir uns dafür herausgegriffen haben:

  • Wir haben die Möglichkeit geschaffen, dass zentral auf der Startseite jeder Mitarbeiter für den heutigen und morgigen Tag einsehen kann, wer an- und wer abwesend ist. Dazu gehört auch, wenn jemand Urlaub hat oder lediglich für ein paar Stunden nicht verfügbar ist.
  • Wichtige Firmennachrichten werden ebenfalls auf der Startseite veröffentlicht. Idealerweise kommen hier mindestens 1-2 neue pro Woche hinzu. Meistens werden die Neuigkeiten durch die Abteilungsleiter eingepflegt. In einem Handelshaus könnten das auch Bekanntmachungen bzgl. der Preisanpassungen sein.
  • Für uns im Handel war ein zentrales Werkzeug der Tourenplan unserer LKWs. Ein Gespräch (vgl. Schritt 1 weiter oben) ergab, dass dieser von allen Verkäufern täglich eingesehen wurde.
  • Tipp-Spiel: Ja, auch solche kleine Dinge können sehr zuträglich sein. Bisher konnte ich für jede EM und WM ein entsprechendes Feature online finden, das ich kostenlos bei uns einbinden konnte. Die Beteiligung an den Tippsielen ist seit Jahren extrem hoch!

Diese 4 Features bewirkten, dass jeder Mitarbeiter mindestens 1x täglich – nämlich morgens – zum Intranet navigierte, um sich einen Überblick für den Tag zu verschaffen. Mit der erwähnten Option die Infos auch für den morgigen Tag einsehen zu können, wurde nach kurzer Zeit dann jeden Abend nochmal hineingeschaut. Nach relativ kurzer Zeit hatten wir so eine vollständige Akzeptanz innerhalb der Belegschaft erreicht. Darauf ließen sich dann weitere Projekte aufsetzen. Hier kann ich vor allem zwei Kernpunkte identifizieren:

  • Dokumentenmanagement, um dem Chaos in der Dateiablage und den öffentlichen Ordnern Herr zu werden
  • Projektmanagement, da es immer und überall Projekte gibt und das Thema an sich seit jeher schwierig und komplex ist

Meines Erachtens nach gibt es jetzt zwei Möglichkeiten wie sie fortfahren können. Das ist vor allem von Ihren Ressourcen und Ihrer IT abhängig. Entweder Sie setzen eines der Themen gleich für Ihren Betrieb um oder – und das ist der bessere Weg – Sie lassen die IT fachinterne Geschäftsprozesse für sich umsetzen, quasi als Prototyp. In der Regel werden Sie hier schon auf eines der oben genannten Themen stoßen. Bei uns war es eine Dokumentationsseite mit allen IT Dokus und eine Inventarliste unserer Soft- und Hardware. Mit diesen Erfahrungen gingen wir die dann die oben genannten Punkte an.

Speziell auf Rückmeldungen zu diesem Artikel würde ich mich besonders freuen. Ich möchte nochmal darauf hinweisen, dass die oben genannten Punkte meine subjektive Wahrnehmung und Meinung wiedergeben. Vergessen Sie auch nicht, dass sich diese Ergebnisse im Rahmen meiner Tätigkeit in einem mittelständischen Handelsbetrieb aus der Edelstahlbranche ergeben haben.

SharePoint ContentType ‘Event’ adaptieren

Wer schon einmal einen Kalender in SharePoint erstellt oder von diesem abgeleitet hat, der wird zwangsläufig auf Spalten wie “Ganztägiges Ereignis” oder “Serie” gestoßen sein. Diese Spalten sind auf ‘Sealed’ gesetzt, sodass diese Websitespalten nicht adaptierbar sind. Darüber hinaus kann man die Spalten auch nicht so einfach ausblenden.

 image

Ich hatte nun die “triviale” Anforderung den Standardwert von der Spalte “Ganztägiges Ereignis” zu ändern. Es gibt dazu mehrere Lösungsansätze, u.a. kann man einen programmatischen Ansatz wählen, den ich hier gefunden habe.

Ich habe die entsprechende Schema.xml des Event Templates geändert. Allerdings bin ich über einen Fallstrick gestolpert: Ich dachte, dass ich den Defaultwert auf True setzen muss. Das ist allerdings falsch! Hier muss 1 eingegeben werden.

 

Anleitung:

Navigiert in das Templates Verzeichnis eurer SharePoint Installation (bei SharePoint Foundation 2010 Deutsch ist dies %programfiles%\Common files\Microsoft Shared\Web Server Extensions\14\Template). Dort navigiert ihr in FEATURES –> EventsList –> Events. Hier liegt die schema.xml Datei. Passt das XML dort wie folgt an (die eigentliche Änderung steht in Zeile 2):

   1: <Field ID="{7d95d1f4-f5fd-4a70-90cd-b35abc9b5bc8}" Type="AllDayEvent" Name="fAllDayEvent" DisplaceOnUpgrade="TRUE" DisplayName="$Resources:core,All_Day_Event;" Sealed="FALSE" SourceID="http://schemas.microsoft.com/sharepoint/v3" StaticName="fAllDayEvent">

   2:   <Default>1</Default>

   3:   <FieldRefs>

   4:     <FieldRef Name="EventDate" RefType="StartDate" />

   5:     <FieldRef Name="EndDate" RefType="EndDate" />

   6:     <FieldRef Name="TimeZone" RefType="TimeZone" />

   7:     <FieldRef Name="XMLTZone" RefType="XMLTZone" />

   8:   </FieldRefs>

   9: </Field>

Danach führt ihr noch über die Kommandozeile den Befehl “iisreset” aus. Fertig! Von nun an ist bei einem neuen Kalendereintrag der Wert “Ganztägiges Ereignis” aktiviert.

%d Bloggern gefällt das: