Расширение списков задач WSS3 для поддержки повторяющихся напоминаний
-
18-09-2019 - |
Вопрос
WSS 3.0 позволит мне отправить электронное письмо в группу, когда в список задач будет добавлено новое задание. Что я хотел бы сделать, так это выполнить еженедельную задачу, которая посылает напоминания о задачах, выполняемых в определенные периоды, то есть 2 дня, 7 дней, 14 дней и т. Д. Я подумал, что самый простой способ - построить небольшое приложение C#, которое сидит на Коробка WS2K3 и запрашивает базу данных WSS. Есть идеи, на какие таблицы я должен проверять? В более общем плане есть общая схема для системы баз данных WSS3?
Если кто -то знает о существующем решении с кодом, пожалуйста, дайте мне знать.
THX ++
Джерри
Решение
Мои предложения:
- Не создавайте приложение для консоли, создайте класс, который наследует от
SPJobDefinition
. - установлен
SPJobLockType.Job
На этот таймер это даст, что работа выполняется только один раз на всей ферме, даже если вы используете несколько фронтальных серверов - В работе таймера откройте
SPSite
,SPWeb
объекты, которые вам нужны, затем найдитеSPList
\ - С использованием
SPQuery
Отфильтруйте только те пункты, которые вам нужны - я полагаю, вам придется отфильтровать те, где статус! = - Перевернуть сборы результатов (который будет тип
SPListItemCollection
, Примените свои правила, проверяяDueDate
а такжеDatetime.Now
, отправить электронные письма - Поскольку задача - это просто
SPListItem
, оно имеетProperties
Собственность, которая на самом деле является сумкой для недвижимости - вы можете добавить любые свойства, которые вам нужны. Итак, добавьте свойствоMy_LastSentReminderDate
. Анкет Используйте это свойство, чтобы проверить, не отправляете ли вы слишком много «корпоративного спама» :-) - Чтобы установить
SPJobDefinition
На ферме SharePoint вы можете использовать сценарий 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, которое периодически выполняется, в 99 раз из 100 вам нужно построить TimerJob. Это запланированные задачи, которые выполняются внутри SharePoint, и вы можете создать свои собственные, а затем использовать функцию + featurerceiver, чтобы фактически «установить» TimoerJob (определение) и назначить его расписание.
Для получения дополнительной информации: см. Эндрю Коннелл Статья о TimerJobs.
PS Никогда не запросите /обновлять базы данных, связанные с SharePoint напрямую! Это сделает вас «неподдерживаемым», то есть, если что -нибудь случится, Microsoft взимает (много) денег, чтобы прийти и исправить их, вместо того, чтобы попросить регулярную поддержку. (Если вы говорите, что подписчик MSDN вы получаете до 4 бесплатных вызовов поддержки в год).
Не пытайтесь перейти прямо в базу данных. У вас будет очень тяжелое время, потому что он незарегистрирован, не поддерживается и не рекомендуется. У SharePoint на самом деле есть полная модель объекта.
Если вы ссылаетесь на microsoft.sharepoint.dll (расположенный в глобальном кэше сборки машины с установленной на нем SharePoint), вы можете получить доступ к данным таким образом. Объекты, с которыми вы захотите начать Spsite, Spweb, Splist, Spquery и Splistitem. Все, что вы можете найти очень легко на http://msdn.microsoft.com в поиске.
Еще одна менее гибкая, но без кода, которую вы могли бы попробовать,-это создание нескольких различных представлений, которые включают в себя предстоящие задачи, а затем через графический интерфейс настроен предупреждение о том, когда элементы добавляются к этому представлению.