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))) < 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),‘.‘))) < 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.
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
Damit hatte ich auch experimentiert, bin aber irgendwie nicht zum Ziel gekommen.
Irgendwas hat immer nicht funktioniert…
Servus!
@Thomas
Ich hatte 100%ig den selben Fehler wie du!
„ddwrt:DateTimeTick(ddwrt:FormatDate(ddwrt:GenDisplayName(string($thisNode/@DueDate)), 1031, 1)) > ddwrt:DateTimeTick(ddwrt:GenDisplayName(string($Today))) “
Grüße
Tezor
http://www.starbike.com
Besteht das Problem mit dem Datum immernoch?
Ich möchte gerne den Status einfärben, wenn das Tagesdatum 3 Tage weiter ist als das Bestelldatum. Wie könnte ich das lösen?
LG
Hallo Thomas2,
Du kannst das gewünschte erreichen, wenn Du die Anzahl Tage zu der erzeugten Zahl addierst. In der Formel oben wäre das
<xsl:if test="number(…)+3 < …
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
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.
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
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
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
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