扩展WSS3任务列表以支持重复提醒

时间:2010-01-05 01:41:28

标签: sharepoint wss task recurring reminders

当新任务添加到任务列表时,WSS 3.0将允许我向组发送电子邮件。我想做的是运行一个每周任务,发出在特定时期内,即2天,7天,14天等任务到期的提醒。我认为最简单的方法是建立一个小的C#应用​​程序,坐在WS2K3框并查询WSS数据库。我应该检查哪些表的想法?更一般地说,WSS3数据库系统有一个整体架构吗?

如果有人知道现有的代码解决方案,请告诉我。

THX ++

杰里

3 个答案:

答案 0 :(得分:2)

如果您需要定期执行sharepoint中的某些内容,那么在100次中需要99次,您需要构建一个TimerJob。这些是在SharePoint中运行的计划任务,您可以创建自己的任务,然后使用功能+ featurereceiver实际“安装”timoerjob(定义)并为其分配计划。

有关详情,请参阅Andrew Connell的article on TimerJobs

P.S。永远不要直接查询/更新与SharePoint相关的数据库!这将使你“不受支持”,即如果发生任何事情,微软将收取(大量)资金来修复它,而不是能够要求定期支持。 (如果您说MSDN订阅者,您每年最多可获得4次免费支持电话)。

答案 1 :(得分:2)

我的建议:

  • 不创建控制台应用,创建一个继承自SPJobDefinition
  • 的类
  • SPJobLockType.Job设置为此计时器,这将授予该作业仅在整个服务器场中执行一次,即使您正在运行多个前端服务器
  • 在计时器作业中,打开所需的SPSiteSPWeb个对象,然后找到SPList \
  • 使用SPQuery过滤掉您需要的项目 - 我相信,您必须过滤掉状态!=完成的项目
  • 循环显示结果集合(类型为SPListItemCollection),应用规则,检查DueDateDatetime.Now,发送电子邮件
  • 由于任务只是SPListItem,因此它具有Properties属性,实际上是属性包 - 您可以添加所需的任何属性。因此,添加属性My_LastSentReminderDate。使用此属性检查您是否发送了太多“公司垃圾邮件”: - )
  • 要在SharePoint场中安装SPJobDefinition,可以使用PowerShell脚本。如果需要,我可以举例说明。

不要忘记Threading.Thread.CurrentThread.CurrentCulture = Your_SPWeb_Instance.Locale,否则如果网站有不同的区域设置,日期比较可能无效!

编辑:这是我的应用程序中典型提醒的样子:

Public Class TypicalTimer
    Inherits SPJobDefinition

    Public Sub New(ByVal spJobName As String, ByVal opApplication As SPWebApplication)
        'this way we can explicitly specify we need to lock the JOB
        MyBase.New(spJobName, opApplication, Nothing, SPJobLockType.Job)
    End Sub

    Public Overrides Sub Execute(ByVal opGuid As System.Guid)
        'whatever functionality is there in the base class...
        MyBase.Execute(Guid.Empty)
        Try
            Using oSite As SPSite = New SPSite("http://yourserver/sites/yoursite/subsite")
                Using oWeb As SPWeb = oSite.OpenWeb()
                    Threading.Thread.CurrentThread.CurrentCulture = oWeb.Locale
                    'find the task list and read the "suspects"
                    Dim oTasks As SPList = oWeb.Lists("YourTaskListTitle")
                    Dim oQuery As New SPQuery()
                    oQuery.Query = "<Where><Neq><FieldRef Name='Status'/>" & _
                                    "<Value Type='Choice'>Complete</Value></Neq></Where>"
                    Dim oUndoneTasks As SPListItemCollection = oTasks.GetItems(oQuery)

                    'extra filtering of the suspects.
                    'this can also be done in the query, but I don't know your rules
                    For Each oUndoneTask As SPListItem In oUndoneTasks
                        If oUndoneTask(SPBuiltInFieldId.TaskDueDate) IsNot Nothing AndAlso _
                            CDate(oUndoneTask(SPBuiltInFieldId.TaskDueDate)) < Now().Date Then
                            ' this is where you send the mail
                        End If
                    Next
                End Using
            End Using
        Catch ex As Exception
            MyErrorHelper.LogMessage(ex)
        End Try
    End Sub
End Class

要注册计时器作业,我通常使用这种脚本:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Administration")
[System.Reflection.Assembly]::LoadWithPartialName("Your.Assembly.Name.Here")
$spsite= [Microsoft.SharePoint.SPSite]("http://yourserver/sites/yoursite/subsite")

$params = [System.String]("This text shows up in your timer job list (in Central Admin)", $spsite.WebApplication
$newTaskLoggerJob = new-object -type Your.Namespace.TypicalTimer -argumentList $params

$schedule = new-object Microsoft.SharePoint.SPDailySchedule
$schedule.BeginHour = 8
$schedule.BeginMinute = 0
$schedule.BeginSecond = 0
$schedule.EndHour = 8
$schedule.EndMinute = 59
$schedule.EndSecond = 59

$newTaskLoggerJob.Schedule = $schedule
$newTaskLoggerJob.Update()

答案 2 :(得分:1)

不要试图直接进入数据库。您将度过一段非常艰难的时期,因为它没有文档记录,不受支持,也不推荐。事实上,SharePoint确实拥有一个功能齐全的对象模型。

如果您引用Microsoft.SharePoint.dll(位于安装了SharePoint的计算机的全局程序集缓存中),则可以通过该方式访问数据。您要开始使用的对象是SPSiteSPWeb,SPList,SPQuery和SPListItem。您可以在搜索中http://msdn.microsoft.com轻松找到所有这些内容。

您可以尝试的另一种不太灵活但无代码的可能性是创建几个不同的视图,包括即将到来的任务,然后通过GUI设置警报,以便将项目添加到该视图。