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

Foi útil?

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 o SPList\
  • 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 o DueDate e Datetime.Now, envie os e-mails
  • Já que uma tarefa é simplesmente um SPListItem, tem um Properties Propriedade, que é na verdade uma bolsa de propriedade - você pode adicionar quaisquer propriedades necessárias. Então, adicione uma propriedade My_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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top