Archive for June, 2007
Publishing and Synchronizing Excel 2007 Tables to SharePoint Lists
29 June 2007Excel 2007 Add-in: Synchronizing Tables with SharePoint Lists:< ?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
MsoNormal style=”MARGIN: 6pt 0cm 3pt 11.35pt”>http://www.microsoft.com/downloads/details.aspx?familyid=25836E52-1892-4E17-AC08-5DF13CFC5295&displaylang=en
This add-in accompanies the MSDN article “Publishing and Synchronizing Excel 2007 Tables to SharePoint Lists“, available in the Related Links section. The add-in allows you to publish a read-write list to Windows SharePoint Services.
Popularity: 1% [?]
Creating Programs in Microsoft Project Server
29 June 2007- First, you create a brand new Project Schedule in Microsoft Project Professional. Publish this project and specify a name for the SharePoint site.
- For any new projects that should be part of the same SharePoint site, create those schedules in Project Professional and specify the same location as the first one.
ct Professional and Project Server 2007 fully support master projects, so you might create the first schedule as an empty one, then after all the others are creating, insert the links into the master.
-Bill
sition:absolute” alt=”" width=”0px” height=”0px” src=”http://c.live.com/c.gif?NC=31263&NA=1149&PI=88469&RF=&DI=3919&PS=85545&TP=projectnation.spaces.live.com>1=projectnation”>
Popularity: 1% [?]
Case Study for Broadcom NTSW Portal Upgrade
27 June 2007Introduction
This is the case study of the SharePoint 2003 Migration Project that we did last month.
Company profile
Broadcom Corporation is a major technology innovator and global leader in semiconductors for wired and wireless communications. Broadcom products enable the delivery of voice, video, data and multimedia to and throughout the home, the office and the mobile environment. We provide the industry’s broadest portfolio of state-of-the-art, system-on-a-chip and software solutions to manufacturers of computing and networking equipment, digital entertainment and broadband access products, and mobile devices. These solutions support our core mission: Connecting everything®.
Broadcom is one of the world’s largest fabless semiconductor companies, with 2006 revenue of $3.67 billion, and holds over 2,000 U.S. and 800 foreign patents, more than 6,000 additional pending patent applications, and one of the broadest intellectual property portfolios addressing both wired and wireless transmission of voice, video and data. Broadcom Class A shares trade on the NASDAQ National Market® under the symbol BRCM.
Business situation
Network Switching Group of Broadcom has very important role in the Broadcom Technology design and development. They are using a completely customized SharePoint 2003 Implementation for Document/Information Sharing and Collaboration. This solution does not fulfill their requirements for number of reasons which are
- Inefficient Search
- No Workflow Support
- No Identification for Content and Metadata
- No Item Level Security
- Bad Navigation
- Hard to Customize
- Slow Response Time
ons NTSW Group decided to upgrade their portal to Microsoft Office SharePoint Server 2007. MOSS 2007 addresses all problems that NTSW Group was facing. MOSS 2007 offers the following
· Enhanced Search with People and Content Search
· Content Management
· Out of the Box Workflow’s and Custom Workflow Development
· Improved Collaboration Facilities
· Document and Records Management
· Excel Services for Excel Solutions
· Forms Server for InfoPath 2007 forms for Automation of Business Process
Technical situation
Broadcom NTSW Department had an Implementation of SharePoint Portal Server 2003 (NTSW Portal) that they use for collaboration and document and information sharing. Each Library and list contain custom metadata properties to identify the content and portal also includes Custom Workflow for Document Approval, Completely ramped up User Interface, Custom Web parts for navigation, more than 20 custom Area Definitions and 15+ Custom Lists Definitions. This portal was in use for 2+ years and the overall database size was more than 10 GB.
Solution
Using Xavor’s SharePoint Upgrade methodology, Development team initially completed some test upgrades by creating a test environment. Later Xavor team developed all Custom Site Definitions for SharePoint 2007 based on the existing Area Definitions of SharePoint Portal Server 2003. All the Old Custom Lists were re-developed using SharePoint 2007 Feature Object Model. 21 SharePoint Site Definition upgrade files were developed that caters all the existing and new MOSS 2007 Functionality. User Interface was completely designed based on SharePoint 2007 Master Pages and Page Layouts concept with custom CSS Files. All the Custom Web parts were obfuscated and were re-developed using SharePoint 2007 object model.
Xavor team also developed bunch of utilities to automatically install and copy content from old to new portal as well as deleting and installing old Webparts instances from the existing portal. These post upgrade utilities includes
- SharePoint 2003 Discussion boards to SharePoint 2007 Copier
- SharePoint 2003 Error Webparts Remover Based on Site Definitions
- Command Line Tool for Installing, Adding, Deleting and Reading Page web parts
- Tree view Enable and Custom Event Handler Cleaner
- Content Types Optimizer
- SharePoint 2007 Webparts Installer and adder to Upgraded Portal based on New Site Definitions
ame up with a complete solution of all the files necessary to upgrade this portal. This solution files includes New Site Definitions, Site Definition upgrade files, Site Features, Web parts, Master Pages and Page Layouts, CSS Files and post upgrade utilities.
Deployment Model
The overall deployment model was also finalized by team. There 5 different platforms to deploy the solution. First the development team will develop and deploy the solution to its development environment and then they will do a distributed Farm level testing on the content. Broadcom will provide 3 platforms which are Development, Quality Assurance and Production. Xavor team will do its initial deployment on Development and will use it for testing. QA platform will be used for UAT (User Acceptance Testing) and on customer approval, Production Environment will be migrated.
SharePoint 2007 Migration
Development team decided to go for Gradual or Side by Side upgrade which gives them flexibility to revert to Version 2.0 in case the upgrade fails. Another challenge that came across was the huge size of database which causes the revert process to timeout. Xavor team done 10 test cycles to confirm the upgrade should be done in one attempt.
Adding into the Xavor’s tasks was a last minute change of hardware decision by the client. The decision was taken by considering the low performance and disk space of the server farm. This decision further added more pressure on 48 hour downtime window for upgrade by the fact that they have to re-create the existing portal to a new hardware within this time.
Within all these hiccups and issues Xavor team was able to completely and successfully upgrade the existing portal to Microsoft Office SharePoint Server 2007 within the 48 time window and the end users does not face any issue because they logged into the portal with same look and feel and working methodology.
Xavor Migration Steps
Ø Create Existing SharePoint Portal Server 2003 Portal on New Hardware
Ø Perform Pre-Upgrade Steps (.NET Framework 3.0, Pre-upgrade Scan Tool) and Resolve Issues
Ø Install Microsoft Office SharePoint Server 2007 and Configure for Gradual Upgrade
Ø Place Newly Developed Site Definition Files and Site Definition Upgrade File on the Server
Ø Install Lists and Library Features
Ø Configure Site URL Mapping before Upgrade
Ø Place Master Pages, CSS and Layout Files
Ø Migrate Complete Portal Site Collection
Ø Uninstall OLD V.2. Web parts and Install Custom Web parts
Ø Run Custom Utilities to Place Web parts on Site pages and Migrate Content Cant be Migrated during migration (e.g. Discussion Boards, Content Types), Enable Tree view on all Sites
Ø Finalize Upgrade and run the Install Feature Activity
Ø Uninstall SharePoint Portal Server 2003 and Windows SharePoint Services 2003
Ø Remove Portal URL mapping and Delete Old Databases
Ø Test the Upgraded Portal
Business Value for Customer
After the upgrade Customer got the following improvements in the portal
· Greater consistency in navigation, and great level of standardization in look and feel, facilitating users in gathering information faster
· Integration of other project web pages with the NTSW Portal, so that project information does not need to be split across many sites
· Customizing web parts and areas to provide more meaningful and more readable information e.g. the information displayed for files
· Greater traceability and visibility in document revisions
· Providing an override privilege on locked (checked out ) files for certain user groups
· Creation of a team web pages, where members of each team may find links and shortcuts to (intranet) sites and pages relevant to their respective areas of work
· Greater association of metadata with content, thus providing more advanced search capabilities
· A more simplified means by which functional or project content owners may update their current sites or inform others of changes, thus reducing the amount of incorrect or outdated information being pulled by users of that content
· Improved Normal and Advanced Search
· Great Number of Out of the Box Web parts
· Content Management
Products and Technologies used
· Microsoft Office SharePoint Portal Server 2003 SP2
· Windows SharePoint Services 2.0 SP2
· Microsoft Office SharePoint Server 2007
· Windows SharePoint Services 3.0
· Microsoft SQL Server 2000 SP4
· Microsoft SQL Server 2005 SP2
· Visual Studio.NET 2005
· ASP.NET 2.0 Master Pages and Page Layouts
· ASP.NET 2.0 Web parts
· XML, C#
· Windows Forms
· Ajax
· ASP.NET Web Applications

Popularity: 1% [?]
70-631 Configuring Windows SharePoint Services Version 3.0 Passed
27 June 2007Today I have passed 70-631 exam got got 950 Marks. Thanks to Microsoft for Developing all the exam from Planning and Configuration Guides. I Read almost 6 Guides other than the books that I have in last two months. The exam was not difficult except for the core Networking Exam like NLB and Resource Sharing. I am now looking forward to 70-630 of MOSS 2007 Configuration for next week.
Will post more.
Jerry
bsolute” alt=”" width=”0px” height=”0px” src=”http://c.live.com/c.gif?NC=31263&NA=1149&PI=88469&RF=&DI=3919&PS=85545&TP=yasirbutt.spaces.live.com>1=Yasirbutt”>
Popularity: 1% [?]
Managing Project Professional’s Active Cache Size and Location
27 June 2007Two parameters help you manage the size and location of Project Professional 2007’s Active Cache (HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\MS Project\Settings):< ?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
MsoListParagraphCxSpFirst style=”MARGIN: 6pt 0cm 0pt 47.35pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo3; mso-add-space: auto”>1. CacheLocation
2. CacheSizePerProfile
These two parameters are also accessible via Project Pro’s menu: Tools -> Local Project Cache -> Cache Settings
It is thus recommended to control via a Group Policy Object (GPO) these two parameters specially when Proj Pro. is deployed in a Terminal Server/Citrix environment.
For more information on how to use GPO with Office 2007 please refer to the following documents:
¾ Enforce settings by using Group Policy in the 2007 Office system
¾ 2007 Office System Administrative Templates (ADM)
Please note 200MB is the minimum recommendation for the Cache Size Limit.
Popularity: 1% [?]
Error Error in Windows Vista
27 June 2007

I got this error message today using Windows Vista. It is a new one to me. I’m wondering if there is an error report for errors in error reports. After tomorrow I’m back on WinXP and am looking forward to it. It is probably a case of “the devil you know” more than anything, but my Vista experience has been less than “WOW!”
In a way, the ultimate OS is one which is invisible. Vista is far from that. WinXP was much more understated and hasn’t really let me down so I see no need for gratuitous change. Sometimes, as Mies said, “Less is More”.
Popularity: 2% [?]
Migrating from MSDE to SQL2005
25 June 2007<black sheep>
This blog is a move away from the scenario based blogs on PS2007 that I’ve been writing, instead it’s an overview of a situation that I think will become more common as organisations upgrade their project server databases (and WSS2.0) to SQL2005 (either from SQL2000, or in some cases there is a requirment to do it from MSDE). Normally this is done by the IT guys, but of course it’s not as straight forward as they first think.
This blog comes about from direct customer experience, and I don’t necessarily have all the answers to hand, but it describes the approach I took and the pitfalls along the way. Also, most of it is written from memory so use this as a guide only!
Existing environment - the customer had a single server installation of PS2003 SP2a which had been running for about a year. The installation used MSDE and WMSDE on the production box, both installed by during the initial installation. MSDE is used for the Project Server databases, and WMSDE is used by WSS2.0 (the main differences between the two databases is that WMSDE removes the 4GB size restriction)
Desired environment - a two server installation, leaving the existing application server alone, but moving the databases to a dedicated SQL2005 database server.
Installation steps
Step 1 - install SQL on the database server
The first job was to install SQL2005 SP1 on the new server. This was just a quesiton of following the instructions. The SQL2005 setup is different from SQL2000 so if you are not used to it then try it first. SP2 had just been released, but we decided it was too risky to include this in the equation, so we stuck with SP1. The SQL2005 install includes Analysis Services, so everything is nicely tied up in one installation and one SP install. There aren’t any instructions for installing SQL2005 for use with ProjectServer 2003, so I’ve given you a few screen shots to help.
At the end of setup UI, SQL is ready to install and it gives a brief summary.
Once the database is installed, it needs to be managed. You need to install the workstation components in order to install the SQL Server Management Studio.
Once everything is installed, it’s time to install SP1.
Step 2 - create a new PS database.
My customer wanted a test environment creating in addition to the live environment, so I created a new DB and then ran the setupdb.cmd command to create the PS tables etc. This has the added advantage of create the correct roles for ProjectServer. The standard websps.sql script that setupdb calls need to be modified as the SQL statements between 2000 and 2005 are different, and websps.sql needs to be modified as below.
- Line 8781: select WASSN_ID from MSP_WEB_ASSIGNMENTS WAT2 WITH (index…
- Line 19456: select WASSN_ID from MSP_WEB_ASSIGNMENTS WA WITH (index …
- Line 26315: select WASSN_ID from MSP_WEB_ASSIGNMENTS WAT2 WITH (index…
of these modifications can be found in the references section
Once the database is created, you’ll need to upgrade it to SP2a. Again, you’ll need to modify websps.sql in the SP2a installation directory as above.
This should give a configured database, and allows us to test the connectivity from our application server to the db server.
If your existing system isn’t on SP2a, then I would perform an SP2a upgrade prior to moving any databases.
Step 3 - restore the existing MSDE database
Take the existing database from MSDE and restore it onto the db server. For this I simply stopped the MSDE service, copied over the database files, and attached them an empty database on the db server. Very simple indeed. I’ve seen posts that say that the database needs to be run in SQL2000 compatibility mode, but this wasn’t an issue for me.
Step 4 - use Editsite to configure the ProjectServer database info.
I restarted MSDE on the app server, and then ran editsite. Just to be sure, I always run editsite to check everything is okay. It’s also a good way to verify database names and role names etc. I made sure using Editsite and SQL Management Studio that the roles were correct etc, and then edited the existing ProjectServer instance in Editsite to reflect the new db server. This part of the installation involved lots of checking and tweaking of the roles etc before getting it working.
Step 5 - migration of WSS databases
This should have been simple, as there are various KB articles (referenced) on how to move WSS2.0 databases. However, I was unsuccesful in being able to move the databases and retain the integrity of the system, I think in part because when you do a WSS2.0 install onto WMSDE lots of decisons are taken for you, and I couldn’t access the configuration database once I’d moved it. So the upshot was to export the WSS data, run wsswiz to remove the ProjectServer templates (I’m not sure if this is exactly necessary but I did it anyway) then remove WSS2.0 from the app server, remove WMSDE, reinstall WSS2.0 and point the installation to the new db server, run wsswiz to reconfigure WSS and PS to talk to each other, install the WSS SP2a upgrade (from ProjectServer SP2a), run PSCOMplus to set the identity for WSS, link PS to the new WSS instance (via the ProjectServer Admin page), and import the WSS data (sites, docus etc) and then link the WSS sites back to the projects. All in all there is a lot to remember here, and not too much is documented. How I love WSS!
This gives us a system that is now does exactly what we had before, but on a new database server.
Step 6 - Analysis Services
ProjectServer 2003 needs the following hotfix applied before it will connect to analysis services - KB 905386. Note the scripts detailed will need to be run on each projectserver database. There is much to download and update here, so expect it to take a while. Plus MS can take 4+ hours to get the hotfix to you, so get it a few days beforehand.
Step 7 - Test environment
Using editsite, a test environment was created that used the original database I created using the setupdb.cmd command. Remember that this database needs updating to SP2a, plus have the analysis services hotfix scripts run against it. I had big issues here, the existing migrated database would connect, but not the new one, and I kept getting the following error "Cannot connect to <database> on <server> server" . It came down to resetting the passwords for the SQL users (MSProjectServerRole etc). Once this was fixed everything worked okay, but it stumped me for a while as I checked and rechecked everything. Plus the error came back immediatley, and I didn’t at first think it was a permissions problem.
References
SQL statement modifications - http://blogs.lv0.net/mpatest/archive/2005/11/18/182.aspx
Moving WSS databases - http://www.microsoft.com/technet/windowsserver/sharepoint/v2/movewsdb.mspx; KB 905386
Analysis Services hotfix - KB 905386; http://support.microsoft.com/default.aspx/kb/921116/
SQL2005 and ProjectServer 2003 issue - kb917401
Credits - thanks to Brian Smith, Bill Raymond and Kate Simpson and my customer - they are all unwitting collaborators.
The end
As is usual, 5% of the work above took 90% of the effort, it’s always just one or two snags that take the time!
enjoy…. Ben.
kltd.spaces.live.com>1=Appleparkltd”>
Popularity: 5% [?]
Creating Issues and Linking to Tasks. Better than task notes?
23 June 2007There are some limitations with the task notes field and the PSI which are discussed elsewhere on the blogs with a potential workaround of using VBA to access the RTF information.
Another workaround you might consider is to use SharePoint and the Project Workspaces and instead of having a task note use the issues or risks lists or document library associated with the project.
In the attached sample I have modified the LoginDemo sample with an additional button that creates a new issue list item in the project workspace. If you don’t create a workspace - or click the button before the workspace has been created by the queue then you will discover how much error handling I have coded in (none!). As well as creating an issue I have modified the project creation piece to also create a task in the project - and then finally I create a link between the new issue and this single task using the PSI ObjectLinkProvider web service. I’ve included the code below in the posting for the main part of the application which is the only .cs file I manually changed from the original LoginDemo. I’ve commented my changes so you can either make just the mods or use the attached zip of the full modified LoginDemo. If you just modify then note you will also need a reference to Microsoft.SharePoint and a web reference to the Object Link Provider web service.
Once you have a link then this is visible in the Project Center view both at the task level - you could also link at the project level. The extra bonuses of using a WSS list include alerts, RSS feed and the ability to attach other files - and if you really want to get clever then you can implement some of the WSS workflow on the inserted issue. Much better than tasks notes! One possible extension of this could the the inclusion of content in a workspace template and then linking up the documents to projects/tasks based on an event.
using System; using System.Data; using System.Drawing; using System.Net; using System.Text; using System.Windows.Forms; using System.Web; using System.Web.Services.Protocols; using System.Threading; using Microsoft.SharePoint; using PSLibrary = Microsoft.Office.Project.Server.Library; /* NOTE: * Delete the Admin, LoginForms, LoginWindows, and Project Web References, and * re-add them for your own Project Server. Use the following URLs * (substitute your values for ServerName and ProjectServerName): * * http://ServerName/ProjectServerName/_vti_bin/psi/admin.asmx * http://ServerName/ProjectServerName/_vti_bin/psi/project.asmx * http://ServerName/ProjectServerName/_vti_bin/psi/LoginForms.asmx * http://ServerName/ProjectServerName/_vti_bin/psi/loginwindows.asmx */ /* NOTE: * For the Object Link Provider example you need to add a reference and using statement for Microsoft.SharePoint * and a Web Reference for the PSI Object Link Provider web service and */ namespace LoginDemo { public partial class LogonProjectServer : Form { private const string URLPREFIX = “http://”; private const string PROJECTWEBSERVICE = “_vti_bin/PSI/Project.asmx”; private const string ADMINWEBSERVICE = “_vti_bin/PSI/Admin.asmx”; // Constant for Object Link Provider URL private const string OLPWEBSERVICE = “_vti_bin/PSI/ObjectLinkProvider.asmx”; private string baseUrl; // Example: http://ServerName/ProjectServerName/ private string userName; private string password; private bool winLogon = true; private bool containsUrl = false; private bool loggedOn = false; private string serverName; // Extra definitions for OLP private PSLibrary.WebObjectType webObjectType; private string linkedItems; public static LoginDemo.WebSvcProject.Project project = new LoginDemo.WebSvcProject.Project(); public static WebSvcAdmin.Admin admin = new LoginDemo.WebSvcAdmin.Admin(); // Added for Object Link Provider public static LoginDemo.WebSvcObjectLinkProvider.ObjectLinkProvider objectLinkProvider = new LoginDemo.WebSvcObjectLinkProvider.ObjectLinkProvider(); private static LoginUtils loginUtils = new LoginUtils(); private static AdminUtils adminUtils = new AdminUtils(); // Defined here so they can be used in the OLP section private Guid projectGuid; private Guid taskGuid; public LogonProjectServer() { InitializeComponent(); lblUserName.Enabled = false; lblPassword.Enabled = false; txtUserName.Enabled = false; txtPassword.Enabled = false; radFormsAuthentication.Enabled = false; radWindowsAuthentication.Enabled = false; btnLogon.Enabled = false; btnLogOff.Enabled = false; lblProjectCreated.Visible = false; txtWorkspaceSubSite.Enabled = false; lblVersion.Text = “”; //Get the user.config or the default for the ProjectServerUrl property setting txtProjectServerUrl.Text = Properties.Settings.Default.ProjectServerUrl; if (txtProjectServerUrl.Text != “http://ServerName/ProjectServer/”) { radFormsAuthentication.Enabled = true; radWindowsAuthentication.Enabled = true; btnLogon.Enabled = true; btnLogon.Select(); } } private void radFormsAuthentication_CheckedChanged(object sender, EventArgs e) { if (radFormsAuthentication.Checked) { lblUserName.Enabled = true; lblPassword.Enabled = true; txtUserName.Enabled = true; txtPassword.Enabled = true; winLogon = false; loggedOn = false; lblLoggedOn.Visible = false; btnLogOff.Enabled = false; lblProjectCreated.Text = “”; lblWorkspaceUrl.Text = “”; } } private void radWindowsAuthentication_CheckedChanged(object sender, EventArgs e) { if (radWindowsAuthentication.Checked) { lblUserName.Enabled = false; lblPassword.Enabled = false; txtUserName.Enabled = false; txtPassword.Enabled = false; winLogon = true; loggedOn = false; lblLoggedOn.Visible = false; btnLogOff.Enabled = false; lblProjectCreated.Text = “”; lblWorkspaceUrl.Text = “”; } } private void txtProjectServerUrl_TextChanged(object sender, EventArgs e) { string url = txtProjectServerUrl.Text.Trim(); if (url.StartsWith(URLPREFIX) && url.Length > 10) containsUrl = true; else { containsUrl = false; } } private void txtProjectServerUrl_Leave(object sender, EventArgs e) { if (containsUrl) { if (!txtProjectServerUrl.Text.EndsWith(“/”)) txtProjectServerUrl.Text += “/”; radFormsAuthentication.Enabled = true; radWindowsAuthentication.Enabled = true; btnLogon.Enabled = true; } else { btnLogon.Enabled = false; MessageBox.Show(“Invalid Project Server URL”, “Invalid URL”, MessageBoxButtons.OK, MessageBoxIcon.Error); radFormsAuthentication.Enabled = false; radWindowsAuthentication.Enabled = false; btnLogon.Enabled = false; } } private void txtUserName_TextChanged(object sender, EventArgs e) { userName = txtUserName.Text; } private void txtPassword_TextChanged(object sender, EventArgs e) { password = txtPassword.Text; } private void btnLogon_Click(object sender, EventArgs e) { baseUrl = txtProjectServerUrl.Text; lblLoggedOn.Visible = false; string errMess = “”; serverName = loginUtils.GetServerName(baseUrl); this.Cursor = Cursors.WaitCursor; try { loggedOn = loginUtils.LogonPS(winLogon, baseUrl, userName, password); } catch (SoapException ex) { errMess = ex.Message.ToString(); } catch (WebException ex) { errMess = ex.Message.ToString(); } this.Cursor = Cursors.Default; if (loggedOn) { AddContextInfo(); lblLoggedOn.Text = “Logon Succeeded!”; lblLoggedOn.ForeColor = Color.Green; btnLogOff.Enabled = true; string version = adminUtils.ProjectServerVersion(admin); if (version.StartsWith(“Error”)) { MessageBox.Show(version, “Admin Web service error”, MessageBoxButtons.OK, MessageBoxIcon.Error); } else lblVersion.Text = “Project Server Version: “ + version; } else { MessageBox.Show(errMess, “Logon Error”, MessageBoxButtons.OK, MessageBoxIcon.Error); lblLoggedOn.Text = “Logon Failed!”; lblLoggedOn.ForeColor = Color.Red; } lblLoggedOn.Visible = true; } private void btnLogOff_Click(object sender, EventArgs e) { bool loggedOff = false; string errMess = “”; try { loggedOff = loginUtils.LogoffPS(winLogon); } catch (SoapException ex) { errMess = ex.Message.ToString(); } catch (WebException ex) { errMess = ex.Message.ToString(); } if (loggedOff) { RemoveContextInfo(); lblLoggedOn.Text = “Logged Off!”; lblLoggedOn.ForeColor = Color.Black; lblLoggedOn.Visible = true; lblProjectCreated.Text = “”; lblVersion.Text = “”; lblWorkspaceLabel.Visible = false; lblWorkspaceUrl.Text = “”; } else { MessageBox.Show(errMess, “Logoff Error”, MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btnSaveUrl_Click(object sender, EventArgs e) { //Save the ProjectServerUrl property to the user.config file. Properties.Settings.Default.ProjectServerUrl = txtProjectServerUrl.Text; Properties.Settings.Default.Save(); } /// <summary> /// Add the URL, and the user credentials or logon cookie, to each /// PSI Web service object in the application. /// </summary> public void AddContextInfo() { // Add the Url property first. admin.Url = loginUtils.BaseUrl + ADMINWEBSERVICE; project.Url = loginUtils.BaseUrl + PROJECTWEBSERVICE; // Url property for OLP objectLinkProvider.Url = loginUtils.BaseUrl + OLPWEBSERVICE; if (winLogon) // Add Windows credentials { admin.Credentials = CredentialCache.DefaultCredentials; project.Credentials = CredentialCache.DefaultCredentials; // Windows credentials for OLP objectLinkProvider.Credentials = CredentialCache.DefaultCredentials; } else // Add Project Server logon cookie for Forms logon { admin.CookieContainer = loginUtils.Cookies; project.CookieContainer = loginUtils.Cookies; // Forms logon cookie for OLP objectLinkProvider.CookieContainer = loginUtils.Cookies; } } /// <summary> /// Remove the user credentials or logon cookie from each PSI Web service object. /// </summary> public void RemoveContextInfo() { if (winLogon) { admin.Credentials = null; project.Credentials = null; // Added for OLP objectLinkProvider.Credentials = null; } else { admin.CookieContainer = null; project.CookieContainer = null; // Adde for OLP objectLinkProvider.CookieContainer = null; } } /// <summary> /// Test the application with a PSI call. For example, create a project. /// </summary> /// <param name=”sender”></param> /// <param name=”e”></param> private void btnCreateProject_Click(object sender, EventArgs e) { string projectCreatedLabel = “Project created!”; string wssUrl; string projectWorkspace = ResetWorkspaceUrl(); bool created = false; lblProjectCreated.Text = “”; lblWorkspaceUrl.Text = projectWorkspace; this.Cursor = Cursors.WaitCursor; try { WebSvcProject.ProjectDataSet dsProject = new WebSvcProject.ProjectDataSet(); WebSvcProject.ProjectDataSet.ProjectRow projectRow = dsProject.Project.NewProjectRow(); projectGuid = Guid.NewGuid(); projectRow.PROJ_UID = projectGuid; projectRow.PROJ_NAME = this.txtProjectName.Text; projectRow.PROJ_TYPE = Convert.ToInt32(PSLibrary.Project.ProjectType.Project); dsProject.Project.AddProjectRow(projectRow); // Adding a task to the project so we can have something to link to WebSvcProject.ProjectDataSet.TaskRow taskRow = dsProject.Task.NewTaskRow(); taskGuid = Guid.NewGuid(); taskRow.PROJ_UID = projectGuid; taskRow.TASK_UID = taskGuid; taskRow.TASK_NAME = “Task 1″; taskRow.TASK_DUR = 480000; dsProject.Task.AddTaskRow(taskRow); Guid jobGuid = Guid.NewGuid(); bool validateOnly = false; // Create and save project to the Draft db project.QueueCreateProject(jobGuid, dsProject, validateOnly); // Wait 3 seconds (more or less) for Queue job to complete. // Or, add a routine that checks the QueueSystem for job completion. System.Threading.Thread.Sleep(3000); WebSvcProject.ProjectRelationsDataSet dsProjectRelations = new WebSvcProject.ProjectRelationsDataSet(); jobGuid = Guid.NewGuid(); // Set wssUrl = “” to have default WSS project workspace, or null to have no workspace. if (chkDefaultWorkspace.Checked) wssUrl = “”; else if (projectWorkspace == “”) wssUrl = null; else wssUrl = projectWorkspace; bool fullPublish = true; // Publishes project to the Published db dsProjectRelations = project.QueuePublish(jobGuid, projectGuid, fullPublish, wssUrl); created = true; } catch (SoapException ex) { string errMess = “”; // Pass the exception to the PSClientError constructor to get // all error information. PSLibrary.PSClientError error = new PSLibrary.PSClientError(ex); PSLibrary.PSErrorInfo[] errors = error.GetAllErrors(); for (int j = 0; j < errors.Length; j++) { errMess += errors[j].ErrId.ToString() + “n”; } errMess += “n” + ex.Message.ToString(); MessageBox.Show(errMess, “Error”, MessageBoxButtons.OK, MessageBoxIcon.Error); } catch (WebException ex) { string message = ex.Message.ToString() + “nnLog on, or check the Project Server Queuing Service”; MessageBox.Show(message, “Project Creation Error”, MessageBoxButtons.OK, MessageBoxIcon.Error); } this.Cursor = Cursors.Default; if (created) { lblProjectCreated.ForeColor = Color.Green; lblWorkspaceUrl.Visible = true; lblWorkspaceLabel.Visible = true; } else { projectCreatedLabel = “Project not created”; lblProjectCreated.ForeColor = Color.Red; lblWorkspaceUrl.Visible = false; lblWorkspaceLabel.Visible = true; } lblProjectCreated.Text = projectCreatedLabel; lblProjectCreated.Visible = true; } private string ResetWorkspaceUrl() { string workspace; if (chkDefaultWorkspace.Checked) { workspace = “http://” + serverName + “/” + txtProjectName.Text; } else { workspace = “http://” + serverName + “/” + txtWorkspaceSubSite.Text; } return workspace; } private void txtProjectName_TextChanged(object sender, EventArgs e) { lblProjectCreated.Text = “”; if (chkDefaultWorkspace.Checked) txtWorkspaceSubSite.Text = txtProjectName.Text; lblWorkspaceLabel.Visible = false; lblWorkspaceUrl.Visible = false; } private void chkDefaultWorkspace_CheckedChanged(object sender, EventArgs e) { if (chkDefaultWorkspace.Checked) { txtWorkspaceSubSite.Enabled = false; } else { txtWorkspaceSubSite.Enabled = true; } } private void btnExit_Click(object sender, EventArgs e) { Application.Exit(); } private void btnAddIssue_Click(object sender, EventArgs e) { //First find the Issues list in the site collection for the new project // siteCollection will fidn the collection for http://servename/pwa SPSite siteCollection = new SPSite(txtProjectServerUrl.Text + txtProjectName.Text); // sites will hold collection of sites under pwa - which will be he workspaces SPWebCollection sites = siteCollection.AllWebs; // lists will be the collection of lists in the specific site with the project name we just created SPListCollection lists = sites[txtProjectName.Text].Lists; // and finally list will be the Issues list for this site SPList list = lists[“Issues”]; // create a list collection SPListItemCollection listItems = list.Items; // add a new item SPListItem item = listItems.Add(); // set some properties - in this sample I just set Title // but you can set any of the properties of the Project Workspace Issues list item[“Title”] = “New Issue for Project “ + txtProjectName.Text; // and update - we now have a new issue item.Update(); // get some properties of the new item we will need later int itemTPID = item.ID; Guid listGuid = list.ID; string listName = list.Title.ToString(); // This code is basicall from the SDK OLP example but using the properties // of the project task and items created earlier in this sample Guid taskWebObjectUid = Guid.Empty; WebSvcObjectLinkProvider.ObjectLinkProviderDataSet dsLinkedObjects = objectLinkProvider.ReadTaskWebObject(taskGuid); int numTaskWebObjects = dsLinkedObjects.WebObjects.Count; // In this sample there will be no existing objects - but would be useful in other scenarios if (numTaskWebObjects > 0) taskWebObjectUid = dsLinkedObjects.WebObjects[0].WOBJ_UID; WebSvcObjectLinkProvider.ObjectLinkProviderDataSet dsTask = new WebSvcObjectLinkProvider.ObjectLinkProviderDataSet(); WebSvcObjectLinkProvider.ObjectLinkProviderDataSet.WebObjectsRow taskRow = dsTask.WebObjects.NewWebObjectsRow(); // Provide all known information to the Web object row for the task. // If a task Web object does not exist, AddWebObjects creates // a new Web object and updates WOBJ_UID in taskRow. taskRow.WOBJ_UID = taskWebObjectUid; taskRow.WOBJ_TASK_UID = taskGuid; taskRow.WOBJ_PROJ_UID = projectGuid; taskRow.WOBJ_TYPE = (int)PSLibrary.WebObjectDatabaseType.Task; dsTask.WebObjects.AddWebObjectsRow(taskRow); WebSvcObjectLinkProvider.ObjectLinkProviderDataSet dsListItems = new WebSvcObjectLinkProvider.ObjectLinkProviderDataSet(); WebSvcObjectLinkProvider.ObjectLinkProviderDataSet.WebObjectsRow listItemRow = dsListItems.WebObjects.NewWebObjectsRow(); listItemRow.WOBJ_UID = Guid.NewGuid(); listItemRow.WOBJ_TP_ID = itemTPID; listItemRow.WOBJ_LIST_NAME = listGuid; listItemRow.WOBJ_PROJ_UID = projectGuid; // I left the switch in but in this sample it will always be an issue switch (listName) { case “Issues”: listItemRow.WOBJ_TYPE = (int)PSLibrary.WebObjectDatabaseType.Issue; webObjectType = PSLibrary.WebObjectType.Issue; linkedItems = “Issues found for task: “ + taskGuid; break; case “Risks”: listItemRow.WOBJ_TYPE = (int)PSLibrary.WebObjectDatabaseType.Risk; webObjectType = PSLibrary.WebObjectType.Risk; linkedItems = “Risks found for task: “ + taskGuid; break; case “Documents”: listItemRow.WOBJ_TYPE = (int)PSLibrary.WebObjectDatabaseType.Document; webObjectType = PSLibrary.WebObjectType.Document; linkedItems = “Documents found for task: “ + taskGuid; break; case “Commitments”: // Commitments are now called Deliverables listItemRow.WOBJ_TYPE = (int)PSLibrary.WebObjectDatabaseType.Commitment; webObjectType = PSLibrary.WebObjectType.Commitment; linkedItems = “Deliverables found for task: “ + taskGuid; break; default: string errMess = listName + ” is not a default SharePoint list type for task links.”; throw new SystemException(errMess); } dsListItems.WebObjects.AddWebObjectsRow(listItemRow); WebSvcObjectLinkProvider.WebObjectLinkType generalLinkType = WebSvcObjectLinkProvider.WebObjectLinkType.General; WebSvcObjectLinkProvider.WebObjectLinkType[] wssLinkTypeArray = { generalLinkType }; objectLinkProvider.CreateWebObjectLinks(dsTask, dsListItems, wssLinkTypeArray); } } }
Technorati Tags: Project Server 2007
Popularity: 44% [?]
MSProject Reporter RSS Feeds Now Available
21 June 2007Popularity: 2% [?]
Impact of Latency on Project Professional 2007
21 June 2007
Please find below a study I did for a customer to demonstrate the advantage of the new EPM 2007 architecture and specifically how Project Professional 2007 communicates to the application server.< ?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
MsoNormal style=”MARGIN: 0cm 0cm 3pt 11.35pt; LINE-HEIGHT: normal”>DISCLAIMER: the times presented below highly depend on the EPM Architecture, the project plan data, as the network between the test machine and the servers, as well as the testing methodology. There is thus no guarantee on the response time in your environment!
EXECUTIVE SUMMARY
Contoso is a worldwide company with many branch offices and is considering a migration from Project Server 2003 to Project Server 2007 but requires reassurance that the newer version of EPM would handle high latency environment when using Project Professional 2007. Contoso uses a Citrix farm today to address the latency issues of Project Professional 2003.
The results showed that Project Professional 2007 runs fine under a high latency environment thus Contoso can migrate from EPM 2003 to EPM 2007 and not use a Citrix farm anymore to run Project Professional.
Project Server 2007 was installed on a single server (including SQL 2005) with the following specifications:
Hardware
¾ Computer modem: Dell Power Edge 2850
¾ Processor: Dual proc Xeon 3.6 Ghz
¾ System memory: 4 Go, FSB 800 Mhz
¾ Hard drive: 36 Go Ultra Scsi 320 15000 rpm
Software
¾ Windows 2003 R2, Enterprise Edition US + SP1
¾ SQL Server 2005, Enterprise Edition US + SP1
¾ Project Server 2007, x86 EN
The EPM Test Framework (EPMTF) was used to automate the testing process of the Project Professional 2007.
The EPMTF ran on a Dell Latitude D600 laptop with 2 Go RAM; Pentium 1,7GHZ & 7200 rpm hard drive running Windows Server 2003 + SP1.
No latency simulation tool were used and instead a true 120 ms latency was generated by accessing an EPM 2007 server located at the MS France lab and accessing it from home via a VPN connection.
Test Data
¾ Contoso gave us a generic project plan used to track “business as usual” activities.
¾ This initial plan contained the following:
¾ 440 tasks
¾ 10 projects Enterprise Custom Fields
¾ 10 resource Enterprise Custom Fields
¾ 5 task Enterprise Custom Fields
¾ 5 resources
¾ 1 to 5 resource assignment per task
¾ No baseline
To simulate the impact of project size we multiplied the total number of tasks for each run as shown below, total number of tasks per run:
1. 444
2. 877
3. 1304
4. 1733
Use Case
Only one use case was tested, it included the following actions:
1. Start Project Professional 2007 and open project plan
2. Add one task at the end of the project plan
3. Save project plan
4. Publish project plan
5. Close project plan
Response Time
Average response time in milliseconds for five runs for each action and each project size with 120ms latency:
|
Total Number of Project Tasks (results in ms) |
|||||
|
|
444 |
877 |
1304 |
1733 |
2160 |
|
Open |
7 415 |
7 283 |
7 645 |
7 782 |
8 533 |
|
AddTask |
78 |
188 |
313 |
570 |
464 |
|
Save |
1 883 |
2 438 |
3 003 |
3 426 |
5 486 |
|
Publish |
5 672 |
5 993 |
5 628 |
5 534 |
3 057 |
|
Close |
1 781 |
1 289 |
1 086 |
1 138 |
1 157 |
The following observations can be made from the results above:
¾ The time to Open a plan “stays” under 10 seconds which is acceptable.
¾ Close & Publish actions are not impacted by the project size (number of tasks).
The following table shows the percentage gain (compared to the table above) obtained by using the Active Cache when performing each action:
|
Total Number of Project Tasks |
|||||
|
444 |
877 |
1304 |
1733 |
2160 |
|
|
Open |
33% |
79% |
127% |
188% |
255% |
|
AddTask |
-35% |
-58% |
7% |
-64% |
-15% |
|
Save |
6% |
-2% |
Popularity: 1% [?] | ||

