Estendendo listas de tarefas WSS3 para oferecer suporte a lembretes recorrentes
-
18-09-2019 - |
Pergunta
O WSS 3.0 me permitirá enviar um email para um grupo quando uma nova tarefa for adicionada a uma lista de tarefas. O que eu gostaria de fazer é executar uma tarefa semanal que envia lembretes de tarefas devidas em certos períodos, ou seja, 2 dias, 7 dias, 14 dias etc. Eu pensei que a maneira mais simples seria criar um pequeno aplicativo C# que se senta A caixa WS2K3 e consulta o banco de dados WSS. Alguma idéia sobre quais tabelas eu deveria estar verificando? De maneira mais geral, existe um esquema geral para o sistema de banco de dados WSS3?
Se alguém estiver ciente de uma solução existente com código, entre em contato.
Thx ++
Jerry
Solução
Minhas sugestões:
- Não crie um aplicativo de console, crie uma classe que herda
SPJobDefinition
. - definir
SPJobLockType.Job
Para esse cronômetro, isso concederá que o trabalho é executado apenas uma vez em toda a fazenda, mesmo se você estiver executando vários servidores de front-end - no trabalho de timer, abra o
SPSite
,SPWeb
objetos que você precisa e depois encontre oSPList
\ - Usando
SPQuery
filtre apenas os itens que você precisa - acredito, você terá que filtrar aqueles onde o status! = Complete - Loop através da coleção de resultados (que será do tipo
SPListItemCollection
, aplique suas regras, verificando oDueDate
eDatetime.Now
, envie os e-mails - Já que uma tarefa é simplesmente um
SPListItem
, tem umProperties
Propriedade, que é na verdade uma bolsa de propriedade - você pode adicionar quaisquer propriedades necessárias. Então, adicione uma propriedadeMy_LastSentReminderDate
. Use esta propriedade para verificar se você não está enviando muito "spam corporativo" :-) - Para instalar o seu
SPJobDefinition
Em uma fazenda do SharePoint, você pode usar um script do PowerShell. Posso dar exemplos, se necessário.
Não se esqueça de Threading.Thread.CurrentThread.CurrentCulture = Your_SPWeb_Instance.Locale
, caso contrário, as comparações de data podem não funcionar se a Web tiver um local diferente!
EDIT: É assim que um lembrete típico se parece em meus aplicativos:
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
Para registrar um trabalho de timer, normalmente uso esse tipo de 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()
Outras dicas
Sempre que você precisar de algo no SharePoint que seja executado periodicamente, 99 vezes em 100, você precisará criar um timerjob. Essas são tarefas programadas que são executadas no SharePoint e você pode criar o seu próprio e, em seguida, usando um recurso + featureCeiver para realmente "instalar" o TimoerJob (definição) e atribui -lhe um cronograma.
Para mais informações: consulte Andrew Connell's Artigo sobre TimerJobs.
PS nunca consulte /atualize os bancos de dados relacionados diretamente ao SharePoint! Isso fará com que você "não suportado", ou seja, se algo acontecer, a Microsoft cobrará (muito) dinheiro para corrigi -lo, em vez de poder pedir suporte regular. (Se você é um assinante do MSDN, você recebe 4 chamadas de suporte gratuito por ano).
Não se preocupe em tentar ir diretamente para o banco de dados. Você terá um tempo muito difícil, porque não é documentado, sem apoio e não recomendado. O SharePoint, de fato, tem um modelo de objeto completo.
Se você faz referência a Microsoft.SharePoint.dll (localizado no cache global de montagem de uma máquina com o SharePoint instalado), poderá acessar os dados dessa maneira. Os objetos que você deseja começar são Spsite, Spweb, Splist, SpQuery e SplistiTem. Tudo o que você pode encontrar com muita facilidade http://msdn.microsoft.com em uma pesquisa.
Outra possibilidade menos flexível, mas sem código que você pode tentar, é criar várias visualizações diferentes que incluem as próximas tarefas e depois através da GUI, configure um alerta para quando os itens são adicionados a essa visualização.