L'extension des listes de tâches de WSS3 pour soutenir des rappels récurrents
-
18-09-2019 - |
Question
WSS 3.0 me permet d'envoyer un e-mail à un groupe quand une nouvelle tâche est ajoutée à une liste de tâches. Ce que je voudrais faire est d'exécuter une tâche hebdomadaire qui envoie des rappels de tâches à cause dans certaines périodes, soit 2 jours, 7 jours, 14 jours, etc. Je pensais que la façon la plus simple serait de construire une petite application C # qui se trouve sur la boîte de WS2K3 et interroge la base de données de WSS. Toutes les idées sur lesquelles les tableaux que je devrais vérifier? Plus généralement il un schéma global pour le système de base de données WSS3?
Si quelqu'un est au courant d'une solution existante avec le code s'il vous plaît laissez-moi savoir.
Thx ++
Jerry
La solution
Mes suggestions:
- ne pas créer une application console, créez une classe qui hérite de
SPJobDefinition
. - set
SPJobLockType.Job
à cette minuterie, ce accordera que le travail est exécuté qu'une seule fois dans toute la ferme, même si vous utilisez plusieurs serveurs frontaux - dans le, travail du minuteur, ouvrez le
SPSite
,SPWeb
objets que vous avez besoin, puis trouver leSPList
\ - Utilisation de filtre
SPQuery
sur uniquement les éléments dont vous avez besoin - je crois, vous devrez filtrer ceux où Status = complet !
- Boucle à travers la collection de résultats (qui sera de type
SPListItemCollection
, appliquez vos règles, la vérification de laDueDate
etDatetime.Now
, envoyer les e-mails - Comme une tâche est tout simplement un
SPListItem
, il possède une propriétéProperties
, qui est en fait un sac de propriété - vous pouvez ajouter toutes les propriétés dont vous avez besoin. Alors, ajoutez unMy_LastSentReminderDate
de propriété. Utilisez cette propriété pour vérifier si vous n'êtes pas envoyer trop de « spam d'entreprise »: -) - Pour installer votre
SPJobDefinition
dans une ferme SharePoint, vous pouvez utiliser un script PowerShell. Je peux vous donner des exemples, le cas échéant.
Ne pas oublier de Threading.Thread.CurrentThread.CurrentCulture = Your_SPWeb_Instance.Locale
, sinon des comparaisons de date peuvent ne pas fonctionner si le Web a un lieu différent!
EDIT: Voici comment un rappel typique ressemble dans mes applications:
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
Pour enregistrer un travail du minuteur, j'utilise généralement ce genre d'un script:
[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()
Autres conseils
Chaque fois que vous besoin de quelque chose dans sharepoint qui est exécuté périodiquement, 99 fois sur 100, vous aurez besoin de construire un TimerJob. Ceux-ci sont des tâches planifiées qui fonctionnent à l'intérieur de SharePoint et vous pouvez créer votre propre, puis en utilisant une fonction + featurereceiver à fait « installer » la timoerjob (définition) et lui attribuer un calendrier.
Pour plus d'informations:. Voir TimerJobs
P.S. Jamais requête / mettre à jour les bases de données relatives à SharePoint directement! Cela vous fera « non pris en charge », à savoir si quelque chose arrive Microsoft facturera (beaucoup) d'argent pour venir réparer, au lieu d'être en mesure de demander un soutien régulier. (Si vous êtes abonné MSDN dire que vous obtenez jusqu'à 4 support gratuit appels par an).
Ne pas la peine d'essayer d'aller directement à la base de données. Vous aurez un temps très difficile, car il est en situation irrégulière, non pris en charge, et non recommandé. SharePoint a en fait un modèle objet très complet bien.
Si vous faites référence à Microsoft.SharePoint.dll (situé dans le Global Assembly Cache d'une machine avec SharePoint installé), vous pouvez accéder aux données de cette façon. Les objets que vous aurez envie de commencer par SPSite , SPWeb , SPList, SPQuery et SPListItem . Tous que vous pouvez trouver très facilement sur http://msdn.microsoft.com dans une recherche.
Une autre possibilité moins souple, mais sans code que vous pouvez essayer est de créer plusieurs vues différentes qui incluent des tâches à venir alors via l'interface graphique mis en place une alerte lorsque des éléments sont ajoutés à ce point de vue.