Расширение списков задач WSS3 для поддержки повторяющихся напоминаний

StackOverflow https://stackoverflow.com/questions/2003620

Вопрос

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 в поиске.

Еще одна менее гибкая, но без кода, которую вы могли бы попробовать,-это создание нескольких различных представлений, которые включают в себя предстоящие задачи, а затем через графический интерфейс настроен предупреждение о том, когда элементы добавляются к этому представлению.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top