Friday, January 30, 2009

Content Type in MOSS

Hi All,

Today we are going to take a very basic and simple way to create a Content Types.

First we will understand what these content types are.

Content Types in MOSS can be treated as a base class with must inherit attributes.

Content Types can be created and then used at sites and sub sites on the list and document library level.

Many items can be treated as content types. For example:

Document Template
Workflows
Columns
Information Management Policies

There are many built in content types already there in moss. Some of them are Blank Document, Announcements and many more if you go to site settings and site content types, there you can see many built in content types available.

They can be simply seen as reusable component. Once created can be used later by just referring them.

Let’s take an example for creating columns and menu item content type to understand further.

First go to Site settings -> site content types under gallery and click on Create to create new content type.



As you can see we have created one content type named Projects and it is as Item for the List.

Now what we need to do is add columns in that content types.

So click ok and go to add from new site columns.

Create Columns: Like this



Now we are done with the content types. Now we need to create one list and add this content type to that list.

So go ahead and create a custom list. Give name Projects List.

Now go to List Settings and advance settings and then change on allow management of content type to True.



Doing this will enable one more section called Content Types in List Settings Screen.

Now go to Add from existing site content type and find out the projects and add it. As you can see the category is Project Management that we gave while creating the content type.



Click on Item content type and delete this content type as we do not want that.

Now go to Project List and click on New.



And once you click on Project, see what comes.



So without adding columns to the Project List, we have added columns with the help of content types as our content type has columns in it.

That’s it.

Wednesday, January 28, 2009

Limitation and Upper boundaries of SharePoint 2007

Hi all,
I was very curious to know the limitation upper boundaries of SharePoint 2007 in standard environment. Then I came across nice Microsoft very informative blog here is a link Click here



Site object

Guidelines for acceptable performance

Notes

Scope of impact when performance degrades

Site collection

50,000 per Web application

Total farm throughput degrades as the number of site collections increases.

Farm

Web site

250,000 per site collection

You can create a very large total number of Web sites by nesting the subsites. For example, 100 sites, each with 1000 subsites, is 100,000 Web sites. The maximum recommended number of sites and subsites is 125 sites with 2,000 subsites each, for a total of 250,000 sites.

Site collection

Subsite

2,000 per Web site

The interface for enumerating subsites of a given Web site does not perform well as the number of subsites surpasses 2,000.

Site view

Document

5 million per library

You can create very large document libraries by nesting folders, using standard views and site hierarchy. This value may vary depending on how documents and folders are organized, and by the type and size of documents stored.

Library

Item

2,000 per view

Testing indicates a reduction in performance beyond two thousand items. Using indexing on a flat folder view can improve performance.

List view

Document file size

50MB (2GB max*)

File save performance is proportional to the size of the file. The default maximum is 50 MB. This maximum is enforced by the system, but you can change it to any value up to 2 GB.

Library, file save performance

List

2,000 per Web site

Testing indicates a reduction in list view performance beyond two thousand entries.

List view

Field type

256 per list

This is not a hard limit, but you might experience list view performance degradation as the number of field types in a list increases.

List view

Column

2,000 per document library

4,096 per list

This is not a hard limit, but you might experience library and list view performance degradation as the number of columns in a document library or list increases.

Library and list view

Web Part

50 per page

This figure is an estimate based on simple Web Parts. The complexity of the Web Parts dictates how many Web Parts can be used on a page before performance is affected.

Page

Tuesday, January 27, 2009

Receiving / enabling emails in the list or library

Hello All,

Today I am going to discuss something about the receiving emails in the list. Before that let me discuss some of the points.

You can receive the emails in one of the following lists.
(1) Document Library
(2) Announcement
(3) Calendar
(4) Discussion
(5) Blog

But before enabling email support in the list, you need to enable incoming email support in the central administration. Under operations->Incoming mail settings.

We will go for enabling for document library.

So first go and check for the incoming email options in central administration. Then only you can see incoming mail settings options under communication section for the document library.

Go to the incoming email settings.

Select allow this document library to receive emails.

Specify the email address for this document library. If anyone sends mail to this email address, mail will be coming down to this document library.

Keep save all attachments in rootfolder and at last keep Accept e-mail messages from any sender options selected.

I also want to give more highlight on one important email handler class. Once you have the document library enabled with the email receiver, then there is one class which you can use and override its method.

The class is SPEmailEventReceiver and you need to override its EmailReceived method. When email is received by the list and event handler is attached to the list. Here is a code which extracts the subject and body from the email and adds the item to the list.

public class EmailHandler: SPEmailEventReceiver
{
public override void EmailReceived(
SPList objList,
SPEmailMessage objMessage,
string strReceiverData)
{
SPListItem objListItem = objList.Items.Add();
objListItem["Title"] = objMessage.Headers["Subject"];
objListItem["Body"] = objMessage.HtmlBody;
objListItem.Update();
}
}


That’s it. Enjoy email receiving.

Thursday, January 8, 2009

Understanding Workflow Tracking Service - Part 3

Hi All,

Here i am back with tracking series for workflow.

Before continue here, i would recommend to go and read previous two parts.

Understanding Workflow Tracking Service - Part 1

Understanding Workflow Tracking Service - Part 2

Ok, by taking the same database and tables and workflow in our hand, run the workflow once again so that we have two ActivityInstances in table and we have two workflowinstances in our database.

Then after running the workflow, just validate again by firing the query in our “WorkflowTracing”database .

Select * from ActivityInstance

Select * from WorkflowInstance

So that you get a result similer to this.



As I have also described you that one tool which we can use to track the tracking service is the WorkflowMonitor tool. But here first we will explore two classes that will be used to extract the information from tracking database.

Ok, let’s write a code inside our tracker console application. But before doing this, do not forget to sign the assembly as strong name otherwise you will not get the Activity and workflow Events. After signing your assembly with strong name only execute this code.

Go to your program.cs and after waitHandle.WaitOne(); write the following code.

#region "Fetch the ActivityEvents"

SqlTrackingQuery objQuery = new SqlTrackingQuery(strConnection);
SqlTrackingWorkflowInstance objInstance = null;

objQuery.TryGetWorkflow(instance.InstanceId, out objInstance);

if (objInstance != null)
{
foreach (ActivityTrackingRecord objRecord in objInstance.ActivityEvents)
{
Console.WriteLine(" {0} :: {1} :: {2} ", objRecord.ExecutionStatus,
objRecord.EventDateTime, objRecord.QualifiedName);
}

Console.Read();
}

#endregion

Here as you can see we have first taken the SqlTrackingQuery object and initialized with the tracking services and then we got the SqlTrackingTrackingWorkflowInstance and then once we have it , we got the ActivityEvents and then iterate through its collection and accessed different properties. You can try and explore more and more properties for the same. For example only I have used three of them and displayed them on console.

See figure below.



Same way write down the below code next to the ActivityEvents iterations in the same way. This is for the WorkflowEvents to track.

#region "Fetch the ActivityEvents"

SqlTrackingQuery objQuery = new SqlTrackingQuery(strConnection);
SqlTrackingWorkflowInstance objInstance = null;

objQuery.TryGetWorkflow(instance.InstanceId, out objInstance);

if (objInstance != null)
{
foreach (WorkflowTrackingRecord objRecord in objInstance.WorkflowEvents)
{
Console.WriteLine(" {0} :: {1} ",
objRecord.EventDateTime, objRecord.EventOrder);
}

Console.Read();
}

#endregion

This way we have fetched the built in events that are trapped automatically by Workflow Tracking service but what if we want to track our own custom events to the database.

Because many a times we want to capture our own tracing, like we can say CodeActivity1 has started. Code activity1 is in process, this step done and code activity ended, this was the user, this happened. Anything that we want to track we can track it if we write our own messages.

Let’s have a look on them.

Activity supports a method called TraceData. It has two overloaded method, one takes the object as a parameter and other takes string as an input for key and an object as a value to store.

So modify our BeforeDelay and AfterDelay activity like this and then run the program again.



Once you are done with the execution of the program, open the database and look for UserEvent table, you will find your own entries that you just did in above code.



This is one way to get the tracked workflow events and activity events from the database. Once you have the values you can define your custom application to display those values.

Next we will see the Workflow Monitor tool to see how this same process can also be seen in using this Monitor tool.

I will continue this series in my next article.

Monday, January 5, 2009

Understanding Workflow Tracking Service - Part 2

Hi All,

If you are here first time I would recommend you to go and read part 1 before proceeding here.

Understanding Workflow Tracking Service - Part 1

Understanding Workflow Tracking Service - Part 3

Let’s continue our series of workflow tracking service.

Ok, once you are done with the basic understanding, let’s create necessary steps for this.

For workflow tracking service to be incorporated, we first need to create one separate database for workflow tracking. This database will contain necessary tables, views, stored procedures and function required for the tracking service. We are given built in SQL script that will create this database for us.

To start with, go to your database server and connect it with your credentials of Window Authentication or Forms Authentication.

Create a database and name it “WorkflowTracking”. Once you are done with this step and if you explore the database node in server explorer, you will see newly database that we have just created.

Now it’s time to find out scripts that are required for this. Typically it should be in your Windows Directory.

C:\WINDOWS\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\EN

If you have different Windows Directory, change it accordingly.

There you will find, Tracking_Schema.sql. Drag and drop in your SQL Server management studio or SQL Express. Be sure to use WorkflowTracking database only, else if you run the script, it will create all these stored procedures, tables in your default database and it will be overhead to remove them from it. So be sure to have WorkflowTracking database in use.

You can write use WorkflowTracking command at the top of the script before you run this.

Once you are done with running the script, you will see tables, stored procedures and functions created there.



Repeat the same steps for Tracking_Logic.sql. (Do not forget to use WorkflowTracking database at the top of the script before running it).

Now we have setup our database for tracking service. All we need to do now is create the Workflow and add the Tracking service in it and bind it with the database so that we can track the activities and much more.

Ok, open the Visual Studio and create a simple Sequential workflow Console Application and name it “TrackedWorkflow”.

Drag IfElseActivity inside that and click left side IfElseActivity1 and set its property according to the figure shown below.



Now drag code activity from toolbox and place it in the First IfElseActivity1 that is Left branch.



Keep Adding the Delay Activity, set its interval to 10 seconds and then again code activity name it as AfterDelayActivity.



Write down the respective code in respective code activity methods

Console.WriteLine("Before Delay Activity....");and

Console.WriteLine("After Delay Activity....");

Write down the Code in that shown in figure below.



Add Application Configuration File in your console Workflow Application and add a reference of Systm.configuration.

Add ConnectionString in app.config File for WorkflowTracking database with your server credentials.

And then in Program.cs add SQLTrackingService to WorkflowRuntime like shown in figure below.

Remember to add reference to System.Workflow.Runtime and System.Workflow.Runtime.Tracking Library.



And then just see the magic, execute your workflow and then open your database and execute Select Query on ActivityInstance table. See you will get the result. Without writing code, we have made the database entry.



Ok, that’s it for this part. Now in next part, we will continue our exploration on tracking service and we will explore the SQLTrackingQuery to gain the knowledge on how to retrieve the information from these activities and workflow related tables and also how to track User Specific actions in the same tables.

All these in next part.

Sunday, December 28, 2008

Highlight SharePoint List rows conditionally

Hi All,here is some JQuery Stuff that will help you to highlight rows of SharePoint List items based on some condition.


<script type="text/javascript">
if(typeof jQuery=="undefined"){
var jQPath="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/";
document.write("<script src='",jQPath,"jquery.min.js' type='text/javascript'><\/script>");
}
</script>
<script>

$(document).ready(function(){

$Text = $("td .ms-vb2:contains('Sales')");

$Text.parent().css("background-color", "green");

$Text =$("td .ms-vb2:contains('Account')");

$Text.parent().css("background-color", "orange");

});

</script>


above JQuery code will highlight if Column has 'Sales' then row will highlight with color green.if column has value Account then it will highlight with orange color.

Look at second Post http://www.sharepointkings.com/2009/04/sharepoint-calculated-column-and-jquery.html

Wednesday, December 17, 2008

Create Custom Web Part in SharePoint

Hello Everyone !

Are you new to SharePoint development? Do you want to see how to create a custom web part?

Let me explain you from basic. Although there are many ways to create a web part but lets look at one way.


Following steps are involved in the creation of a custom web part:
1. Creation of Web Part project.
2. Creation of controls used in the web part.
3. Loading the control as web part.
4. Deploying the web part code in the SharePoint site.
5. Adding the web part on the site page.

Let’s understand each step with the help of an example.

Step 1: Open Visual Studio and create a new blank solution as shown in figure. 1.





Figure.1
Step 2: Add a new project of type web application under the newly created solution as shown in the figure.2 below.




Figure.2

Delete the existing class from it. Add a new web user control in this project and give some appropriate name to it as shown in figure. 3




Figure .3
Code snippet for the user control and its code behind is given below:



using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

namespace MyWebControls
{
public partial class MyUserControl : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{

}

protected void MyButton_Click(object sender, EventArgs e)
{
Response.Write("Good Morning " + txtUserName.Text);
}
}
}

Step 3: Create a new project under the solution of type class library as shown in figure.4 below.





Figure. 4

Delete the default class and add a new class as shown in the figure.5





Figure .5

Add Reference of Windows SharePoint Services to this project as shown in the figure. 6 below.




Figure.6

Code snippet is shown below:
Generate a new GUID.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Serialization;
using System.Runtime.InteropServices;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.WebPartPages;

namespace MyWebPart
{
[Guid("52D7FA40-EF93-45ad-806E-9B77C782A93B")]
[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Assert, Unrestricted = true)]
public class MyWebPartClass : System.Web.UI.WebControls.WebParts.WebPart
{
public MyWebPartClass()
{

this.ExportMode = WebPartExportMode.All;
}

string virtualpath = @"~/UserControls/MyUserControl.ascx";
protected override void CreateChildControls()
{
MyWebControls.MyUserControl objMyUserControl = (MyWebControls.MyUserControl)Page.LoadControl(virtualpath);
this.Controls.Add(objMyUserControl);
}

}
}

Step 4: Go to the properties of the web part project and select the build output path to the bin folder of the web application virtual directory. Before compiling add reference of the web part control project to it.

Add a safe control entry (below the safe control entries which are already present) to the web.config file of the web application which is present inside the virtual directory.





Change the trust level to Full as shown below.




Step 5:
Add Control to site:

Create a new folder within the virtual directory of the web application to store the user control. Give it a name such as UserControls.

Now go to Site Settings and click web parts as shown in the figure below



Figure.7
Click on New Web parts. Select the web part we deployed and click populate gallery.





Figure.8

Go to the page on which you want to add the web part. Click the site settings àEdit Page as shown in the figure. 9 below.





Figure.9

Select the web part from the list of web parts. That’s it your web part is ready to play its role.




Figure.10



Figure.11

I hope this post will help many developers. If you still need more clarification please write to us at

sharepointkings@gmail.com
We will be happy to help you as always.






Understanding Workflow Tracking Service - Part 1

Hi All,

I have been working with workflows for many months and I love to explore each and every thing with respect to workflow. I learn about different activities and different ways to create the workflows and much more other stuff that can be done in workflow. One of the good stuff to do with workflow is services. Services can be attached to the workflow runtime.

Every workflow has instance and there is always a workflow runtime which handles this workflow. There are many services available that can be attached to the workflow runtime.

Here is a list of services that can be added to the workflow runtime.

(1) Workflow Persistence service
(2) Workflow Queuing service
(3) Workflow runtime service
(4) Workflow scheduler service
(5) Workflow Tracking service
(6) Workflow Transaction service

Here we are going to go with Workflow Tracking service. In this article we are going to cover the understanding on tracking service of workflow.

Read Understanding Workflow Tracking Service - Part 2
for further reading.

Workflow has one primary service which is SqlTrackingService. There are two additional services are also available which are ConsoleTracking as well as SimpleFileTrackingService. But we are going to discuss SqlTrackingService.

First let me give you a highlight on this tracking. When your workflow gets started, an instance of it gets created and starts running. This instance then fires several events internally when activities get executed. If you want to capture all these details, you can do it with the help of tracking service. You can track other things also like your own custom tracking. Let’s say at the end of every activity or in between any activity you would like to make a cross mark saying that this and this part of activities have completed executing. Something like this is possible with the tracking service.

If you want to track your custom data, you will have to prepare Tracking profile which is nothing but an XML which shows that what data to capture and what not to capture.

So Bottom line is to track the actions taking place in workflow and actions that you want to track on your own can be achieved easily through tracking service. All you need to have is SqlServer and Tracking service to attach to workflow runtime.

All this information is stored in database. So once we have data in database, then it becomes easy to have query on them and to generate reports from them.

One big advantage of querying this tracking data is WF also comes with SQLTrackingQuery class built in with it. So just play with an object of this class and have some fun getting the answers of your query. So even no need to write specific SELECT Commands for this.

Built in tracking is actually divided in three parts.

(1) Activity tracking

Activity tracking allows you to track activity related events like activity cancellation, activity execution, and unhandled exceptions in activity etc. ActivityTrackingpoint and ActivityTrackingLocation object allows you to track all these.

(2) Workflow Tracking

Workflow Tracking allows you to track workflow related events like workflow starting, workflow stopping and workflow terminated etc.

(3) User Tracking

User related all custom tracking that you would like to capture. Because user tracking is workflow to workflow specific.

If you closely look at this concept, this is very similar to tracing in ASP.NET where you have different severity levels and based on that what all information you want to capture can be traced at any point of time.

To really analyze data captured by service, WF also comes with the Tool called WorkflowMonitor. This is useful to see the execution of workflow as GUI. Where you come to know what all activities are done for specific instance and what all activities are pending to execute.

We will have a real fun in executing this service and then analyze the data captured by tracking service and using the Workflow Monitoring tool.

I will continue this article and in part 2 we will explore the tracking service practically.

Monday, December 15, 2008

Iterate SharePoint list items using SharePoint web service

Hi all,
here is some chunks of that will help you out to iterate list item in SharePoint list using SharePoint web service. to parse all list items you should know XmlNameSpace from result xml schema,but here in this case I have remove that XmlNameSpace using Regx.so it is easy to iterate result xml schema.

Following example will fetch all list items from SharePoint list and show all title to console.

for better result copy the code and paste it in your console application add necessary assemblies,
include SharePoint list.asmx webrefrence name this reference as "ListService".


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
//List service proxy
using SharePointKingsDemo.ListService;
using System.Net;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;

namespace SharePointKingsDemo
{
///


/// Created By:Jayesh Prajapati.
/// Purpose:how to use SharePoint web service.,how to iterate each row in SharePoint list.
/// iterate each SharePoint list item without xmlname space.
/// This demo will work on .NET framework 3.5
///

class Program
{
//find replace xmlnamespace..
private static readonly Regex StripXmlnsRegex =
new Regex(@"(xmlns:?[^=]*=[""][^""]*[""])",
RegexOptions.IgnoreCase RegexOptions.Multiline RegexOptions.Compiled RegexOptions.CultureInvariant);

//to find and replace short XmlNameSpace like z:,rs: from xmlresponse by GetListItems method
private static readonly Regex removeShortNameSpace = new Regex
(@"(?<lessthan><)(?<closetag>[/])?(?<shortname>\w+:)\s*", RegexOptions.IgnoreCase RegexOptions.Multiline RegexOptions.Compiled RegexOptions.CultureInvariant);


static void Main(string[] args)
{
//list webservice proxy instance..
ListService.Lists listService = new Lists();
CredentialCache credential = new CredentialCache();
//credentials username,password,domain..
NetworkCredential networkCredential = new NetworkCredential("username", "password","domain");
credential.Add(new Uri("http://localhost"),"NTLM",networkCredential);
listService.Credentials = credential;
listService.Url = "http://localhost/_vti_bin/lists.asmx";

//xmldocument to create necessary nodes for getalllistitems method..
XmlDocument xdoc =new XmlDocument();
XmlNode queryNode =xdoc.CreateNode(XmlNodeType.Element,"Query","");

//get all list items whose id is greater than zero i.e all list item..
string strQuery = @"<Where><Gt><FieldRef Name='ID'/><Value Type='Counter'>0</Value></Gt></Where>";
queryNode.InnerXml=strQuery;
XmlNode viewNode = xdoc.CreateNode(XmlNodeType.Element,"ViewFields","");
string strViewFields = "<FieldRef Name=\"ID\" /><FieldRef Name=\"Title\" />";
viewNode.InnerXml=strViewFields;
XmlNode nodeQueryOption = xdoc.CreateNode(XmlNodeType.Element,"QueryOptions","");
nodeQueryOption.InnerXml="<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns><DateInUtc>TRUE</DateInUtc>";
string rowlimit = "100";
string webid = "";

//get items from test sharepoint list..
XmlNode result = listService.GetListItems("test","", queryNode, viewNode, rowlimit, nodeQueryOption, webid);

//remove namespace xmlnls from result xml..
string xmlResponse = StripXmlnsRegex.Replace(result.InnerXml, "");

//find and replace short XmlNameSpace like z:,rs: from responce with space..
xmlResponse = removeShortNameSpace.Replace(xmlResponse, delegate(Match m)
{
Group closetag = m.Groups["closetag"];
if (closetag.Length !=0)
{
return "</";
}
else
{
return "<";
}

});

//load xml from removed XmlNameSpace and short name of XmlNameSpace..
XDocument xmlDoc = new XDocument();
xmlDoc = XDocument.Parse(xmlResponse);

//iterate each row in sharepoint list.
//in result xml each row is in element "row"
var Items = from item in xmlDoc.XPathSelectElements("//row")
select new
{
//get Title Field of SharePoint list...
Title = Convert.ToString(item.Attribute("ows_Title").Value)
};
//display each item in title field in console..
Array.ForEach(Items.ToArray(), item => Console.WriteLine(item.Title));
Console.ReadLine();


}
}
}

give your comments on this post, for alternate approch to parse web service response using xpath see following article..

http://www.sharepointkings.com/2008/11/how-to-iterate-sharepoint-list-fields.html


Friday, December 12, 2008

How to deploy a workflow in moss

Hi All,

Deploying a workflow is one of the major concerns when you develop the workflow because developing the software or anything is only half job done. The other half is deploying the code and software that you have developed.

so here we look forward on how to deploy a workflow in moss.

I will give you here the brief idea about how exactly we can proceed to have a structure of workflow and finally what files are needed for workflow to deploy.

Here keep in mind that I am talking about the workflows developed using the Visual Studio. we are not talking about workflow designed by the Sharepoint Designer.

To start with, you should have a workflow dedicated project in which your entire workflow will reside.

Give name of the Project and then Create Folder Structure inside it just like shown below.



The above should be the structure where you can have your feature Files and related ASPX files if any like association and initiation pages for the workflow.

Now double click the workflow.xml and right click and select insert snippet and then Windows Sharepoint Service Workflow> and then workflow.XML Which will give you the complete XML which you are required to use.





Snippets give you the clear idea about the replacement of tokens that we have to make. So all the green tokens need to be replaced by appropriate values.

Replace Name with the name of the Workflow that you want to give.

ID must be unique GUID. Generate it from Visual Studio Tools>Create GUID option

Tokens are self explanatory. So replace it accordingly.

Same way, use the Insert snippet and this time select feature.xml



Replace the Unique GUID and other tokens.

So here are the total files that are required for workflow to deploy:

(1) Your workflow code assembly
(2) Feature file
(3) Custom Forms if needed
(4) Workflow file which is also called workflow definition file.

Folder under feature and folder under layouts will have the same name.

Copy those folders and paste them in respective 12 hive folder. Give your assembly strong name and build your project. Place assembly in GAC.

Now your feature is ready for deployment.

Install the feature and activate that feature, so if your feature is installed at site level, you will find it at site collection administration or else you will find in the site administration under specific web. And if the feature is activated, you will find the workflow in Workflow Settings under document library and list.



Share your SharePoint Experiences with us...
As good as the SharePointKings is, we want to make it even better. One of our most valuable sources of input for our Blog Posts comes from ever enthusiastic Visitors/Readers. We welcome every Visitor/Reader to contribute their experiences with SharePoint. It may be in the form of a code stub, snippet, any tips and trick or any crazy thing you have tried with SharePoint.
Send your Articles to sharepointkings@gmail.com with your Profile Summary. We will Post them. The idea is to act as a bridge between you Readers!!!

If anyone would like to have their advertisement posted on this blog, please send us the requirement details to sharepointkings@gmail.com