Aplica-se a
SharePoint no Microsoft 365 O SharePoint no Microsoft 365 Pequenas Empresas

por Justin Joyce, LANtek

Observação: Este artigo faz parte de uma coleção de postagens de quatro anos do blog Get the Point para usuários finais do SharePoint.

Visão geral: relatórios de envelhecimento personalizados sem código

Uma das peças funcionais frequentemente solicitadas de um site do SharePoint é um relatório de envelhecimento para tarefas ou itens de lista. Em outras palavras, quantos dias/meses se passaram desde que este item de lista foi modificado pela última vez?

Na superfície, essa parece ser uma solicitação muito simples. Afinal, temos datas para itens que estão sendo criados e modificados, temos a capacidade de armazenar datas personalizadas quando determinadas alterações nos itens ocorrem por meio de receptores de eventos. Calculamos colunas em que podemos incluir fórmulas semelhantes ao Excel para trabalhar com nossas informações. Isso parece uma proposta bem direta. Escolhemos um campo de data, criamos uma coluna calculada e, em seguida, fazemos algo de fórmula nos moldes de [DateField] – [Hoje]. Mas não tão rápido! Como qualquer um que tentou essa tarefa "simples" sabe, tentar usar algo como [Hoje] em uma coluna calculada causa problemas. Tentar inserir [Hoje] na caixa de fórmulas da coluna calculada lhe dará uma mensagem de erro algo assim:

Mensagem de erro

Por que isso? Bem, isso tem a ver com a forma como as colunas calculadas são calculadas.

Vamos usar uma fórmula simples como exemplo:

= IF( [Column1]<=[Column2], "OK", "Not OK")

Tudo isso diz que se Column1 for menor ou igual a Column2, exiba OK, caso contrário, exiba Not OK. Essa é uma fórmula básica bastante típica para uma coluna calculada e faz uma suposição básica sobre o item de lista que contém essas colunas: os valores de Column1 e Column2 nunca poderão ser alterados sem um evento Update no item de lista.

Isso mesmo, as colunas calculadas só serão recalculadas quando a lista for atualizada (ou criada), pois elas assumem que as informações que você está calculando estão contidas no item em si. Isso cria um problema quando você está tentando usar algo que muda independentemente dos campos do item, como a data de hoje.

Agora eu não estava na reunião onde eles decidiram que esta é a maneira que colunas calculadas funcionariam, no entanto, se eu tivesse que fazer um palpite educado eu assumiria que eles funcionam assim para o desempenho. Imagine se você tivesse uma lista de milhares de itens, cada um deles continha uma coluna calculada que precisava de uma atualização "ao vivo". Isso significaria que algum mecanismo, talvez um trabalho de temporizador, teria que iterar por meio de cada item que continha essa coluna calculada de vez em quando e atualizar seu valor. Isso pode ser extremamente tributante em termos de desempenho porque, com implantações maiores, esse trabalho pode estar constantemente executando e mudando as coisas. Isso é só o meu palpite, mas faz um pouco de sentido se você pensar sobre isso.

Há algumas sugestões para soluções semelhantes flutuando por aí que envolvem enganar o SharePoint para aceitar um valor Today criando primeiro uma coluna chamada Today, depois adicionando-a à sua fórmula e excluindo-a. Tudo isso é bom, mas lembre-se do que eu disse quando as colunas calculadas são atualizadas. Esse valor só será alterado quando o item for atualizado, o que significa que seus valores em breve estarão incorretos, especialmente no caso de um cálculo de dia.

Vi outros usando JavaScript inteligente para escrever os valores na página. Isso também funcionaria, mas sou categoricamente contra o script do cliente quando ele pode ser evitado.

Implementação:

Então, o que fazer? Colunas calculadas estão fora de questão para as chamadas funções "voláteis" como Hoje. É possível que possamos desenvolver algum código personalizado para cuidar disso para nós, como uma Coluna Computada, trabalho de temporizador ou processo agendado para apresentar e atualizar cada item que precise desse cálculo feito. Isso nos traz de volta ao problema de desempenho que mencionei no último parágrafo e, além disso, é uma solução frágil que seria altamente específica para o site/lista/coluna em questão. Além dessas duas preocupações, você também teria que encontrar um cara nerd, como eu, que sabe como codificar e persuadi-lo a desenvolver essa solução para você. Mas há uma maneira mais fácil!

Se você tiver o direito de criar campos e editar páginas em seu site e tiver um pouco de conhecimento sobre XSLT e criar exibições, poderá montar um modelo XSL que pode ser incluído em uma exibição de lista e calculará fielmente seu valor sempre que a página for solicitada. Esse cenário remove nossa preocupação com o desempenho e não exige que o código personalizado seja desenvolvido e implantado por meio de uma solução.

Perfeito. Então, como fazemos isso?

  1. Crie ou selecione o campo que atuará como nossa origem. Deve ser um tipo de data.

  2. Crie nosso campo que atuará como um espaço reservado para o valor que está sendo calculado.

  3. Adicione ambos os campos a um tipo de conteúdo e adicione esse tipo de conteúdo a uma lista.

  4. Crie uma exibição dessa lista que contém as colunas de origem e espaço reservado.

  5. Carregue o modelo XSL na Biblioteca de Estilos.

  6. Defina a propriedade "XSL Link" para a Web Part de Exibição de Lista por meio da interface do usuário.

  7. Êxito!

Vamos explorar um caso de uso de exemplo e percorrer a implementação. Nosso cliente queria uma visão de sua lista de main que lhes dissesse há quanto tempo um determinado item de lista estava sentado em seu status. Esta lista continha um tipo de conteúdo de site personalizado derivado do tipo Item e adicionado à lista. Já havia um receptor de eventos no local que captura cada vez que status campo no item da lista foi alterado e salvo essa data em uma coluna chamada "Status de data alterado". Toda essa fiação não é necessária e pode ser feita com QUALQUER campo de data (acontece que essa é a nossa implementação, mas sinta-se à vontade para experimentar). O mínimo necessário é seu campo de data de origem e espaço reservado para manter seu cálculo (mais sobre isso no próximo parágrafo) adicionado à sua lista, embora eu sugiro que você use colunas de site e tipos de conteúdo do site caso deseje reutilizar essa solução em outros lugares em seu site.

Portanto, temos nossa data de origem que podemos usar em nosso cálculo em relação à data de hoje. Agora podemos criar uma coluna de site personalizada para usar como um contêiner para nosso valor calculado. Nesse caso, optei por usar uma coluna calculada, pois ela não poderá ser alterada nos formulários de itens novos ou editados, mas pode ser selecionada para exibição nas exibições, pois não queremos que os usuários insiram valores arbitrários nesta coluna. Pode ser confuso por que não está sendo exibido nas exibições, etc.

Agora que temos nossa coluna de site, podemos adicioná-la aos nossos tipos de conteúdo que serão usados em nossa lista. Em seguida, precisamos criar nossa exibição que posteriormente será personalizada com nosso XSLT. Crie uma exibição padrão que contenha sua coluna de data de origem e sua nova coluna calculada que atuará como um espaço reservado para o valor calculado.

Agora temos tudo o que precisaremos para dar suporte ao nosso relatório de envelhecimento personalizado. Tudo o que resta é criar nosso modelo XSL, carregá-lo na Biblioteca de Estilos do site e vinculá-lo à nossa exibição de lista. O modelo XSL que usaremos conterá alguma marcação normal gerada pelo SharePoint para gerar a exibição, bem como nossa própria marcação personalizada usada para substituir determinadas partes disso e calcular nosso valor desejado para nós.

Dando crédito onde o crédito é devido, os modelos XSL para fazer os cálculos reais que estou usando para essa solução foram graciosamente fornecidos por "swirch" nos fóruns MSDN:http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Baixe a folha de estilos XSL (aging.zip) Que reuni localizada aqui:https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissõesChanged=1&id=C262E8E2D59A86D9!104

Abrindo isso no editor de texto favorito, você verá muita marcação normal do SharePoint XSL para renderizar as exibições, se você continuar rolando até a linha 357, verá o início dos modelos personalizados que adicionei à marcação, sendo o primeiro o modelo "DateDiff" seguido por "calcul-julian-day" e "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Esses são nossos três modelos que farão e exibirão nossos cálculos em nossas exibições. Se você usar nomes de campo diferentes dos especificados anteriormente neste artigo, precisará passar por esses modelos e substituir quaisquer referências aos outros nomes. Lembre-se de que, para isso, você deseja usar o nome INTERNO do campo e não o nome da exibição.

Depois de estar satisfeito que o modelo esteja pronto para ir, navegue até a Biblioteca de Estilos e carregue-o na pasta "Folhas de Estilo XSL" e copie o link para o arquivo. Isso nos permitirá fazer alterações facilmente posteriormente ou adicioná-las a diferentes partes do site conforme quisermos.

Em seguida, vá para sua lista e selecione a exibição que você criou anteriormente neste artigo. No menu "Ações do Site" clique em "Editar Página".

Comando Editar Página no menu Ações do Site

Localize sua Web Part de Exibição de Lista na página e abra o menu Web Part clicando na pequena seta voltada para baixo no canto superior direito. Neste menu, selecione "Editar Web Part".

Editar comando da Web Part no menu da Web Part

Isso abrirá o menu da Web Part no lado direito da janela do navegador.

menu de Web Part

Clique na seção + para "Diversos" e localize a propriedade "XSL Link".

Propriedade do Link XSL no menu Web Part

Cole no link para o arquivo XSL na Biblioteca de Estilos que você copiou anteriormente (isso pode ser um link relativo ou absoluto).

Link do arquivo XSL colado

Clique em "OK" para salvar suas alterações e clique no botão "Parar Edição" na faixa de opções "Página" na parte superior da página.

Botão Cancelar Edição na Guia Página

Se tudo estiver configurado corretamente, agora você deverá ver números na coluna "Dias no Status".

Coluna Dias em Status exibindo número

E, finalmente, aqui está como seria com alguns dados de teste de várias datas:

Relatório de vencimentos exibindo dados de teste

Resumo:

Lá está: uma maneira bem formatada, robusta e de melhor desempenho para criar um relatório de envelhecimento no SharePoint., completo com uma implementação simples sem código. Isso tem alguns aplicativos potenciais além do caso de uso que exploramos aqui. Outro cenário comum para esse tipo de relatório é anexá-lo a uma lista de tarefas para que você possa ver há quanto tempo uma tarefa foi criada rapidamente.

Aproveite!

--Justin

Justin Joyce

Comentários

Etapas ausentes 8/10/2012 3:51 AM ok, eu segui as etapas, mas deve haver algo ausente - como o XSL saberá em qual data usar ou em qual campo adicionar os dias desde então? odeio quando as etapas são perdidas.

Sem Código, concordou! 30/08/2012 12:12 PM Eu concordo- Eu não acho que isso realmente conta como "sem código".Curiosamente, por meio de algum erro do SharePoint, tenho uma coluna calculada funcionando usando o Today... não sei como ou por que porque eu não consigo fazê-lo fazer isso de novo, mas aquele ainda está lá e trabalhando.

Fórmula para a coluna calculada "Dias no Status"? 02/05/2012 7:39 AM Justin - Qual é a fórmula usada para sua coluna de site calculada "Dias no Status" (coluna de espaço reservado)? Foi "=hoje"?

SharePoint 2007 2/12/2011 11:29 No momento, não tentei aplicar essa solução ao SharePoint 2007, no entanto, estou olhando para ela. Infelizmente, não há nenhuma propriedade XslLink exibida na Web Part por meio da interface do usuário.

Excelente Publicação 30/11/2011 9:53 Olá; Grande Post.Estou a utilizar o SharePoint 2007.Não tenho uma secção Misc, conforme indicado acima.Tem passos para uma configuração do SP2007? Obrigado.

Re: Solução sem código: apresentar os dias desde que um item de lista do SharePoint foi alterado pela última vez 11/10/2011 8:24 Olá Chris.grande descoberta! Vou ver o que publicou ainda hoje e ver se consigo tornar esta solução um pouco mais robusta.Ainda bem que gostou da mensagem e ainda bem que conseguiu encontrar uma solução para o formato de data europeu. :) -Justin

Solução para Formatos de Data Europeus 11/10/2011 6:45 Olá novamente Justin, Nota: encontrei uma solução para o problema que mencionei anteriormente nesta página;https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

Formatos de Data Europeus 07/10/2011 3:59 Olá Justin, Esta é uma solução muito boa, obrigado, e é o tipo de coisa que passei os últimos dois dias à procura! No entanto, estou a ter um pequeno problema com isso e esperava que me pudesses ajudar.Alterei ligeiramente o seu código para calculá-lo até que algo aconteça, em vez de o fazer desde então, ao mudar as variáveis na última linha da função "DateDiff"; <xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of> No entanto, só consigo fazê-lo agrupar a diferença corretamente metade do tempo. Por exemplo, com esta data (formatar dd/MM/aaaa); 12/30/2011 Calcula corretamente, mas com esta data (mesmo formato) 10/12/2011 Calcula como se fosse 10-Dez-2011 em vez de 12-Out-2011.Tentei mudar simplesmente as posições dos valores de dia e mês na variável "JulianStartDate", desta forma; <xsl:with-param name="Month" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMMdd'),7,2)"/> <xsl:with-param name="Day" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMMdd'),5,2)"/> E isto corrigiu o problema com a segunda data, no entanto estava então incorreto para a primeira data! Também tentei alterar as chamadas FormatDateTime para utilizar LCIDs europeus e várias alterações para o último parâmetro de FormatDateTime (por exemplo, ddMMyyyy, MMddyyyyy) com os ajustes adequados aos parâmetros posicionais de subcadeia sem êxito.Agradeço muito qualquer conselho que possa oferecer.Obrigado; Chris

Sem Código 21/09/2011 4:27 Não creio que o XSL se qualifique como uma solução "sem código", uma vez que compreender a linguagem XSL não é para todos - no entanto, não envolve programação. Além disso: Boa solução, obrigado!

Precisa de mais ajuda?

Quer mais opções

Explore os benefícios da assinatura, procure cursos de treinamento, saiba como proteger seu dispositivo e muito mais.