WSS 3.0 将允许我在将新任务添加到任务列表时向组发送电子邮件。我想做的是运行一个每周任务,发送在特定时间段内到期的任务提醒,即 2 天、7 天、14 天等。我认为最简单的方法是构建一个小 C# 应用程序WS2K3 框并查询 WSS 数据库。关于我应该检查哪些表的任何想法?更一般地说,WSS3 数据库系统是否有一个整体架构?
如果有人知道现有的代码解决方案,请告诉我。
谢谢++
杰瑞
WSS 3.0 将允许我在将新任务添加到任务列表时向组发送电子邮件。我想做的是运行一个每周任务,发送在特定时间段内到期的任务提醒,即 2 天、7 天、14 天等。我认为最简单的方法是构建一个小 C# 应用程序WS2K3 框并查询 WSS 数据库。关于我应该检查哪些表的任何想法?更一般地说,WSS3 数据库系统是否有一个整体架构?
如果有人知道现有的代码解决方案,请告诉我。
谢谢++
杰瑞
任何时候你需要在共享点中定期执行的东西,100 次中有 99 次你需要构建一个 TimerJob。这些是在 SharePoint 中运行的计划任务,您可以创建自己的任务,然后使用功能 + 功能接收器实际“安装” timoerjob(定义)并为其分配计划。
有关详细信息:请参阅 Andrew Connell关于 TimerJobs 的文章。
PS永远不要直接查询/更新与SharePoint相关的数据库!这将使您“不受支持”,即如果发生任何事情,微软将收取(很多)钱来修复它,而不是能够要求定期支持。(如果您是 MSDN 订阅者,您每年最多可获得 4 个免费支持电话)。
我的建议:
SPJobDefinition
.SPJobLockType.Job
为此计时器,这将允许作业在整个场中仅执行一次,即使您正在运行多个前端服务器SPSite
对象SPWeb
,然后找到SPList
\SPQuery
过滤掉您需要的项目 - 我相信,您将不得不过滤掉 Status!=Complete 的项目SPListItemCollection
,应用您的规则,检查DueDate
and Datetime.Now
,发送电子邮件SPListItem
,它有一个Properties
属性,它实际上是一个属性包——你可以添加任何你需要的属性。所以,添加一个属性My_LastSentReminderDate
。使用此属性检查您是否发送了太多“企业垃圾邮件”:-)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()
不要费心尝试直接进入数据库。您将很难过,因为它没有记录、不受支持且不推荐。不过,SharePoint 实际上确实有一个功能齐全的对象模型。
如果您引用 Microsoft.SharePoint.dll(位于安装了 SharePoint 的计算机的全局程序集缓存中),您可以通过这种方式访问数据。您要开始使用的对象是SPSite、SPWeb、SPList、SPQuery 和 SPListItem。所有这些您都可以在http://msdn.microsoft.com上的搜索中轻松找到。
您可以尝试的另一种不太灵活但无代码的可能性是创建几个不同的视图,其中包括即将执行的任务,然后通过 GUI 设置何时将项目添加到该视图的警报。