SharePoint Versionierung und Anhänge

In SharePoint 2010 bietet sich für den Benutzer die praktische Funktionalität der Versionierung für Einträge in Listen und Bibliotheken. Mit diesem Feature hat der Nutzer die Möglichkeit einen Eintrag in einer Liste in mehreren Versionen abzuspeichern und diesen auch in älteren Versionen zu betrachten, um Änderungen nachvollziehen zu können oder eine ätere Version wiederherzustellen.
Mit dieser Versionierung muss selbstverständlich auch sichergestellt werden, dass die angelegten Elemente auch weiterhin in einer älteren Version in der Content Datenbank hinterlegt sind. Sofern man mit einfachen Listenelementen arbeitet, ohne Anhang, stellt dies noch gar kein Problem dar. Änderungen an den Spalten des Elements führen dazu, dass eine neue Version erstellt wird und folglich diese neue Version auch in die Content Datenbank wandert.
Gibt man nun seinem Element einen Anhang, so wird dieser Anhang natürlich zu diesem Element mit in der Content Datenbank abgelegt. Was aber nicht offensichtlich ist, ist, dass für jede neue Version des Elements auch der Anhang erneut in der Content Datenbank abgelegt, selbst wenn sich am Anhang nichts geändert hat.
Auf dem folgenden Screenshot sehen wir die Content Datenbank Eigenschaften vor einer neuen Version des Elements in einer Bibliothek:

Wie hier deutlich zu sehen ist im Feld Size, haben wir aktuell eine Größe von ca. 2590 MB.
Erstellen wir nun von unserem Element eine neue Version wie wir im Screenshot sehen können (Version 2.1.), so wird auch die Content Datenbank anwachsen. Was in unserem Fall bei einem Anhang von ca. 500 MB Größe durchaus ins Gewicht fällt.


Sehen wir uns hier nochmal die Size an, werden wir einen deutlichen Zuwachs feststellen, obwohl an der angehangenen Datei sich nichts geändert hat.

Veröffentlicht unter SharePoint 2010, SQL Server | Verschlagwortet mit , , | Hinterlasse einen Kommentar

SharePoint und Multi Line Textfelder

In SharePoint speichert man seine Informationen in der Regel in Listen ab. Häufig hat man dort dann auch die Anforderung, dass wir in diesen Listen Notizen hinterlegen, welche sich als Text über mehrere Zeilen erstrecken. Für diesen Anwendungsfall wurde das Multi-Line Textfeld eingeführt, welches man ohne Probleme einer Liste als Spalte hinzufügen kann.
Jedoch sollte man wissen, dass dieses Textfeld, anders als andere Felder im SharePoint gewisse Funktionen nicht unterstützt. Um nur zwei der wichtigsten Funktionen herauszupicken:

- Mit einem Multi-Line Textfeld ist es dem Anwender nicht möglich, die erstellte Multi-Line Spalte zu sortieren.

- Für ein Mulit-Line Textfeld gibt es nicht die Möglichkeit der Gruppierung.

SharePoint bildet seine Daten intern auf eine SQL Datenbank ab. Jedoch handelt es sich beim Format des Multi-Line Textfeldes nicht um einen simplen Text im Sinne von nchar oder varchar, sondern um ein komplexeres Konstrukt, welches sich nicht aufeinander vergleichen kann. Somit ist es dem Multi-Line Textfeld nicht möglich sich zu sortieren. Da sich das Textfeld nicht vergleichen kann, ist natürlich eine Gruppierung ebenfalls ausgeschlossen.

Veröffentlicht unter MOSS 2007, SharePoint 2010, SQL Server | Verschlagwortet mit , , , , , , , , | Hinterlasse einen Kommentar

Threads und Windows Forms

Wenn man in Windows Forms einen weiteren Thread benötigt, welcher eine Berechnung für das Programm abwickelt, welche etwas mehr Zeit in Anspruch nimmt, so hat man verschiedene Möglichkeiten diesen Thread in die Form zu integrieren.
Eine wohl bekannte Möglichkeit wäre die Verwendung eines Backgroundworkers, welcher dann die von einem gewünschte Logik vollzieht.
Andererseits hat man auch die Möglichkeit direkt ein Thread Objekt zu verwenden, welches die Berechnung abwickelt.

public class MyForm : Form{

private Thread t;

private void Button_Click(object sender, EventArgs e){
t = new Thread(...);
t.Start()
}
}

Der oben stehende Code skizziert im Ansatz die Verwendung des Threads.
Schließt man jetzt das Form, so wird man in ein Problem laufen. Da zwar das Form geschlossen wird, der Thread jedoch noch weiterläuft, wird das Programm auch insgeheim noch weiter laufen. Wir sehen zwar kein Fenster mehr, jedoch läuft im Hintergrund immer noch unser Thread.
Deshalb müssen wir dafür sorgen, dass unser Thread nicht mehr ausgeführt wird. Dies lässt sich auf verschiedene Wege bewerkstelligen.

Zum einen haben wir die Möglichkeit, dass wir auf den Form_Closing Event zugreifen. Dort können wir auf unserern Thread die Methode Abort aufrufen. Somit wird dessen Ausführung unterbrochen und das Programm wird dadurch auch beendet.
Zum anderen besteht für uns die Möglichkeit vor dem Start des Threads dessen Eigenschaft IsBackground auf true zu setzen. Diese bewirkt nun logischerweise, dass der Thread als Backgroundthread ausgeführt wird. Im Gegensatz zu einem Foregroundthread, hält der Backgroundthread die Ausführung des Programms nicht aufrecht. Somit wird, sobald der letzte Foregroundthread (in diesem Fall unserer Form) gestoppt wird auch das Programm beendet.

Es sollte also immer bei der Verwendung von Threads darauf geachtet werden, dass diese richtig verarbeitet werden, wenn die dazugehörige Form geschlossen wird. Denn wenn bestimmte Threads nicht geschlossen wurden, kann es sein, dass für andere Prozesse und Programme Resourcen blockiert werden, von welchen wir ausgehen, dass diese freigegeben sein sollten.

Veröffentlicht unter .NET, .NET Framework, C#, Windows Forms | Verschlagwortet mit , , , , | Hinterlasse einen Kommentar

ASP.NET und Ajax

Ajax ist mittlerweile eine weit verbreitete Technologie und ein sehr praktisches und viel verwendetes Konzept. Auch in ASP.NET hat man die Möglichkeit für seine Komponenten Ajax zu verwenden.
Dies geht viel einfacher als man meinen würde. Um Asynchronität in die eigene Lösung zu integrieren benötigt man nur zwei Elemente in der eigenen ASP.NET WebForm.
Zum einen benötigt man den ScriptManager, welcher die JavaScript Skripte, welche für die Asynchronität benötigt werden, in den Client injected. Zum anderen benötigt man für die Komponente, die Asynchronität gewährleisten sollen, ein UpdatePanel. Alle Komponenten, welche von diesem UpdatePanel umfasst werden gewährleisten jetzt ein asynchrones Verhalten.

Wenn man eine Art Windows Explorer Ansicht mit einem TreeView und einem ListView aufbaut, sollte man ggf. beide Elemente mit je einem UpdatePanel umfassen, damit diese einwandfrei asynchron arbeiten und nicht gemeinsam aktualisiert werden.

Veröffentlicht unter .NET, Ajax Control Toolkit, ASP.NET, Java Script, Uncategorized | Verschlagwortet mit , , , | Hinterlasse einen Kommentar

Sharepoint bessere Performance ohne Queries

Bei der Entwicklung für Sharepoint kann es schnell mal vorkommen, dass man mit Listen konfrontiert wird in der Entwicklung. Nicht selten ist es dann auch der Fall, dass man eine bestimmte Information aus dieser Liste sucht. Der schnelle Weg dafür ist bekanntlich eine Query.
Sucht man jedoch sehr oft im Programmablauf nach Elementen von der Liste und ist diese Liste vielleicht noch sehr lang, so kann es schnell passieren, dass diese Queries sehr viel Zeit in Anspruch nehmen und nicht mehr so schnell sind, wie man zunächst erwartet hatte.
Sofern man die Information nur lesen möchte und mit den Werten dann weiterarbeitet, so besteht die Möglichkeit, dass man den Inhalt der Liste in ein Dictionary überträgt.
Das heißt, dass man zu Beginn des Programms als aller erstes ein neues Dictionary anliegt und in dieses genau die Werte aus der Liste hineinschreibt. Dafür benötigt man natürlich ein Key Value Paar. Dieses setzt man am besten so zusammen, dass der Key die Werte beinhaltet, welche man normalerweise auch für die Query verwenden würde. Der Value auf der anderen Seite beinhaltet die Werte, mit welchen man weiterarbeiten möchte. Sollte es notwendig sein, kann man sich als Value auch eine eigene Klasse definieren.
Statt nun eine Query auf die Liste laufen zu lassen, ruft man einfach das Dictionary auf und sucht dort nach dem Schlüssel.
Die Vorteile davon sind, dass man nicht ständig auf die Sharepoint-Liste zugreifen muss, keine komplizierten Queries schreiben muss und dass das Dictionary sehr schnelle Zugriffszeiten hat.
Nachteil davon: Zu Beginn muss das Dictionary initialisiert werden. Sollte man nicht viele Queries haben, dann ist der zeitliche Mehraufwand nicht so schnell kompensiert.

Kleiner Tipp am Rande: Sollte man die Items, welche man queried bearbeiten wollen. So kann man im Dictionary als Value die ID des Items speichern und so einfach und bequem auf das tatsächliche ListItem zugreifen.

Veröffentlicht unter MOSS 2007, SharePoint 2010 | Verschlagwortet mit , , , , , | Hinterlasse einen Kommentar

Formatierung von Werten im SQL Server

Wenn man im SQL Server ein Feld formatieren möchte kann man dies sehr schön mit der Function REPLICATE machen. Hier ein kleines Beispiel:

REPLICATE('0', 5 - LEN(tblAuftrag.AuftragNr)) + tblAuftrag.AuftragNr

Somit wird die Auftragsnummer immer 5 stellig angezeigt. Das heißt aus dem Wert “123″ wird ”00123″.

Veröffentlicht unter SQL Server | Verschlagwortet mit , , | Hinterlasse einen Kommentar

Duplikate in SharePoint Liste finden und vermeiden

Neulich hatte ich die Notwendigkeit mir eine lange SharePoint Liste (> 1000 Einträge) anzusehen und zu prüfen, ob in dieser Liste Duplikate existieren. Dies kann man natürlich einfach überprüfen, indem man ein kurzes Programm schreibt, welches jedes Item der Liste mit jedem anderen vergleicht. Jedoch kann man auch auf eine schnellere Art herausfinden, ob eine Liste doppelte Einträge enthält und das ganz ohne Code.
Dies lässt sich verhältnismäßig leicht realisieren mit Hilfe einer angepassten Ansicht auf die Liste. In den Einstellungen der Ansicht der aktuellen Liste gibt es einen Unterpunkt Gruppierung, wie man im Screenshot erkennen kann.

Dort wählt man nun diejenigen Felder aus nach denen man gruppieren möchte und welche für die Eindeutigkeit der Einträge verantwortlich sind. Außerdem wählt man aus, dass die Darstellung reduziert sein soll.
Sieht man sich nun die Ansicht der Liste an, so kann man hinter den Listeneinträgen, welche reduziert sind eine Zahl in Runden Klammern finden. Diese Zahl gibt an, wie oft das Item vorhanden ist. Ist nun ein Item mehr als 1 mal vorhanden, so hat man möglicherweise ein Duplikat gefunden, wobei natürlich alle Attribute, die nicht vergleichen wurden immer noch abweichen können.
Jedoch empfiehlt sich dieser Ansatz nur bei einer überschaubaren Anzahl an Items, welche man schnell auch mal selbst prüfen kann anhand der Gruppierung.

Um Duplikate von Anfang an zu vermeiden, sollte man am Bestem mit einem EventHandler auf die Liste arbeiten. Mit Hilfe des ItemAdding Events kann man beim Einfügen eines neuen Items überprüfen, ob das Item bereits in der Liste vorhanden ist. Sollte dies der Fall sein, so bricht man das Einfügen des neuen Elements ab und weißt den Nutzer darauf hin, dass er ein Duplikat einfügen wollte, ansonsten wird es in die Liste eingefügt.

Veröffentlicht unter SharePoint 2010 | Verschlagwortet mit , , , , | Hinterlasse einen Kommentar