Bei Microsoft anmelden
Melden Sie sich an, oder erstellen Sie ein Konto.
Hallo,
Wählen Sie ein anderes Konto aus.
Sie haben mehrere Konten.
Wählen Sie das Konto aus, mit dem Sie sich anmelden möchten.
No-Code-Lösung: Anzeigen der Tage seit der letzten Änderung eines Listenelements

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?

Auf der Oberfläche scheint dies eine sehr einfache Anforderung zu sein. Schließlich haben wir Datumsangaben für Elemente, die erstellt und geändert werden, und wir können benutzerdefinierte Datumsangaben speichern, wenn bestimmte Änderungen an Elementen über Ereignisempfänger erfolgen. Wir haben berechnete Spalten, in denen wir Excel-ähnliche Formeln verwenden können, um mit unseren Informationen zu arbeiten. Dies scheint ein ziemlich geradliniger Vorschlag zu sein. Wählen Sie ein Datumsfeld aus, erstellen Sie eine berechnete Spalte, und führen Sie dann eine Formel in der Zeile [DateField] – [heute] aus. Ah, aber nicht so schnell! Als jeder, der diese "einfache" Aufgabe ausprobiert hat, kann es zu Problemen kommen, wenn Sie versuchen, so etwas wie [heute] in einer berechneten Spalte zu verwenden. Wenn Sie versuchen, [heute] in das Formelfeld der berechneten Spalte einzufügen, erhalten Sie eine Fehlermeldung wie die folgende:

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 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, in dem Element selbst enthalten sind. Dadurch wird ein Problem verursacht, wenn Sie versuchen, etwas zu verwenden, das unabhängig von den Feldern des Elements, wie dem heutigen Datum, geändert wird.

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 im Umlauf, die dazu führen, dass SharePoint in die Annahme eines heutigen Werts übertragen wird, indem zuerst eine Spalte mit dem Namen "heute" erstellt und dann der Formel hinzugefügt und dann gelöscht wird. Diese sind alle gut und gut, aber denken Sie daran, was ich darüber gesagt habe, wenn berechnete Spalten aktualisiert werden. Dieser Wert ändert sich nur, wenn das Element aktualisiert wird, was bedeutet, dass ihre Werte in Kürze falsch sein werden, insbesondere bei einer Tages Berechnung.

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.

Deshalb haben wir unser Quelldatum, das wir in unserer Berechnung für das heutige Datum verwenden können. Jetzt können wir eine benutzerdefinierte Websitespalte erstellen, die als Container für unseren berechneten Wert verwendet wird. In diesem Fall habe ich entschieden, eine berechnete Spalte zu verwenden, da Sie nicht in der Lage ist, auf den neuen oder bearbeiten Element Formularen geändert zu werden, aber für die Anzeige in den Ansichten ausgewählt werden kann, da wir nicht möchten, dass Benutzer willkürliche Werte in diese Spalte eingeben. Es könnte verwirrend sein, warum es in den Ansichten nicht angezeigt wird usw.

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.

Wenn Guthaben gutgeschrieben wird, werden die XSL-Vorlagen für die tatsächlichen Berechnungen, die ich für diese Lösung verwende, von "swirch" in den MSDN-Foren bereitgestellt:
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 dies in Ihrem bevorzugten Text-Editor öffnen, wird Ihnen viel normales SharePoint XSL-Markup für das Rendern der Ansichten angezeigt, wenn Sie den Bildlauf nach unten in Zeile 357 fortsetzen, sehen Sie den Anfang der benutzerdefinierten Vorlagen, die ich dem Markup hinzugefügt habe, wobei die erste die Vorlage "DateDiff" und dann "Calculate-Julian-Day" und "FieldRef_printTableCell_EcbAllowed. Days_x0020_At_x0020_Status Dies sind unsere drei Vorlagen, die unsere Berechnungen in unseren Ansichten vornehmen und Anzeigen werden. Wenn Sie unterschiedliche Feldnamen verwenden möchten, als weiter oben in diesem Artikel beschrieben wurden, müssen Sie diese Vorlagen durchlaufen und alle Verweise auf die anderen Namen ersetzen. Beachten Sie bitte, dass Sie den internen Namen des Felds nicht den Anzeigenamen verwenden möchten.

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 10/8/2012 3:51 am
OK, ich habe die Schritte befolgt, aber es muss etwas fehlen – wie wird das XSL wissen, welches Datum verwendet werden soll, oder in welchem Feld werden die Tage seither hinzugefügt? Ich hasse es, wenn Schritte übersprungen werden.

Kein Code, vereinbart!
8/30/2012 12:12 Uhr
Ich erkläre mich damit einverstanden, dass dies nicht wirklich als "kein Code" gilt.
Interessanterweise habe ich durch einige screwup von SharePoint eine funktionierende berechnete Spalte mit heute... Sie sind sich nicht sicher, wie oder warum, weil ich es nicht wieder tun kann, aber die eine ist immer noch da und funktioniert.

Formel für die berechnete Spalte "Tage bei Status"?
5/2/2012 7:39 am
Justin-Was ist die Formel, die Sie für die berechnete Websitespalte "Days at Status" (Platzhalterspalte) verwendet haben? Handelte es sich um "=Heute"?

SharePoint 2007
12/2/2011 11:29 am
Derzeit habe ich nicht versucht, diese Lösung auf SharePoint 2007 anzuwenden, aber ich Suche in Sie. Leider gibt es in der Benutzeroberfläche keine XslLink-Eigenschaft im Webpart.

Toller Beitrag
11/30/2011 9:53 am
Hallo,
Toller Beitrag.
Ich verwende SharePoint 2007.
Ich habe keinen misc-Abschnitt wie oben beschrieben.
Haben Sie Schritte für die Konfiguration von "ein-und ausgehend"?
Danke.

Re: No-Code-Lösung: Anzeigen der Tage seit der letzten Änderung
eines SharePoint-Listenelements 10/11/2011 8:24 am
Hallo Chris.
tolle Entdeckung!
Ich werde einen Blick darauf werfen, was Sie später hoffentlich noch heute gepostet haben, und sehen, ob ich diese Lösung etwas robuster machen kann.
Ich bin froh, 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 am
Hallo nochmal Justin,
FYI, 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
10/7/2011 3:59 am
Hallo Justin,
Das ist eine wirklich gute Lösung, und genau das, was ich in den letzten beiden Tagen gesucht habe! Allerdings habe ich ein kleines Problem damit, und ich hoffte, dass Sie mir helfen könnten.
Ich habe Ihren Code etwas geändert, um die Anzahl der Tage zu calcultate, bis etwas stattfindet, indem Sie die Variablen in der letzten Zeile der Funktion "DateDiff" wechseln;

<XSL: Wert-von Select = "$JulianToday-$JulianStartDate" ></XSL: Wert-von>

Allerdings kann ich den Unterschied nur zur Hälfte der Zeit caclulate. Zum Beispiel mit diesem Datum (Format tt/mm/jjjj);

30/12/2011

Sie wird korrekt berechnet, aber mit diesem Datum (Gleiches Format)

12/10/2011

Sie wird als wenn 10 – Dez-2011 statt 12-Okt-2011 berechnet.
Ich habe versucht, einfach die Positionen der Tages-und Monatswerte in der Variablen "JulianStartDate" zu wechseln, wie hier;

<XSL: with-param Name = "Month" Select = "SUBSTRING (ddwrt: FormatDateTime (String ($StartDate), 1033, ' JJJJMMTT '), 7, 2)"/>
<XSL: with-param Name = "Tag" Select = "SUBSTRING (ddwrt: FormatDateTime (String ($StartDate), 1033, ' JJJJMMTT '), 5, 2)"/>

Und dadurch wurde das Problem mit dem zweiten Datum behoben, war aber für das erste Datum falsch!
Ich habe auch versucht, die FormatDateTime-Aufrufe zu ändern, um europäische LCIDs und verschiedene Änderungen des letzten Parameters von FormatDateTime (z.b. TTMMJJJJ, MMTTJJJJ) mit den entsprechenden Anpassungen an den Positionsparametern der Teilzeichenfolge ohne Erfolg zu verwenden.
Ich wäre Ihnen sehr dankbar für Ratschläge, die Sie anbieten können.
Vielen Dank,
Chris

Kein Code
9/21/2011 4:27 am
Ich glaube nicht, dass XSL als eine "No-Code"-Lösung qualifiziert ist, da das Verständnis der XSL-Sprache nicht für jeden gedacht ist, aber nicht die Programmierung beinhaltet. Davon abgesehen: Gute Lösung, vielen Dank!

Benötigen Sie weitere Hilfe?

Möchten Sie weitere Optionen?

Erkunden Sie die Abonnementvorteile, durchsuchen Sie Trainingskurse, erfahren Sie, wie Sie Ihr Gerät schützen und vieles mehr.

In den Communities können Sie Fragen stellen und beantworten, Feedback geben und von Experten mit umfassendem Wissen hören.

War diese Information hilfreich?

Wie zufrieden sind Sie mit der Sprachqualität?
Was hat Ihre Erfahrung beeinflusst?
Wenn Sie auf "Absenden" klicken, wird Ihr Feedback zur Verbesserung von Produkten und Diensten von Microsoft verwendet. Ihr IT-Administrator kann diese Daten sammeln. Datenschutzbestimmungen.

Vielen Dank für Ihr Feedback!

×