<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>diploD &#187; webpart</title>
	<atom:link href="http://www.diplod.it/tag/webpart/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diplod.it</link>
	<description>by Davide Del Monte</description>
	<lastBuildDate>Fri, 13 Feb 2015 14:26:10 +0000</lastBuildDate>
	<language>it-IT</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>Dataview che filtra per data gli elementi di una lista Sharepoint: che fatica!</title>
		<link>http://www.diplod.it/2009/12/28/dataview-che-filtra-per-data-gli-elementi-di-una-lista-sharepoint-che-fatica/</link>
		<comments>http://www.diplod.it/2009/12/28/dataview-che-filtra-per-data-gli-elementi-di-una-lista-sharepoint-che-fatica/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 23:35:24 +0000</pubDate>
		<dc:creator><![CDATA[Davide]]></dc:creator>
				<category><![CDATA[Ajax e Javascript]]></category>
		<category><![CDATA[Sharepoint]]></category>
		<category><![CDATA[calendario]]></category>
		<category><![CDATA[dataview]]></category>
		<category><![CDATA[designer]]></category>
		<category><![CDATA[filtro]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[sharepoint]]></category>
		<category><![CDATA[webpart]]></category>
		<category><![CDATA[xsl]]></category>

		<guid isPermaLink="false">http://www.diplod.it/?p=938</guid>
		<description><![CDATA[Il concetto è semplice: ho una lista calendario in Sharepoint e voglio ottenere una dataview in grado di filtrare gli avvenimenti occorsi in un dato intervallo di tempo. A cosa può servire? Immaginiamo che il calendario in questione serva per segnare le ferie degli utenti e qualcuno sia interessato a vedere quante persone sono in [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>Il concetto è semplice: ho una lista calendario in Sharepoint e voglio ottenere una dataview in grado di filtrare gli avvenimenti occorsi in un dato intervallo di tempo.</strong> A cosa può servire? Immaginiamo che il calendario in questione serva per segnare le ferie degli utenti e qualcuno sia interessato a vedere quante persone sono in ferie oggi, oppure dal 25 dicembre al 6 gennaio, per organizzare meglio il proprio lavoro..</p>
<p>Che ci sarà di così difficile? Nulla, se non il fatto che WSS è davvero poco user friendly quando si tratta di date.</p>
<p>Le prime cose da sapere riguardano la manipolazione delle date con XSL, bisogna <a title="Date con XSL" href="http://msdn.microsoft.com/en-us/library/ms256099.aspx" target="_blank">partire dalle basi</a> e poi da <a title="Date con XSL - esempi" href="http://mdasblog.wordpress.com/2008/02/19/comparing-dates-in-sharepoint-using-xsl/" target="_blank">qualche esempio</a>. Le date gestite su Sharepoint sono la <em>@EventDate</em> (data di inizio) e la <em>@EndDate</em> (data fine) e vengono restituite generalmente nel formato seguente: <em>2009-25-19T11:15:02Z</em>.</p>
<p>Ovviamente l&#8217;ambiente di lavoro è <strong>Sharepoint Designer</strong>. Per prima cosa, una volta creata la nuova <strong>dataview</strong> webpart, bisogna associargli un form (una DataForm WebPart) tramite il quale passare gli intervalli di selezione delle date. Pubblico subito il codice sorgente di questo form:</p>
<p><span id="more-938"></span></p>
<p><code>&lt;SCRIPT type="text/javascript" src="dhtmlgoodies_calendar/dhtmlgoodies_calendar.js?random=20060118"&gt;&lt;/script&gt;<br />
&lt;link type="text/css" rel="stylesheet" href="dhtmlgoodies_calendar/dhtmlgoodies_calendar.css?random=20051112" media="screen"&gt;&lt;/LINK&gt;<br />
&lt;table&gt;<br />
&lt;script language="JavaScript"&gt;<br />
function setStartTimeNow()<br />
{<br />
var d = new Date();<br />
var currYear = d.getFullYear();<br />
var currMonth = d.getMonth() + 1;<br />
var currDate = d.getDate();<br />
var currHour = d.getHours();<br />
var currMin = d.getMinutes();<br />
timeA = currYear + "" + currMonth + "" + currDate + "0001";<br />
timeB = currYear + "" + currMonth + "" + currDate + "2359";<br />
theInputA = document.getElementById('dataa');<br />
theInputA.value = timeA;<br />
theInputB = document.getElementById('datab');<br />
theInputB.value = timeB;<br />
}<br />
&lt;/script&gt;<br />
&lt;tr&gt;&lt;td&gt;Data e ora Inizio: &lt;/td&gt;&lt;td&gt;&lt;td&gt;&lt;input id="dataa" type="text" value="" readonly name="<strong>T1</strong>"&gt;&lt;input type="button" value="Seleziona data e ora.." onclick="displayCalendar(document.getElementById('dataa'),'<strong>yyyymmddhhii</strong>',this,true)"&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;tr&gt;&lt;td&gt;Data e ora Fine: &lt;/td&gt;&lt;td&gt;&lt;td&gt;&lt;input id="datab" type="text" value="" readonly name="<strong>T2</strong>"&gt;&lt;input type="button" value="Seleziona data e ora.." onclick="displayCalendar(document.getElementById('datab'),'<strong>yyyymmddhhii</strong>',this,true)"&gt;&lt;/td&gt;&lt;/tr&gt;<br />
&lt;/table&gt;<br />
&lt;br/&gt;<br />
&lt;input type="button" value="Voglio sapere gli assenti di oggi.." onclick="setStartTimeNow()"/&gt;<br />
&lt;input type="button" value="Mostra Risultati" onclick="javascript:_SFSUBMIT_"/&gt;</code></p>
<p>Per creare questo form ho utilizzato il comodissimo javascript <strong><a title="Date Picker Javascript" href="http://www.dhtmlgoodies.com/index.html?page=calendarScripts" target="_blank">dhtmlgoodies_calendar</a></strong>, che permette di avere il classico calendarietto tramite il quale selezionare la data. La particolarità è che il formato della data passato all&#8217;input element del form è del tipo <em>yyyymmddhhii</em>, ovvero vengono passate data e ora sottoforma di numero. Ad esempio, la data 25/12/2009 &#8211; 13:52, viene passata come 200912251352. In questo modo sarà possibile confrontarla con altre date tramite gli operatori logici (maggiore, minore, uguale..).<br />
T1 e T2 sono i parametri del form che verranno connessi alla web part XML.</p>
<p>Veniamo ora al dunque della web part che deve mostrare i dati, tramite Sharepoint Designer è necessario attivare due parametri: che chiameremo per comodità T1 e T2 (esattamente come gli elementi del form).</p>
<p><img class="size-full wp-image-939 alignnone" title="spdesigner" src="http://www.diplod.it/wp-content/uploads/2009/12/spdesigner.png" alt="spdesigner" width="680" height="400" /></p>
<p>Una volta fatto ciò, il grosso del lavoro sta tutto nell&#8217;impostare correttamente il filtro attraverso una espressione XSL. Prima il codice, poi i commenti:</p>
<p><code>&lt;xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[ ( ddwrt:FormatDateTime(string(@EventDate) ,1033 ,'yyyyMMddHHmm') &amp;lt;= $T1 and ddwrt:FormatDateTime(string(@EndDate) ,1033 ,'yyyyMMddHHmm') &amp;gt;= $T1 )  or  ( ddwrt:FormatDateTime(string(@EventDate) ,1033 ,'yyyyMMddHHmm') &amp;lt;= $T2 and ddwrt:FormatDateTime(string(@EndDate) ,1033 ,'yyyyMMddHHmm') &amp;gt;= $T2 )  or  ( ddwrt:FormatDateTime(string(@EventDate) ,1033 ,'yyyyMMddHHmm') &amp;gt;= $T1 and ddwrt:FormatDateTime(string(@EndDate) ,1033 ,'yyyyMMddHHmm') &amp;lt;= $T2 ) ]"/&gt;</code></p>
<p>Cosa fa questa funzione? Posto che i parametri T1 e T2 identificano rispettivamente la data di inizio e la data di fine dell&#8217;intervallo di selezione (il periodo per cui vogliamo sapere chi era assente), il codice del filtro trasforma tutte le date nel formato numerico descritto sopra, e le confronta in base ai parametri T1 e T2, verificando se esistono eventi iniziati prima della data T1 e ancora in corso nell&#8217;intervallo [T1;T2], iniziati e conclusi all&#8217;interno dell&#8217;intervallo oppure iniziati in [T1;T2] e con conclusione dopo T2. In questo modo si ottiene la lista di tutti gli assenti all&#8217;interno di un determinato periodo, anche degli assenti per solo alcuni giorni e non per tutto l&#8217;intervallo stesso.</p>
<p><img class="alignnone size-full wp-image-947" title="webpart" src="http://www.diplod.it/wp-content/uploads/2009/12/maschera2.png" alt="webpart" width="600" height="336" /></p>
<p>Nota bene, in linea di massima anche questo filtro dovrebbe essere corretto:</p>
<p><code>&lt;xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row[ ( substring(translate(translate(translate(translate(@EventDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;lt;= $T1 and substring(translate(translate(translate(translate(@EndDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;gt;= $T1 )  or  ( substring(translate(translate(translate(translate(@EventDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;lt;= $T2 and substring(translate(translate(translate(translate(@EndDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;gt;= $T2 )  or  ( substring(translate(translate(translate(translate(@EventDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;gt;= $T1 and substring(translate(translate(translate(translate(@EndDate,'-',''),':',''),'T',''),'Z',''),1,12) &amp;lt;= $T2 ) ]"/&gt;</code></p>
<p>La funzione <em>translate</em> depura la stringa della data dai vari caratteri e lascia solo 14 numeri, la funzione <em>substring</em> leva gli ultimi due numeri (relativi ai secondi dell&#8217;ora della data). Ma così non funziona, per un qualche strano motivo Sharepoint anticipa di un&#8217;ora la data di tutti gli eventi, e ciò che concettualmente era infallibile, decade durante la prova effettiva, con buona pace per tutto il tempo trascorso sopra a ragionarci.. Argh!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diplod.it/2009/12/28/dataview-che-filtra-per-data-gli-elementi-di-una-lista-sharepoint-che-fatica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
