0

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

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

谢谢++

杰瑞

4

3 回答 3

2

任何时候你需要在共享点中定期执行的东西,100 次中有 99 次你需要构建一个 TimerJob。这些是在 SharePoint 中运行的计划任务,您可以创建自己的任务,然后使用功能 + 功能接收器实际“安装” timoerjob(定义)并为其分配计划。

有关详细信息:请参阅 Andrew Connell关于 TimerJobs 的文章

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

于 2010-01-05T01:59:18.567 回答
2

我的建议:

  • 不要创建控制台应用程序,而是创建一个继承自SPJobDefinition.
  • 设置SPJobLockType.Job为此计时器,这将允许作业在整个场中仅执行一次,即使您正在运行多个前端服务器
  • 在计时器作业中,打开您需要的SPSite对象SPWeb,然后找到SPList\
  • 仅使用SPQuery过滤掉您需要的项目 - 我相信,您将不得不过滤掉 Status!=Complete 的项目
  • 遍历结果集合(将是 type SPListItemCollection,应用您的规则,检查DueDateand Datetime.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()
于 2010-01-05T11:35:03.610 回答
1

不要费心尝试直接进入数据库。您将很难过,因为它没有记录、不受支持且不推荐。不过,SharePoint 实际上确实有一个功能齐全的对象模型。

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

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

于 2010-01-05T01:58:00.940 回答