Solução sem código: Exibir os dias desde que um item de lista foi alterado pela última vez
Applies ToSharePoint no Microsoft 365 SharePoint no Microsoft 365 Pequenos Negócios

por Justin Joyce, LANtek

Nota: Este artigo faz parte de uma coleção de publicações de quatro anos do blog Get the Point para utilizadores finais do SharePoint.

Visão geral: Relatórios de envelhecimento personalizado sem código

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

Na superfície, este parece ser um pedido muito simples. Afinal, temos datas para os itens serem criados e modificados, temos a capacidade de armazenar datas personalizadas quando certas alterações de itens ocorrem através de recetores de eventos. Calculamos colunas onde podemos incluir fórmulas semelhantes ao Excel para trabalhar com a nossa informação. Parece uma proposta bastante direta. Escolhemos um campo de data, criamos uma coluna calculada, e depois fazemos uma fórmula de algo como [DateField] – [Hoje]. Ah, não tão rápido! Como qualquer pessoa que tenha tentado esta tarefa "simples" sabe, tentar usar algo como [Hoje] numa coluna calculada causa problemas. Tente inserir [Hoje] na caixa de fórmula da sua coluna calculada, uma mensagem de erro algo assim:

Mensagem de erro

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

Vejamos uma fórmula simples como exemplo:

= IF(Coluna1]<=[Coluna2], "OK", "Não OK") IF(

Tudo isto diz que se a Coluna1 for inferior ou igual à Coluna2, então apresente OK, caso contrário, não esteja bem. Esta é uma fórmula básica bastante típica para uma coluna calculada e faz um pressuposto básico sobre o item da lista que contém estas colunas: Os valores da Coluna1 e coluna2 nunca serão capazes de alterar sem um evento de Atualização no item da lista.

É verdade, as colunas calculadas só recalcularão quando a lista for atualizada (ou criada) uma vez que assumem que a informação que está a calcular está contida no próprio item. Isto cria um problema quando se está a tentar usar algo que muda independentemente dos campos do item, como a data de hoje.

Agora não estava na reunião onde decidiram que esta era a forma como as colunas calculadas funcionariam, no entanto, se tivesse de fazer um palpite educado, presumiria que funcionassem assim para o desempenho. Imagine se tivesse uma lista de vários milhares de itens, cada um dos quais continha uma coluna calculada que precisava de uma atualização "ao vivo". Isso significaria que algum mecanismo, talvez um trabalho de temporizador, teria de iteração através de cada item que continha aquela coluna calculada de vez em quando e atualizar o seu valor. Isto pode ser extremamente taxativamente taxante em termos de desempenho, porque com maiores implementações este trabalho pode estar constantemente a correr e a mudar as coisas. É só o meu palpite, mas faz muito sentido se pensares nisso.

Existem algumas sugestões para soluções semelhantes que flutuam por aí que envolvem enganar o SharePoint para aceitar um valor Today, criando primeiro uma coluna chamada Today, depois adicioná-la à sua fórmula e depois apagá-la. São todas boas e boas, mas lembrem-se do que eu disse quando as colunas calculadas são atualizadas. Este valor só será alterado quando o item for atualizado, o que significa que os seus valores em breve estarão incorretos, especialmente no caso de um cálculo diário.

Já vi outros a usarem javaScript inteligente para escrever os valores na página. Isto também funcionaria, mas sou categoricamente contra o guião dos clientes quando 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 o Today. É possível que possamos desenvolver algum código personalizado para cuidar disto para nós como uma Coluna Computada, trabalho de temporizador ou processo programado para vir e atualizar cada item que precisa deste cálculo feito. No entanto, isso remete-nos para o problema do 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. Para além destas duas preocupações, também terias de ir procurar um tipo totó, como eu, que saiba codificar e persuadi-lo a desenvolver esta solução para ti. Mas há uma maneira mais fácil!

Se tiver o direito de criar campos e editar páginas no seu site, e tiver um pouco de conhecimento sobre o XSLT e criar vistas, pode montar um modelo XSL que pode ser incluído numa vista de lista e calcular fielmente o seu valor cada vez que a página é solicitada. Este cenário remove a nossa preocupação com o desempenho, e não requer que o código personalizado seja desenvolvido e implementado através de uma solução.

Perfeito, perfeito. Então, como fazemos?

  1. Criar ou selecionar o campo que funcionará como a nossa fonte. Deve ser um tipo de data.

  2. Crie o nosso campo que funcionará como um espaço reservado para o valor a ser calculado.

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

  4. Crie uma visão dessa lista que contenha as colunas de origem e de espaço reservado.

  5. Faça o upload do modelo XSL para a Biblioteca styles.

  6. Deslocorre a propriedade "XSL Link" para a Lista Ver Página Web através da UI.

  7. Êxito!

Vamos explorar um exemplo de caso de uso e caminhar através da implementação. O nosso cliente queria uma visão da sua lista principal que lhes dissesse quanto tempo um determinado item da lista estava no seu estado. Esta lista continha um tipo de conteúdo de site personalizado derivado do tipo item e adicionado à lista. Já havia um recetor de eventos no local que captura cada vez que o campo de estado no item da lista foi alterado e guardou essa data para uma coluna chamada "Date Status Changed". Toda esta cablagem não é necessária, e pode ser feita com qualquer campo de data (acontece que esta é a nossa implementação, mas sinta-se livre para experimentar). O mínimo que necessitará é do campo de data de origem e do campo de espaços reservados para manter o seu cálculo (mais sobre isso no parágrafo seguinte) adicionado à sua lista, embora eu sugira que use colunas de site e tipos de conteúdo do site no caso de pretender reutilizar esta solução em outros locais do seu site.

Temos a nossa data de origem que podemos usar no nosso cálculo contra a data de hoje. Agora podemos criar uma coluna de site personalizada para usar como um recipiente para o nosso valor calculado. Neste caso, optei por utilizar uma coluna calculada, uma vez que não poderá ser alterada nos novos formulários de produto ou editar, mas pode ser selecionada para exibição nas vistas, uma vez que não queremos que os utilizadores introduzam valores arbitrários nesta coluna. Pode ser confuso o porquê de não estar a ser exibido nas vistas, etc.

Agora que temos a nossa coluna de site, podemos adicioná-la aos nossos tipos de conteúdo que serão usados na nossa lista. Em seguida, precisamos criar a nossa visão que será mais tarde personalizada com o nosso XSLT. Certifique-se de que cria uma visão padrão que contém a coluna de data de origem e a sua nova coluna calculada que funcionará como um espaço reservado para o valor calculado.

Temos agora tudo o que precisamos para apoiar o nosso relatório de envelhecimento personalizado. Tudo o que resta é criar o nosso modelo XSL, enviá-lo para a Biblioteca de Estilo do site e ligá-lo à nossa vista de lista. O modelo XSL que vamos usar vai conter alguma marcação normal gerada pelo SharePoint para gerar a vista, bem como a nossa própria marcação personalizada usada para sobrepor certas partes deste e calcular o 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 esta solução foram graciosamente fornecidos por "swirch" nos fóruns da MSDN: http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Descarregue a folha de estilo XSL (aging.zip) que juntei aqui: https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissõesSOo 1&id=C262E8E2D59A86D9!104

Abrindo isto no seu editor de texto favorito, verá uma abundância de marcação normal do SharePoint XSL para renderizar as vistas, se continuar a rolar para baixo para a linha 357 verá o início dos modelos personalizados que adicionei à marcação, sendo o primeiro o modelo "DateDiff" seguido de "calcular-julian-day" e "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020 Status_". Estes são os nossos três modelos que farão e mostrarão os nossos cálculos nas nossas opiniões. Se você vai usar nomes de campo diferentes do especificado anteriormente neste artigo, você precisará passar por estes modelos e substituir quaisquer referências aos outros nomes. Lembre-se, pois deseja utilizar o nome INTERNAL do campo e não o nome de visualização.

Assim que estiver convencido de que o modelo está pronto para ir, navegue para a sua Biblioteca de Estilo e carregue-o sob a pasta "Folhas de Estilo XSL" e, em seguida, copie o link para o ficheiro. Isto permitir-nos-á facilmente fazer alterações mais tarde, ou adicioná-lo a diferentes partes do site como quisermos.

Em seguida, vá à sua lista e selecione a vista que criou anteriormente neste artigo. A partir do menu "Ações do Site" clique em "Editar Página".

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

Encontre a sua Lista Ver Página Web na página e abra o menu Parte Web clicando na pequena seta virada para baixo no canto superior direito. A partir deste menu selecione "Editar a Peça Web".

Comando Editar Peça Web no menu Peça Web

Isto abrirá o menu da Parte Web no lado direito da janela do seu navegador.

Menu Peça Web

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

Propriedade da Ligação XSL no menu Peça Web

Cole no link para o seu ficheiro XSL na sua Biblioteca de Estilos que copiou anteriormente (isto pode ser um link relativo ou absoluto).

Ligação do ficheiro XSL colada

Clique em "OK" para guardar as suas alterações e clique no botão "Parar de editar" na fita "Página" na parte superior da página.

Botão Parar Edição no separador Página

Se tudo foi configurado corretamente, deve agora ver números na sua coluna "Days At Status".

Coluna Dias no Estado a apresentar número

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

Relatório de Envelhecimento a apresentar dados de teste

Resumo:

Aí está: uma forma bem formatada, robusta e de melhor desempenho para criar um relatório de envelhecimento no SharePoint., completo com uma simples implementação sem código. Isto tem algumas aplicações potenciais além do caso de uso único que exploramos aqui. Outro cenário comum para este tipo de relatório é anexá-lo a uma lista de tarefas para que possa ver quanto tempo passou desde que uma tarefa foi criada num ápice.

Desfrute!

--Justin

Justin Joyce

Comentários

Degraus em falta 10/8/2012 3:51 ok eu segui os passos, mas deve faltar alguma coisa - como é que o XSL saberá qual data usar, ou em que campo adicionar os dias desde então? odiá-lo quando os passos são perdidos.

Sem código, de acordo! 8/30/2012 12:12 Concordo, não acho que isto conte como "sem código".Curiosamente, através de algumas falhas do SharePoint, tenho uma coluna calculada a funcionar usando hoje... não sei como ou porquê, porque não consigo fazê-lo de novo, mas o que ainda está lá e a funcionar.

Fórmula para "Days At Status" Coluna calculada? 5/2/2012 7:39 Justin - Qual é a fórmula que usou para a sua coluna de sítio calculada "Days At Status" (coluna de espaço reservado)? Foi "=hoje"?

SharePoint 2007 12/2/2011 11:29 Atualmente, não tentei aplicar esta solução ao SharePoint 2007, no entanto estou a analisá-la. Infelizmente não existe nenhuma propriedade XslLink surgindo na parte web através da UI.

Grande Post 11/30/2011 9:53 Olá, Grande Post.Estou a usar o SharePoint 2007.Não tenho uma secção de Misc, como se nota acima.Tem passos para uma configuração SP2007? Obrigado.

Re: Solução sem código: Exibição dos dias desde que um item da lista SharePoint foi alterado pela última vez 10/11/2011 8:24 Olá Chris.grande descoberta! Vou ver o que publicou, espero que mais tarde, e ver se consigo tornar esta solução um pouco mais robusta.Ainda bem que gostou do post, e estou muito feliz por ter conseguido encontrar uma solução para o formato europeu de data. :) - Justin

Solução para formatos de data europeia 10/11/2011 6:45 Olá, de novo, Justin, FYI, encontrei uma solução para o assunto que mencionei anteriormente nesta página; https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

Formatos europeus de data 10/7/2011 3:59 AM 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 calcular o número de dias até que algo aconteça, em vez de, 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 caclular a diferença corretamente metade do tempo. Assim, por exemplo, com esta data (formato dd/MM/yyyy); 30/12/2011 Calcula corretamente, mas com esta data (mesmo formato) 12/10/2011 Calcula como se 10-Dez-2011 em vez de 12-Out-2011.Tentei simplesmente mudar as posições dos valores do dia e do mês na variável "JulianStartDate", como esta; <xsl:com nome param="Mês" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMMdd'),7,2)"/> <xsl:com nome param="Day" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMMdd'),5,2)"/> E isto corrigiu o problema com a segunda data, no entanto foi incorreto para o primeiro encontro! Também tentei alterar as chamadas FormatDateTime para usar LCIDs europeus e várias alterações para o último parâmetro do FormatDateTime (por exemplo, ddMMyyyyyyyyyyyyyy) com os ajustes adequados aos parâmetros de posicionamento sub-adstring sem sucesso.Agradecia muito qualquer conselho que me oferecesse.Obrigada. Chris

Sem Código 9/21/2011 4:27 AM Não acho que o XSL se qualifique como uma solução "sem código", já 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 subscrição, navegue em cursos de formação, saiba como proteger o seu dispositivo e muito mais.

As comunidades ajudam-no a colocar e a responder perguntas, a dar feedback e a ouvir especialistas com conhecimentos abrangentes.