Codefreie Lösungen: Anzeigen, vor wie vielen Tagen ein SharePoint-Listenelement zuletzt geändert wurde

Codefreie Lösungen: Anzeigen, vor wie vielen Tagen ein SharePoint-Listenelement zuletzt geändert wurde

Wichtig :  Dieser Artikel wurde maschinell übersetzt. Bitte beachten Sie den Haftungsausschluss. Die englische Version des Artikels ist als Referenz hier verfügbar: hier.

20.9.2011, 15:01 Uhr

von Jonas Joyce, LANtek

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

Übersicht: Benutzerdefinierte codefreie Alterslisten

Eine der häufig angeforderten funktionalen Elemente einer SharePoint-Website ist eine Altersliste für Vorgänge oder Listenelemente. Mit anderen Worten, wie viele Tage/Monate ist es her, seit der dieses Listenelement zuletzt geändert wurde?

Oberflächlich betrachtet scheint dies eine sehr einfache Anforderung zu sein. Schließlich verfügen wir über die Datumsangaben für erstellte und geänderte Elemente und wir können benutzerdefinierte Datumsangaben speichern, wenn bestimmte Änderungen an Elementen über Ereignisempfänger erfolgen. Wir haben berechnete Spalten, in die wir Excel-ähnliche Formeln einfügen können, um mit den Informationen zu arbeiten. Dies scheint ein ganz einfaches Konzept zu sein. Wir wählen Sie ein Datumsfeld aus, erstellen eine berechnete Spalte und führen dann eine Formel über bestimmte Zeilen von [Datumsfeld] – [Heute] aus. Aber Moment! Nicht ganz so schnell. Wie jeder weiß, der sich an dieser "einfachen" Aufgabe versucht hat, bringt der Versuch, Elemente wie [Heute] in einer berechneten Spalte zu verwenden, Probleme mit sich. Wenn Sie [Heute] in das Formelfeld Ihrer berechneten Spalte einfügen, wird eine Fehlermeldung angezeigt, die etwa so aussieht:

Fehlermeldung

Was ist der Grund hierfür? Nun, es hat mit der Art und Weise zu tun, wie berechnete Spalten berechnet werden.

Nehmen wir eine einfache Formel als Beispiel:

= WENN( [Spalte1]<=[Spalte2]; "OK"; "Nicht OK")

Dies bedeutet lediglich Folgendes: Wenn "Spalte1" kleiner oder gleich "Spalte2" ist, dann wird "OK" angezeigt, andernfalls wird "Nicht OK" angezeigt. Das ist eine ziemlich normale, einfache Formel für eine berechnete Spalte mit einer grundlegenden Annahme über das Listenelement, das diese Spalten enthält: Die Werte für "Spalte1" und "Spalte2" können sich nie ohne ein Aktualisierungsereignis für das Listenelement ändern.

Das stimmt. Berechnete Spalten werden nur neu berechnet, wenn die Liste aktualisiert (oder erstellt) wird, weil davon ausgegangen wird, dass die berechneten Informationen im Element selbst enthalten sind. Dies führt zu einem Problem, wenn Sie Elemente verwenden möchten, die sich unabhängig von den Feldern des Elements ändern können, z. B. das Datum von heute.

Nun, ich war nicht dabei, als entschieden wurde, dass berechnete Spalten auf diese Weise funktionieren sollen, wenn ich jedoch eine Vermutung abgeben sollte, würde ich tippen, dass dieses Verhalten aus Leistungsgründen gewählt wurde. Stellen Sie sich vor, Sie hätten eine Liste mit mehreren Tausend Elementen, von denen jedes eine berechnete Spalte enthält, für die eine "Live"-Aktualisierung erforderlich wäre. Das würde bedeuten, dass ein Mechanismus, z. B. ein Zeitgeberauftrag, jedes Element mit einer berechneten Spalte regelmäßig durchlaufen und den Wert aktualisieren müsste. Das könnte im Hinblick auf die Leistung kaum zu bewältigen sein, da dieser Auftrag bei größeren Bereitstellungen möglicherweise ununterbrochen ausgeführt werden und Elemente ändern würde. Es ist zwar nur eine Vermutung, die aber, wenn man darüber nachdenkt, ziemlich sinnvoll ist.

Es gibt einige Vorschläge für ähnliche Lösungen, wie man SharePoint austricksen kann, damit es den Wert "Heute" akzeptiert. Beispielsweise, indem zuerst eine Spalte mit dem Namen "Heute" erstellt, dann zur Formel hinzugefügt und anschließend wieder gelöscht wird. Diese Vorschläge sind alle schön und gut, aber erinnern Sie sich, was ich über das Aktualisieren von berechneten Spalten gesagt habe. Dieser Wert ändert sich nur, wenn das Element aktualisiert wird, was bedeutet, dass Ihre Werte schon bald falsch sind, besonders im Falle der Berechnung eines Tags.

Ich habe andere Lösungen gesehen, bei denen intelligentes JavaScript zum Schreiben der Werte in die Seite verwendet wird. Dies würde auch funktionieren, aber ich bin prinzipiell gegen Clientskript, wenn es vermieden werden kann.

Implementierung:

Was ist also zu tun? Berechnete Spalten kommen für so genannte "veränderliche" Funktionen wie "Heute" nicht in Frage. Wir könnten benutzerdefinierten Code entwickeln, der diese Aufgabe für uns übernimmt, z. B. eine berechnete Spalte, einen Zeitgeberauftrag oder einen geplanten Prozess, der regelmäßig jedes einzelne Element aktualisiert, für das diese Berechnung vorgenommen werden muss. Damit kommen wir jedoch wieder zu dem im letzten Absatz erwähnten Leistungsproblem zurück, und darüber hinaus ist es eine unelegante Lösung, die hochgradig spezifisch für die jeweilige Website/Liste/Spalte wäre. Zusätzlich zu diesen beiden Bedenken müssten Sie auch noch einen Computerfreak wie mich finden, der sich mit derartigem Code auskennt, und ihn überreden, diese Lösung für Sie zu programmieren. Aber es gibt eine einfachere Möglichkeit!

Wenn Sie zum Erstellen von Feldern und zum Bearbeiten von Seiten auf Ihrer Website berechtigt sind und über grundlegende Kenntnisse von XSLT und vom Erstellen von Ansichten verfügen, können Sie eine XSL-Vorlage erstellen, die in eine Listenansicht eingefügt werden kann und zuverlässig jedes Mal, wenn die Seite angefordert wird, den erforderlichen Wert berechnet. Dieses Szenario beseitigt die Bedenken hinsichtlich der Leistung, und es muss kein benutzerdefinierter Code entwickelt und über eine Lösung bereitgestellt werden.

Perfekt. Und wir funktioniert das nun?

  1. Zuerst müssen Sie das Feld erstellen oder auswählen, das als Quelle fungieren soll. Das Feld muss den Datentyp "Datum" aufweisen.

  2. Dann erstellen Sie das Feld, das als Platzhalter für den berechneten Wert fungieren soll.

  3. Fügen Sie beide Felder zu einem Inhaltstyp und den Inhaltstyp zu einer Liste hinzu.

  4. Erstellen Sie eine Ansicht der Liste, die die Quell- und Platzhalterspalten enthält.

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

  6. Legen Sie die Eigenschaft "XSL-Verknüpfung" für das Listenansichts-Webpart über die Benutzeroberfläche fest.

  7. Fertig!

Lassen Sie uns nun einen Beispielanwendungsfall untersuchen und uns die Implementierung anschauen. Unser Kunde benötigt eine Ansicht seiner Hauptliste, die Informationen darüber liefert, wie lange ein bestimmtes Listenelement seinen aktuellen Status aufweist. Diese Liste enthält einen benutzerdefinierten Website-Inhaltstyp, der vom Elementtyp abgeleitet und der Liste hinzugefügt wird. Es gibt bereits einen Ereignisempfänger, der jede Änderung des Statusfelds des Listenelements erfasst und dieses Datum in einer Spalte mit dem Namen "Status geändert am" speichert. Alle diese Verknüpfungen sind nicht erforderlich, unsere Lösung funktioniert mit JEDEM Datumsfeld (der vorliegende Fall ist lediglich ein Beispiel für eine Implementierung – Sie können beliebig experimentieren). Sie müssen als absolutes Minimum das Quelldatumsfeld und das Platzhalterfeld zum Speichern der Berechnung (weitere Informationen hierzu erhalten Sie im nächsten Absatz) zu Ihrer Liste hinzufügen, allerdings empfiehlt es sich, Websitespalten und Website-Inhaltstypen zu verwenden, falls Sie diese Lösung an anderer Stelle auf Ihrer Website wiederverwenden möchten.

Damit verfügen wir über das Quelldatum, das wir in unserer Berechnung gegen das heutige Datum verwenden können. Jetzt können wir eine benutzerdefinierte Websitespalte erstellen und als Container für unseren berechneten Wert verwenden. In diesem Fall habe ich mich für die Verwendung einer berechneten Spalte entschieden, da sie auf den Formularen "Neu" oder "Element bearbeiten" nicht geändert, aber für die Anzeige in den Ansichten ausgewählt werden kann – schließlich sollen Benutzer ja keine beliebigen Werte in diese Spalte eingeben können. Es könnte verwirrend sein, warum sie in den Ansichten usw. nicht angezeigt wird.

Nachdem wir nun die Websitespalte erstellt haben, können wir sie zu den Inhaltstypen hinzufügen, die in der Liste verwendet werden. Als Nächstes erstellen wir unsere Ansicht, die später mit XSLT angepasst wird. Stellen Sie sicher, dass Sie eine Standardansicht erstellen, die die Quelldatumsspalte und die neue berechnete Spalte enthält, die als Platzhalter für den berechneten Wert fungiert.

Wir haben nun alle Elemente vorbereitet, die wir zur Unterstützung unserer benutzerdefinierten Altersliste benötigen. Jetzt brauchen wir nur noch die XSL-Vorlage zu erstellen, in die Formatbibliothek der Website hochzuladen und mit unserer Listenansicht zu verknüpfen. Die XSL-Vorlage, die wir verwenden werden, soll einige normale, von SharePoint generierte Markups zum Generieren der Ansicht enthalten sowie unser eigenes benutzerdefiniertes Markup, das bestimmte Teile überschreibt und den gewünschten Wert berechnet.

Zugewiesen haben, in dem Kreditkarte fällig ist, die XSL-Vorlagen für die ist-Berechnungen, die ich für diese Lösung verwende ausführen wurden großzügigerweise von "Swirch" auf der MSDN-Foren:
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Das von mir zusammengestellte XSL-Stylesheet (aging.zip) können Sie hier herunterladen:
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104

Wenn Sie dieses in Ihrem bevorzugten Texteditor öffnen, sehen Sie viele normale SharePoint XSL-Markups zur Darstellung von Ansichten. Weiter unten, ab Zeile 357 beginnen die benutzerdefinierten Vorlagen, die ich dem Markup hinzugefügt habe, zuerst die Vorlage "DateDiff", gefolgt von "calculate-julian-day" und "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Hierbei handelt es sich um die drei Vorlagen, die die Berechnungen in den Ansichten vornehmen und anzeigen. Wenn Sie andere Feldnamen als die weiter oben in diesem Artikel angegebenen verwenden möchten, müssen Sie in den Vorlagen die Verweise auf diese Felder entsprechend ändern. Denken Sie daran, dazu müssen Sie den INTERNEN Namen des Felds und nicht den Anzeigenamen verwenden.

Wenn Sie mit der Vorlage fertig sind, navigieren Sie zur Formatbibliothek, laden Sie die Vorlage in den Ordner "XSL-Stylesheets" hoch, und kopieren Sie anschließend die Verknüpfung zu der Datei. Auf diese Weise können Sie zu einem späteren Zeitpunkt mühelos Änderungen vornehmen oder die Vorlage bei Bedarf zu anderen Teilen der Website hinzufügen.

Wechseln Sie als Nächstes zu Ihrer Liste, und wählen Sie die Ansicht aus, die Sie weiter oben in diesem Artikel erstellt haben. Klicken Sie im Menü "Websiteaktionen" auf "Seite bearbeiten".

Befehl 'Seite bearbeiten' im Menü 'Websiteaktionen'

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

Befehl 'Webpart bearbeiten' im Menü 'Webpart'

Dadurch wird das Menü "Webpart" auf der rechten Seite des Browserfensters geöffnet.

Webpartmenü

Klicken Sie auf das + für den Abschnitt "Verschiedenes", und suchen Sie die Eigenschaft "XSL-Verknüpfung".

Eigenschaft 'XSL-Verknüpfung' im Menü 'Webpart'

Fügen Sie die weiter oben kopierte Verknüpfung zu Ihrer XSL-Datei in der Formatbibliothek ein (dies kann eine relative oder absolute Verknüpfung sein).

Eingefügte XSL-Dateiverknüpfung

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

Schaltfläche 'Bearbeitung beenden' auf der Registerkarte 'Seite'

Wenn alles richtig konfiguriert wurde, sollten jetzt Zahlen in der Spalte "Days At Status" angezeigt werden.

Spalte 'Days At Status' mit angezeigter Zahl

Und so würde das ganze mit einigen Testdaten und verschiedenen Datumsangaben aussehen:

Ablaufbericht mit angezeigten Testdaten

Zusammenfassung:

Hier ist sie: eine ordentlich formatierte, robuste und leistungsstärkere Möglichkeit zum Erstellen einer Altersliste in SharePoint, eine vollständige und einfache codefreie Implementierung. Es gibt eine ganze Reihe von Anwendungsmöglichkeiten neben dem einen Anwendungsfall, den wir hier untersucht haben. Ein weiteres gängiges Szenario für diese Art von Bericht besteht in der Anbindung an eine Aufgabenliste, um auf einen Blick sehen zu können, wie viel Zeit seit der Erstellung einer Aufgabe vergangen ist.

Viel Spaß!

--Justin

Justin Joyce, LANtek

Kommentare

Fehlende Schritte
8.10.2012, 3:51 Uhr
OK, ich habe die Schritte befolgt, aber es muss etwas fehlen – woher soll XSL wissen, welches Datum verwendet werden soll oder in welches Feld die "Tage seit" eingefügt werden sollen? Ich hasse es, wenn Schritte übersprungen werden.

codefrei, OK!
30.8.2012, 12:12 Uhr
Ich stimme zu – Ich glaube nicht, dass wir hier von "codefrei" sprechen können.
Interessanterweise habe ich durch irgendeinen Fehler von SharePoint eine funktionierende berechnete Spalte, die den Wert "Heute" verwendet... Ich bin nicht sicher, wie oder warum, denn es lässt sich in SharePoint nicht reproduzieren, aber die eine ist weiterhin vorhanden und funktioniert.

Formel für berechnete "Days At Status"-Spalte?
2.5.2012, 7:39 Uhr
Justin, welche Formel haben Sie für die berechnete "Days At Status"-Websitespalte (Platzhalterspalte) verwendet? Handelte es sich um "=Heute"?

SharePoint 2007
2.12.2011, 11:29 Uhr
Ich habe bisher nicht versucht, diese Lösung für SharePoint 2007 anzuwenden, aber ich werde mich damit befassen. Leider gibt es in der Benutzeroberfläche keine XslLink-Eigenschaft im Webpart.

Großartiger Beitrag
30.11.2011, 9:53 Uhr
Hallo,
großartiger Beitrag.
Ich verwende SharePoint 2007.
Den oben erwähnten Abschnitt "Verschiedenes" gibt es bei mir nicht.
Können Sie mir die Schritte für eine Konfiguration mit SP2007 nennen?
Vielen Dank.

Betrifft: Codefreie Lösung: Anzeigen der Tage seit der letzten Änderung eines Elements einer SharePoint-Liste
10.11.2011, 8:24 Uhr
Hi Chris.
Großartiger Hinweis!
Ich werde mich hoffentlich im Laufe des Tages mit Ihrem Beitrag genauer befassen können und versuchen, die Lösung noch etwas robuster zu machen.
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
10/11/2011 6:45 Uhr
Hallo erneut Jonas,
FYI, ich habe eine Lösung für das Problem, die ich zuvor auf dieser Seite bereits; gefunden
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
Hi Justin,
Dies ist wirklich eine gute Lösung, danke, und genau das, wonach ich in den letzten beiden Tagen gesucht habe! Aber ich ein kleines Problem damit, und ich hoffe, dass Sie mir helfen können
Ich habe Ihren Code ein wenig geändert, um die Anzahl der Tage bis zu einem bestimmten Ereignis zu berechnen, anstatt die Anzahl der Tage seit dem Auftreten eines bestimmten Ereignisses, indem ich die Variablen in der letzten Zeile der Funktion "DateDiff" vertauscht habe;

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

Allerdings wird die Differenz nur in der Hälfte der Fälle richtig berechnet. Beispielsweise mit diesem Datum (Format dd/MM/yyyy);

30/12/2011

ist die Berechnung korrekt, aber mit diesem Datum (selbes Format)

12/10/2011

erfolgt die Berechnung mit dem 10. Dezember 2011 statt mit dem 12. Oktober 2011.
Ich habe versucht, einfach die Positionen der Tag- und Monat-Werte in der Variablen "JulianStartDate" wie folgt zu tauschen:

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

Damit wurde der Fehler beim zweiten Datum behoben, dafür war anschließend die Berechnung für das erste Datum falsch!
Ich habe auch versucht, die "FormatDateTime"-Aufrufe so zu ändern, dass europäische LCIDs verwendet werden und habe verschiedene Änderungen am letzten Parameter von "FormatDateTime" (z. B. ddMMyyyy, MMddyyyy) mit den entsprechenden Anpassungen an den Positionsparametern der Teilzeichenfolge vorgenommen, ohne Erfolg.
Ich würde mich über jeden Tipp von Ihnen freuen.
Danke,
Chris

Codefrei
21.9.2011, 4:27 Uhr
Ich glaube nicht, dass XSL als eine "codefreie" Lösung bezeichnet werden kann, weil nicht jeder die XSL-Sprache versteht – allerdings ist keine Programmierung erforderlich. Davon abgesehen: Gute Lösung, vielen Dank!

Hinweis : Haftungsausschluss für maschinelle Übersetzungen: Dieser Artikel wurde mithilfe eines Computersystems und ohne jegliche Bearbeitung durch Personen übersetzt. Microsoft bietet solche maschinellen Übersetzungen als Hilfestellung für Benutzer ohne Englischkenntnisse an, damit Sie von den Informationen zu Produkten, Diensten und Technologien von Microsoft profitieren können. Da es sich bei diesem Artikel um eine maschinelle Übersetzung handelt, enthält er möglicherweise Fehler in Bezug auf (Fach-)Terminologie, Syntax und/oder Grammatik.

Ihre Fähigkeiten erweitern
Schulung erkunden
Neue Funktionen als Erster erhalten
An Office Insider teilnehmen

War diese Information hilfreich?

Vielen Dank für Ihr Feedback!

Vielen Dank für Ihr Feedback. Es klingt, als ob es hilfreich sein könnte, Sie mit einem unserer Office-Supportmitarbeiter zu verbinden.

×