Monday, September 19, 2022

No-Code-Lösung: Anzeige der Tage seit der letzten Änderung eines Listeneintrags

No-Code-Lösung: Anzeige der Tage seit der letzten Änderung eines Listeneintrags

von Justin Joyce, LANtek

Hinweis: Dieser Artikel ist Teil einer Sammlung von Posts aus vier Jahren des Get the Point -Blogs für SharePoint-Endbenutzer.

Überblick: Benutzerdefinierte Alterungsberichte ohne Code

Einer der häufig angeforderten Funktionsbestandteile einer SharePoint-Website ist ein Alterungsbericht für Aufgaben oder Listenelemente. Mit anderen Worten, wie viele Tage/Monate sind seit der letzten Änderung dieses Listenelements vergangen?

An der Oberfläche scheint dies eine sehr einfache Anfrage zu sein. Schließlich haben wir Datumsangaben für erstellte und geänderte Elemente, wir haben die Möglichkeit, benutzerdefinierte Daten zu speichern, wenn bestimmte Änderungen an Elementen durch Ereignisempfänger stattfinden. Wir haben Spalten berechnet, in die wir Excel-ähnliche Formeln einfügen können, um mit unseren Informationen zu arbeiten. Dies scheint ein ziemlich einfacher Vorschlag zu sein. Wir wählen ein Datumsfeld aus, erstellen eine berechnete Spalte und führen dann eine Formel in der Art von [DateField] – [Heute] aus. Ah, aber nicht so schnell! Wie jeder weiß, der sich an dieser „einfachen" Aufgabe versucht hat, verursacht der Versuch, etwas wie [Heute] in einer berechneten Spalte zu verwenden, Probleme. Wenn Sie versuchen, [Heute] in das Formelfeld Ihrer berechneten Spalte einzufügen, erhalten Sie eine Fehlermeldung wie diese:

Fehlermeldung

Warum ist das? Nun, es hat damit zu tun, wie berechnete Spalten berechnet werden.

Nehmen wir als Beispiel eine einfache Formel:

= IF( [Spalte1]<=[Spalte2], "OK", "Nicht OK")

Alles, was dies besagt, ist, dass, wenn Spalte1 kleiner oder gleich Spalte2 ist, OK angezeigt wird, andernfalls Nicht OK angezeigt wird. Dies ist eine ziemlich typische Grundformel für eine berechnete Spalte und macht eine grundlegende Annahme über das Listenelement, das diese Spalten enthält: Die Werte für Column1 und Column2 können sich ohne ein Update-Ereignis für das Listenelement niemals ändern.

Das ist richtig, berechnete Spalten werden nur neu berechnet, wenn die Liste aktualisiert (oder erstellt) wird, da sie davon ausgehen, dass die Informationen, die Sie berechnen, im Element selbst enthalten sind. Dies führt zu einem Problem, wenn Sie versuchen, etwas zu verwenden, das sich unabhängig von den Feldern des Elements ändert, z. B. das heutige Datum.

Jetzt war ich nicht in der Besprechung, in der sie entschieden haben, dass berechnete Spalten so funktionieren würden, aber wenn ich eine fundierte Vermutung anstellen müsste, würde ich annehmen, dass sie so für die Leistung funktionieren. Stellen Sie sich vor, Sie hätten eine Liste mit mehreren tausend Elementen, von denen jedes eine berechnete Spalte enthielt, die eine „Live"-Aktualisierung benötigte. Das würde bedeuten, dass ein Mechanismus, vielleicht ein Timer-Job, jedes Element, das diese berechnete Spalte enthielt, von Zeit zu Zeit durchlaufen und seinen Wert aktualisieren müsste. Dies könnte in Bezug auf die Leistung äußerst anstrengend sein, da dieser Job bei größeren Bereitstellungen möglicherweise ständig ausgeführt wird und Dinge ändert. Das ist nur meine Vermutung, aber es macht ziemlich viel Sinn, wenn man darüber nachdenkt.

Es gibt einige Vorschläge für ähnliche Lösungen, die im Umlauf sind und SharePoint dazu bringen, einen Heute-Wert zu akzeptieren, indem Sie zuerst eine Spalte mit dem Namen Heute erstellen, sie dann zu Ihrer Formel hinzufügen und dann löschen. Das ist alles schön und gut, aber denken Sie daran, was ich darüber gesagt habe, wann berechnete Spalten aktualisiert werden. Dieser Wert ändert sich nur, wenn der Artikel aktualisiert wird, was dazu führt, dass Ihre Werte, insbesondere bei einer Tagesberechnung, schnell falsch sein werden.

Ich habe andere gesehen, die cleveres JavaScript verwendet haben, um die Werte auf die Seite zu schreiben. Dies würde auch funktionieren, aber ich bin ziemlich kategorisch gegen Client-Skripte, wenn es vermieden werden kann.

Implementierung:

Was also tun? Berechnete Spalten kommen für sogenannte „volatile" Funktionen wie Today nicht in Frage. Es ist möglich, dass wir benutzerdefinierten Code entwickeln, um dies für uns zu erledigen, wie z. B. eine berechnete Spalte, ein Timer-Job oder ein geplanter Prozess, der mitkommt und jedes einzelne Element aktualisiert, für das diese Berechnung erforderlich ist. Das bringt uns jedoch zurück zu dem Problem der Leistung, das ich im letzten Absatz erwähnt habe, und außerdem ist es eine spröde Lösung, die sehr spezifisch für die betreffende Site/Liste/Spalte wäre. Zusätzlich zu diesen beiden Bedenken müssten Sie auch einen nerdigen Typen wie mich finden, der weiß, wie man codiert, und ihn davon überzeugen, diese Lösung für Sie zu entwickeln. Aber es geht auch einfacher!

Wenn Sie Rechte zum Erstellen von Feldern und Bearbeiten von Seiten auf Ihrer Website haben und ein wenig Wissen über XSLT und das Erstellen von Ansichten haben, können Sie eine XSL-Vorlage zusammenstellen, die in eine Listenansicht eingefügt werden kann und Ihren Wert jedes Mal genau berechnet Seite wird angefordert. Dieses Szenario beseitigt unsere Bedenken hinsichtlich der Leistung und erfordert nicht, dass benutzerdefinierter Code entwickelt und über eine Lösung bereitgestellt wird.

Perfekt. Wie machen wir es also?

  1. Erstellen oder wählen Sie das Feld aus, das als Quelle dienen soll. Es muss ein Datumstyp sein.

  2. Erstellen Sie unser Feld, das als Platzhalter für den zu berechnenden Wert dient.

  3. Fügen Sie diese beiden Felder einem Inhaltstyp hinzu und fügen Sie diesen Inhaltstyp einer Liste hinzu.

  4. Erstellen Sie eine Ansicht dieser Liste, die sowohl die Quell- als auch die Platzhalterspalten enthält.

  5. Laden Sie die XSL-Vorlage in die Stilbibliothek hoch.

  6. Legen Sie die Eigenschaft „XSL-Link" für das Listenansicht-Webpart über die Benutzeroberfläche fest.

  7. Erfolg!

Lassen Sie uns einen beispielhaften Anwendungsfall untersuchen und die Implementierung durchgehen. Unser Kunde wollte eine Ansicht seiner Hauptliste, die ihm sagen würde, wie lange ein bestimmtes Listenelement auf seinem Status gesessen hat. Diese Liste enthielt einen benutzerdefinierten Websiteinhaltstyp, der vom Elementtyp abgeleitet und der Liste hinzugefügt wurde. Es war bereits ein Ereignisempfänger vorhanden, der jedes Mal erfasst, wenn dieses Statusfeld auf dem Listenelement geändert wurde, und dieses Datum in einer Spalte namens „Statusänderungsdatum" speichert. All diese Verkabelung ist nicht erforderlich und kann mit JEDEM Datumsfeld durchgeführt werden (zufälligerweise ist dies unsere Implementierung, aber Sie können gerne experimentieren). Das absolute Minimum, das Sie benötigen, ist Ihr Quelldatumsfeld und Platzhalterfeld, um Ihre Berechnung (mehr dazu im nächsten Absatz) zu Ihrer Liste hinzuzufügen, obwohl ich vorschlage, dass Sie Site-Spalten und Site-Inhaltstypen verwenden, falls Sie diese wiederverwenden möchten Lösung an anderen Stellen auf Ihrer Website.

Wir haben also unser Quelldatum, das wir in unserer Berechnung gegen das heutige Datum verwenden können. Jetzt können wir eine benutzerdefinierte Site-Spalte erstellen, die als Container für unseren berechneten Wert verwendet wird. In diesem Fall habe ich mich für die Verwendung einer berechneten Spalte entschieden, da sie in den Formularen „Neu" oder „Element bearbeiten" nicht geändert werden kann, aber für die Anzeige in den Ansichten ausgewählt werden kann, da wir nicht möchten, dass Benutzer beliebige Werte in diese Spalte eingeben . Es könnte verwirrend sein, warum es nicht in den Ansichten usw. angezeigt wird.

Jetzt, da wir unsere Site-Spalte haben, können wir sie zu unseren Inhaltstypen hinzufügen, die in unserer Liste verwendet werden. Als nächstes müssen wir unsere Ansicht erstellen, die später mit unserem XSLT angepasst wird. Stellen Sie sicher, dass Sie eine Standardansicht erstellen, die Ihre Quelldatumsspalte und Ihre neu berechnete Spalte enthält, die als Platzhalter für den berechneten Wert dient.

Wir haben jetzt alles, was wir benötigen, um unseren benutzerdefinierten Alterungsbericht zu unterstützen. Es bleibt nur noch, unsere XSL-Vorlage zu erstellen, sie in die Stilbibliothek der Website hochzuladen und sie mit unserer Listenansicht zu verknüpfen. Die XSL-Vorlage, die wir verwenden werden, enthält ein normales, von SharePoint generiertes Markup zum Generieren der Ansicht sowie unser eigenes benutzerdefiniertes Markup, das verwendet wird, um bestimmte Teile davon zu überschreiben und unseren gewünschten Wert für uns zu berechnen.

Anerkennung wem Ehre gebührt, die XSL-Vorlagen für die eigentlichen Berechnungen, die ich für diese Lösung verwende, wurden freundlicherweise von „swirch" in den MSDN-Foren bereitgestellt:
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Laden Sie das XSL-Stylesheet (aging.zip) herunter, das ich hier zusammengestellt habe:
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104

Wenn Sie dies in Ihrem bevorzugten Texteditor öffnen, sehen Sie viele normale SharePoint-XSL-Markups zum Rendern der Ansichten. Wenn Sie weiter nach unten zu Zeile 357 scrollen, sehen Sie den Anfang der benutzerdefinierten Vorlagen, die ich dem Markup hinzugefügt habe, wobei die erste ist die Vorlage „DateDiff", gefolgt von „calculate-julian-day" und „FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Dies sind unsere drei Vorlagen, die unsere Berechnungen in unseren Ansichten erstellen und anzeigen. Wenn Sie andere Feldnamen als die weiter oben in diesem Artikel angegebenen verwenden, müssen Sie diese Vorlagen durchgehen und alle Verweise auf die anderen Namen ersetzen. Denken Sie daran, dass Sie hierfür den INTERNEN Namen des Felds und nicht den Anzeigenamen verwenden möchten.

Wenn Sie zufrieden sind, dass die Vorlage einsatzbereit ist, navigieren Sie zu Ihrer Stilbibliothek und laden Sie sie in den Ordner „XSL-Stilvorlagen" hoch. Kopieren Sie dann den Link zu der Datei. Auf diese Weise können wir später problemlos Änderungen daran vornehmen oder sie nach Belieben zu verschiedenen Teilen der Website hinzufügen.

Gehen Sie als Nächstes zu Ihrer Liste und wählen Sie die Ansicht aus, die Sie zuvor in diesem Artikel erstellt haben. Klicken Sie im Menü „Site-Aktionen" auf „Seite bearbeiten".

Befehl Seite bearbeiten im Menü Websiteaktionen

Suchen Sie Ihr Listenansicht-Webpart auf der Seite und öffnen Sie das Webpart-Menü, indem Sie auf den kleinen nach unten weisenden Pfeil in der oberen rechten Ecke klicken. Wählen Sie aus diesem Menü „Webpart bearbeiten".

Befehl „Webpart bearbeiten

Dadurch wird das Menü des Webparts auf der rechten Seite Ihres Browserfensters geöffnet.

Webpart-Menü

Klicken Sie auf das + für den Abschnitt „Verschiedenes" und suchen Sie die Eigenschaft „XSL-Link".

XSL-Link-Eigenschaft im Webpart-Menü

Fügen Sie den Link zu Ihrer XSL-Datei in Ihre Stilbibliothek ein, den Sie zuvor kopiert haben (dies kann ein relativer oder absoluter Link sein).

XSL-Dateilink eingefügt

Klicken Sie auf „OK", um Ihre Änderungen zu speichern, und klicken Sie dann auf die Schaltfläche „Bearbeitung beenden" im Menüband „Seite" oben auf der Seite.

Schaltfläche „Bearbeitung beenden

Wenn alles richtig konfiguriert wurde, sollten Sie jetzt Zahlen in Ihrer Spalte „Days At Status" sehen.

Tage bei Statusspalte mit Anzahl

Und schließlich, so würde es mit einigen Testdaten verschiedener Daten aussehen:

Alterungsbericht mit Testdaten

Zusammenfassung:

Da ist es: eine gut formatierte, robuste und leistungsstärkere Möglichkeit, einen Alterungsbericht in SharePoint zu erstellen, komplett mit einer einfachen No-Code-Implementierung. Abgesehen von dem einen Anwendungsfall, den wir hier untersucht haben, hat dies eine ganze Reihe potenzieller Anwendungen. Ein weiteres häufiges Szenario für diese Art von Bericht ist das Anhängen an eine Aufgabenliste, sodass Sie auf einen Blick sehen können, wie lange es her ist, seit eine Aufgabe erstellt wurde.

Genießen!

- Justin

Justin Joyce, LANtek

Kommentare

Schritte fehlen
8.10.2012 3:51 Uhr
ok, ich habe die Schritte befolgt, aber es muss etwas fehlen - woher weiß das XSL, welches Datum verwendet werden soll oder in welches Feld die Tage seither eingefügt werden sollen? hasse es, wenn Schritte ausgelassen werden.

No-Code, einverstanden!
30.08.2012 12:12 Uhr
Ich stimme zu - ich glaube nicht, dass dies wirklich als "kein Code" zählt.
Interessanterweise habe ich durch einen Fehler in SharePoint eine funktionierende berechnete Spalte, die Today verwendet. Ich bin mir nicht sicher, wie oder warum, weil ich sie nicht dazu bringen kann, dies erneut zu tun, aber die eine ist immer noch da und funktioniert.

Formel für berechnete Spalte "Tage zum Status"?
2.5.2012 7:39 Uhr
Justin – Welche Formel haben Sie für die berechnete Site-Spalte „Days At Status" (Platzhalterspalte) verwendet? War es "=heute"?

SharePoint 2007
2.12.2011 11:29 Uhr
Derzeit habe ich nicht versucht, diese Lösung auf SharePoint 2007 anzuwenden, aber ich schaue mir das an. Leider wird im Webpart über die Benutzeroberfläche keine XslLink-Eigenschaft angezeigt.

Guter Eintrag
30.11.2011 09:53 Uhr
Hallo,
Guter Eintrag.
Ich verwende Sharepoint 2007.
Ich habe keinen Misc-Bereich, wie oben erwähnt.
Haben Sie Schritte für eine SP2007-Konfiguration?
Vielen Dank.

Betreff: No-Code-Lösung: Anzeige der Tage seit der letzten Änderung eines SharePoint-Listeneintrags
11.10.2011 8:24 Uhr
Hallo Chris.
toller Fund!
Ich werde einen Blick auf das werfen, was Sie hoffentlich später heute gepostet haben, und sehen, ob ich diese Lösung etwas robuster machen kann.
Ich freue mich, dass Ihnen der Beitrag gefallen hat, und ich bin sehr froh, dass Sie eine Lösung für das europäische Datumsformat finden konnten. :)
-Justin

Lösung für europäische Datumsformate
11.10.2011 6:45 Uhr
Hallo nochmal Justin,
Zu Ihrer Information, ich habe eine Lösung für das Problem gefunden, das ich zuvor auf dieser Seite erwähnt habe.
https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

Europäische Datumsformate
7.10.2011 3:59 Uhr
Hallo, Justin,
Dies ist eine wirklich gute Lösung, danke, und genau das, wonach ich die letzten zwei Tage gesucht habe! Allerdings habe ich ein kleines Problem damit und ich hatte gehofft ihr könnt mir helfen.
Ich habe Ihren Code leicht geändert, um die Anzahl der Tage zu berechnen, bis etwas passiert, anstatt seitdem, indem ich die Variablen in der letzten Zeile der Funktion "DateDiff" vertausche;

<xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of>

Allerdings bekomme ich es nur in der Hälfte der Fälle dazu, die Differenz richtig zu berechnen. Also zum Beispiel mit diesem Datum (Format TT/MM/JJJJ);

30.12.2011

Es wird korrekt berechnet, aber mit diesem Datum (gleiches Format)

10.12.2011

Es wird so berechnet, als wäre der 10. Dezember 2011 und nicht der 12. Oktober 2011.
Ich habe versucht, einfach die Positionen der Tages- und Monatswerte in der Variablen "JulianStartDate" zu tauschen, so;

<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)"/>

Und das hat das Problem mit dem zweiten Date behoben, aber es war dann falsch für das erste Date!
Ich habe auch versucht, die FormatDateTime-Aufrufe zu ändern, um europäische LCIDs zu verwenden, und verschiedene Änderungen am letzten Parameter von FormatDateTime (z. B. ddMMyyyy, MMddyyyy) mit den entsprechenden Anpassungen an den Positionsparametern der Teilzeichenfolge ohne Erfolg.
Ich würde mich sehr über jeden Rat freuen, den Sie anbieten können.
Vielen Dank,
Chris

Kein Code
21.9.2011 4:27 Uhr
Ich glaube nicht, dass XSL als "No-Code"-Lösung qualifiziert ist, da das Verstehen der XSL-Sprache nicht jedermanns Sache ist - es erfordert jedoch keine Programmierung. Ansonsten: Schöne Lösung, danke!

No comments:

Post a Comment