Search This Blog

Sunday, November 6, 2011

Creating Custom Timer Job in SharePoint 2010

Creating Custom Timer Job in SharePoint 2010




 
 
 
 
 
 
i
 
20 Votes

Quantcast

In this post I will show you how to create Custom Timer Job in SharePoint 2010 but you must know this post is based on Creating Custom SharePoint Timer Jobs ,So let us start

Create Custom List and name it  ListTimerJob





Open Visual Studio 2010 >File > New >Project >SharePoint 2010>Empty SharePoint Project. >Name it Custom_TimerJob>Ok





Check Deploy as farm solution>Finish






create a class that inherits from the Microsoft.SharePoint.Administration.SPJobDefinition class. To implement this class, you need to create a few constructors and override the Execute() method as following


01namespace DotnetFinder
02{
03    class ListTimerJob : SPJobDefinition
04    {
05         public ListTimerJob()
06 
07            : base()
08        {
09 
10        }
11 
12        public ListTimerJob(string jobName, SPService service, SPServer server, SPJobLockType targetType)
13 
14            : base(jobName, service, server, targetType)
15        {
16 
17        }
18 
19        public ListTimerJob(string jobName, SPWebApplication webApplication)
20 
21            : base(jobName, webApplication, null, SPJobLockType.ContentDatabase)
22        {
23 
24            this.Title = "List Timer Job";
25 
26        }
27 
28        public override void Execute(Guid contentDbId)
29        {
30 
31            // get a reference to the current site collection's content database
32 
33            SPWebApplication webApplication = this.Parent as SPWebApplication;
34 
35            SPContentDatabase contentDb = webApplication.ContentDatabases[contentDbId];
36 
37            // get a reference to the "ListTimerJob" list in the RootWeb of the first site collection in the content database
38 
39            SPList Listjob = contentDb.Sites[0].RootWeb.Lists["ListTimerJob"];
40 
41            // create a new list Item, set the Title to the current day/time, and update the item
42 
43            SPListItem newList = Listjob.Items.Add();
44 
45            newList["Title"] = DateTime.Now.ToString();
46 
47            newList.Update();
48 
49        }
50}
51}


As you can see this job just add a new item to a ListTimerJob list every time it’s executed



Now that you have the job built> Right click on the Features >Add Feature





Right click on the Feature1 ” you can rename the Feature1 to any name” > Add Event Receiver






As you can see the event Receiver class inherits from the Microsoft.SharePoint.SPFeatureReceiver and This class handles events raised during feature activation, deactivation, installation, uninstallation, and upgrade. But we only need FeatureActivated & FeatureDeactivated event handler to install/uninstall our custom timer job as following

01namespace DotnetFinder.Features.Feature1
02{
03[Guid("9a724fdb-e423-4232-9626-0cffc53fb74b")]
04public class Feature1EventReceiver : SPFeatureReceiver
05    {
06        const string List_JOB_NAME = "ListLogger";
07        // Uncomment the method below to handle the event raised after a feature has been activated.
08 
09        public override void FeatureActivated(SPFeatureReceiverProperties properties)
10        {
11            SPSite site = properties.Feature.Parent as SPSite;
12 
13            // make sure the job isn't already registered
14 
15            foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
16            {
17 
18                if (job.Name == List_JOB_NAME)
19 
20                    job.Delete();
21 
22            }
23 
24            // install the job
25 
26            ListTimerJob listLoggerJob = new ListTimerJob(List_JOB_NAME, site.WebApplication);
27 
28            SPMinuteSchedule schedule = new SPMinuteSchedule();
29 
30            schedule.BeginSecond = 0;
31 
32            schedule.EndSecond = 59;
33 
34            schedule.Interval = 5;
35 
36            listLoggerJob.Schedule = schedule;
37 
38            listLoggerJob.Update();
39 
40        }
41 
42        // Uncomment the method below to handle the event raised before a feature is deactivated.
43 
44        public override void FeatureDeactivating(SPFeatureReceiverProperties properties)
45        {
46            SPSite site = properties.Feature.Parent as SPSite;
47 
48            // delete the job
49 
50            foreach (SPJobDefinition job in site.WebApplication.JobDefinitions)
51            {
52 
53                if (job.Name == List_JOB_NAME)
54 
55                    job.Delete();
56 
57            }
58 
59}
60 
61   }


Before Deploying you should select the right scope of the Feature in other words in which scope you will activate the Feature(Farm,Site,Web,WebApplication) in our case we will activate Feature1 on Site which is mean Site Collection.





Note : if you trying to activate the feature in the wrong scope will get the following error





Now let us deploy our custom timer job >Right Click on Custom_TimerJob project > Click Deploy






Open now your SharePoint site and select ListTimerJob List and you should see something similar to the following image








Our custom timer job is working fine now you can go and check it and modify the schedule as following

Go to SharePoint 2010 central administration >Monitoring >in the Timer Jobs Section Select Review Job Definitions

and you should See our Custom Timer Job






Click on it and you should see Edit Timer Job Page ,Modify Timer Job schedule based on your requirement



Note : you can also modify schedule of your custom Timer Job from the code but you need to add one of the following class in FeatureActviated Event Handler as following




After Specific Minutes use SPMinuteSchedule class


Hourly use SPHourlySchedule class



Daily use SPDailySchedule class


Weekly use SPWeeklySchedule class


Monthly use SPMonthlySchedule class




Updated [ 8/10/2011]


References

How to: Create a Web Application-Scoped Timer Job

Friday, November 4, 2011

TabContainer Setting Focus to a control inside the TabPanel

<%@ Control Language="VB" AutoEventWireup="false" CodeFile="SearchTabs.ascx.vb" Inherits="UserControls_SearchTabs" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>

<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
   
Namespace="System.Web.UI" TagPrefix="asp" %>
<div style="text-align:left">

<script type="text/javascript" language="javascript" >
 
var control;
 

function getControl_TabClicked1(sender, e) {  
        control
= $get('<%=txtName.ClientID%>');        
}

function getControl_TabClicked2(sender, e) {  
        control
= $get('<%=txtAddress.ClientID%>');        
}

function getControl_TabClicked3(sender, e) {  
        control
= $get('<%=txtID.ClientID%>');        
}

function getControl_TabClicked4(sender, e) {  
        control
= $get('<%=txtAttribute.ClientID%>');      
}
 

function setFocus(sender, e) {  
    control
.focus();  
}


 
</script>


<ajaxToolkit:TabContainer runat="server" ID="Tabs" CssClass="MyTab" Height="60px" Width="400px" OnClientActiveTabChanged="setFocus" >    
   
<ajaxToolkit:TabPanel runat="Server" ID="panName" HeaderText="By Name" ScrollBars="auto" OnClientClick="getControl_TabClicked1">                        
       
<ContentTemplate>  
             
<asp:UpdatePanel ID="updateTab1" runat="server" >
               
<ContentTemplate>                                              
                   
<table >
                       
<tr>
                           
<td align="left">Enter Business Name</td>
                           
<td align="left"><asp:TextBox ID="txtName" runat="server" Width="150px" CssClass="textbox"  TabIndex="1" /></td>
                           
<td align="center">
                               
<asp:Button ID="btnName" runat="Server" Text="Search" CssClass="textbox"/>
                           
</td>
                       
</tr>                      
                       
<tr>
                           
<td colspan="3" align="left">Enter at least 3 characters from the Business Name</td>
                       
</tr>
                   
</table>                                                    
               
</ContentTemplate>
           
</asp:UpdatePanel>                          
       
</ContentTemplate>
   
</ajaxToolkit:TabPanel>
   
   
<ajaxToolkit:TabPanel  runat="Server" ID="panAddress"  HeaderText="By Address" OnClientClick="getControl_TabClicked2">
       
<ContentTemplate>
             
<asp:UpdatePanel ID="updateTab2" runat="server">
               
<ContentTemplate>
                   
<table>
                       
<tr>
                           
<td align="left">Enter Business Address</td>
                           
<td align="left"><asp:TextBox ID="txtAddress" runat="server" CssClass="textbox"/></td>
                           
<td align="center">
                               
<asp:Button ID="btnAddress" runat="Server" Text="Search" CssClass="textbox"/>
                           
</td>
                       
</tr>                        
                   
</table>                    
               
</ContentTemplate>
           
</asp:UpdatePanel>    
       
</ContentTemplate>
   
</ajaxToolkit:TabPanel>

   
<ajaxToolkit:TabPanel runat="Server" ID="panID" HeaderText="By ID" OnClientClick="getControl_TabClicked3">
       
<ContentTemplate>
             
<asp:UpdatePanel ID="updateTab3" runat="server">
               
<ContentTemplate>
                   
<table>
                       
<tr>
                           
<td align="left">Enter Business ID</td>
                           
<td align="left"><asp:TextBox ID="txtID" runat="server" CssClass="textbox"/></td>
                           
<td align="center">
                               
<asp:Button ID="btnID" runat="Server" Text="Search"  CssClass="textbox"/>
                           
</td>
                       
</tr>
                       
<tr>                            
                           
<td colspan="3">
                               
<asp:RegularExpressionValidator runat="server" ID="revID" ControlToValidate="txtID" ValidationExpression="^\d+$" ErrorMessage="Must be an integer > 0!" Font-Size="X-Small" SetFocusOnError="true"></asp:RegularExpressionValidator>                            
                               
<asp:CompareValidator ID="cvID"  runat="server" ControlToValidate="txtID" ValueToCompare="0" Operator="NotEqual" ErrorMessage="Must be an integer > 0!" Font-Size="X-Small" SetFocusOnError="true"></asp:CompareValidator>                                
                           
</td>                            
                       
</tr>                        
                   
</table>                  
             
</ContentTemplate>
           
</asp:UpdatePanel>  
       
</ContentTemplate>
   
</ajaxToolkit:TabPanel>
   
   
<ajaxToolkit:TabPanel runat="Server" ID="panAttribute" HeaderText="By Attribute" OnClientClick="getControl_TabClicked4">
       
<ContentTemplate>
           
<asp:UpdatePanel ID="updateTab4" runat="server">
               
<ContentTemplate>
                   
<table>
                       
<tr>
                           
<td align="left">Select Attribute</td>
                           
<td align="left" colspan="2">
                               
<asp:DropDownList ID="ddlAttributes" DataSourceID="AttributesDataSource" DataTextField="text" DataValueField="value" runat="server" CssClass="textbox">
                               
</asp:DropDownList>
                               
<asp:XmlDataSource ID="AttributesDataSource" runat="server" DataFile="~/XML Files/AttributeNames.xml">
                               
</asp:XmlDataSource>
                           
</td>
                           
</tr>
                           
<tr>
                           
<td align="left">
                                Enter Value
                           
</td>
                           
<td align="left">
                               
<asp:TextBox ID="txtAttribute" runat="server" CssClass="textbox"></asp:TextBox>                                
                               
                           
</td>
                           
<td align="center">
                               
<asp:Button ID="btnAttribute" runat="Server" Text="Search" CssClass="textbox"/>
                           
</td>
                       
</tr>                                        
                   
</table>                                                                    
               
</ContentTemplate>
           
</asp:UpdatePanel>
       
</ContentTemplate>
   
</ajaxToolkit:TabPanel>                      
</ajaxToolkit:TabContainer>

</div>  

 

Thursday, November 3, 2011

TabContainer Setting Focus to a control inside the TabPanel

 Place this at the BOTTOM of your ASP.Net Page.  Replace txtPartNo with the name of your control.



<script language="javascript" type="text/javascript">
   
Sys.Application.add_load
   
(
       
function()
       
{
            window
.setTimeout(focus, 1);
       
}
   
)
   
function focus()
   
{
        document
.getElementById('<%=txtPartNo.ClientID %>').focus();
   
}
</script>