Montag, 23. März 2009
Reservierte Namen in der Dokumentenbibliothek
Nicht jeder Name kann auf jeder Ebene vergeben werden. Leider sind die reservierten Worte, bzw. Wortbestandteile nirgends aufgelistet oder ich habe sie noch nicht gefunden.
Nicht benutzt werden sollten:
* forms (auf Root-Ebene), da dieser Folder reserviert ist für die .aspx-Seiten, mit denen Einträge in der Dokumentenbibliothek bearbeitet werden können
* die Endungen _file, _files, .files (alle Ebenen). Benutzt werden können diese Wortbestandteile allerdings, wenn nach ihnen noch Zeichen kommen, z.B. _files2. Sollte es solch ein Verzeichnis geben, wird es von SharePoint nach dem Anlegen automatisch umbenannt und ein Unterstrich angefügt. Außerdem scheint es das Objektmodell zu verwirren denn bei Operationen auf dem SPFolder-Objekt erscheinen dann z.B. solche Fehlermeldungen: "This operation can only be performed on a file; "Documents/folder1/01_Source_Files/Folder2" is a folder."
Sollte ich auf weitere in Dokumentenbibliotheken "verbotene" Worte stoßen, werde ich sie hier posten.
Donnerstag, 12. März 2009
Mit SPQuery nach Items in DocumentLibrary suchen
Die Code-Abfrage lautet dann so:
SPFieldLookup spFieldLookup = (SPFieldLookup)spListItem.Fields[property];
SPList spLookupList = spListItem.Web.Lists[new Guid(spFieldLookup.LookupList)];
SPQuery query = String.Format("{1} ", spLookupFieldName, value);
query.ViewAttributes += " Scope=\"RecursiveAll\"";
SPListItemCollection results = spLookupList.GetItems(query);
spListItem und property sind das SPListItem welches ich updaten möchte und der Name des Lookup-Feldes, welches benutzt werden soll. value ist der Foldername, nach dem gesucht werden soll.
Mehr zum dem Attribut "Scope" gibt es auf http://msdn.microsoft.com/en-us/library/ms438338.aspx.
Montag, 2. März 2009
Gruppen in Quicklaunch-Navigation eintragen
Witzigerweise stehen diese Gruppen auch nicht per Default zur Verfügung, wenn man in "All People" versucht, einen Benutzer gleich einer Gruppe hinzuzufügen.
Abhilfe schafft hier das Property "vti_associategroups" vom Rootweb, dem man semikolonsepariert die IDs der Benutzergruppen zuweisen muss:
List quickLaunchGroupIDs = new List();
...
// create a new spGroup here and add its ID to the list
quickLaunchGroupIDs.Add(spGroup.ID.ToString());
rootWeb.AllProperties["vti_associategroups"] = string.Join(";", quickLaunchGroupIDs.ToArray());
rootWeb.Update();
Mittwoch, 18. Februar 2009
Formeln für berechnete Felder (calculated fields)
Viele dieser Formeln lassen z.B. Feldmanipulationen auf EventReceiver-Seite überflüssig werden.
Mittwoch, 21. Januar 2009
"Insufficient memory to continue the execution of the program" und "System.OutOfMemoryException" bei Upload in eine Dokumentbibliothek
Neben der Tatsache, dass SharePoint stark begrenzte Vorgaben was die Maximallänge von Datei- und Verzeichnisnamen sowie deren Syntax betrifft - dazu vielleicht in einem anderen Post einmal mehr -, gibt es auch das Problem, dass Dateien nicht beliebig groß sein dürfen.
In der Zentraladministration unter Application Management > Web Application General Settings die Einstellung Maximum Upload Size. Standardmäßig sollten dort 50 MB eingestellt sein.
Laut Microsoft kann man nun Dateien von einer Umgebung in eine Dokumentenbibliothek laden mittels diesen Codes:
FileStream fStream = File.OpenRead(srcUrl);
byte[] contents = new byte[fStream.Length];
fStream.Read(contents, 0, (int)fStream.Length);
fStream.Close();
EnsureParentFolder(site, destUrl);
site.Files.Add(destUrl, contents);
Das funktioniert auch wunderbar. Wird versucht, eine Datei hochzuladen, die größer ist als die eingestellte Maximum Upload Size wirft SharePoint eine Exception, die auch aussagt, dass das File Size Limit Exceeded ist.
Eine weitere Projektanforderung besagt, dass Dokumente bis 200 MB hochgeladen werden sollen. Also erhöhte ich den Wert in der ZA. Das funktionierte eine Zeit lang auch ganz gut aber irgendwann tauchten solche Fehlermeldungen auf:
Insufficient memory to continue the execution of the program.
at Microsoft.SharePoint.Library.SPRequestInternalClass.PutFile(String bstrUrl, String bstrWebRelativeUrl, Object varFile, PutFileOpt PutFileOpt, String bstrCreatedBy, String bstrModifiedBy, Int32 iCreatedByID, Int32 iModifiedByID, Object varTimeCreated, Object varTimeLastModified, Object varProperties, String bstrCheckinComment, UInt32& pdwVirusCheckStatus, String& pVirusCheckMessage)
at Microsoft.SharePoint.Library.SPRequest.PutFile(String bstrUrl, String bstrWebRelativeUrl, Object varFile, PutFileOpt PutFileOpt, String bstrCreatedBy, String bstrModifiedBy, Int32 iCreatedByID, Int32 iModifiedByID, Object varTimeCreated, Object varTimeLastModified, Object varProperties, String bstrCheckinComment, UInt32& pdwVirusCheckStatus, String& pVirusCheckMessage)
at Microsoft.SharePoint.SPFileCollection.AddInternal(String urlOfFile, Object file, PutFileOpt fileOpt, String createdBy, String modifiedBy, Int32 createdByID, Int32 modifiedByID, DateTime timeCreated, DateTime timeLastModified, Object varProperties, String checkInComment, SPVirusCheckStatus& virusCheckStatus, String& virusCheckMessage)
at Microsoft.SharePoint.SPFileCollection.Add(String urlOfFile, Byte[] file, SPUser createdBy, SPUser modifiedBy, DateTime timeCreated, DateTime timeLastModified)...
Und zwar genau in der Codezeile, in der der SPFileCollection mit der Methode .add die neue Datei hinzugefügt werden sollte.
Die Irritation war groß zumal laut der oben verlinkten MSDN-Seite und dem dort vorgegebenen Code Dateigrößen bis 2 GB möglich sein sollten.
Ein paar Zeilen tiefer in meinem Logfile fand sich auch diese Fehlermeldung:
Exception of type 'System.OutOfMemoryException' was thrown.
Und zwar in der Codezeile, in der das Bytearray deklariert wurde:
byte[] contents = new byte[fStream.Length];Das Problem an dieser Stelle ist ausnahmsweise mal nicht SharePoint sondern das Betriebssystem, bzw. .net. Anscheinend sind Byte-Arrays jenseits der ~100 MB-Grenze zu groß für den Speicher sodass es zu den oben genannten Fehlermeldungen kommt.
Glücklicherweise, und das verschweigt die MSDN in ihrem Artikel voll und ganz, kann als zweiter Parameter in der SPFileCollection.add-Methode anstelle eines Byte-Arrays auch ein Stream benutzt werden:
FileStream fStream = File.OpenRead(fileToUpload);
spFile = spFileCollection.Add(newDocumentName, fStream, fileCreator, fileModifier, DateTime.Parse(fileCreated), DateTime.Parse(fileModified));
fStream.Close();
Durch diese Methode wird nicht nur der Speicher geschont sondern werden auch weniger Codezeilen benötigt.
Freitag, 12. Dezember 2008
Fehler beim Anlegen eines Folders in einer Dokumentenbibliothek
Hier werden u.a. programmatisch Folder und Dokumente in einer Dokumentenbibliothek angelegt aber ab und zu taucht diese Fehlermeldung auf:
The filename, directory name, or volume label syntax is incorrect. (Exception from HRESULT: 0x8007007B)
Der Name des anzulegenden Folders war "1_ERF ", beinhaltete also keine Zeichen, die SharePoint kategorisch ablehnt (wie z.B. & # % * usw.). Über die Oberfläche war der Folder ebenfalls problemlos anlegbar.
Daraufhin versuchte ich noch einmal den Folder programmatisch anzulegen. Diesmal ohne das Leerzeichen am Ende und siehe da, plötzlich funktionierte es problemlos.
Fazit: Beim programmatischen Anlegen von Foldern in einer Dokumentenbibliothek am besten immer ein .TrimEnd() oder .Trim() an den Folder-Namen hängen.
Montag, 1. Dezember 2008
Michael Greth auf dem 3. Treffen der regionalen SharePoint User Gruppe
Vgl: Consultants Digest
Ich freue mich, an dieser Stelle verkünden zu können, dass Michael Greth, einer der SharePoint Evangelisten in Deutschland und Microsoft MVP, am 15.01.2008 zum dritten Treffen der regionalen SharePoint User Gruppe Nürnberg kommen wird, um dort über das Podcasting Kit zu sprechen.
Der Termin wird am 15.01.2008 wieder bei der Spirit Link Technology in Erlangen stattfinden.
Anmeldung und weitere Informationen zu dem Termin und der User Gruppe finden Sie unter:
Xing Termin: https://www.xing.com/app/events?op=detail;id=281380;from=home
User Gruppe: https://www.xing.com/net/spusergroupnbg/
Spirit Link Technology: www.spiritlink-technology.de
Ich würde mich freuen auch den einen oder anderen Blog Leser dort zu diesem sicher spannenden Termin begrüßen zu dürfen.
