How to prevent SharePoint 2010 solutions from globally deploying

Often when developing solutions, I endup with a solution that wants to be deployed globally. Often this is not wanted, as a solution mostly should be available for only one webapplication.
Turns out that a solution will be deployed globally by default. When the solutions contains a safecontrol registration, then the solutions will be able to be deployed per webapplication.

Koen has a nice post about this: K&Y – How to prevent SharePoint 2010 solutions from globally deploying.

Create search scopes for external content types

I have two external content types, both from the same external source. Now I want to create search scopes for each of the external content types.

My first try was to filter by content type. Unfortunately this is not possible as the managed metadata property has the value for Retrievable set to false. Timmy Gilissen explains how to see which properties can’t be retrieved: http://www.moss2007.be/blogs/timmy/archive/2011/08/10/core-results-webpart-fetched-properties-issue.aspx

The solutions that I have found is certainly not ideal, but it works in my case:
Since each external content type hase a seperate web part page bound to the as default page, I was able to define the search scopes, by using the existing managed property ‘FileName’.

Using TaxonomyWebTaggingControl in custom webpart makes CreateChildControls called twice!

The TaxonomyWebTaggingControl is a great control to use in your custom code, but when adding this control to a custom webpart I experienced my code running twice! I don’t know if this behaviour is specific to this control, but I have been able to isolate the behaviour to this control in my webpart.

Don’t have a solution to this :-(

The first call has the following stacktrace:
MyAssembly.dll!MyAssembly.MyWebPart.MyWebPart.CreateChildControls() Line 86 C#
System.Web.dll!System.Web.UI.Control.EnsureChildControls() + 0x92 bytes
System.Web.dll!System.Web.UI.Control.PreRenderRecursiveInternal() + 0x3d bytes
System.Web.dll!System.Web.UI.Control.PreRenderRecursiveInternal() + 0xe0 bytes
System.Web.dll!System.Web.UI.Control.PreRenderRecursiveInternal() + 0xe0 bytes
System.Web.dll!System.Web.UI.Control.PreRenderRecursiveInternal() + 0xe0 bytes
System.Web.dll!System.Web.UI.Control.PreRenderRecursiveInternal() + 0xe0 bytes
System.Web.dll!System.Web.UI.Control.PreRenderRecursiveInternal() + 0xe0 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequestMain(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint) + 0xd42 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint) + 0xa0 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest() + 0x5b bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext context) + 0xf0 bytes
System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x257 bytes
System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step, ref bool completedSynchronously) + 0xab bytes
System.Web.dll!System.Web.HttpApplication.PipelineStepManager.ResumeSteps(System.Exception error) + 0x511 bytes
System.Web.dll!System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext context, System.AsyncCallback cb) + 0x72 bytes
System.Web.dll!System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest wr, System.Web.HttpContext context) + 0x269 bytes
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(System.IntPtr managedHttpContext, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) + 0x411 bytes
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(System.IntPtr managedHttpContext, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) + 0x2b bytes
[Native to Managed Transition]
[Managed to Native Transition]
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(System.IntPtr managedHttpContext, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) + 0x540 bytes
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(System.IntPtr managedHttpContext, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) + 0x2b bytes
[Appdomain Transition]

Stacktrace second call:
MyAssembly.dll!MyAssembly.MyWebPart.MyWebPart.CreateChildControls() Line 86 C#
System.Web.dll!System.Web.UI.Control.EnsureChildControls() + 0x92 bytes
System.Web.dll!System.Web.UI.WebControls.WebParts.Part.Controls.get() + 0x14 bytes
System.Web.dll!System.Web.UI.Control.LoadChildViewStateByIndex(System.Collections.ArrayList childState) + 0x22 bytes
System.Web.dll!System.Web.UI.Control.LoadViewStateRecursive(object savedState) + 0x18b bytes
System.Web.dll!System.Web.UI.Control.LoadChildViewStateByID(System.Collections.ArrayList childState) + 0xb4 bytes
System.Web.dll!System.Web.UI.Control.LoadViewStateRecursive(object savedState) + 0x17b bytes
System.Web.dll!System.Web.UI.Control.LoadChildViewStateByIndex(System.Collections.ArrayList childState) + 0xe8 bytes
System.Web.dll!System.Web.UI.Control.LoadViewStateRecursive(object savedState) + 0x18b bytes
System.Web.dll!System.Web.UI.Control.LoadChildViewStateByIndex(System.Collections.ArrayList childState) + 0xe8 bytes
System.Web.dll!System.Web.UI.Control.LoadViewStateRecursive(object savedState) + 0x18b bytes
System.Web.dll!System.Web.UI.Control.LoadChildViewStateByIndex(System.Collections.ArrayList childState) + 0xe8 bytes
System.Web.dll!System.Web.UI.Control.LoadViewStateRecursive(object savedState) + 0x18b bytes
System.Web.dll!System.Web.UI.Control.LoadChildViewStateByIndex(System.Collections.ArrayList childState) + 0xe8 bytes
System.Web.dll!System.Web.UI.Control.LoadViewStateRecursive(object savedState) + 0x18b bytes
System.Web.dll!System.Web.UI.Page.LoadAllState() + 0x234 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequestMain(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint) + 0x748 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest(bool includeStagesBeforeAsyncPoint, bool includeStagesAfterAsyncPoint) + 0xa0 bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest() + 0x5b bytes
System.Web.dll!System.Web.UI.Page.ProcessRequest(System.Web.HttpContext context) + 0xf0 bytes
System.Web.dll!System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() + 0x257 bytes
System.Web.dll!System.Web.HttpApplication.ExecuteStep(System.Web.HttpApplication.IExecutionStep step, ref bool completedSynchronously) + 0xab bytes
System.Web.dll!System.Web.HttpApplication.PipelineStepManager.ResumeSteps(System.Exception error) + 0x511 bytes
System.Web.dll!System.Web.HttpApplication.BeginProcessRequestNotification(System.Web.HttpContext context, System.AsyncCallback cb) + 0x72 bytes
System.Web.dll!System.Web.HttpRuntime.ProcessRequestNotificationPrivate(System.Web.Hosting.IIS7WorkerRequest wr, System.Web.HttpContext context) + 0x269 bytes
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(System.IntPtr managedHttpContext, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) + 0x411 bytes
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(System.IntPtr managedHttpContext, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) + 0x2b bytes
[Native to Managed Transition]
[Managed to Native Transition]
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotificationHelper(System.IntPtr managedHttpContext, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) + 0x540 bytes
System.Web.dll!System.Web.Hosting.PipelineRuntime.ProcessRequestNotification(System.IntPtr managedHttpContext, System.IntPtr nativeRequestContext, System.IntPtr moduleData, int flags) + 0x2b bytes
[Appdomain Transition]

Exciting news!

Last friday I’ve decided to quit my job. That’s right, only one month left and I will leave Ordina. Even though Ordina has been good to me, I felt it was time for something new. Only a couple of months after I joined Ordina in 2007, a colleague left Ordina to start as a self-employed SharePoint specialist. From then on, I knew that someday I’d be doing the exact same thing. On the side I will also be active in the world of Windows Phone development.

So exciting times are ahead. At the moment I’m busy getting myself certified on SharePoint 2010 Development and I’ve got my first job for a Windows Phone App!

Also, I have created beijsolutions.nl to get some exposure and moved my blog to it.

Anyway, the most important thing now is to get an assignment as a SharePoint developer, so if anyone is in need of an SharePoint specialist, please let me know!

Cheers!

Field type ‘text’ is not installed properly

I got this error after changing a field in the deployment script from number to text.
Luckily the fix was quite easy once I knew what the problem was: The field’s type attribute is case sensitive!
Well that makes sense. As soon as I changed the field’s type from ‘text’ to Text, the deployment worked as expected.

<Field Type="Text" Name="Test" ID="{ba2b97ac-94e4-4b86-8845-279b22a82036}" DisplayName="Test" StaticName="Test" Group="My Group" SourceID="{8dfe28a0-f470-4a48-9b96-e90f759c3b2c}"/>

SharePoint 2010 Deployment script using Powershell

For a project I was working on last month, I needed a way to deploy SharePoint 2010 solutions in a controlled manner.
Thanks to Gary Lapointe I was quickly up to speed to create my first Powershell Script. The script he provided in his post makes it possible to deploy solutions using a xml configuration file. But I needed a script that activates the features as well, so I extended Gary’s script.

solutions.xml

<Solutions>
<Solution Path=”[[Solution1.wsp]]” CASPolicies=”false” GACDeployment=”true”>
<WebApplications>
<WebApplication Url=”[[URL]]:8080″>
<Feature Name=”1116af9b-e3b5-498e-9706-1b67b7b60c43″ Url=”[[URL]]” />
<Feature Name=”2220d8aa-2d25-47bb-8d44-29a45caaa4ce” Url=”[[URL]]” />
<Feature Name=”3330364b-e879-4fee-b103-3c3dd10c0a1c” Url=”[[URL]]” />
<Feature Name=”444a36e0-d249-469a-ba46-4ca7baa10ea6″ Url=”[[URL]]” />
</WebApplication>
</WebApplications>
</Solution>
<Solution Path=”[[Solution2.wsp]]” CASPolicies=”false” GACDeployment=”true”>
<WebApplications>
<WebApplication Url=”[[URL]]”>
<Feature Name=”Feature1″ Url=”[[URL]]” />
</WebApplication>
</WebApplications>
</Solution>
</Solutions>

Deplopy.ps1

$solutionfile = “solutions.xml”

if ( (Get-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null )
{
Add-PSSnapin Microsoft.SharePoint.PowerShell
}

function Install-Solutions([string]$configFile)
{
if ([string]::IsNullOrEmpty($configFile)) { return }

$solutionsConfig = Get-Content $configFile
if ($solutionsConfig -eq $null) { return }

$solutionsConfig.Solutions.Solution | ForEach-Object {

$_.WebApplications.WebApplication | ForEach-Object {
Write-Host $_.Url
$_.Feature | ForEach-Object {
Write-Host $_.Name
[string]$name = $_.Name
[string]$url = $_.Url
Write-Host Deactivate-Feature $name $url
Deactivate-Feature $name $url
}
}

[string]$path = $_.Path
[bool]$gac = [bool]::Parse($_.GACDeployment)
[bool]$cas = [bool]::Parse($_.CASPolicies)
$webApps = $_.WebApplications.WebApplication
Write-Host Install-Solution $path $gac $cas $webApps.Url
Install-Solution $path $gac $cas $webApps.Url

$_.WebApplications.WebApplication | ForEach-Object {
$_.Feature | ForEach-Object {
[string]$name = $_.Name
[string]$url = $_.Url
Activate-Feature $name $url
}
}
}
}

function Deactivate-Feature([string]$featurename, [string]$url)
{
#Check for Sitecollection-scoped feature
$feature = Get-SPFeature $featurename -Site $url -ErrorAction SilentlyContinue
if ($feature -eq $null) {
#Check for Web-scoped feature
$feature = Get-SPFeature $featurename -Web $url -ErrorAction SilentlyContinue
}

if ($feature -ne $null) {
Write-Host Disable-SPFeature -Identity $featurename -Url $url
Disable-SPFeature -Identity $featurename -Url $url -Confirm:$false
}

}

function Activate-Feature([string]$featurename, [string]$url)
{
$feature = Get-SPFeature $featurename -ErrorAction SilentlyContinue
if ($feature -ne $null) {
Write-Host Enable-SPFeature -Identity $featurename -Url $url
Enable-SPFeature -Identity $featurename -Url $url
}
}

function Install-Solution([string]$path, [bool]$gac, [bool]$cas, [string[]]$webApps = @())
{
$spAdminServiceName = “SPAdminV4″

[string]$name = Split-Path -Path $path -Leaf
$solution = Get-SPSolution $name -ErrorAction SilentlyContinue

if ($solution -ne $null) {
#Retract the solution
if ($solution.Deployed) {
Write-Host “Retracting solution $name…”
if ($solution.ContainsWebApplicationResource) {
$solution | Uninstall-SPSolution -AllWebApplications -Confirm:$false
} else {
$solution | Uninstall-SPSolution -Confirm:$false
}
Stop-Service -Name $spAdminServiceName
Start-SPAdminJob -Verbose
Start-Service -Name $spAdminServiceName

#Block until we’re sure the solution is no longer deployed.
do { Start-Sleep 2 } while ((Get-SPSolution $name).Deployed)
}

#Delete the solution
Write-Host “Removing solution $name…”
Get-SPSolution $name | Remove-SPSolution -Confirm:$false
}

#Add the solution
Write-Host “Adding solution $name…”
$solution = Add-SPSolution $path

#Deploy the solution
if (!$solution.ContainsWebApplicationResource) {
Write-Host “Deploying solution $name to the Farm…”
$solution | Install-SPSolution -GACDeployment:$gac -CASPolicies:$cas -Confirm:$false
} else {
if ($webApps -eq $null -or $webApps.Length -eq 0) {
Write-Warning “The solution $name contains web application resources but no web applications were specified to deploy to.”
return
}
$webApps | ForEach-Object {
Write-Host “Deploying solution $name to $_…”
$solution | Install-SPSolution -GACDeployment:$gac -CASPolicies:$cas -WebApplication $_ -Confirm:$false
}
}
Stop-Service -Name $spAdminServiceName
Start-SPAdminJob -Verbose
Start-Service -Name $spAdminServiceName

#Block until we’re sure the solution is deployed.
do { Start-Sleep 2 } while (!((Get-SPSolution $name).Deployed))
}

function Get-ScriptDirectory
{
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
Split-Path $Invocation.MyCommand.Path
}

Install-Solutions($solutionfile);

SharePoint Connections Fall 2010 – The Hague

SharePoint Connections Fall 2010

The Hague

On September 28th and 29th of this year the SharePoint Connections have taken place in The Hague (the Netherlands).

Here are my notes of the event, which I wrote in dutch (sorry guys).

Inleiding

28 en 29 September ben ik naar de SharePoint Connections geweest. Bij de meeste sessies heb ik aantekeningen gemaakt. In dit document ga ik de aantekeningen uitschrijven en daar waar ik meer wil weten over wat ik gehoord heb op de SharePoint connections, vul ik mijn aantekeningen hier op aan.

In dit document heb ik bijlagen toegevoegd: SharePoint Connections Fall 2010 – The Hague

http://www.devconnections.com/speurope/

Videos from SharePoint Products TechCenter: http://www.bing.com/videos/browse/source?tag=ms_office:cpub_stc&q=browse:source/ms_office%3acpub_stc

Keynote

Steve Fox (Microsoft)

De keynote is altijd een vrij algemeen praatje, maar toch heb ik daar een aantal dingen opgestoken.

Read-only sitecollections

Steve liet zien dat SharePoint 2010 bewust is van instellingen op de database: wanneer een content database op read-only gezet wordt, dan zijn de sitecollections die in deze database zitten gewoon nog te benaderen, maar de opties om items te bewerken of toe te voegen en dergelijke, zijn greyed-out, zodat deze niet te gebruiken zijn.

Ik heb hierover ook een blogpost gevonden van Joel Oleson: http://www.sharepointjoel.com/Lists/Posts/Post.aspx?ID=329

Sitecollection solutions

Steve had het terloops over sitecollection solutions. Aangezien ik hier nog niet eerder van gehoord had, besloot ik hier later op internet naar te zoeken. Via een video kwam ik tot de conclusie dat dit hetzelfde moet zijn als een sandboxed solution, dus wellicht is het goed om nog eens goed te kijken naar wat precies een sandboxed solution is.

In de Central Administration kunnen quota templates aangemaakt worden. Dit op zich is niets nieuws ten aanzien van SharePoint 2007, alleen kunnen er ook limieten aangegegven worden voor User Solutions. Deze limieten kunnen aangegeven worden met points. Wanneer een solution meer points verbruikt op een dag dan in de quota staat aangegeven, wordt de solution voor die dag uitgeschakeld. Op de SharePoint Dev Wiki is te zien hoe er omgegaan wordt met points.

In de sitecollection kunnen sandboxed solutions toegevoegd worden via /_catalogs/solutions/.

Hier is ook te zien hoeveel resources er door de solutions verbruikt worden en kunnen de solutions geactiveerd en gedeactiveerd worden.

Video: http://www.bing.com/videos/watch/video/getting-started-sharepoint-2010-site-collection-solution-galleries/10tjfz1cf

SharePoint Dev Wiki: http://www.sharepointdevwiki.com/display/sp2010/SharePoint+Sandboxed+Solutions

Excel Sparklines

In zijn demo liet Steve de integratie met Excel zien. Hierbij toonde hij de mogelijkheid in Excel 2010 om Sparklines te maken. Het heeft niet zo veel met SharePoint 2010 te maken, maar toch een leuke nieuwe feature. Een sparkline is een cel waarin in een minidiagram de trend getoond wordt op basis van data in andere cellen.

Verschillende variaties zijn mogelijk.

Zie blog MS Office Guru’s: http://www.msofficegurus.com/post/Excel-2010-Sparklines.aspx

Workflow via Visio

Via Visio 2010 zijn workflows te maken die geimporteerd kunnen worden in SharePoint Designer. Deze Visio bestanden defineert het proces, maar niet de details. Deze zullen in SharePoint Designer nog geconfigureerd moeten worden.

Hier is wel Visio Premium voor nodig.

Indien Visio Services is ingeschakeld, kan de voortgang van workflowinstanties schematisch bekeken worden.

PowerPoint Broadcast

Met PowerPoint 2010 is het nu ook mogelijk om, in combinatie met SharePoint 2010 presentaties te broadcasten. Dit houdt in dat, terwijl je de presentatie geeft, gebruikers via SharePoint mee kunnen kijken naar de slides. Tijdens de SharePoint Connections waren er al veel mensen met een iPad. Ik zou mij zo kunnen voorstellen dat in de toekomst de SharePoint connections worden gebroadcast, zodat iedereen in de zaal altijd de presentaties goed kan zien.

Hier is Office WEB Apps voor benodigd.

Social Point Blog: http://www.social-point.com/broadcasting-a-powerpoint-presentation-with-sharepoint-2010

Use Dataviews to get your data – Both inside and outside of SharePoint

Asif Rehmani (SharePoint-eLearning.com)

Vanuit SharePoint Designer is het mogelijk koppelingen te leggen met externe systemen. Je hoeft dan geen gebruik te maken van de BCS (Business Connectivity Service). Belangrijk is dat in het achterhoofd gehouden wordt dat eventuele connection strings toegangkelijker zijn, dan wanneer van de BCS gebruik wordt gemaakt, aangezien dan de connection details slechts door BCS administrators toegangkelijk is.

Via SharePoint Designer kunnen koppelingen gelegd worden naar onder andere de volgende bronnen:

  • XML files
  • Webservices
  • Databases
  • BCS

In SharePoint 2010 is het mogelijk om data van externe systemen uit te lezen, maar ook weg te schrijven. Er is echter geen vorm van locking naar externe systemen. Er is er geen systeem voor caching en validatie is ook niet standaard aanwezig, dus dit zal op bronniveau moeten gebeuren, of zelf geimplementeerd moeten worden in SharePoint Designer. Wegens gebrek aan caching mogelijkheden, is het belangrijk om de performance van de verbinding en het externe systeem in de gaten te houden. Om validatie toe te voegen, is het wellichts het best om als datasource gebruik te maken van webservices.

Om data weer te geven zijn er 2 soorten webparts:

  • “XSLT ListView” voor data uit lists/libraries in je SharePoint omgeving
  • “XSLT DataView” voor externe data

XSLT ListView webpart

Het XSLT Listview webpart wordt gebruikt voor alle view webparts. Hierdoor is het mogelijk om views op elke manier te integreren, bijvoorbeeld in webpart pages, of WiKi pages. Nadat XSLT Listview webparts in SharePoint Designer zijn aangepast, is het nog steeds mogelijk voor een gebruiken om deze view aan te passen in de browser (bijvoorbeeld sortering aanpassen, of kolommen toevoegen).

Asif heeft laten zien dat je dit webpart eenvoudig dusdanig kunt aanpassen zodat er op basis van een kolomwaarde een bepaalde afbeelding getoond wordt. Zo liet hij zien dat in een lijst van contactpersonen door middel van een M of S aan gegeven was of een contact persoon getrouwd, of single was. Door 2 afbeeldingen toe te voegen en voorwaardelijk te tonen, is de view een stuk mooier, dan wanneer er alleen maar een M of S staat. Wanneer je een afbeelding wil toevoegen vraag SharePoint Designer automatisch waar je deze afbeelding wil opslaan en stelt voor dit te doen in de library Site Assets. Dit is een library specifiek voor site ondersteunende bestanden.

Ook heeft Asif laten zien dat het mogelijk is om het context menu aan een andere kolom te koppelen. Het context menu is het openklapbare menu dat bij een item beschikbaar is om te kunnen kiezen om een item te bewerken, verwijderen etc. Dit is relatief eenvoudig om te doen.

Chun Liu laat zien hoe: http://blogs.msdn.com/b/chunliu/archive/2010/09/27/enabling-ecb-menu-on-a-custom-column-in-sharepoint-2010-part-1.aspx

XSLT DataView webpart

Om data te tonen uit een andere bron, moet eerst een dataconnection gemaakt worden vanuit SharePoint Designer. Daarna kan een dataview toegevoegd worden, waarbij je aangeeft dat je gebruik wil maken van de dataconnection die zojuist gemaakt is.

Afhankelijk van de bron type kun je bij de dataconnection aangeven of en hoe data te lezen bewerken is. Indien data ook te bewerken is, kun je in de dataview velden aanpassen van bijvoorbeeld type Text naar type Textbox. De waarde is dan te bewerken.

Om de waarde dan ook op te kunnen slaan, moet een save button toegevoegd worden. Ook dit is eenvoudig te doen vanuit SharePoint Designer.

In vergelijking tot de Listview, is duidelijk te zien dat de aandacht voor opmaak ontbreekt. Het is aan de designer zelf om iets moois van het formulier te maken.

Designing Governance: How Information Management and Security Must Drive Your Design

Dan Holme (Intelliem)

Je zult moeten defineren wat voor soorten content je wilt ontsluiten (nu en in de toekomst). Denk daarbij aan:

  • Search
  • Intranet
  • Collaboration

De verschillende soorten data moeten gescheiden beschikbaar gesteld worden. Vaak zie je in implementaties, dat er een intranet gebouwd is, met nog een paar formuliertjes voor bijvoorbeeld verlof aanvragen of ziektemelding. Dit soort data heeft een behoorlijk verschillende karakter:

  • Andere dataowner
  • Retentie policy is anders
  • Security is anders

Doordat er scheiding aangeracht moet worden, zal er ook vooraf nagedacht moeten worden over content promotion. Denk hierbij bijvoorbeeld aan een projectenportaal waarin informatie opgesteld wordt over het project, welke wanneer goedgekeurd, beschikbaar moet zijn op het intranet. Er zal dan een duidelijke en bewuste keuze gemaakt hoe dit gerealiseerd wordt. Er kan voor gekozen worden om deze data simpelweg te kopieren naar het intranet, maar het kan ook een keuze zijn om dit middels de Send-to functionaliteit van SharePoint te laten verlopen.

Je architectuurkeuzes moeten gebasseerd zijn op de scopes waarop functies binnen SharePoint aangeboden worden. Gelukkig zijn hier een paar prettige verbeteringen in aangebracht ten opzichte van SharePoint 2007.

Denk aan:

  • Sitecollections
    • Content types
    • Navigation
    • Quota’s
    • Content DB’s (denk aan backup mogelijkheden)
    • Autorisaties
  • Web application
    • Recycle bin settings (aantal dagen dat items in de recycle bin blijven)
    • Performance (server, dan wel application pool scheiding)
    • URL-scheiding (denk ook aan SSL)
  • Farm
    • Geo performance (hoe verder de servers van de gebruiker af staan, hoe meer dit de performance drukt)
    • Isolation
    • Exchange server settings

In bovenstaande rijtje zal rekening gehouden moeten worden met prioriteit en of er workarounds zijn. Zo wordt de hoofdnavigatie bijvoorbeeld standaard bepaald op sitecollectionniveau. Maar er zijn mogelijkheden om dit toch centraal te beheren. Bijvoorbeeld middels scripting, het ontwikkelen van een Service Application (als voorbeeld heeft Wouter van Vugt een Service Application gemaakt die dit zou kunnen, te vinden op codeplex), of 3rd-party tools.

Voor wat betreft autorisaties:

Wanneer je bijvoorbeeld een klantenportaal hebt en klanten kunnen zelf inloggen en deze portaal bestaat uit 1 sitecollection waar meerdere klanten een site hebben, dan zou klant A medewerkergegevens kunnen terugvinden van klant B.

Elke klant zou dus op zijn minst zijn eigen SC moeten hebben.

Als je er ook nog rekening mee houdt dat via de peoplepicker ook nog een hoop gegevens van gebruikers is terug te vinden, zou er wellicht zelfs voor gekozen moeten worden om klanten een eigen webapplication te geven, zodat de gebruikersprofielen echt geisoleerd worden.

Om verschillende authenticatiemethoden te gebruiken binnen 1 webapplicatie, was het in SharePoint 2007 nodig om webapplicaties te extenden. Dit betekend dat de webapplicatie via meerdere url’s te bereiken is. Voor elke authenticatie methode 1 url. Een belangrijk nadeel hierbij is, dat gebruikers niet meer eenvoudig url’s kunnen delen. De url die bijvoorbeeld voor interne medewerkers gebruikt worden, kunnen niet voor de klant gebruikt worden. In SharePoint 2010 is het niet meer nodig om webapplicaties te extenden.

Automating Business Processes Using InfoPath 2010 Forms with Integrated SharePoint Designer 2010 Workflows

Asif Rehmani (SharePoint-eLearning.com)

SharePoint Designer 2010 is een gratis tool. Het kan dan ook vaker voorkomen dat power users op eigen initiatief SharePoint Designer installeren en hier mee aan de slag gaan.

InfoPath 2010

In InfoPath 2010 is het mogelijk formulieren te maken voor SharePoint. In deze formulieren is het mogelijk om rules te defineren, welke te gebruiken zijn over meerdere velden. In InfoPath 2007 kon dig nog niet.

Voor het publiceren van formulieren zijn dezelfde opties beschikbaar als in InfoPath 2007:

  • Form Library
  • Site Content Type
  • Administrator approved

Om workflows te kunnen defineren

Workflow via Visio

Via Visio 2010 zijn workflows te maken die geimporteerd kunnen worden in SharePoint Designer. Deze Visio bestanden defineert het proces, maar niet de details. Deze zullen in SharePoint Designer nog geconfigureerd moeten worden.

Hier is wel Visio Premium voor nodig.

Indien Visio Services is ingeschakeld, kan de voortgang van workflowinstanties schematisch bekeken worden.

SharePoint Designer workflows

Vanuit een workflow kunnen nu ook velden uit het profiel van gebruikers uitgelezen worden!

In SharePoint 2007 waren er een aantal standaard workflows, waaronder de approval workflow. Met de komst van SharePoint 2010 en SharePoint Designer 2010 is het nu mogelijk om deze standaard workflow uit te breiden!

Het is nu ook mogelijk om site workflows te maken. Deze workflows zijn te exporteren en importeren, waardoor deze workflows te deployen zijn.

http://channel9.msdn.com/Learn/Courses/SharePoint2010Developer/Workflow/WhatsNewinSharePoint2010Workflow

Overview of Enterprise Content Management in SharePoint 2010

Bart Wessels (Microsoft)

Document ID

In SharePoint 2010 kunnen documenten een document ID meekrijgen. Om hier gebruik van te maken moet een feature geactiveerd worden, vervolgens moeten nog wat instellingen geconfigureerd worden.
Het grote voordeel van een dergelijk document ID, is dat deze documenten ook wanneer ze verplaatst worden gevonden kunnen worden. Op basis van het document ID kan een URL opgevraagd worden welke, ondanks dat het document verplaatst, gevonden kan worden.
Belangrijk is om vooraf goed na te denken over hoe men hier men mee om wil gaan.

Zie ook blog van BlairB: http://blogs.technet.com/b/blairb/archive/2009/10/20/new-document-id-feature-in-sharepoint-2010.aspx

Document Sets

Documenten kunnen nu samengevoegd worden tot een document set. Een document set kan bijvoorbeeld toegepast worden als dossiervorming. Aan een document set kan metadata toegevoegd worden. Deze metadata wordt dan opgeslagen in de onderstaande documenten. Ook kan er net zoals een gewoon document, een workflow gestart worden, of kan een gehele set gearchiveerd worden (naar een records management center).

Zie ook blog Didier Danse: http://didierdanse.net/blogs/dev_en/archive/2010/05/16/sharepoint-2010-all-about-document-set.aspx

Taxonomy

Aan items in SharePoint kunnen nu termen gekoppeld worden. Het koppelen van termen wordt mogelijk gemaakt door de Managed Metadata Service. Aan lists, libraries en content types kunnen kolommen toegevoegd worden die hiervan gebruik maken.

De termen zijn in categorien in te delen, waardoor bij een sitecolum aangegeven kan worden welke categorie termen gebruikt kan worden. Voor categorien kun je denken aan:

  • Afdelingen
  • Vertrouwelijkheid
  • Technieken
  • Methoden

Deze termen zijn te importeren.

Belangrijk om in de gaten te houden, is dat de wanneer documenten gekoppeld zijn aan managed metadata, clientapplicaties mogelijk dit niet ondersteuning, wat de user-experience ernstig benadeelt.

Meer info over Taxonomy, zie: Information Architecture and the Managed Metadata Service: A to Z van Dan Holme.

Zie ook: http://www.bing.com/videos/watch/video/governing-content-types-policies-and-taxonomy-services-in-sharepoint-2010/10tadfrt5

Templates

Nu is het ook mogelijk om direct vanuit Word een document template dat in SharePoint staat te openen. De templates die beschikbaar zijn, zijn de templates die staan in libraries waar je member van bent.

Manage your External Data using BCS

Asif Rehmani (SharePoint-eLearning.com)

Connecties naar externe systemen zijn te leggen met 2 manieren om te autoriseren:

  1. Inloggegevens opgeving tijdens het configureren van de koppeling. Dit betekend dat altijd verbinding wordt gemaakt met dezelfde credentials.
  2. Middels de Secure Store Service, kan een gebruiker verbinding maken met het externe systeem middels zijn eigen credentials. In de Secure Store worden credentials van gebruikers opgeslagen. Hierdoor kan er voor gezorgd worden dat wanneer je inlogd op SharePoint, wat je doet met AD-inloggegevens, je ook data kunt uitlezen uit een ander systeem waarvoor je aparta inloggegevens hebt gekregen.
    Voorheen werd deze service Single Sign-On genoemd.
    Zie: http://technet.microsoft.com/en-us/library/ee806889.aspx

In SharePoint 2007 heet de Business Connectivity Service, Business Data Connectivty service. De belangrijkste veranderingen zijn:

  1. Via SharePoint Designer kan de koppeling naar het externe systeem geconfigureerd worden, waar voor de BDC de configuratie nog verliep door het uitschrijven van XML-bestanden.
  2. Het is nu mogelijk om data uit het externe systeem te manipuleren.
  3. Bij de BDC was er een timer job die periodiek de data ophaalde uit het externe systeem. Hierdoor werd de data dus gekopieerd naar SharePoint. Aangezien de BDC read-only was, was dit mogelijk. Dit heeft een performance winst, maar maakt wel dat je data niet real time geleverd wordt.
    Bij de BCS wordt de data altijd via de externe connectie opgehaald. Er zal dus op performance issues gelet moeten worden.

De BCS kan gebruik maken van verschillende connecties. Voor de BCS is er geen vorm van (optimistic) logging. Wel is het mogelijk wanneer je connecties legt met bijvoorbeeld een web service, validatie toe te voegen.

Een koppeling middels BCS wordt gedefineerd op webapplicatie niveau. Hier moet met de architectuur rekening gehouden worden.

Building Simple Service Applications

Wouter Vugt (Code Counsel)

Dit is de enige sessie voor developers die ik gevolgd heb. Ik ben naar deze sessie gegaan, omdat ik eerder al gehoord en gelezen had dat het mogelijk is om je eigen Service Application te maken voor SharePoint 2010, maar ik mij nooit een goed beeld heb kunnen vormen van wanneer een Service Applicatie te maken. Op deze vraag hoopte ik antwoord te krijgen, alhoewel dit niet helemaal gelukt is, heb ik wel een en ander meegenomen.

Wouter heeft in de SharePoint special van het .Net magazine van september 2010 een artikel geschreven dat precies hier over gaat. Gelukkig is hier ook een digitale versie van: http://dotnetmag.nl/Artikel/1317/SharePoint-SSP-twee-verdiende-plusjes-erbij/NITF?TB_iframe=true

Wouter gaf als tip de developertools CKSDEV. Deze tool is beschikbaar via cksdev.codeplex.com

Dit is een tool waar Wouter Vugt zelf ook aan heeft mee gewerkt. Aangezien ik tijdens het schrijven van deze samenvatting mail binnen krijg van Jurjan Brust, collega van Clockwork, waarin ook hij deze tool aanraadt, denk ik dat deze het vernoemen waard is.

This project extends the Visual Studio 2010 SharePoint project system with advanced templates and tools. Using these extensions you will be able to find relevant information from your SharePoint environments without leaving Visual Studio. You will have greater productivity while developing SharePoint components and you will have greater deployment capabilities on your local SharePoint installation.

Wouter heeft ook een demoproject, waarin te zien is hoe een Service Application te ontwikkelen is: woutersdemos.codeplex.com

Aantal redenen waarom je Service Applicaties zou kunnen willen ontwikkelen.

  • Wanneer je meer samenwerking wil tussen sitecollections
  • Voor heavy duty tasks
  • Wanneer je integratie wil met andere applicaties

Service applications zijn nieuw in SharePoint 2010. In SharePoint 2007 heb je wel de Shared Service Provider. Hiermee kun je een gebruik maken van een bepaald aantal services die bij SharePoint geleverd worden. Met de komst van Application services is het nu mogelijk om zelf services te maken, services te koppelen aan meerdere webapplicaties (kon in SP 2007 ook al), maar ook Service Applications meerdere keren koppelen aan een webapplicatie. De flexibiliteit is daarmee vele malen groter geworden. Tevens zijn er ook een hoop aantal nieuwe Service Applications beschikbaar gekomen. In bijlage 1 een overzicht hiervan.

Information Architecture and the Managed Metadata Service: A to Z

Dan Holme (Intelliem)

Door de Managed Metadata Service te configureren, kan er over meerdere sitecollections (en webapplicaties en farms) heen, gebruik gemaakt worden van dezelfde metadata.

Concreet betekend dit, dat er gebruik gemaakt kan worden van Taxonomy, Folksonomy en Content Types.

Taxonomy en folksonomy

Op internet zijn er discussies te vinden over het verschil tussen taxonomy en folksonomy. De insteek is dat folksonomy unmanaged keywords bevat en taxonomy bevat managed keywords. Wel is het mogelijk als beheerder termen uit de folksonomy over te nemen naar de taxonomy. Wanneer een informatiebeheerder ziet dat bepaalde termen veel gebruik worden en centraal beheerd zouden moeten worden, kan dit dus eenvoudig.

Een informatiebeheerder kan ook synoniemen opgeven van woorden, zodat deze als dezelfde term beschouwd worden. Tevens voorziet de managed metadata service in multilingual support. De talen die ondersteund worden, zijn de talen waarvoor een language pack is geinstalleerd.

Omdat het beheren van termen feitelijk geen werk is voor een beheerder, maar iets is wat bij de business hoort, is het mooi dat het mogelijk is om terms te beheren zonder dat hiervoor toegang voor de Central Administration nodig is. Vanuit een sitecollection kan een gebruiker met voldoende rechten de taxonomy onderhouden.

Terms in de taxonomy zijn als volgt ingedeeld:

Er kunnen term groups aangemaakt worden. Op dit niveau kunnen rechten ingeregeld worden. Zo is het bijvoorbeeld voor te stellen dat er een term group aangemaakt wordt voor termen aangaande HR, waarvoor enkele medewerkers van HR geautoriseerd worden. Zij onderhouden dan de termen met betrekking tot HR. Daarnaast kan er een term group gemaakt worden voor de afdeling Informatie Management, welke zorgdraagt voor de overige termen.

Binnen term groups worden term sets aangemaakt. Een term set kan bijvoorbeeld zijn: Departments, Confidentiality, of Techniques. Wanneer in een sitecollection een sitecolumn voor managed keywords aangemaakt wordt, moet daarbij aangegeven worden uit welke term set de terms moeten komen. Binnen een term set kunnen termen en termsets aangemaakt worden. Zo kan dus een tree opgebouwd worden van term sets.

Een beheerder heeft de mogelijkheid om terms uit verschillende termsets aan elkaar te koppelen, zodat duidelijk is dat ze hetzelfde betekenen, maar thuishoren in beide term sets. Een beheerder kan er ook voor kiezen om een term simpelweg dubbel aan te maken, voor wanneer een woord meerdere betekenissen heeft.

Door terms te gebruiken in lijsten en libraries, is er eenvoudig functionaliteit beschikbaar om te filteren op de items.

Content types

Het meest interessante vond ik de mogelijkheid om content types te delen over meerdere sitecollections. In de Managed metadata service kan opgegeven worden welke sitecollection leading is (Site content hub). Nadat dit opgegeven is in de Managed metadata service, wordt deze waarde read-only! De content types van deze sitecollection worden dan naar de andere sitecollections gepubliceerd. Dit wordt gedaan door middel van timer jobs. Het kan dus even duren voordat een wijziging gepubliceerd is.

Aangezien er maar 1 sitecollection opgegeven kan worden, raadt Dan Holme aan om een aparte sitecollection te maken, specifiek voor het specificeren van content types.

The file manifest.xml does not exist in the solution package

When creating a deployment script I ran into the following error during the installation of the package:

“The file manifest.xml does not exist in the solution package”
This was after I added about 200 images to the solution.

After a while I found out that the problem occurred only after the solution package reached the size of 1440 KB. It turns out that this is a backwards compatibility ‘feature’ for the good old floppy’s.

After adding a couple of settings in my .ddf file everything works exactly the way it should be.

Apply the following settings to your .ddf file

.Set CabinetFileCountThreshold=0
.Set FolderFileCountThreshold=0
.Set FolderSizeThreshold=0
.Set MaxCabinetSize=0
.Set MaxDiskFileCount=0
.Set MaxDiskSize=0

Create the .wsp again using makecab and there you go!

Thanks to

Mark Beij http://blog.martmuller.nl/DisableSizeLimitsForWspCabFiles.aspx

Changing the Background Color for ActiveX Controls in SharePoint 2007

You may run into problems if you have a dark CSS background color for your site which is defined on the body element. The ActiveX control will show this dark color as its background color even if it is a child of another element with a light background color. This makes it difficult , if not impossible, to read and work with the content in the control.

On tinyfly.com I’ve found the solution for this:

body {
/* Background color for ActiveX items like “Edit in Datasheet */
background-color: white;
}

form#aspnetForm {
/* real background color for the site as a whole */
background-color: #002842;

/* to be sure it fills the whole page vertically */
height: 100%;
}

CQWP problems

I’ve had huge trouble finding out why my Content Query WebPart wasn’t showing the data as I configured it to do.

Luckily I’ve found the following very interesting posts:

Part 3 really helped me with my problems, but all the posts in this serie are very interesting.

It turns out that there is a inconsistancy in the way SharePoint saves its data in the database and the way SharePoint queries the same data. Item data gets saved in the AllUserData table. In this table there are collumns for general use e.g. the columns have names like nvarchar21, nvarchar22, etc. These columns will be used to store data of lists and libraries.

When a contenttype gets used by multiple subsites, there is no gaurantee that the fields get saved in the same columns. This wouldn’t be a problem, if SharePoint create the right query to retrieve the data from the right columns..

Well, I suggest just take the time to read the post. It really makes things clearer.