All posts by Ayman El-Hattab [MVP]

Ayman El-Hattab is a Technology Evangelist @ Nintex & a recognized industry expert focusing on helping organizations plan, design, develop, build, govern and operate enterprise collaboration solutions. You can follow Ayman on Twitter @AymanElHattab to stay updated on his upcoming activities.

The Evils of AllWebs !

As I have been working to develop an event handler that will be used to mirror a Document Library, I’ve come across an interesting tid bit that was frustrating at first.

It’s worth mentioning that in MOSS 2007, Event Handlers execute in the context of the current user rather than the process user in SharePoint 2003 .

The event handler contained the following piece of code :
using( SPWeb web = SPContext.Current.Site.AllWebs[guid] )
// code

When running as an administrator, the event handler worked fine. However, if you switch to a non-administrative user that doesn’t have full control of the site, you’ll get a lovely exception. The problem is that you must have full control of the site to be able to use the AllWebs property.

To solve this, try the following code:

using( SPWeb web = SPContext.Current.Site.OpenWeb(guid) )
// code

Happy SharePoint Coding 😀


Multiple Document Upload issue in MOSS 2007

I recently had an issue when trying to upload multiple documents to SharePoint 2007 Document Library . I receive the following error :” Cannot run Windows SharePoint Services on this page” .

To fix this issue :

1) Go to the Central Administration from Start > Microsoft Office Server à SharePoint Central Administration
2) Choose the Application Management tab
3) Choose Authentication providers from Application Security
4) Change the web Application to your web application then select the zone that failed ( Mine was Default )
5) Disable the client integration by selecting No
6) Return to the default zone again
7) Enable the client integration by choosing “Yes”
8) Now you can use the multiple upload feature

Create KPIs Programmatically in PerformancePoint 2007

I created this web project while I was investigating the performancepoint API, it was really a very hard and silly task so I decided to share this code with you 🙂

Firstly, Add a reference to :
\Microsoft Office PerformancePoint Server\3.0\Monitoring\Assemblies\Microsoft.PerformancePoint.Scorecards.Common.dll

using Microsoft.PerformancePoint.Scorecards;
using System.Net;

public partial class _Default : System.Web.UI.Page
private Kpi kpi_wows;
private PmService Publisher;

protected override void OnInit(EventArgs e)
Publisher = (PmService)PmService.CreateInstance(“http://localhost:40000/webservice/pmservice.asmx”);
Publisher.Credentials = CredentialCache.DefaultNetworkCredentials;

protected void Page_Load(object sender, EventArgs e)

private void CreateKPIandSetSomeProperties()
// Create a new kpi instance
kpi_wows = Kpi.CreateNew();
// Setting its name
kpi_wows.Name.Text = “zzz”;
// Setting the Owner
BpmPropertyUser Owner = new BpmPropertyUser();
Owner.Login = @”Server\Administrator”;
kpi_wows.Owner = Owner;
// setting the actual
KpiMeasure ActualMeasure = new KpiMeasure();
ActualMeasure.Guid = Guid.NewGuid();
ActualMeasure.ModelCurrent = 345M;
BpmPropertyText ActualName = new BpmPropertyText();
ActualName.Text = “The Actual”;
ActualMeasure.Name = ActualName;
ActualMeasure.ValueSource = ValueSources.MaxRollup;
kpi_wows.Actual = ActualMeasure;
// Setting the Target
Target ATarget = new Target();
ATarget.Guid = Guid.NewGuid();
ATarget.ModelCurrent = 656M;
BpmPropertyText TargetName = new BpmPropertyText();
TargetName.Text = “The Target”;
ATarget.Name = TargetName;
// Scoring Pattern
ATarget.Pattern = KpiPattern.DecreasingIsBetter;
// Banding Method
Banding TargetBanding = new Banding();
TargetBanding.Type = BandType.Normalized;
TargetBanding.ActualWorst = 999M;
TargetBanding.SpreadMinimum = 0M;
TargetBanding.SpreadMaximum = 1.2M;
ATarget.Banding = TargetBanding;
ATarget.IndicatorId = new Guid(“70b22c72-6523-487d-ae4a-ad607431584f”);
ATarget.IsCustomCurrentFormula = true; // If true, then CurrentFormula is used to compute the current value.
//ATarget.CurrentFormula = “————–MDX Formula Goes Here ————-“;
ATarget.CurrentFormula = “0”;
//Adding Description
kpi_wows.Description.Text = “This is a kpi created by the object model”;
// Assigning Permissions
Microsoft.PerformancePoint.Scorecards.Membership AdministratorMembership = new Microsoft.PerformancePoint.Scorecards.Membership();
AdministratorMembership.Login = @”Server\Administrator”;
AdministratorMembership.Role = “Editor”;
Microsoft.PerformancePoint.Scorecards.Membership ReaderMembership = new Microsoft.PerformancePoint.Scorecards.Membership();
ReaderMembership.Login = @”Server\ayman_elhattab”;
ReaderMembership.Role = “Reader”;
// Assigning the Responsible Person
kpi_wows.Owner.Login = @”Server\Administrator”;

// publishing the KPI


Create Scorecards and Dashboards Programmatically in PerformancePoint

Hi All, I managed to create a Dashboard and a Scorecard programmatically, I failed to find any resources, articles or anything online talking about this subject.
That’s why I decided to share it online with you!

Here is the web project I created while I was investigating The PerformancePoint API ..

Firstly, Add a reference to :\Microsoft Office PerformancePoint Server\3.0\Monitoring\Assemblies\Microsoft.PerformancePoint.Scorecards.Common.dll
using Microsoft.PerformancePoint.Scorecards;
using System.Net;

public partial class _Default : System.Web.UI.Page
private Scorecard AScoreCard_wows;
private PmService Publisher;

protected override void OnInit(EventArgs e)
Publisher = (PmService)PmService.CreateInstance(“http://localhost:40000/webservice/pmservice.asmx”);
Publisher.Credentials = CredentialCache.DefaultNetworkCredentials;
protected void Page_Load(object sender, EventArgs e)
protected void CreateScoreCard()
Guid AGuid;
// create a new scorecard instance
AScoreCard_wows = Scorecard.CreateNew();
// Setting the name property;
BpmPropertyText NameProperty = new BpmPropertyText();
NameProperty.Text = “The ScoreCard”;
AScoreCard_wows.Name = NameProperty;
AScoreCard_wows.Description.Text = “This Scorecard was created by code”;
// Setting the owner property
AScoreCard_wows.Owner.Login = @”Server\Administrator”;
// Configuring the scorecard view
ConfiguredView ACofiguredView = new ConfiguredView();
GridViewDefinition ParentChildDefinition = new GridViewDefinition();
GridHeaderItem ParentX = new GridHeaderItem();
AGuid = Guid.NewGuid();
ParentX.Guid = AGuid;
ParentX.DefinitionGuid = AGuid;
ParentX.DisplayText = “ParentX”;
ParentX.DimensionName = “Scorecard__”;
ParentX.DimensionValue = “cd30315e-bd40-4977-b21b-cbb47cc83494”; // Guid of KPI
ParentX.HeaderType = ScorecardNodeTypes.Kpi;
ParentX.Depth = 1;
GridHeaderItem ChildX = new GridHeaderItem();
AGuid = Guid.NewGuid();
ChildX.Guid = AGuid;
ChildX.DefinitionGuid = AGuid;
ChildX.DisplayText = “ChildX”;
ChildX.DimensionName = “Scorecard__”;
ChildX.DimensionValue = “e9ec1e6b-8c7e-4f7d-b87d-28cad4b29d7f”; // Guid of KPI
ChildX.LinkedKpiId = new Guid(“e9ec1e6b-8c7e-4f7d-b87d-28cad4b29d7f”);
ChildX.HeaderType = ScorecardNodeTypes.Kpi;
ChildX.Depth = 2;
GridHeaderItem ChildY = new GridHeaderItem();
AGuid = Guid.NewGuid();
ChildY.Guid = AGuid;
ChildY.DefinitionGuid = AGuid;
ChildY.DisplayText = “ChildY”;
ChildY.DimensionName = “Scorecard__”;
ChildY.DimensionValue = “8878d533-b7b7-40f7-8772-4da81c54c85b”; // Guid of KPI
ChildY.LinkedKpiId = new Guid(“8878d533-b7b7-40f7-8772-4da81c54c85b”);
ChildY.HeaderType = ScorecardNodeTypes.Kpi;
ChildY.Depth = 2;
GridHeaderItem ActualColumn = new GridHeaderItem();
AGuid = Guid.NewGuid();
ActualColumn.Guid = AGuid;
ActualColumn.DefinitionGuid = AGuid;
ActualColumn.DisplayText = “Actual”;
ActualColumn.DimensionName = “Scorecard_Measures__”;
ActualColumn.DimensionValue = “Actual”; // Guid of KPI
ActualColumn.HeaderType = ScorecardNodeTypes.KpiActual;
ActualColumn.Depth = 1;
GridTargetSettings ActualColumnTargetSettings = new GridTargetSettings();
ActualColumnTargetSettings.ShowImage = true;
ActualColumnTargetSettings.ShowScore = true;
ActualColumnTargetSettings.RollupType = RollupTypes.AverageWeighted;
ActualColumnTargetSettings.ScoreType = ScoreTypes.Normalized;
ActualColumn.TargetSettings = ActualColumnTargetSettings;
GridHeaderItem TargetColumn = new GridHeaderItem();
AGuid = Guid.NewGuid();
TargetColumn.Guid = AGuid;
TargetColumn.DefinitionGuid = AGuid;
TargetColumn.DisplayText = “Target”;
TargetColumn.DimensionName = “Scorecard_Measures__”;
TargetColumn.DimensionValue = “Target”; // Guid of KPI
TargetColumn.HeaderType = ScorecardNodeTypes.KpiTarget;
TargetColumn.Depth = 1;
GridTargetSettings TargetColumnTargetSettings = new GridTargetSettings();
TargetColumnTargetSettings.ShowImage = true;
TargetColumnTargetSettings.ShowScore = true;
TargetColumnTargetSettings.RollupType = RollupTypes.AverageWeighted;
TargetColumnTargetSettings.ScoreType = ScoreTypes.Raw;
TargetColumn.TargetSettings = TargetColumnTargetSettings;
ACofiguredView.GridViewDefinition = ParentChildDefinition;
// Publishing the ScoreCard
protected void CreateDashBoard()
//Create An Instance
ADashboard_wows = Dashboard.CreateNew();
// Setting the Name
ADashboard_wows.Name.Text = “Ayman’s Dashboard__”;
//Setting the owner
ADashboard_wows.Owner.Login = @”Server\Administrator”;
//Adding A Page
// Creating a Page
DashboardElementContainer APage = new DashboardElementContainer();
APage.Guid = Guid.NewGuid();
APage.Name.Text = “Ayman’s Page__”;
APage.Owner.Login = @”Server\Administrator”;
// Creating A Zone
DashboardElementContainer AZone = new DashboardElementContainer();
AZone.Guid = Guid.NewGuid();
AZone.Name.Text = “Ayman’s Zone__”;
AZone.Owner.Login = @”Server\Administrator”;
// Creating a dashboard Item ( scorecard )
DashboardItem Item = new DashboardItem();
Item.Guid = Guid.NewGuid();
Item.UnderlyingElementId = AScoreCard_wows.Guid;
Item.Name.Text = “Ayman’s Item__”;
Item.Owner.Login = @”Server\Administrator”;
// Adding the Item to the zone
// Adding the zone to the page
// Adding the page to the dashboard