Se aplica a
SharePoint en Microsoft 365 SharePoint en Microsoft 365 Pequeña Empresa

por Justin Joyce, LANtek

Nota: Este artículo forma parte de una colección de publicaciones de cuatro años del blog Obtener el punto para los usuarios finales de SharePoint.

Información general: Informes de antigüedad personalizados sin código

Una de las partes funcionales solicitadas con frecuencia de un sitio de SharePoint es un informe de antigüedad para tareas o elementos de lista. En otras palabras, ¿cuántos días/meses han transcurrido desde que se modificó por última vez este elemento de lista?

En la superficie parece ser una solicitud muy sencilla. Después de todo, tenemos fechas para los elementos que se crean y modifican, tenemos la capacidad de almacenar fechas personalizadas cuando determinados cambios en los elementos tienen lugar a través de receptores de eventos. Hemos calculado columnas en las que podemos incluir fórmulas similares a las de Excel para trabajar con nuestra información. Esto parece una proposición bastante directa. Seleccionamos un campo de fecha, creamos una columna calculada y, a continuación, realizamos una fórmula a lo largo de las líneas de [DateField] – [Hoy]. ¡Pero no tan rápido! Como sabe cualquier persona que ha intentado esta tarea "sencilla", intentar usar algo como [Hoy] en una columna calculada causa problemas. Intente insertar [Hoy] en el cuadro de fórmula de la columna calculada y recibirá un mensaje de error similar a este:

Mensaje de error

¿Por qué es esto? Bueno, tiene que ver con la forma en que se calculan las columnas calculadas.

Veamos una fórmula simple como ejemplo:

= SI( [Columna1]<=[Columna2], "Correcto", "Incorrecto")

Todo esto indica que si Columna1 es menor o igual que Columna2, mostrar Aceptar, de lo contrario, mostrar No correcto. Esta es una fórmula básica bastante típica para una columna calculada y hace una suposición básica sobre el elemento de lista que contiene estas columnas: Los valores de Columna1 y Columna2 nunca podrán cambiar sin un evento Update en el elemento de lista.

Es correcto, las columnas calculadas solo se recalcularán cuando se actualice (o cree) la lista, ya que asumen que la información que está calculando está contenida en el propio elemento. Esto crea un problema cuando intenta usar algo que cambia independientemente de los campos del elemento, como la fecha actual.

Ahora no estaba en la reunión donde decidieron que esta es la manera en que funcionarían las columnas calculadas, sin embargo, si tuviera que hacer una estimación educada, asumiría que funcionan así para el rendimiento. Imagine si tenía una lista de varios miles de elementos, cada uno de los cuales contenía una columna calculada que necesitaba una actualización "activa". Esto significaría que algún mecanismo, quizás un trabajo de temporizador, tendría que iterar por cada elemento que contenía esa columna calculada cada tan a menudo y actualizar su valor. Esto podría ser extremadamente taxativo en términos de rendimiento, ya que con implementaciones más grandes este trabajo podría estar constantemente en ejecución y cambiando cosas. Eso es sólo mi suposición, pero tiene bastante sentido si lo piensas.

Existen algunas sugerencias para soluciones similares que flotan por ahí y que implican engañar a SharePoint para que acepte un valor hoy creando primero una columna denominada Hoy, a continuación, agregándola a la fórmula y eliminándola. Son todos correctos y buenos, pero recuerde lo que dije cuando se actualizan las columnas calculadas. Este valor solo cambiará cuando se actualice el elemento, lo que significa que los valores pronto serán incorrectos, especialmente en el caso de un cálculo de día.

He visto a otros usuarios usando JavaScript inteligente para escribir los valores en la página. Esto también funcionaría, pero estoy casi categóricamente contra la secuencia de comandos del cliente cuando se puede evitar.

Implementación:

¿Y qué hacer? Las columnas calculadas no se preguntan por las funciones "volátiles" como Hoy. Es posible que podamos desarrollar algún código personalizado para hacer esto por nosotros, como una columna calculada, un trabajo del temporizador o un proceso programado para venir y actualizar cada elemento que necesita este cálculo hecho. Sin embargo, esto nos lleva al problema de rendimiento que mencioné en el último párrafo, y además es una solución que sería muy específica para el sitio/lista/columna en cuestión. Además de estas dos preocupaciones, también tendrías que ir a buscar a un tipo nerdy, como yo, que sabe cómo codificar y persuadirlo para desarrollar esta solución para ti. Pero hay una forma más fácil.

Si tiene derechos para crear campos y editar páginas en su sitio, y tiene un poco de conocimiento sobre XSLT y la creación de vistas, puede crear una plantilla XSL que se puede incluir en una vista de lista y calculará fielmente su valor cada vez que se solicite la página. Este escenario quita nuestra preocupación sobre el rendimiento y no requiere que se desarrolle e implemente código personalizado a través de una solución.

Perfecto. ¿Cómo lo hacemos?

  1. Cree o seleccione el campo que actuará como nuestro origen. Debe ser un tipo de fecha.

  2. Cree nuestro campo que actuará como marcador de posición para el valor que se calcula.

  3. Agregue ambos campos a un tipo de contenido y agréguelo a una lista.

  4. Cree una vista de esa lista que contenga las columnas de origen y marcador de posición.

  5. Cargue la plantilla XSL en la Biblioteca de estilos.

  6. Establezca la propiedad "Vínculo XSL" para el elemento web Vista de lista a través de la interfaz de usuario.

  7. ¡Perfecto!

Vamos a explorar un caso de uso de ejemplo y a recorrer la implementación. Nuestro cliente quería una vista de su lista principal que le indicara cuánto tiempo ha estado sentado un elemento de lista en particular. Esta lista contenía un tipo de contenido de sitio personalizado derivado del tipo Elemento y agregado a la lista. Ya había un receptor de eventos en su lugar que captura cada vez que se cambiaba el campo de estado del elemento de lista y guardaba esa fecha en una columna denominada "Estado de fecha cambiado". Todo este cableado no es necesario, y se puede hacer con CUALQUIER campo de fecha (ocurre esto es nuestra implementación, pero no dude en experimentar). Lo mínimo que necesitará es el campo de fecha de origen y el campo de marcador de posición para mantener el cálculo (más información sobre esto en el párrafo siguiente) agregado a la lista, aunque le sugiero que use columnas de sitio y tipos de contenido de sitio en caso de que desee volver a usar esta solución en otros lugares del sitio.

Por lo tanto, tenemos nuestra fecha de origen que podemos usar en nuestro cálculo con respecto a la fecha actual. Ahora podemos crear una columna de sitio personalizada para usarla como contenedor para nuestro valor calculado. En este caso, he elegido usar una columna calculada, ya que no se podrá cambiar en los formularios nuevos o de edición de elementos, pero se puede seleccionar para su visualización en las vistas, ya que no queremos que los usuarios introduzcan valores arbitrarios en esta columna. Podría resultar confuso en cuanto a por qué no se muestra en las vistas, etc.

Ahora que tenemos nuestra columna de sitio, podemos agregarla a nuestros tipos de contenido que se usarán en nuestra lista. A continuación, necesitamos crear nuestra vista que más adelante se personalizará con nuestro XSLT. Asegúrese de crear una vista estándar que contenga la columna de fecha de origen y la nueva columna calculada que actuará como marcador de posición del valor calculado.

Ahora tenemos todo en su lugar que requeriremos para apoyar nuestro informe de envejecimiento personalizado. Todo lo que queda es crear nuestra plantilla XSL, cargarla en la biblioteca de estilos del sitio y vincularla a nuestra vista de lista. La plantilla XSL que usaremos va a contener algunas revisiones normales generadas por SharePoint para generar la vista, así como nuestro propio marcado personalizado que se usa para invalidar determinadas partes de esto y calcular nuestro valor deseado para nosotros.

Dando crédito cuando vence el crédito, las plantillas XSL para realizar los cálculos reales que estoy usando para esta solución se proporcionaron con gracia por "swirch" en los foros de MSDN:http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Descargar la hoja de estilos XSL (aging.zip) que he recopilado que se encuentra aquí:https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104

Al abrir esto en su editor de texto favorito, verá muchas revisiones normales de XSL de SharePoint para representar las vistas. Si sigue desplazándose hacia abajo hasta la línea 357, verá el inicio de las plantillas personalizadas que agregué a la revisión, la primera es la plantilla "DateDiff" seguida de "calculate-julian-day" y "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Estas son nuestras tres plantillas que harán y mostrarán nuestros cálculos en nuestras vistas. Si va a usar nombres de campo diferentes de los especificados anteriormente en este artículo, tendrá que pasar por estas plantillas y reemplazar las referencias a los otros nombres. Recuerde que, para ello, querrá usar el nombre INTERNO del campo y no el nombre para mostrar.

Una vez que esté satisfecho de que la plantilla está lista para usar, vaya a la Biblioteca de estilos y cárguela en la carpeta "Hojas de estilos XSL". Después, copie el vínculo al archivo. Esto nos permitirá realizar fácilmente cambios en él más adelante, o agregarlo a diferentes partes del sitio a medida que lo deseemos.

Después, vaya a la lista y seleccione la vista que creó anteriormente en este artículo. Desde el menú "Acciones del sitio", haga clic en "Editar página".

Comando Editar página del menú Acciones del sitio

Busque el elemento web Vista de lista en la página y abra el menú Elemento web haciendo clic en la pequeña flecha hacia abajo de la esquina superior derecha. En este menú, seleccione "Editar elemento web".

Comando Editar elemento web en el menú Elemento web

Esto abrirá el menú del elemento web en el lado derecho de la ventana del explorador.

Menú Elemento web

Haga clic en el signo + de la sección "Varios" y busque la propiedad "Vínculo XSL".

propiedad Vínculo XSL en el menú Elemento web

Pegue el vínculo al archivo XSL de la biblioteca de estilos que copió anteriormente (puede ser un vínculo relativo o absoluto).

Vínculo del archivo XSL pegado en

Haga clic en "Aceptar" para guardar los cambios y, a continuación, haga clic en el botón "Detener edición" en la cinta "Página" de la parte superior de la página.

Botón Detener la edición en la pestaña Página

Si todo estaba configurado correctamente, ahora debería ver los números en la columna "Días en estado".

Columna Días en el estado que muestra números

Y, por último, este es el aspecto que tendría con algunos datos de prueba de varias fechas:

Informe de vencimiento que muestra datos de prueba

Resumen:

Ahí está: una forma bien formatada, sólida y con mejores resultados para crear un informe de antigüedad en SharePoint. Se completa con una sencilla implementación sin código. Esto tiene bastantes aplicaciones potenciales aparte del caso de uso que hemos explorado aquí. Otro escenario común para este tipo de informe es adjuntarlo a una lista de tareas para que pueda ver de un vistazo cuánto tiempo ha pasado desde que se creó una tarea.

¡A disfrutar!

--Justin

Justin Joyce, LANtek

Comentarios

Faltan pasos 8/10/2012 3:51 AM ok he seguido los pasos, pero debe haber algo que falta: ¿cómo sabrá el XSL qué fecha usar o en qué campo agregar los días desde entonces? odio cuando se pierden pasos.

¡Sin código, acordado! 30/8/2012 12:12 p.m. Estoy de acuerdo - No creo que esto realmente cuenta como "ningún código".Curiosamente, a través de algún fastidio de SharePoint, tengo una columna calculada de trabajo usando Hoy... no sé cómo o por qué, porque no puedo conseguir que lo haga de nuevo, pero el sigue ahí y funcionando.

Fórmula para la columna calculada "Días en estado"? 2/5/2012 7:39 AM Justin: ¿Cuál es la fórmula que usó para la columna de sitio calculada "Días en estado" (columna marcador de posición)? ¿Fue "=hoy"?

SharePoint 2007 2/12/2011 11:29 AM Actualmente no he intentado aplicar esta solución a SharePoint 2007, pero estoy buscando en ella. Desafortunadamente, no hay ninguna propiedad XslLink surfaced en el elemento web a través de la interfaz de usuario.

Gran publicación 30/11/2011 9:53 AM Hola Gran publicación.Estoy usando SharePoint 2007.No tengo una sección misc como se mencionó anteriormente.¿Tiene pasos para una configuración de SP2007? Gracias.

Re: Solución sin código: Mostrar los días desde la última vez que se cambió un elemento de lista de SharePoint 11/10/2011 8:24 AM Hola Chris.gran encontrar! Voy a echar un vistazo a lo que publicaste con suerte más adelante en el día de hoy y ver si puedo hacer que esta solución sea un poco más sólida.Me alegra que te haya gustado la entrada, y me alegro de que hayas podido encontrar una solución al formato de fecha europeo. :) -Justin

Solución para formatos de fecha europeos 11/10/2011 6:45 AM Hola de nuevo Justin, Tenga en cuenta que he encontrado una solución para el problema que mencioné anteriormente en esta página;https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

Formatos de fecha europeos 7/10/2011 3:59 AM Hola, Justin Esta es una muy buena solución gracias, y sólo el tipo de cosas que he pasado los últimos dos días buscando! Sin embargo, tengo un problema con él y esperaba que pudieras ayudarme.He alterado ligeramente el código para calcular el número de días hasta que algo sucede, en lugar de desde entonces, cambiando las variables en la última línea de la función "DateDiff"; <xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of> Sin embargo, sólo soy capaz de conseguir que se caclulate la diferencia correctamente la mitad del tiempo. Por ejemplo, con esta fecha (formato dd/MM/aaaa); 12/30/2011 Se calcula correctamente, pero con esta fecha (el mismo formato) 10/12/2011 Calcula como si 10-Dic-2011 en lugar de 12-Oct-2011.He intentado simplemente cambiar las posiciones de los valores de día y mes en la variable "JulianStartDate", así; <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)"/> Y esto corrigió el problema con la segunda fecha, sin embargo, era incorrecto para la primera fecha. También he intentado modificar las llamadas a FormatDateTime para usar LCID europeos y varias modificaciones en el último parámetro de FormatDateTime (p. ej., ddMMyyyy, MMddyyyy) con los ajustes adecuados a los parámetros posicionales de subcadena sin éxito.Agradecería enormemente cualquier consejo que puedas ofrecer.Gracias Chris

Sin código 21/9/2011 4:27 AM No creo que XSL sea una solución "sin código", ya que entender el lenguaje XSL no es para todos - sin embargo, no implica programación. Además de eso: Buena solución, gracias!

¿Necesita más ayuda?

¿Quiere más opciones?

Explore las ventajas de las suscripciones, examine los cursos de aprendizaje, aprenda a proteger su dispositivo y mucho más.