26 November 2009

Mehrsprachigkeit in SharePoint 2010

Mit dem MUI – dem Multilingual User Interface – wird SharePoint 2010 endlich mehrsprachig. Dabei kann die Sprache des User Interface jede möglichen SharePoint Site geändert werden.

Als Voraussetzung muss für jede gewünschte Sprache das entsprechende Language Pack (einmal für SharePoint Foundation und einmal für SharePoint Server) installiert werden. Für Beta 2 sind Language Packs für Englisch, Deutsch, Französisch, Spanisch, Japanisch und Chinesisch verfügbar.

Nach der Installation kann in den Site Settings pro Site die gewünschten Sprachen ausgegeben werden. Unter “Site Administration” erscheint der neue Eintrag “Language settings”.

image

Hier wird angezeigt, in welcher Sprache die Site angelegt wurde und welche Language Packs installiert wurden. Wählt man weitere Sprachen an, stehen diese dem Benutzer zur Verfügung. Dies kann übrigens auch über das Object Model erfolgen (SPWeb.AddSupportedUICulture).

image

Der Benutzer kann nun über das “My” Menu zwischen den Sprachen hin und her wechseln.

image

Sämtliche Texte werden nun übersetzt. Die Settings Pages, die Navigation, die Hilfe aber auch Menus, OOB Listennamen, OOB Spaltennamen und OOB Webparts werden mittels den Ressourcen in den Language Packs übersetzt.

Eigene Bezeichner für Listen, Spalten, Content Types, Managed Metadata, etc. können als RESX Datei exportiert, übersetzt und wieder importiert werden. Mit der aktuellen Beta scheint hier noch nicht alles zur Verfügung zu stehen. Eigene Customizations können mit der bekannten ASP.NET Localization übersetzt werden.

Nicht übersetzten kann man den Content auf den Wikipages und die Listeninhalte. Hier können wir Developers aber mit etwas .NET Code einfache Lösungen bauen.

20 November 2009

Microsoft SharePoint: Update Center

Microsoft bietet neu ein Update Center für SharePoint! Endlich sind alle Updates an einem Ort zu finden. Sysadmins wissen wie mühsam es teilweise ist die richtigen Updates alle zu finden, die richtige Installationsreihenfolge zu beachten und wer eine mehrsprachige SharePoint Farm betriebt, der darf das ganze Spiel mehrmals durchspielen weil es für alle Service Packs auch noch Language Packs gibt. Neu, alles an einem Ort zu finden. An der Installationsroutine ändert sich aber nichts.

Vorgehensweise SharePoint Upgrade:

Installation WSS Service Pack
Installation WSS Language Packs
Installation MOSS Service Pack
Installation MOSS Language Pack.
Config Wizard am Schluss laufen lassen. Es ist nicht zwingend notwendig diesen nach den einzelnen Installationen auszuführen.

Update Center Highlights:

  • Latest Updates Table
  • See the latest updates for your version of Office
  • List of all releases in a year
  • Find information about past releases
  • RSS Feed: Subscribe to the feed and get updated as new releases become available

16 November 2009

SharePoint 2010 Beta ist (fast) da!

Der MSDN New Downloads RSS Feed zeigt die Office 2010 / SharePoint 2010 Betas bereits an. Sichtbar über das Web UI sind die Downloads aber noch nicht. Es ist anzunehmen, dass die Beta 2 von Office 2010, SharePoint 2010 aber auch des FAST Search for SharePoint nicht mehr lange auf sich warten lassen.

Die Vorfreude bei isolutions ist gross – nicht nur werden wir mit dieser (intern Beta 2 genannten) Version ein internes Deployment vornehmen und erste Funktionen produktiv einsetzen. Auch werden mit dem FAST Search for SharePoint und den Language Packs einige Module herausgegeben, welche wir bis jetzt noch nicht einsehen konnten.

Update 18:40: Die Beta von SharePoint 2010, Office 2010, SharePoint Designer 2010 als auch das FAST Search Servers sind auf MSDN verfügbar. Los gehts, Jungs!

11 November 2009

Christoph Mäder bloggt über Dynamics CRM

image Christoph Mäder, Dynamics CRM Spezialist bei isolutions AG, hat unter http://mscrm4you.blogspot.com/ einen Blog über Microsoft Dynamics CRM eingerichtet. Zurzeit weilt er in Berlin an der TechEd Europe und berichtet regelmässig über Neuigkeiten rund um .NET, Visual Studio und weitere Microsoft Technologien.

Willkommen unter den Bloggern, Chrigu!

09 November 2009

Fehler: Invalid look-up value

Folgender Fehler trat gestern beim hinzufügen einer Datei in eine SharePoint Dokumentenbibliothek auf:

Invalid look-up value
A look-up field contains invalid data. Please check the value and try again.

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)

Die Datei wurde von einem Template, welches mit dem passenden ContentType verknüpft ist, kopiert:

SPFile template = Site.RootWeb.GetFile(documentTemplateUrl);SPFile file = List.RootFolder.Files.Add(leafName, template.OpenBinary(), false);

Nach und nach stellte sich die Ursache des Problems heraus: die Vorlage, welche mit dem Content Type verknüpft war, beinhaltete noch (unsichtbare) Referenzen auf Felder einer früheren Version dieses Content Types.


image

Mit Prepare-> Inspect Document konnten diese einfach gefunden und entfernt werden. Et voila: das Kopieren klappte ohne Probleme…

image image

Der Fehler ist auch reproduzierbar beim Hochladen eines so präparierten Dokumentes in eine SharePoint Dokumnetenbibliothek, welche mit dem entsprechenden Content Type verknüpft ist.

06 November 2009

Das SharePoint 2010 ABC für Developer

Diese Woche durfte ich am SharePoint 2010 Ignite Developer Training in Amsterdam teilnehmen. Wouter van Vugt, Todd Carter und Vesa Juvonen haben uns einen tiefen Einblick in SharePoint 2010 vermittelt.

Für euch habe ich das SharePoint 2010 ABC für Developer zusammengestellt:

A wie Application Lifecycle Management

Für das Application Lifecycle Management (ALM) stellt SharePoint 2010 neue Möglichkeiten zur Verfügung. Die Versionsnummer von Features wird beachtet und in den Featuredefinitionen können UpgradeActions definiert werden. Neben dem Hinzufügen von neuen Site Columns zu Content Types, kann auch C# Code ausgeführt werden. Dies geschieht über einen neuen EventReceiver (FeatureUpgrading).

B wie Business Connectivity Services

Die Business Connectivity Services (BCS) lösen den Business Data Catalog (BDC) ab und erlauben das Einbinden von externen Daten. Sei es eine SQL Datenbank, ein Web Services oder gar ein .NET Type. BCS Daten stehen als External Content Type zur Verfügung und können in einer sogenannten External List wie eine normale SharePoint Daten bearbeitet werden. Neu können die Daten auch geschrieben werden.

C wie Client Object Model

Mit dem Client Object Model kann man aus .NET, Silverlight oder JavaScript Anwendungen auf SharePoint Daten zugreifen. Grundsätzlich steht alles unterhalb der Site Collection zur Verfügung. Das Client OM ist aber vor allem für den Zugriff auf Listen interessant. Die Zeiten von lists.asmx sind gezählt.

D wie Designer

Der SharePoint Designer 2010 wird nun auch für Developer interessant. Der Workflow Designer hat massive Verbesserungen erfahren. Zum Erstellen von BCS ist der SharePoint Designer das Tool der Wahl. Das Beste: Customizations lassen sich als WSP exportieren und können in Visual Studio 2010 weiterverarbeitet werden.

E wie EventReceiver

Mit den neuen EventReceivern für Listen (ListAdding/ed) und Sites (WebAdding/Provisioned) sowie Post-Synchronous Events wird das EventReceiver Modell komplettiert. Die Post-Synchronous Events erlauben es dem Developer nach dem Ausführen einer Operation durch SharePoint, aber bevor dem Benutzer das UI wieder angezeigt wird, einzugreifen. Damit können Bilder nach dem Upload skaliert und Properties nach dem Erstellen abgefüllt werden.

F wie FAST

Von der Integration der FAST Search Engine profitiert auch der Developer. Über die Mächtigkeit der FAST Search Engine wurde in diesem Blog bereits einiges geschrieben. Programmatisch kann über dasselbe API auf den Suchindex zugegriffen werden. Als Goodie kann man über das Object Model gezielt Content in den Index pushen und auf diese Weise real-time Search-based Applikationen realisieren (z.B. eine Tasklist über die gesamte Farm).

G wie graphische Anpassungen

Graphische Anpassungen lassen sich mit SharePoint 2010 viel einfacher umsetzen. Themes sind in 5 Minuten erstellt (siehe unter ‘T’). Die Masterpages wird out-of-the-box mit sauberen HTML Code ausgeliefert. Die Content Placeholders sind aber dieselben – d.h. die Migration wird nicht sehr aufwändig.

H wie Hub

Mit dem Content Type Hub können Content Types über die gesamte Farm verteilt werden. Früher waren hier Features und Code notwendig. Der Content Type Hub ist in den Managed Metadata Services integriert.

I wie InfoPath

Die List Forms (NewItem, ViewItem, EditItem) können in SharePoint 2010 mit InfoPath 2010 angepasst werden. Das Customizing erfolgt über den SharePoint Designer.

J wie JavaScript

Viele Funktionen (SP.*.js) stehen dem JavaScript Entwickler zur Verfügung. Dabei stehen auch die Debug Dateien zur Verfügung. Ein Lazy Loading Mechanismus ist integriert und kann auch für die eigenen JavaScript Dateien eingesetzt werden.

K wie Kompilieren

Der bestehende Code muss – solange er im IIS läuft – nicht neu kompiliert werden. Über ein BindingRedirects werden die Object Model Calls auf die neuen SharePoint 14.0.0.0 DLLs geleitet. Nur jene Bits, welche von OWSTimer.exe ausgeführt werden (EventReceiver, Timer Jobs, Workflows) müssen gegen die neuen DLLs kompiliert werden.

L wie Listen

Bei den Listen wurden unter SharePoint 2010 einige entscheidende Verbesserungen realisiert. Neu können sie bis zu 50 Millionen Items enthalten. Dafür kann nun bei der Abfrage festgelegt werden, wie viele Items aus der Datenbank gelesen werden. Relationships lassen sich mit Cascade Delete oder Block Delete realisieren.

M wie Mehrsprachigkeit

Gerade für uns Schweizer sind die Neuerungen bei der Mehrsprachigkeit sehr spannend. Auf einer SharePoint 2010 Site kann die Sprache der Menus, der Navigation und der anderen Seitenelemente über das Menu umgestellt werden. Man muss nur die entsprechenden Language Packs installieren. Ob man auch die Namen der selbst erstellten Columns übersetzen kann, gilt es zu prüfen.

N wie Networking

Mit der MySite von SharePoint 2010 stehen viele Social Network Funktionen zur Verfügung. Persönliche Tags, I like it und Wall Posts werden auf der MySite angezeigt. Mittels einer Silverlight Applikation wird da Organigramm dargestellt.

O wie Online

SharePoint Online wird aufgewertet. Bald können wir unsere Webparts als Sandboxed Solutions auf SharePoint Online deployen. Dabei handelt es sich um WSP, welche in einem separaten Prozess ausgeführt werden. Natürlich darf der Code nicht beliebige Operationen ausführen - der Zugriff auf das SharePoint Object Model ist aber gewährleistet. Sandboxed Solutions können vom Site Collection Admin in die neue Solution Gallery hochgeladen und aktiviert werden.

P wie PowerShell

Die PowerShell Cmdlets für SharePoint 2010 sind sehr mächtig und vereinfachen viele IT Pro Tasks. Über PowerShell kann auch direkt auf das SharePoint Object Model zugegriffen werden.

Q wie Query

Queries lassen sich unter SharePoint 2010 mit LINQ absetzen. Dabei wird das EntityModel ab einer bestehenden Site generiert (mit dem Utility SPMETAL) und das Visual Studio Projekt hinzugefügt. Die LINQ Abfragen können auch über Relationships erfolgen.

R wie REST

Ein REST-based Zugriff auf SharePoint 2010 Listen stellt die Daten für Drittsysteme zur Verfügung. Die Abfrage der Daten erfolgt über das URL (z.B. /_vti_bin/ListData.svc/Listname). Zurück kommt wahlweise ATOM XML, JSON oder sogar ein Bild.

S wie SharePoint 2010

SharePoint 2010 rocks!

T wie Themes

Themes lassen sich über das Web UI zusammenklicken. Ebenfalls elegant ist der Import einer thmx Datei. Eine solche Datei exportieren die Office 2007 Applikationen auf Grund der Styles.

U wie User Interface

Das neue UI mit dem Ribbon und den Popup Dialogen ist für den Benutzer intuitiver (da er nicht immer wegnavigiert wird und sich die Befehle alle im Ribbon befinden) und kann vom Developer sehr flexibel erweitert werden.

V wie Visual Studio

Mit den Visual Studio 2010 Templates wird der Traum vom Deploy per F5-Taste endlich wahr. Mainfest.xml, DDF, SafeControls, etc. gehört der Vergangenheit an. Zirka 20 Projekt Templates stehen für die verschiedenen SharePoint Erweiterungen zur Verfügung. Wo nötig können man die XML Dateien aber immer noch selbst bearbeiten werden.

W wie Wiki

Team Sites sind nun auch Wiki Sites. Der Benutzer kann überall Inhalte, Links (nur "[[" eingeben und schon erscheint ein Popup zur Auswahl von Pages, Listen und Subsites) sowie Webparts einfügen. Nur um ein Bild einzufügen, braucht es kein ImageWebPart mehr.

X wie XHTML

SharePoint 2010 rendert Well-Formed XHTML 1.0. Was anderswo selbstverständlich war, mussten wir uns hart erkämpfen. Ebenfalls wird die Accessibilitynorm WCAG 2.0 AA erfüllt.

Y wie hmm… Joker

Z wie Zugriff

Neu kann der Zugriff auf SharePoint 2010 mittels Claims erfolgen. Dies ermöglich tolle Möglichkeiten um Benutzer mit Live ID Accounts, Federated Active Directory Accounts oder anderen Providern zu authentisieren.

02 November 2009

How to set a Correlation Token Property on a Custom Activity


I like to break up my sharepoint workflows into several custom activities, especially when there are many repetitive tasks involved. But I've always struggeld with one thing: when I needed to send an email from such an activity, I had to pass the correlation token of the onWorkflowActivated activity manually in the constructor of my workflow to my custom activity, which assigned it in turn to the SendEmail activity. As one doesn't get workflow validation using this approach, it makes for an easy to oversee failure if in a hurry. And additionally, the compiler produces a warning that the correlation token of you SendEmail Activity may be uninitialized.

After a little digging around with Reflector.NET, I finally found out that one can declare a Type Converter of the type CorrelationTokenTypeConverter on the correlation token property of the custom activity. As this type converter is an internal class, the type property of the attribute has to be set by its full qualified class name.

[DefaultValue((string)null),
TypeConverter("System.Workflow.Activities.CorrelationTokenTypeConverter, System.Workflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")]
public CorrelationToken WorkflowCorrelationToken
{
get { return (CorrelationToken)base.GetValue(WorkflowCorrelationTokenProperty); }
set
{
base.SetValue(WorkflowCorrelationTokenProperty, value);
sendEmail.CorrelationToken = value;
}
}

(The code snippets above assumes assumes that a “CorrelationToken” dependency property is registered for the custom activity class.)

Now that we can set the correlation token using the designer, we are also able to use a validator class on the custom activity, so the compiler will throw an error if the correlation token is not set. Doing this is quite easy, just add the ActivityValidator attriubte to the activity class definition and implement an activityvalidator class which validates that the correlation token property of the custom activity is set.

[ActivityValidator(typeof(MyActivityValidator))]
public partial class MyActivity : SequenceActivity
{

private class MyActivityValidator : ActivityValidator
{
/// <summary>
/// Verifies that the MyActivity activity is valid.
/// </summary>
/// <param name="manager">The <see cref="T:System.Workflow.ComponentModel.Compiler.ValidationManager"/> associated with validation.</param>
/// <param name="obj">The <see cref="T:System.Workflow.ComponentModel.Activity"/> to be validated.</param>
/// <returns>
/// A <see cref="T:System.Workflow.ComponentModel.Compiler.ValidationErrorCollection"/> object containing any errors or warnings that occurred during validation.
/// </returns>
public override ValidationErrorCollection Validate(ValidationManager manager, object obj)
{
ValidationErrorCollection errors = new ValidationErrorCollection();
MyActivity activity = obj as MyActivity;
if (activity == null)
{
throw new InvalidOperationException();
}
if (activity.Parent != null)
{
if (activity.WorkflowCorrelationToken == null)
{
Hashtable hashtable = activity.GetValue(WorkflowMarkupSerializer.ClrNamespacesProperty) as Hashtable;
if ((hashtable == null) (hashtable["WorkflowCorrelationToken"] == null))
{
errors.Add(ValidationError.GetNotSetValidationError("WorkflowCorrelationToken"));
}
}
}
errors.AddRange(base.Validate(manager, obj));
return errors;
}
}
// SNIP: MyActivity code...
}