SharePoint : How to filter an external data XsltListViewWebPart in SharePoint Designer ?

sharepoint 2013
sharepoint 2013

Context : You use Business Data Connectivity to retrieve external data in SharePoint, and you wish to display a filtered view of this data in a page.
In SharePoint Designer, you insert a Data View of that external data.
Then, there are 2 ways to filter it :

  • By using the « Filter » button in the office ribbon :
SharePoint Designer Filter
SharePoint Designer Filter

This actually generates a CAML query :
SharePoint_BDC_Filter_External_Data_2

  • By passing a parameter to the finder method of the BDC Model. You can do this manually or by using the « Search » button :

SharePoint_BDC_Filter_External_Data_1b
It generates this code in the View element :
SharePoint_BDC_Filter_External_Data_3
You should use the second solution. Why ? We could consider the CAML query as a « front-end » filter. It means that ALL the records are sent by the BDC, and then the CAML query filter it.
If you retrive thousands of records, it can affect performances.
If you pass a parameter directly to the BDC (finder method), the request sent to the external source will be filtered, and SharePoint will have to deal with less data.
Maybe you will have to create a new finder method in your BDC, but it worth the time spent on it !

CAML (WSS) : Requête avec un champ "DateTime"

Iso machin
Pour qu’une date soit exploitable dans une requête CAML, il faut qu’elle soit d’un format ISO spécifique.
Convertir la date à l’aide de cette outil du framework SharePoint :
SPUtility.CreateISO8601DateTimeFromSystemDateTime(maDate);
La requête suivante fonctionnera sans problème :
maQuery = "<Where><Geq><FieldRef Name='ChampDate' /><Value Type='DateTime'>" + SPUtility.CreateISO8601DateTimeFromSystemDateTime(maDate) + </Value></Geq></Where>";

SPQuery sur SPList.GetItems retourne tous les éléments !

Cauet rit.
Dans le bout de code suivant :

SPQuery qry = new SPQuery();
qry.Query = "<Query><Where><Eq><FieldRef Name='Champ1' /><Value Type='Number'>0</Value></Eq></Where></Query>";

SPListItemCollection myData = mySPList.GetItems(qry);
« myData » contiendra l’ensemble des enregistrements de la liste « mySPList », sans tenir compte de ma requête « Where ».
Ceci vient de la requête CAML mal formée : il faut enlever les balises « <Query></Query> ». En effet, l’objet SPQuery de charge lui-même de les ajouter.
Source : http://sharepointxperience.blogspot.com/2007/10/spquery-returns-all-items.html

SharePoint : Bug natif dans le modèle de liste "Forum de discussion"

Un paquet de CAML !
Quelque soient les droits des utilisateurs dans un forum de discussion SharePoint, le lien « Afficher les propriétés » apparait pour chaque message. Or ce lien redirige vers les propriétés du message, où il est possible de le modifier, le supprimer…
Résultat : l’utilisateur va se retrouver devant une page d’erreur quand il tentera ces actions.
Pour corriger ce dysfonctionnement natif, le mieux et de créer son propre modèle de liste DiscussionList (en copiant-collant l’original), et de corriger le fichier %FEATURE%DiscussionsListDiscussschema.xml
Dans notre cas, on va simplement afficher ce lien uniquement aux utilisateurs qui sont l’auteur du message. A la ligne 351du fichier, il faut remplacer le code défécteux par celui-ci (entre le </Switch> de la ligne 351 et le <IfHasRights> de la ligne 354) :
          <HTML><![CDATA[<td style="border-style:none" nowrap="TRUE"><div>]]></HTML>
<IfEqual>
<Expr1>
<Column Name="Author"/>
</Expr1>
<Expr2>
<UserID></UserID>
</Expr2>
<Then>
<HTML><![CDATA[<a id="DisplayLink]]></HTML>
<Field Name="ID" />
<HTML><![CDATA[" href="]]></HTML>
<URL Cmd="EDIT" />
<HTML><![CDATA[" ONCLICK="GoToLink(this);return false;" target="_self">]]></HTML>
<HTML><![CDATA[<NOBR>Afficher les propriétés</NOBR></a>]]></HTML>
</IfHasRights>
</Then>
</IfEqual>


Bien sûr, tout ceci peut être libre de toute fantaisie !