TimerJob sharepoint server 2013
В sharepoint весь список, имеющий столбец Status (тип данных Dropdown) и столбец Duedate. Столбец Duedate превышает текущую дату. Столбец состояния должен быть изменен. Закрывается автоматически с помощью Timerjob. Я использовал этот код, но он не работает, пожалуйста, кто-то изменил этот код и как достичь этого решения.
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();
}
}
}
}
}
1 ответ
Как сказано в комментарии, ваш код никогда не будет работать, так как SPContext имеет значение null при использовании 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.