SharePointCommunity
Die deutschsprachige Community für SharePoint, Microsoft 365, Teams, Yammer und mit Azure

Sponsored by

Willkommen im Forum Archiv.
Einträge sind hier nicht mehr möglich, aber der Bestand von 12 Jahren SharePoint-Wissen ist hier recherchierbar.




Sortierung nach "Geändert" funktioniert nicht (Deutsch / Engl. Datumsformate?)

Unbeantwortet Dieser Beitrag hat 10 Antworten

Ohne Rang
17 Beiträge
Alex_E erstellt 3 Juli 2013 08:51
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Moin Moin,

ich habe eine Verknpüfte Datenquelle und darin 15 Dokumentenbibliotheken.

Ich möchte nun in einer Datenansicht bewirken, dass eine absteigende Sortierung nach dem [Geändert] ([Modified]) - Datumswert erfolgt. Scheinbar gibt es aber Probleme mit dem deutsch / englischen Datumsformaten.

Das habe ich bisher versucht:

Umwandlung in der Sortierung:

<xsl:sort select="ddwrt:FormatDateTime(string(@Modified),1033,' yyyy-MM-dd-hh-mm-ss')" order="descending" />

Funktioniert leider nicht - Der 27.06 ist vor dem 02.07 

 

Berechnete Spalte ("Änderungsdatum"):

=TEXT([Geändert];"YYYY-MM-DD");

oder auch

=JAHR([Geändert])&"-"&

WENN(MONAT([Geändert])>10;MONAT([Geändert]);"0"&MONAT([Geändert])) &"-"&

WENN(TAG([Geändert])>10;TAG([Geändert]);"0"&TAG([Geändert])) &"-"&

WENN(STUNDE([Geändert])>10;STUNDE([Geändert]);"0"&STUNDE([Geändert])) &"-"&

WENN(MINUTE([Geändert])>10;MINUTE([Geändert]);"0"&MINUTE([Geändert])) &"-"&

WENN(SEKUNDE([Geändert])>10;SEKUNDE([Geändert]);"0"&SEKUNDE([Geändert]))

 Da ergibt sich dann die Besonderheit bei Verknüpfungen / Links, dass dieses berechnete Datum nach einiger Zeit dem aktuellen Datum entspricht. Ich vermute einen Zusammenhang mit den Suchläufen des SearchServers.

 ---

Habt Ihr vielleicht eine Lösung parat? Vielleicht eine Umwandlung in einen String?

Gefunden hatte ich bisher: http://blogs.evocom.de/af/archive/2011/04/07/datumsvergleiche-f%C3%BCr-bedingte-formatierungen-in-datenansichten.aspx

Leider konnte ich den Code nicht für mich nutzen und entsprechend umschreiben. Vielleicht habt Ihr Experten einen Tipp?

 

Herzlichen Dank und Viele Grüße,

Alex

Alle Antworten

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Juli 2013 09:00
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich vermute das eigentliche Problem ganz woanders, nämlich daß das <xsl:sort> an der falschen Stelle steht. Verknüpfte Datenquellen werden ja immer in ein eigenes Parent-Element geschachtelt und Du sortierst deshalb immer nur die Ergebnisse einer Datenquelle, danach die nächste usw. Das sieht in etwas so aus:

<Quelle1>
  <Row>
  <Row>
  ...
</Quelle1>
<Quelle2>
  <Row>
  <Row>
  ...
</Quelle2>

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
17 Beiträge
Alex_E Als Antwort am 3 Juli 2013 09:30
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke für deine schnelle Rückmeldung.

Bei mir ist es folgendermaßen:

<DataSources>
        <SharePoint:AggregateDataSource  ...>

<SharePoint:SPDataSource ...

...

</DataSources>

<ParameterBindings>
...

</ParamaterBindungs>

<datafields> ... </datafields>

<XSL>
<xsl:stylesheet xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:agg="http://schemas.microsoft.com/sharepoint/aggregatesource" version="1.0" exclude-result-prefixes="xsl msxsl ddwrt" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:ddwrt2="urn:frontpage:internal">
    <xsl:output method="html" indent="no"/>
    <xsl:decimal-format NaN=""/>
    <xsl:param name="dvt_apos">'</xsl:param>
    <xsl:param name="ManualRefresh"></xsl:param>
    <xsl:param name="dvt_firstrow">1</xsl:param>
    <xsl:param name="dvt_nextpagedata" />
    <xsl:variable name="dvt_1_automode">0</xsl:variable>
   
    <xsl:template match="/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:x="http://www.w3.org/2001/XMLSchema" xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" xmlns:agg="http://schemas.microsoft.com/sharepoint/aggregatesource" xmlns:asp="http://schemas.microsoft.com/ASPNET/20" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" xmlns:SharePoint="Microsoft.SharePoint.WebControls">
        <xsl:choose>
            <xsl:when test="($ManualRefresh = 'True')">
                <table width="100%" border="0" cellpadding="0" cellspacing="0">
                    <tr>
                        <td valign="top">
                            <xsl:call-template name="dvt_1"/>
                        </td>
                        <td width="1%" class="ms-vb" valign="top">
                            <img src="/_layouts/images/staticrefresh.gif" id="ManualRefresh" border="0" onclick="javascript: {ddwrt:GenFireServerEvent('__cancel')}" alt="Click here to refresh the dataview."/>
                        </td>
                    </tr>
                </table>
            </xsl:when>
            <xsl:otherwise>
                <xsl:call-template name="dvt_1"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>
   
    <xsl:template name="dvt_1">
        <xsl:variable name="dvt_StyleName">Table</xsl:variable>
        <xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>
        <xsl:variable name="dvt_RowCount" select="count($Rows)"/>
        <xsl:variable name="RowLimit" select="10" />
        <xsl:variable name="FirstRow" select="$dvt_firstrow" />
        <xsl:variable name="LastRow">
            <xsl:choose>
                <xsl:when test="($FirstRow + $RowLimit - 1) &gt; $dvt_RowCount"><xsl:value-of select="$dvt_RowCount" /></xsl:when>
                <xsl:otherwise><xsl:value-of select="$FirstRow + $RowLimit - 1" /></xsl:otherwise>
            </xsl:choose>
        </xsl:variable>
        <xsl:variable name="IsEmpty" select="$dvt_RowCount = 0" />
        <xsl:variable name="dvt_IsEmpty" select="$dvt_RowCount = 0"/>
       
        <xsl:choose>
            <xsl:when test="$dvt_IsEmpty">
                <xsl:call-template name="dvt_1.empty"/>
            </xsl:when>
            <xsl:otherwise>
                <table border="0" width="100%" cellpadding="2" cellspacing="0">
                    <tr valign="top">
                        <xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">
                            <th class="ms-vh" width="1%" nowrap="nowrap"></th>
                        </xsl:if>
                        <th class="ms-vh" nowrap="nowrap">Name (zur Verwendung in Formularen)</th>
                        <th class="ms-vh" nowrap="nowrap">Oberbegriff</th>
                        <th class="ms-vh" nowrap="nowrap">URL-Pfad</th>
                        <th class="ms-vh" nowrap="nowrap">Geändert von</th>
                        <th class="ms-vh" nowrap="nowrap">Geändert</th><th class="ms-vh" nowrap="nowrap">Änderungsdatum</th></tr>
                    <xsl:call-template name="dvt_1.body">
                        <xsl:with-param name="Rows" select="$Rows"/>
                        <xsl:with-param name="FirstRow" select="$FirstRow" />
                        <xsl:with-param name="LastRow" select="$LastRow" />
                    </xsl:call-template>
                </table>
            </xsl:otherwise>
        </xsl:choose>
        <xsl:call-template name="dvt_1.commandfooter">
            <xsl:with-param name="FirstRow" select="$FirstRow" />
            <xsl:with-param name="LastRow" select="$LastRow" />
            <xsl:with-param name="RowLimit" select="$RowLimit" />
            <xsl:with-param name="dvt_RowCount" select="$dvt_RowCount" />
            <xsl:with-param name="RealLastRow" select="number(ddwrt:NameChanged('',-100))" />
        </xsl:call-template>
    </xsl:template>
    <xsl:template name="dvt_1.body">
        <xsl:param name="Rows"/>
        <xsl:param name="FirstRow" />
        <xsl:param name="LastRow" />
        <xsl:for-each select="$Rows">
            <xsl:sort select="@Modified" order="descending" />
            <xsl:variable name="dvt_KeepItemsTogether" select="false()" />
            <xsl:variable name="dvt_HideGroupDetail" select="false()" />
            <xsl:if test="(position() &gt;= $FirstRow and position() &lt;= $LastRow) or $dvt_KeepItemsTogether">
                <xsl:if test="not($dvt_HideGroupDetail)" ddwrt:cf_ignore="1">
                    <xsl:call-template name="dvt_1.rowview" />
                </xsl:if>
            </xsl:if>
        </xsl:for-each>

 

Ich bin der Meinung, dass die Sortierung grundsätzlich funktionierte (bis Ende Juni). Als ich dann eine neue Datei am 01.07. 2013 eingestellt habe, wurde diese nicht oben angezeigt

Sicherheitshalber habe ich die Ansicht mal angepasst:

    <xsl:value-of select="ddwrt:FormatDateTime(string(@Modified),1033,'yyyy-MM-dd-hh-mm-ss')"/>

 

Das wird aus dem 02.07.2013:

2013-02-07-03-52-00

 

Ohne Rang
17 Beiträge
Alex_E Als Antwort am 3 Juli 2013 09:47
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ich habe mir die Ansicht angepasst:

<xsl:value-of select="ddwrt:FormatDateTime(string(@Modified),1033,'yyyy-MM-dd-hh-mm-ss')"/>

Dabei kommt 2013-02-07-03-52-00 heraus (Für den 02.07.2013 - richtig wäre also 2013-07-02-...).

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Juli 2013 09:53
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das ist genau das Problem, das ich in dem Blogpost beschrieben habe, den Du selbst oben verlinkt hast. Sprcih, die Funktion tut nicht wie erwartet und es hilft nur das Datum mit Stringfunktionen selbst zu zerpflücken. Ob man damit aber eine Sortierung hinbekommt, habe ich nicht getestet.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
17 Beiträge
Alex_E Als Antwort am 3 Juli 2013 10:18
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Das war auch meine Vermutung.

Ich habe es nun doch hinbekommen:

Es funktioniert wunderbar mit deinem Code-Schnipsel, den ich angepasst habe:

number(concat(substring(string(@Modified),7,4),substring(string(@Modified),4,2),substring-before(string(@Modified),'.')))

 

Kann ich das Ganze noch irgendwie auf die Uhrzeit erweitern?

 

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Juli 2013 11:22
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

[quote user="Alex_E"]Kann ich das Ganze noch irgendwie auf die Uhrzeit erweitern?[/quote]

Klar, Du mußt Dir nur noch mehr substrings von weiter hinten extrahieren. Die substring-Funktion erwartet drei parameter: der erste ist der String, in dem gesucht wird, der zweite ist der Index des ersten Zeichens und der dritte die Anzahl der Zeichen.

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
17 Beiträge
Alex_E Als Antwort am 3 Juli 2013 12:01
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Wie kann ich mir den den Roh-String ausgeben lassen, um Index und Zeichenanzahl herauszufinden?

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Juli 2013 12:04
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Ganz einfach: <xsl:value-of select="string(@Modified)" />

Viele Grüße
Andi
af @ evocom de
Blog
Ohne Rang
17 Beiträge
Alex_E Als Antwort am 3 Juli 2013 13:15
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Danke dir - Leider bekomme ich es nicht hin:

Als String gibt er mir aus (mit Umbruch)

19.06.2013

19:26

 

 

Ohne Rang
19231 Beiträge
Andi Fandrich Als Antwort am 3 Juli 2013 14:26
SchlechtSchlechtIn OrdnungIn OrdnungDurchschnittDurchschnittGutGutSehr gutSehr gut

Der Umbruch wird ebenfalls durch eine Anzahl Zeichen verursacht, die man einfach mitzählen muß. Erweitere das value-of um disable-output-escaping="yes" und Du siehst wirklich den rohen String.

Viele Grüße
Andi
af @ evocom de
Blog