![](/img/trans.png)
[英]Integrating SharePoint 2013 with SSRS report Data or Extracting Data from SSRS into SharePoint using a TimerJob
[英]TimerJob sharepoint server 2013
在sharepoint中,所有具有Status列(數據類型為Dropdown)和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();
}
}
}
}
}
如評論所述,由於使用SPTimerJob時SPContext為null,因此您的代碼將永遠無法工作。 (請注意,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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.