Datumsvergleiche für bedingte Formatierungen in Datenansichten

Leider mußte ich eben feststellen, daß bedingte Formatierungen mit Datumsvergleichen in einer Datenansicht mit dem XsltListViewWebPart bei deutschen Ländereinstellungen nicht funktionieren.

Wenn man zum Beispiel die Zeilen einer Aufgabenliste je nach Status (abgeschlossen oder nicht) und Fälligkeitsdatum unterschiedlich einfärben möchte, dann funktioniert das nur wenn in der entsprechenden Website ein englisches Datumsformat (MM/DD/YYYY) eingestellt ist. Abweichungen davon, z.B. beim deutschen Format DD.MM.YYYY, sorgen dafür, daß die automatisch erzeugten Datumsvergleiche manchmal fehlschlagen. Ja, richtig: manchmal.

Update: das Problem wurde durch Service Pack 1 behoben.

Wenn man sich im SharePoint Designer 2010 eine bedingte Formatierung "zusammenklickt"…

…dann wird dieser XSL-Code erzeugt:

<xsl:if test="ddwrt:DateTimeTick(ddwrt:GenDisplayName(string($thisNode/@DueDate))) &lt; ddwrt:DateTimeTick(ddwrt:GenDisplayName(string(‚Today‘)))" …

Wie man sieht wird dabei mit der Funktion ddwrt:DateTimeTick gearbeitet (sie liefert die Anzahl Tage seit 01.01.1900). Ein paar Versuche haben gezeigt, daß diese Funktion nur für ein englisches Datum das richtige Ergebnis liefert. Wenn sich ein deutsches Datum englisch interpretieren läßt (z.B. der 07.04. als 4. Juli), wird ein falsches Ergebnis geliefert. Wenn sich ein deutsches Datum gar nicht englisch interpretieren läßt (z.B. der 13.04. als 4. Des dreizehnten Monats), wird einfach 0 (Null) geliefert. Das ist die Erklärung dafür, daß es eben manchmal funktioniert.

Ich habe dann Versuche mit den Funktionen ddwrt:FormatDate und ddwrt:FormatDateTime angestellt. Eigentlich wollte ich damit ein Datum im deutschen Format ins englische Format übertragen und dadurch erreichen, daß die Datumsvergleiche immer korrekt funktionieren. Leider wurde es von Microsoft bis heute nicht für notwendig befunden, die ddwrt-Erweiterungen zu dokumentieren. Die einzige Dokumentation dazu ist vom Oktober 2005 und bezieht sich auf SharePoint 2003. Sehr schade, da diese Erweiterungsfunktionen durchaus nützlich sind bzw. sein könnten.

Wie auch immer: es ist mir nicht gelungen, ein deutsches Datum ins englische Format zu übertragen. Nach ein paar weiteren Versuchen habe ich mich für folgende Lösung entschieden:

<xsl:if test="number(concat(substring(string($thisNode/@DueDate),7,4),substring(string($thisNode/@DueDate),4,2),substring-before(string($thisNode/@DueDate),‘.‘))) &lt; translate(substring-before(ddwrt:TodayIso(),’T‘),‘-‚,“) …

Dieser Vergleich macht genau dasselbe wie der oben gezeigte, funktioniert aber für das deutsche Datumsformat (allerdings nur für das).

Erklärung:

Beide Daten (Fälligkeitsdatum und aktuelles Datum) werden ins Format YYYYMMDD gebracht und das dann verglichen. Mit kleinen Änderungen, sollte sich dieses Vorgehen auf jedes beliebige Datumsformat umbauen lassen. Das Fälligkeitsdatum wird mit Stringfunktionen in seine Bestandteile zerlegt und in der richtigen Reihenfolge ohne Trennzeichen zusammengesetzt. Das aktuelle Datum erhält man von der ddwrt:TodayIso-Funktion bereits in der richtigen Reihenfolge. Es wird einfach alles nach dem ‚T‘ abgeschnitten und das Trennzeichen-Minus entfernt.

11 Gedanken zu “Datumsvergleiche für bedingte Formatierungen in Datenansichten

  1. Hallo Andi,

    ich habe dieses Probelem mit FormatDate auch lösen können

    ddwrt:DateTimeTick(ddwrt:FormatDate(ddwrt:GenDisplayName(string($thisNode/@DueDate)), 1031, 1)) > ddwrt:DateTimeTick(ddwrt:GenDisplayName(string($Today)))

    LG Thomas

    Gefällt mir

  2. Hi, also ich habe das jetzt genau so verucht, bei mir ist aber immer das erste $thisNode rot unterwellt.
    Die Bedingung wird somit nicht ausgeführt.
    weiß viell. jemdand woran das liegen kann?

    Der Code ist ident mit dem im blog:
    number(concat(substring(string($thisNode/@DatumZweitpassKennzeichnen),7,4),substring(string($thisNode/@DatumZweitpassKennzeichnen),4,2),substring-before(string($thisNode/@DatumZweitpassKennzeichnen),‘.‘))) < translate(substring-before(ddwrt:TodayIso(),'T'),'-','')

    Danke
    Tom

    Gefällt mir

  3. Hallo Tom,

    das kann eigentlich nur daher kommen, daß der Kontext nicht paßt. Die Variable $thisNode gibt es bei Datenansichten immer im Kontext einer Zeile. Man kann sie also nur dort benutzen und nicht z.B. um einen Header auszugeben.

    Wie man den passenden XPath-Ausdruck für Deinen Kontext findet, kann ich aber aus der Ferne nicht sagen.

    Gefällt mir

  4. Hallo Andi,
    habe den code so wie du verwendet(d.h. wollen keine Header Daten ausgeben).
    Leider funktioniert es immer noch nicht.

    Trotzdem Danke für die rasche Antwort.

    Gruß Tom

    Gefällt mir

  5. Wie kriege ich das über Sharepoint Designer hin, dass er mir mein Datum aktualsiert? So muss ich jedes mal die jeweilige Aktion neu abspeichern. Ich möchte aber, dass er es selber aktualisiert.

    Gruß Tim

    Gefällt mir

  6. Hallo,

    ich habe eine Frage zum Sharepoint Designer. Und zwar wie kriege ich das hin, dass er mir mein Datum selber aktualisiert?
    So muss ich in die jeweilige Aktion reingehen und neu abspeichern, damit das heutige Datum angezeigt wird.
    Danke im voraus

    Gruß Max

    Gefällt mir

  7. Hallo Tim und Max.
    Ich verstehe leider das Problem nicht ganz. Was genau soll den automatisch aktualisiert werden? Für den Datumsvergleich im Beispiel wird ja „Today“ verwendet und das ist automatisch immer das aktuelle Datum.

    Viele Grüße
    Andi

    Gefällt mir

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s