Welcome to MSDN Blogs Sign in | Join | Help

Recently, I got a request from one of my friend who had never worked on SharePoint to provide him resources to quickly get on speed with SharePoint. It was really tough to tell about SharePoint technologies (WSS 3.0 and MOSS 2007), which is such huge and expansive area, to someone who hasn’t seen it is really challenging. I tried to provide him some resources with context. Sharing it here also as there could be many others like my friend.

Getting to Know

Again, the portal has so many resources that one can get lost easily. So here’s the order that you can start with

  • End User Training:  To start with you should know how to “use” SharePoint. How does SharePoint looks like. For this, you should go through end user training. One of the great resource is End User Training from Microsoft:

http://office.microsoft.com/en-us/sharepointserver/HA102488011033.aspx

You can download the standalone edition and go through some of the trainings available here.

  • Environment: To learn how to “use” or develop in SharePoint, it’s very important that you have working environment, where you can try hands-on! For this, you can either download pre installed VPC or download WSS or evaluation version of MOSS 2007 and install it on your server.
  • Evaluation Guides: Once you get a little hang of SharePoint, get a quick look at all features available in WSS and MOSS from their respective evaluation guides: WSS, SharePoint

Developing

Once you have gone through the above resources, there are plenty of places where you can start learning about the development. Here are a few of resources that can get you up to speed quickly:

  • SharePointDeveloper Portal: A lot of 100-200 level resources to get you started
  • Ramp Up Portal: It has modules for many technologies. There are two modules on SharePoint – part 1 and part 2 

After going through above resources you are ready to venture anywhere in the world of SharePoint! It’s huge, you can start from anywhere and go anywhere! Any list of resources would not do justice to available resources on the net.

In any case, I’m providing a few Pages that provide links to other resources:

Cheers!

Many times, I get question from my customers if they should build a new application in SharePoint or ASP.net. For certain kind of applications such as Collaboration or KM Portal, Internet facing web site, intranet social networking site, applications requiring browser enabled forms or Enterprise Search, SharePoint is THE option to go for.

However, it’s not a straight forward answer for all types of applications. You need to look at different aspects before deciding. I’ve put a high level list of questions that I use to make such decisions. Hopefully, the questions should help you also.

  1. What are the features that you are going to use out-of-the-box (OOB) from SharePoint (site provisioning, search, version control, roles/groups, easy forms (list edit, new, view pages), collaboration, workflows, content deployment, alerts ) )
    1. The list of feature is huge, have a look at evaluation guides for complete list: WSS, SharePoint and Search
    2. If you are not using any of these features what’s it that you’d gain from SharePoint?
    3. If you need these features, why are you thinking of not going with SharePoint? What’s the effort if you custom build those features?
  2. What are the features that I’m going to build custom (for example, reports for some applications would be custom and need relational tables with transactional support)
    1. How much effort is required for custom development in ASP.net vs. in SharePoint? Is the difference huge?
  3. What kind of application it is? Is it one off application, or this is going to replicated across many teams. SharePoint is an excellent platform where you need to replicate one type of site to many teams.
  4. What are the required Scale and Performance objectives of your application
    1. SharePoint has some boundaries, most of these can be avoided with adjusted design or workaround. Would the adjusted design or workaround be acceptable to your users? Examples:
      1. 2000 list items at a single level – a well know limitation
      2. 2000 security principles for a securable object – a lesser known limitation, but this can create problems when users in a site collection grows more than 2000 – there are workarounds for this (such as using AD security groups) – are those acceptable?
    2. SharePoint may not be able to match the performance of a plain ASP.net application as it does a lot more work (security trimming, getting files from database etc.) Can your performance targets be met using SharePoint?
      1. You can check benchmarks published by Microsoft or other vendors (such as HP, Intel) to see if SharePoint can meet your requirements. Links to most of the benchmarks are available in this blog post: SharePoint (Performance, Stress ) Load Testing 
  5. How many employees would be using these application? How many requests you can expect for customization from different teams. Remember, SharePoint provides a pretty good platform for customization and personalization.
  6. How much time do you have to build such apps? Can you use some off-the-shelf solutions? For examples, there are many custom applications which be deployed in no time by using WSS Application Templates (http://technet.microsoft.com/en-us/windowsserver/sharepoint/bb407286.aspx)
  7. What’s the cost you can afford. Remember, you need not buy any separate license, if you are only using Windows SharePoint Services. Have a look at difference of features between WSS and MOSS in the comparison Excel spreadsheet.
  8. What skills your developers have? Though SharePoint is based on ASP.net, but you need have additional knowledge to develop SharePoint applications. Also, development is SharePoint is not like normal .NET development (for example, you don’t get WYSWYG designer to develop web parts for SharePoint). You also need to take extra care to follow same build and source control process that you do for .Net code. Have a look at Application Lifecycle Management Resource Center for SharePoint Server for more details.

Updated On 22-July-2009 

Whenever I've helped my customers in performance testing and analysis of SharePoint, I get one common question: Can you tell us more about "SharePoint Load Testing" and links where I can learn more? Doing a quick web search on "SharePoint Load Testing" or "SharePoint Performance Testing" - you get all kinds of results such as data population tools, performance tuning techniques, handling large lists etc. However, it's not very easy to get results about, How to go about load testing SharePoint, what are the counters that i should measure, where can i find real life bench mark results of SharePoint? That's exactly, what I am trying to in this post. I'm trying to cover all the resources that I know about load testing. I wouldn't be covering much about Performance Tuning and Analysis.

One important thing than many people don't know is this - There’s nothing much specific to SharePoint when it comes to performance testing. SharePoint provides a few objects (e.g. for Publishing Cache, Search Indexer). Otherwise, same principles that applies to ASP.net also apply to SharePoint. Basically, we have to analyze different objects and counters (Memory, CPU, Disk, Network, CLR) in relation with required parameters such as throughput, response time, user load etc. to find out various issues. Below is the list of resources that would help you in doing that:

Official Documentation

References of Real life performance testing to get the bench mark results

There are many times when you do performance testing in your environment, but don’t know if your results are good or not. The links in this section would help you in finding that.

Testing Tools

This section provides links to the tools that helps in the load testing.

Tools to generate load and test data:

Browsers Add-Ons: There are many good tools (mostly free) that integrate with your browser to analyze each and every activity happening through your browser. You can use these tools for tuning the performance of a web site by measuring parameters such as download times, caching or the number of network round trips. [Thanks to Ed Glas for suggesting some of these tools.]

  • Fiddler – a very handy and light weight tool that can provide quick overview of you web site performance. It can also records scripts that you can use in VSTS. This MSDN article provides detailed information on how Fiddler can be used for performance tuning.
  • neXpert - an add-on to Fiddler which automates the classic performance best practice checks and produces a HTML report on the issues found in a Fiddler capture. Also adds the ability to insert step markers in Fiddler sessions to associate network objects together (create transactions). Check out more here
  • HttpWatch - an HTTP viewer and debugger. Available in commercial as well as free variants. 
  • FireBug – provides many web development tools. Integrates only with FireFox
  • YSlow - analyzes web pages and tells you why they're slow based on the rules for high performance web sites. Integrates only with FireFox

At times, you need to focus on end-user response time. As it is difficult to simulate real life network bandwidth, it becomes difficult to test, how your application perform for end users. The following tools help you to find end-user experience

  • Visual Round Trip Analyzer - Web page performance visualizer and analyzer tool. You can find Ed Glas’s blog post introducing this tool and detailed article on using the tool.
  • webPageTest -   webPageTest is a free over-the-web tool for performance testing a page from either Dulles, VA, USA or Wellington New Zealand. Pagetest allows you to provide the URL of a webpage to be tested provides a waterfall of your page load performance as well as a comparison against an optimization checklist.

There are other tools available for sizing and capacity planning also such as HP ProLiant Sizer for Microsoft Office SharePoint Server 2007 and SharePoint Capacity Planning Tool from Microsoft

Useful Blogs, Third Party Articles

ASP.Net performance testing and Analysis

The following links provide information on performance testing of ASP.net based web sites. Everything you wanted to know such as how to setup Performance Monitor, what counters to analyze, what should be threshold value of the counters, what to do if some counters are overshooting the threshold – you’ll get here.

SharePoint Performance Improvements

Though this post is focuses on Performance Testing, I’m also providing a few links on Performance improvements, tuning and optimazation

Hopefully, you’ll find these useful

- Sanjay

Have you come across a situation, where you get a URL and you need to identify what object type is this: SPSite, SPWeb, SPList, SPFolder, SPListItem or SPFile? I faced this multiple times. Recently, I was working on custom content deployment utility. Customer wanted a command line utility, which was more or less on similar lines that Chris' command line tool for content deployment wizard. However, there wasn't any associate GUI. Users can copy any URL from the browser and pass it on to the command line tool for export. It's upto the tool to figure out what kind of object it is. Initially it sounded simple: Just create an SPSite object from passed url, compare the passed Url and Site or web or list URL, whichever matches that's the object type. But it wasn't so simple. Users used Mouse' right click option to copy shortcut to any link and provided the same to command line. These URLs can be of any form like this:

Folder in doc lib in query string format: http://moss.litwareinc.com/Documents/Forms/AllItems.aspx?RootFolder=%2fDocuments%2fFolderInLibrary&FolderCTID=&View=%7b6F7E9FC7%2dC64B%2d4993%2dBB7D%2dD3FBFCAA3C53%7d

Folder in doc lib in list item format: http://moss.litwareinc.com/Documents/FolderInLibrary

Document Library: http://moss.litwareinc.com/Documents/

List Item http://moss.litwareinc.com/Lists/Tasks/DispForm.aspx?ID=2&RootFolder=%2fLists%2fTasks%2fFolderInTasksList

The problem is even more when the URL includes form pages such as AllItem.aspx or DispForm.aspx. By default, SharePoint returns SPFile for form pages, but actually they can point to a folder or a list item. So I wrote a utility function. The code is provided below, which is self explanatory.

using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Text;
using System.Web;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Administration;
using Microsoft.SharePoint.Deployment;

namespace SanjayNarang.Sharepoint.Utilities
{
    
class SanjayMossUtilities
    {
        
public SPDeploymentObjectType GetObjectTypeFromURL(string passedUrl, out Guid objectGuid)
        
{
            SPDeploymentObjectType objType
= SPDeploymentObjectType.Invalid;
            
objectGuid = Guid.Empty;

            
SPSite site = null;
            
SPWeb web = null;
            
SPList list = null;
            
object obj = null;
            
string url = null;
            
string siteRelativeUrl = null;
            
NameValueCollection queryParams = null;

            
url = GetModifiedUrl(passedUrl, out queryParams);

            
try
            
{
                site
= new SPSite(url);
                
if (url.Equals(site.Url, StringComparison.OrdinalIgnoreCase))
                
{
                    objectGuid
= site.ID;
                    
return SPDeploymentObjectType.Site;
                
}

                web
= site.OpenWeb();
                
if (url.Equals(web.Url, StringComparison.OrdinalIgnoreCase))
                
{
                    objectGuid
= web.ID;
                    
return SPDeploymentObjectType.Web;
                
}

                siteRelativeUrl
= url.TrimStart(web.Url.ToCharArray());
                
list = web.GetList(url);

                
if ((null != list) &&
                    (
siteRelativeUrl.Equals(list.RootFolder.Url, StringComparison.OrdinalIgnoreCase)))
                
{
                    objectGuid
= list.ID;
                    
return SPDeploymentObjectType.List;
                
}

                
// if we are here, it means URL is none of these:
                // site, web, list
                // So, it can be either file, folder or a list item.
                // Finding that is intricated.

                
obj = web.GetObject(url);

                
if (null != obj)
                
{
                    
if (obj is SPFile)
                    
{
                        
// Generally, we get here for Forms Pages,
                        // such as DispForm.aspx, AllItems.aspx
                        // so, a SPFile object could be a list item Or
                        // a folder in a list or a Folder

                        // Pages in root of the web are also returned as
                        // SPFiles e.g. http://moss/default.aspx

                        // The URLs that point to a file in doc lib are
                        // returned as SPListItem by GetObject method
                        //

                        
SPFile file = obj as SPFile;

                        
if (null != queryParams)
                        
{
                            
// The logic to identify folder or item has
                            // been explained in ValidateQueryString
                            
string idValue = queryParams["ID"];
                            
string folderValue = queryParams["RootFolder"];
                            
if (null != idValue)
                            
{
                                SPListItem item
= list.GetItemById(int.Parse(idValue));
                                
objectGuid = item.UniqueId;
                                
return SPDeploymentObjectType.ListItem;
                            
}
                            
else if (null != folderValue)
                            
{
                                SPFolder folder
= web.GetFolder(folderValue);
                                
objectGuid = folder.UniqueId;
                                
return SPDeploymentObjectType.Folder;
                            
}
                            
else
                            
{
                                
// Deployyment Object Type is: Invalid, so no need
                                // to do anything
                            
}
                        }
                        
else
                        
{
                            objectGuid
= file.UniqueId;
                            
return SPDeploymentObjectType.File;
                        
}
                    }
                    
else if (obj is SPFolder)
                    
{
                        SPFolder folder
= obj as SPFolder;
                        
objectGuid = folder.UniqueId;
                        
return SPDeploymentObjectType.Folder;
                    
}
                    
else if (obj is SPListItem)
                    
{

                        SPListItem item
= obj as SPListItem;

                        
// item can contain a folder of file also. e.g.
                        // http://moss.litwareinc.com/Documents/folderinlibrary
                        // http://moss.litwareinc.com/Documents/FolderInLibrary/File2.doc

                        
if (null != item.Folder)
                        
{
                            objectGuid
= item.Folder.UniqueId;
                            
return SPDeploymentObjectType.Folder;
                        
}
                        
else if (null != item.File)
                        
{
                            objectGuid
= item.File.UniqueId;
                            
return SPDeploymentObjectType.File;
                        
}

                        objectGuid
= item.UniqueId;
                        
return SPDeploymentObjectType.ListItem;
                    
}
                }

            }
            
finally
            
{
                
if (web != null)
                
{
                    web.Dispose
();
                
}
                
if (site != null)
                
{
                    site.Dispose
();
                
}
            }
            
return objType;
        
}

        
private string GetModifiedUrl(string url, out NameValueCollection queryParams)
        
{
            
string modUrl = url; //modified url
            
string querystring = string.Empty;
            
queryParams = null;

            
// if it's a site or web or folder, user can pass '/' at
            // the end, which we need to trim
            
if (url.EndsWith("/"))
            
{
                modUrl
= url.TrimEnd(new char[] { '/' });
            }

            
// we need to get the URL without query string as it creates
            // problem getting the parent folder
            
if (url.Contains("?"))
            
{

                
int tmp = url.IndexOf("?");
                
modUrl = url.Substring(0, tmp);
                
querystring = url.Substring(tmp + 1);

                
queryParams = HttpUtility.ParseQueryString(querystring);
                
// apply custom rules
                
ValidateQueryString(queryParams);
            
}

            
return modUrl;
        
}

        
private void ValidateQueryString(NameValueCollection queryParams)
        
{
            
// when there's query string in the URL, the URL can point to a
            // list item (in a list) or a folder.          
            // For example if an item is a folder
            // 'FolderInTasksList' the URL of item would look like this    
            // http://moss.litwareinc.com/Lists/Tasks/DispForm.aspx?ID=2&RootFolder=/Lists/Tasks/FolderInTasksList OR
            // http://moss.litwareinc.com/Lists/Tasks/DispForm.aspx?ID=2&RootFolder=%2fLists%2fTasks%2fFolderInTasksList
            //
            // And if we need Url of the folder, it would be like this:
            // http://moss.litwareinc.com/Lists/Tasks/AllItems.aspx?RootFolder=%2fLists%2fTasks%2fFolderInTasksList&FolderCTID=&View=%7bD8E1251D%2d829B%2d4FCE%2d9127%2d5E4FC6E6A5C4%7d
            //
            // From the above two examples, I'm applying the following
            // rules on the query string
            // 1. It can contain only these keys: ID, RootFolder, FolderCTID, View
            //    If there's any other key, i would treat that as invalid query string
            //
            // 2. ID and RootFolder should never be empty
            //    otherwise, raise exception here rather than hitting that later
            //
            // 3. the query string has to contain at least one of the following
            //    a. ID, b. RootFolder

            // Build a string collection with possible values. For comparison,
            // we'll use lower case only
            
StringCollection strColl = new StringCollection();
            
strColl.Add("ID".ToLower());
            
strColl.Add("RootFolder".ToLower());
            
strColl.Add("FolderCTID".ToLower());
            
strColl.Add("View".ToLower());

            
// Apply the Rules
            
bool hasID = false;
            
bool hasRootFolder = false;

            
Console.WriteLine();
            
foreach (string str in queryParams.AllKeys)
            
{
                
// can be used for debugging
                // Console.WriteLine("Name: " + str + " | Value: " + queryParams[str]);

                // Rule 1
                
if (!(strColl.Contains(str.ToLower())))
                
{
                    
throw new ArgumentException("Invalid argument in passed query string");
                
}
                
// Rule 2
                
if (str.Equals("id", StringComparison.OrdinalIgnoreCase))
                
{
                    hasID
= true;
                    
if (queryParams[str].Equals(String.Empty))
                    
{
                        
throw new ArgumentException("Query string parameter \"" + str + "\" can not be empty.");
                    
}
                }
                
// Rule 2
                
if (str.Equals("rootfolder", StringComparison.OrdinalIgnoreCase))
                
{
                    hasRootFolder
= true;
                    
if (queryParams[str].Equals(String.Empty))
                    
{
                        
throw new ArgumentException("Query string parameter \"" + str + "\" can not be empty.");
                    
}
                }
            }
            
// Rule 3
            
Console.WriteLine();
            
if (!(hasID || hasRootFolder))
            
{
                
throw new ArgumentException("Query string must have at least one parameter from these: ID and RootFolder");
            
}
        }

    }
}

Have you faced the issue of getting limited to 255 characters when working with your custom field controls? Especially, when you are inheriting from a field such as SPFieldMultiColumn! When you save an item having custom field control with more than 255 characters, you can get this type of message:


Invalid text value

A text field contains invalid data. Please check the value and try again.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Runtime.InteropServices.COMException: Invalid text value

A text field contains invalid data. Please check the value and try again.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.


Stack Trace:


It's really disturbing that you chose MultiColumn field control because you wanted to store multiple values and the combined length of values in all the columns cannot exceed 255 characters!

The issue is generally that you have not chosen correct "ParentType" in fldtypes.xml file. In many samples available on internet, the "ParentType" is generally "Text", which is designed only for 255 characters. So even when in your code, you have inherited from a class other than SPFieldText e.g. SPFieldMultiColumn, the basic properties are governed by what ParentType you have chosen in the xml file. For example, for SPFieldMultiColumn this value should be as given below:

<Field Name="ParentType">MultiColumn</Field>

Generally, what value you should choose in ParentType can be referred from this page in SDK: Field Element (List - Definition) Interestingly, the above URL mentions ParentType for SPFieldMultiColumn as "Note". Both works as MultiColumn also rolls up to "Note" which is Parent Type for many field controls.

If you are developing a custom result page, some of the key requirements (in addition to showing relevant results) that are common across many types of projects are:

  1. Showing the total number of search results based on the submitted keyword or query so that you can show some statistics like Results 1-10 of 572
  2. Showing links for page numbers to move backwards and forwards (e.g. < Back, 1, 2, 3, 4, 5, Next >). Getting the page count correct is again dependent of getting total results count correct.

The SharePoint Object Model (OM) provides two types of classes to query against it content: KeywordQuery and FullTextSqlQuery. These queries have properties StartRow and RowLimit. Both of these queries get us result in ResultTable class and this class has one property TotalRows. These properties are defined below:

  • StartRow: Gets or sets first row included in the search results.
  • RowLimit: Gets or sets the maximum number of rows returned in the search results.
  • TotalRows: Gets the number of rows in the search query result table.

With the above understanding, isn't it too simple to implement to get both of the points – 1 and 2 stated above. Basically, your paging would be like this .. Result <StartRow> to <StartRow + RowLimit> of <TotalRows>. And based on TotalRows, you can show the links for pages to be displayed.

However, this is not that simple. It's very difficult for any search engine (including web search engines such as Live or Google) to get the exact number of total results found as it's very time consuming scheme. So, most search engines (including MOSS) perform only an "estimate" to provide total number of results. Hence, the value of TotalRows property can change for the same keyword. The value is more accurate when the StartRow is towards the end of search results. Hence any logic to display links for search pages can fail here. I recommend the following approach here:

The links for "page" numbers may get unstable. For example, let us say, you got total rows as 100 and you always show links for page 1, 2, 3, 4 and 5. But let us say, actual result is 27 only. Which would mean if user clicks on page "4" , you'll fire a query for item 31 to 40 and you'll get zero results. At this point rather than showing page with zero results, do the following:

  1. Get the Total rows from the same result table. This time it should give the correct value (27 as it is close to end). Confirm it's correctness by checking the value of property IsTotalRowsExact.
  2. If it's correct, then just show the last page which is 3 (and make links for page, 4, 5 and "Next" as invisible)

Though, the approach seems "crude" , but it's one of the most efficient and least invasive way to achieve this functionality. Even internet search engines such as Live and Google employ the same technique.

There are some other approach that you can use to get the numbering correct as provided in the following blogs:

  1.  To round  the total results number off to some value (for consistency): Results count and custom paging [ http://blogs.pointbridge.com/Blogs/dupont_thomas/Pages/Post.aspx?_ID=7 ]
  2. Use Query.TotalRowsExactMinimum to show how many page numbers to show from current page: Understanding Total Hits & Paging in the MOSS 2007 Search API (http://sharepointsearch.com/cs/blogs/enterprisesearch/archive/2008/05/22/understanding-total-hits-amp-paging-in-the-moss-2007-search-api.aspx )  

Recently, while working on a WCM project, I realized that many developers don't know that various properties of a list item (especially document library) are inter dependent and may change based on each other's values. These properties are: Moderation (Approval) status, Scheduling status, Versions Numbers. So I thought, I'd put up this write-up that would demystify some of the underlying concepts.

 

FACTS:

Before starting on this let's get some facts clear:

  1. Item Scheduling (ability to schedule or expire an item) is ONLY available on document libraries. You cannot enable it on lists.
  2. SharePoint does not rely on Scheduling Start Date (or Publish date) and Scheduling End Date (or Expiry Date) to find if an item needs to be shown or not to unauthorized users. In fact, it relies on "Moderation Status" (the value shown in "Approval Status" field). When you enable Item Scheduling on a document library, SharePoint makes use of event receivers and timer job to change the moderation status as per Scheduling Start and End Dates.
  3. This is what happens to moderation status as per Scheduling Start and End Dates.
    1. Before Scheduling Start Date: if someone "approves" an item (from different options available, more on that below), the moderation status changes to "Scheduled".
    2. On Scheduling Start Date: if moderation status was "Scheduled" earlier, it changes to "Approved". Version number is changed from Minor to next Major. No change happens if moderation status was "Draft" or "Pending" earlier.
    3. On Scheduling End Date: if moderation status was "Approved" earlier, it changes to "Draft". Version number is changed from Major to previous Minor
  4. If you are setting the moderation status manually (through Object Model) from a custom application or Workflow, you need NOT worry about checking Scheduling Start and End Dates and change the status to "Scheduled" or "Approved" according to these dates. You can always, change the status to Approved (as shown below). SharePoint would ensure that it gets the correct status as per Scheduling Dates.

    Item.ModerationInformation.Status = SPModerationStatusType.Approved  

APPROVING AND PUBLISHING ITEMS

SharePoint provides multiple ways to approve or publish items that can vary based on item's moderation status and version numbers. This section explains that. Note that the following explanation is only for "Pages" library in "Publishing Sites". However, the behavior should be same for other document libraries also, though Page Editing Toolbar would not be available.

 

The options to approve based on moderation status are:

 

  1. Item status - "Draft"
    1. Page Editing Toolbar: two buttons are visible: Submit For Approval, Publish
    2. ECB menu: "approve/reject" is not available. Instead, "Publish a Major Version" is available
    3. "View item properties" page: "Approve/Reject" button is available, which takes to the approval page. But on the approval page only the following two options are available:
      1. Draft
      2. Pending
  2. Item status - "Pending"
    1. Page Editing Toolbar: two buttons are visible: Approve, Reject - these button change the status directly
    2. Context menu: approve/reject menu is available and takes to approval page with all three options:
      1. Approved
      2. Rejected
      3. Pending

 

The behavior of various options is described below. To make it simpler to understand, I've provided the following categories for each behavior:

  1. Visibility: where and when "this" option is available
  2. Versions: how does "this" option impacts version numbers
  3. Moderation: how does "this" option impacts moderation status
  4. Scheduling: how does "this" option impacts scheduling

 

The behavior for options is:

  1. Submit for Approval
    1. Visibility: Appears when the approval status is "draft"
    2. Versions: Checks-in the current minor version
    3. Moderation: Changes the approval status to "Pending"
    4. Scheduling: If item is schedule and scheduled start time comes before item is approved, nothing happens

       

  2. Publish
    1. Visibility: Appears on Page Editing Toolbar when the approval status is "draft", version could be checked-in or out
    2. If the item Scheduled Start Date is in PAST (item is active)
      1. Versions: Checks-in (if checked out) and changes the current "Minor Version" (e.g. 4.1) to next "Major version" (e.g. 5.0)
      2. Moderation: Changes the approval status to "Approved"
      3. Scheduling (when scheduled start time comes): NA
    3. If the item Scheduled Start Date is in FUTURE (item is not active)
      1. Versions: Checks-in (if checked out), keeps the current "Minor Version"
      2. Moderation: Changes the approval status to "Scheduled"
      3. Scheduling (when scheduled start time comes):
        1. Changes the approval status to "Approved"
        2. Converts the latest Minor version to Next Major version

           

  3. Publish a Major Version (It's not same as Publish on Page Editing Toolbar)
    1. Visibility: In ECB Menu, only when the status is draft and item is checked-in
    2. Versions: Interestingly, this does not change version. It changes only moderation status. If item version is 0.1, it remains 0.1 even afterwords.
    3. Moderation: Changes the approval status to "Pending"
    4. Scheduling (when scheduled start time comes): No Change

 

HTH 

   

I've been working on implementing accessibility requirements for a public facing site on MOSS. Though keywords such as "SharePoint accessibility" provide a number of results on Live Search or any other engine, I had difficult time in searching the appropriate resources. Thought it would be worthwhile sharing the resources that I found and providing a context around them. Here are these resources:

Microsoft's Statements/Papers on SharePoint Accessibility

We have couple of white papers and articles on this topic, however, search engines are yet to rank them better to come towards the top. Here are these:

  • Article: Accessibility features (as provided by Office Online)

    http://office.microsoft.com/en-us/sharepointserver/CH100948721033.aspx

  • Blog: Improvements in accessibility – Blog entry on SharePoint Team blog by Lawrence Liu. Though it's pretty old entry (April 2006) and was written for pre RTM version, but you can find a good summary of new and improved accessibility features. Most of this holds for RTM also. The blog groups the improvement areas in categories such as Headings, Navigation, Keyboard, Graphics, High Contrast – Low Vision, HTML Controls and also relates them to specific checkpoints from WCAG 1.0

    http://blogs.msdn.com/sharepoint/archive/2006/04/24/improvements-in-accessibility.aspx

  • Whitepaper: Deliver accessible solutions by using Office SharePoint Server - This downloadable white paper provides information and guidelines about the issues that organizations face when delivering Web solutions, including those built by using Microsoft Office SharePoint Server 2007 that are accessible to people with disabilities. It's a pretty good paper to read when you are starting your journey on accessibility. It describes the available out-of-the-box (OOB) accessibility features in MOSS 2007 and also provides a very good summary on Accessibility Kit for SharePoint (AKS). If you want to know all about AKS in 4 pages, this is the article to read. However, if you are looking for best practices or implementation approaches – you need to look for a different paper. Have a look at the next one

    http://technet.microsoft.com/en-us/library/cc668367.aspx

  • Whitepaper: Best practices for developing accessible Web sites - This downloadable white paper provides information about designing and developing accessible Web sites in Microsoft Office SharePoint Server 2007. If you are looking for implementation best practices that you couldn't find in the white paper listed above, this is a very useful resource. In this paper, Waldek Mastykarz, provides tips and techniques that are categorized in different areas such as General (HTML, javascript), .Net, MOSS, and IIS. You'll find tips such as appropriate MIME type, things to ensure while writing custom controls e.g. use Render method RenderControl

    http://technet.microsoft.com/en-us/library/cc716527.aspx

Other Resources

Toolkits

Accessibility in General

  • E-Book: Understanding Accessibility - A Guide to Achieving Compliance on Web Sites and Intranets will assist you in achieving compliance with U.S. federal standards and W3C Guidelines for Web content. From the book home page – "This book is for Web Authors, Project Managers and basically any individual or team that is faced with the challenge of creating an accessible Web site or retrofitting a Web site to make it accessible. If you are new to accessibility we suggest you start at the beginning and read the entire book. If you are tasked with repairing sites that are not accessible, this book will serve as a reference and guide. If you review sites for accessibility this book will help you to select tools and understand accessibility requirements."

    http://www.hisoftware.com/uaccess/Index.html

  • W3C Resources:
    • Official W3C Recommendation for Web Content Accessibility Guidelines 1.0 - http://www.w3.org/TR/WCAG10/
    • Web Accessibility Initiative (WAI) – Provides all resources from W3C such as Introductions, Techniques and Guidelines on Managing and Evaluating Accessibility

      http://www.w3.org/WAI/

It's been a long time (almost 18 months) since I blogged last time ... and there's been a lot of changes in this time. The key changes are: 

  1. I've moved from HP to Microsoft
  2. My focus has moved from VSTS to SharePoint
  3. My blog has changed from http://sanjaynarang.wordpress.com/ to http://blogs.msdn.com/sanjaynarang

It took me a long time to get time for blogging again. Now, as I'm once again starting on this ,, plan to be much more regular!

Would be coming up with first post very soon ...

 
Page view tracker