簡體   English   中英

TimerJob共享點服務器2013

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM