2016-01-18 5 views
0

В SharePoint весь список имеющий Статуса столбца (Datatype является Dropdown) & DueDate колонка. Столбец Duedate превышает сегодняшнюю дату. Состояние. Столбец должен быть изменен. Закрыто автоматически с использованием Timerjob. Я использовал этот код, но не работает, пожалуйста, кто-то изменит этот код и как достичь этого решения.TimerJob SharePoint Server 2013

class.cs

namespace TimerJobNew 
{ 
    class StatusCompleted : SPJobDefinition 

    { 
     public const string jobName = "CompletedProjectsJob"; 
     public StatusCompleted() : base() { } 
     public StatusCompleted(SPWebApplication webApplication) 
      : base(jobName, webApplication, null,SPJobLockType.Job) 
     { 
      Title = "Completed Projects Job"; 
     } 
     public override void Execute(Guid targetInstanceId) 
     { 
      SPWebApplication webApp = this.Parent as SPWebApplication; 
      SPSite site = new SPSite(SPContext.Current.Web.Url); 
      SPWeb web = site.RootWeb; 
      // SPWeb web = webApp.Sites["/sites/test"].RootWeb; 
      SPList list = web.Lists.TryGetList("CommonList"); 
      SPListItem items; 
      bool flag =true; 
      SPListItemCollection itemColl = list.Items; 
      var query =new SPSiteDataQuery(); 
      query.Lists = "<Lists BaseType='0' />"; 
      query.ViewFields = "<FieldRef Name='Title' Nullable='TRUE' />" + 
           "<FieldRef Name='Status' Nullable='TRUE' />" + 
           "<FieldRef Name='CommonlistID' Nullable='TRUE' />"; 

      query.Query = "<Where>" + 
           "<Eq>" + 
            "<FieldRef Name='Status' />" + 
            "<Value Type='Choice'>Closed</Value>" + 
           "</Eq>" + 
          "</Where>"; 
      query.Webs = "<Webs Scope='SiteCollection' />"; 
      DataTable dt = web.GetSiteData(query); 
      foreach (DataRow row in dt.Rows) 
      { 
       items = list.Items.Add(); 
       if (itemColl.Count != 0) 
       { 
        foreach (SPListItem item in itemColl) 
        { 
         if (item["CommonlistID"].ToString() == row["CommonlistID"].ToString()) 
         { 
          flag = false; 
          break; 
         } 
         else 
         { 
          flag = true; 
         } 
        } 
        if (flag ==true) 
        { 
         items["Title"] = row["Title"].ToString(); 
         items["Status"] = row["Status"].ToString(); 
         items["CommonlistID"] = row["CommonlistID"]; 
         items.Update(); 
         list.Update(); 
        } 
       } 
       else 
       { 
        items["Title"] = row["Title"].ToString(); 
        items["Status"] = row["Status"].ToString(); 
        items["CommonlistID"] = row["CommonlistID"]; 
        items.Update(); 
        list.Update(); 
       } 
      } 
     } 
    } 
} 


    [Guid("95a2f297-4d46-45b2-b792-a7874f11ce08")] 
    public class StatusFeatureEventReceiver : SPFeatureReceiver 
    { 
     public override void FeatureActivated(SPFeatureReceiverProperties properties) 
     { 
      SPWebApplication webApp = properties.Feature.Parent as SPWebApplication; 
      DeleteJob(webApp.JobDefinitions); 
      StatusCompleted tasksTimerJob = new StatusCompleted(webApp); 
      SPMinuteSchedule schedule = new SPMinuteSchedule(); 
      schedule.BeginSecond = 0; 
      schedule.EndSecond = 59; 
      schedule.Interval = 1; 
      tasksTimerJob.Schedule = schedule; 
      tasksTimerJob.Update(); 
     }  
     public override void FeatureDeactivating(SPFeatureReceiverProperties properties) 
     { 
      SPWebApplication webApp = properties.Feature.Parent as SPWebApplication; 
      DeleteJob(webApp.JobDefinitions); 
     } 
     private void DeleteJob(SPJobDefinitionCollection jobs) 
     { 
      foreach (SPJobDefinition job in jobs) 
      { 
       if (job.Name.Equals(StatusCompleted.jobName, 
       StringComparison.OrdinalIgnoreCase)) 
       { 
        job.Delete(); 
       } 
      } 
     } 
    } 
} 
+0

SPContext.Current.Web.Url не будет работать в задании таймера, поскольку он работает на уровне фермы, используйте полный URL ..... –

ответ

0

Как сказано в комментарии, ваш code'll никогда не работать, так как SPContext равно нулю при использовании SPTimerJob. (Обратите внимание, что это одинаково для EventReceiver)

Вы можете улучшить конструктор своей работы, чтобы получить дополнительную информацию. Таким образом, в вашем случае вы можете сделать:

public StatusCompleted(SPWebApplication webApplication, string TargetSite) 
     : base(jobName, webApplication, null,SPJobLockType.Job) 
{ 
    Title = "Completed Projects Job"; 
    Properties.Add("TargetSite", TargetSite); 
} 

Тогда при вызове методы Execute(), вы можете получить на сайте:

string targetList = (this.Properties["TargetList"] ?? string.Empty).ToString(); 
using (SPSite site = new SPSite(targetSite)) 
{ 
    using (SPWeb web = site.OpenWeb()) 
    { 
    //TO DO 
    } 
} 

Надеется, что это помогает

И последнюю мысль , не забудьте отладить ваш TimerJob. Будет очень полезно найти ошибку. Вам просто нужно прикрепить свою Visual Studio к процессу OWSTIMER.exe.